Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 6 from a total of 6 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Safe Transfer Fr... | 23392628 | 49 days ago | IN | 0 ETH | 0.00008187 | ||||
| Set Active Agree... | 23385024 | 50 days ago | IN | 0 ETH | 0.00005129 | ||||
| Set Agreement Me... | 23385019 | 50 days ago | IN | 0 ETH | 0.00018445 | ||||
| Set Active Agree... | 23362061 | 53 days ago | IN | 0 ETH | 0.00004224 | ||||
| Set Agreement Me... | 23362059 | 53 days ago | IN | 0 ETH | 0.00016213 | ||||
| Set Agreement Me... | 23362052 | 53 days ago | IN | 0 ETH | 0.00016197 |
Latest 2 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
To
|
|||
|---|---|---|---|---|---|---|---|
| 0x60806040 | 23361917 | 53 days ago | Contract Creation | 0 ETH | |||
| 0x60806040 | 23361917 | 53 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BurnAgreement
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT
/*
( (
( )\ ) )\ )
( )\ ( (()/((()/(
)((_) )\ /(_))/(_))
((_)_ _ ((_)(_)) (_))_
| _ )| | | |/ __| | \
| _ \| |_| |\__ \ | |) |
|___/ \___/ |___/ |___/
by steviep.eth
2025
*/
import "./Dependencies.sol";
pragma solidity ^0.8.28;
/// @title Burn Agreement (bUSD)
/// @author steviep.eth
/// @notice Terms and conditions for engaging with the bUSD project. Owning a Burn Agreement token can be used to streamline the bUSD issuance process. Ownership of this NFT does not guarantee participation in a Burn Ceremony
contract BurnAgreement is ERC721, Ownable {
uint256 public totalSupply = 1;
string public activeAgreementVersion = '1.0.0';
address public burnCeremony;
BurnAgreementURI public uri;
BurnAgreementMinter public minter;
/// @notice Map a Burn Agreement token to the agreement version
mapping(uint256 => string) public tokenIdToAgreementVersion;
/// @notice Map an agreement version to the agreement content uri
mapping(string => string) public agreementVersionToMetadata;
/// @notice Keeps track of whether an agreement token has been used in a Ceremony
mapping(uint256 => bool) public agreementUsed;
event MetadataUpdate(uint256 _tokenId);
event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);
/// @dev Mints #0 to the contract deployer
constructor(address ceremony) ERC721('Burn Agreement', 'BA') {
burnCeremony = ceremony;
uri = new BurnAgreementURI();
minter = new BurnAgreementMinter();
_safeMint(msg.sender, 0);
tokenIdToAgreementVersion[0] = activeAgreementVersion;
}
/// @notice Checks if given token ID exists
/// @param tokenId Token to run existence check on
/// @return True if token exists
function exists(uint256 tokenId) external view returns (bool) {
return _exists(tokenId);
}
/// @notice Mints a Burn Agreement token to the recipient
/// @param recipient Address to sent token to
/// @dev Can only be called by the BurnAgreementMinter
function mint(address recipient) external payable {
require(msg.sender == address(minter), 'Only minting address can mint');
tokenIdToAgreementVersion[totalSupply] = activeAgreementVersion;
_safeMint(recipient, totalSupply);
totalSupply++;
}
/// @notice Marks an Agreement as "used" as part of a burn ceremony
/// @dev Can only be called by the BurnCeremony
function markAgreementUsed(uint256 tokenId) external {
require(msg.sender == burnCeremony, 'Only burn ceremony can use agreement');
require(!agreementUsed[tokenId], 'Agreement already used');
agreementUsed[tokenId] = true;
emit MetadataUpdate(tokenId);
}
function setMinter(BurnAgreementMinter newMinter) external onlyOwner {
minter = newMinter;
}
function setBurnCeremony(address _burnCeremony) external onlyOwner {
burnCeremony = _burnCeremony;
}
function setActiveAgreement(string calldata _activeAgreementVersion) external onlyOwner {
activeAgreementVersion = _activeAgreementVersion;
}
function setAgreementMetadata(string calldata agreementVersion, string calldata metadata) external onlyOwner {
agreementVersionToMetadata[agreementVersion] = metadata;
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
return uri.tokenURI(tokenId);
}
function setURI(address newURI) external onlyOwner {
uri = BurnAgreementURI(newURI);
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
return interfaceId == bytes4(0x49064906) || super.supportsInterface(interfaceId);
}
}
/// @title Burn Agreement Minter (bUSD)
/// @author steviep.eth
/// @notice Interface for minting bUSD Burn Agreement NFTs
contract BurnAgreementMinter {
uint256 public price = 0.01 ether;
BurnAgreement public burnAgreement;
constructor() {
burnAgreement = BurnAgreement(msg.sender);
}
modifier onlyOwner {
require(msg.sender == burnAgreement.owner(), "Ownable: caller is not the owner");
_;
}
function mint() external payable {
require(msg.value >= price, 'Invalid value');
burnAgreement.mint(msg.sender);
}
function withdraw(uint256 balance) external onlyOwner {
(bool success, ) = payable(burnAgreement.owner()).call{value: balance}('');
require(success, "Transfer failed");
}
function setPrice(uint256 _price) external onlyOwner {
price = _price;
}
}
contract BurnAgreementURI {
BurnAgreement public agreement;
constructor() {
agreement = BurnAgreement(msg.sender);
}
function tokenURI(uint256 tokenId) public view returns (string memory) {
bool agreementUsed = agreement.agreementUsed(tokenId);
string memory agreementVersion = agreement.tokenIdToAgreementVersion(tokenId);
string memory bg = agreementUsed ? '#000' : '#fff';
string memory text = agreementUsed ? '#ef791f' : '#000';
bytes memory thumbnail = abi.encodePacked(
'data:image/svg+xml;base64,',
Base64.encode(abi.encodePacked(
'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 850 1100">'
'<style>text{font:bold 50px sans-serif;fill:', text, ';text-anchor: middle}</style>'
'<rect width="850" height="1100" x="0" y="0" fill="', bg,'" stroke="none"/>'
'<rect x="150" y="150" width="550" height="800" style="fill:none;stroke:', text,';stroke-width:7.5px"/>'
'<text x="425" y="450">BURN</text>'
'<text x="425" y="550">AGREEMENT</text>'
'<text x="425" y="650">v', agreementVersion, '</text>'
'</svg>'
))
);
string memory attrs = string.concat(
'[',
string.concat('{ "trait_type": "Agreement Version", "value": "', agreementVersion, '" },'),
string.concat('{ "trait_type": "Agreement Used", "value": "', agreementUsed ? 'True' : 'False', '" }'),
']'
);
return string(abi.encodePacked(
'data:application/json;utf8,'
'{"name": "Burn Agreement v', agreementVersion,
'", "description": "By purchasing this token you implicitly agree to the terms of this agreement. Ownership of this NFT does not guarantee participation in a Burn Ceremony. Participation shall be left to the full discretion of the Burn Agent.'
'", "image": "', thumbnail,
'", "animation_url": "', agreement.agreementVersionToMetadata(agreementVersion),
'", "attributes":', attrs,
'}'
));
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
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);
}
}
}
}
/**
* @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;
}
}
/**
* @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);
}
// Don't need these
/**
* @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);
}
}
/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/// @notice Encodes some bytes to the base64 representation
function encode(bytes memory data) internal pure returns (string memory) {
uint256 len = data.length;
if (len == 0) return "";
// multiply by 4/3 rounded up
uint256 encodedLen = 4 * ((len + 2) / 3);
// Add some extra buffer at the end
bytes memory result = new bytes(encodedLen + 32);
bytes memory table = TABLE;
assembly {
let tablePtr := add(table, 1)
let resultPtr := add(result, 32)
for {
let i := 0
} lt(i, len) {
} {
i := add(i, 3)
let input := and(mload(add(data, i)), 0xffffff)
let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
out := shl(8, out)
out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
out := shl(8, out)
out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
out := shl(8, out)
out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
out := shl(224, out)
mstore(resultPtr, out)
resultPtr := add(resultPtr, 4)
}
switch mod(len, 3)
case 1 {
mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
}
case 2 {
mstore(sub(resultPtr, 1), shl(248, 0x3d))
}
mstore(result, encodedLen)
}
return string(result);
}
}
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata extension, but not including the Enumerable extension, which is available separately as
* {ERC721Enumerable}.
*/
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
// Token name
string private _name;
// Token symbol
string private _symbol;
// Mapping from token ID to owner address
mapping(uint256 => address) private _owners;
// Mapping owner address to token count
mapping(address => uint256) private _balances;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public virtual override {
require(operator != _msgSender(), "ERC721: approve to caller");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
//solhint-disable-next-line max-line-length
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* `_data` is additional data, it has no specified format and it is sent in call to `to`.
*
* This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
* implement alternative mechanisms to perform token transfer, such as signature-based.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
* and stop existing when they are burned (`_burn`).
*/
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
/**
* @dev Returns whether `spender` is allowed to manage `tokenId`.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
/**
* @dev Safely mints `tokenId` and transfers it to `to`.
*
* Requirements:
*
* - `tokenId` must not exist.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
/**
* @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
* forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
*/
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Mints `tokenId` and transfers it to `to`.
*
* WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
*
* Requirements:
*
* - `tokenId` must not exist.
* - `to` cannot be the zero address.
*
* Emits a {Transfer} event.
*/
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
}
/**
* @dev Destroys `tokenId`.
* The approval is cleared when the token is burned.
*
* Requirements:
*
* - `tokenId` must exist.
*
* Emits a {Transfer} event.
*/
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
// Clear approvals
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
* As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
// Clear approvals from the previous owner
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before any token transfer. This includes minting
* and burning.
*
* Calling conditions:
*
* - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
* transferred to `to`.
* - When `from` is zero, `tokenId` will be minted for `to`.
* - When `to` is zero, ``from``'s `tokenId` will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(address from, address to, uint256 amount) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
// decrementing then incrementing.
_balances[to] += amount;
}
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
unchecked {
// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
_balances[account] += amount;
}
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
// Overflow not possible: amount <= accountBalance <= totalSupply.
_totalSupply -= amount;
}
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"ceremony","type":"address"}],"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":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","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":[],"name":"activeAgreementVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"agreementUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"agreementVersionToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnCeremony","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"markAgreementUsed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"contract BurnAgreementMinter","name":"","type":"address"}],"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":"string","name":"_activeAgreementVersion","type":"string"}],"name":"setActiveAgreement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"agreementVersion","type":"string"},{"internalType":"string","name":"metadata","type":"string"}],"name":"setAgreementMetadata","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":"address","name":"_burnCeremony","type":"address"}],"name":"setBurnCeremony","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract BurnAgreementMinter","name":"newMinter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newURI","type":"address"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToAgreementVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uri","outputs":[{"internalType":"contract BurnAgreementURI","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405260016007556040518060400160405280600581526020017f312e302e300000000000000000000000000000000000000000000000000000008152506008908161004d91906109ea565b50348015610059575f5ffd5b506040516169f83803806169f8833981810160405281019061007b9190610b17565b6040518060400160405280600e81526020017f4275726e2041677265656d656e740000000000000000000000000000000000008152506040518060400160405280600281526020017f4241000000000000000000000000000000000000000000000000000000000000815250815f90816100f591906109ea565b50806001908161010591906109ea565b50505061012461011961026460201b60201c565b61026b60201b60201c565b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060405161017090610793565b604051809103905ff080158015610189573d5f5f3e3d5ffd5b50600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040516101d5906107a0565b604051809103905ff0801580156101ee573d5f5f3e3d5ffd5b50600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061023e335f61032e60201b60201c565b6008600c5f5f81526020019081526020015f20908161025d9190610b69565b5050610f74565b5f33905090565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61034d828260405180602001604052805f81525061035160201b60201c565b5050565b61036183836103b760201b60201c565b6103735f84848461058760201b60201c565b6103b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a990610cce565b60405180910390fd5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161041c90610d36565b60405180910390fd5b6104348161071560201b60201c565b15610474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046b90610d9e565b60405180910390fd5b6104855f838361077d60201b60201c565b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546104d29190610de9565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f6105ad8473ffffffffffffffffffffffffffffffffffffffff1661078260201b60201c565b15610708578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026105dc61026460201b60201c565b8786866040518563ffffffff1660e01b81526004016105fe9493929190610eaa565b6020604051808303815f875af192505050801561063957506040513d601f19601f820116820180604052508101906106369190610f49565b60015b6106b8573d805f8114610667576040519150601f19603f3d011682016040523d82523d5f602084013e61066c565b606091505b505f8151036106b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a790610cce565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061070d565b600190505b949350505050565b5f5f73ffffffffffffffffffffffffffffffffffffffff1660025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b5f5f823b90505f8111915050919050565b61152780614bd783390190565b6108fa806160fe83390190565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061082857607f821691505b60208210810361083b5761083a6107e4565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261089d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610862565b6108a78683610862565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6108eb6108e66108e1846108bf565b6108c8565b6108bf565b9050919050565b5f819050919050565b610904836108d1565b610918610910826108f2565b84845461086e565b825550505050565b5f5f905090565b61092f610920565b61093a8184846108fb565b505050565b5b8181101561095d576109525f82610927565b600181019050610940565b5050565b601f8211156109a25761097381610841565b61097c84610853565b8101602085101561098b578190505b61099f61099785610853565b83018261093f565b50505b505050565b5f82821c905092915050565b5f6109c25f19846008026109a7565b1980831691505092915050565b5f6109da83836109b3565b9150826002028217905092915050565b6109f3826107ad565b67ffffffffffffffff811115610a0c57610a0b6107b7565b5b610a168254610811565b610a21828285610961565b5f60209050601f831160018114610a52575f8415610a40578287015190505b610a4a85826109cf565b865550610ab1565b601f198416610a6086610841565b5f5b82811015610a8757848901518255600182019150602085019450602081019050610a62565b86831015610aa45784890151610aa0601f8916826109b3565b8355505b6001600288020188555050505b505050505050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610ae682610abd565b9050919050565b610af681610adc565b8114610b00575f5ffd5b50565b5f81519050610b1181610aed565b92915050565b5f60208284031215610b2c57610b2b610ab9565b5b5f610b3984828501610b03565b91505092915050565b5f81549050610b5081610811565b9050919050565b5f819050815f5260205f209050919050565b818103610b77575050610c4c565b610b8082610b42565b67ffffffffffffffff811115610b9957610b986107b7565b5b610ba38254610811565b610bae828285610961565b5f601f831160018114610bdb575f8415610bc9578287015490505b610bd385826109cf565b865550610c45565b601f198416610be987610b57565b9650610bf486610841565b5f5b82811015610c1b57848901548255600182019150600185019450602081019050610bf6565b86831015610c385784890154610c34601f8916826109b3565b8355505b6001600288020188555050505b5050505050505b565b5f82825260208201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f610cb8603283610c4e565b9150610cc382610c5e565b604082019050919050565b5f6020820190508181035f830152610ce581610cac565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f610d20602083610c4e565b9150610d2b82610cec565b602082019050919050565b5f6020820190508181035f830152610d4d81610d14565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f610d88601c83610c4e565b9150610d9382610d54565b602082019050919050565b5f6020820190508181035f830152610db581610d7c565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610df3826108bf565b9150610dfe836108bf565b9250828201905080821115610e1657610e15610dbc565b5b92915050565b610e2581610adc565b82525050565b610e34816108bf565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610e7c82610e3a565b610e868185610e44565b9350610e96818560208601610e54565b610e9f81610e62565b840191505092915050565b5f608082019050610ebd5f830187610e1c565b610eca6020830186610e1c565b610ed76040830185610e2b565b8181036060830152610ee98184610e72565b905095945050505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610f2881610ef4565b8114610f32575f5ffd5b50565b5f81519050610f4381610f1f565b92915050565b5f60208284031215610f5e57610f5d610ab9565b5b5f610f6b84828501610f35565b91505092915050565b613c5680610f815f395ff3fe6080604052600436106101e2575f3560e01c806370a0823111610101578063a05b5e3c11610094578063e985e9c511610063578063e985e9c5146106ea578063eac989f814610726578063f2fde38b14610750578063fca3b5aa14610778576101e2565b8063a05b5e3c14610622578063a22cb4651461065e578063b88d4fde14610686578063c87b56dd146106ae576101e2565b80638a025219116100d05780638a0252191461056a5780638da5cb5b1461059257806395d89b41146105bc5780639d2bc642146105e6576101e2565b806370a08231146104c6578063715018a6146105025780637761bb77146105185780637a4bf6d614610540576101e2565b806323b872dd116101795780635a20e1ac116101485780635a20e1ac1461041e5780636352211e146104465780636a627842146104825780636c1a17791461049e576101e2565b806323b872dd1461036a57806333a345711461039257806342842e0e146103ba5780634f558e79146103e2576101e2565b8063095ea7b3116101b5578063095ea7b3146102b257806311d9ddfa146102da57806318160ddd1461031657806318aa244f14610340576101e2565b806301ffc9a7146101e657806306fdde0314610222578063075461721461024c578063081812fc14610276575b5f5ffd5b3480156101f1575f5ffd5b5061020c60048036038101906102079190612462565b6107a0565b60405161021991906124a7565b60405180910390f35b34801561022d575f5ffd5b50610236610800565b6040516102439190612530565b60405180910390f35b348015610257575f5ffd5b5061026061088f565b60405161026d91906125ca565b60405180910390f35b348015610281575f5ffd5b5061029c60048036038101906102979190612616565b6108b4565b6040516102a99190612661565b60405180910390f35b3480156102bd575f5ffd5b506102d860048036038101906102d391906126a4565b610935565b005b3480156102e5575f5ffd5b5061030060048036038101906102fb9190612616565b610a4b565b60405161030d91906124a7565b60405180910390f35b348015610321575f5ffd5b5061032a610a68565b60405161033791906126f1565b60405180910390f35b34801561034b575f5ffd5b50610354610a6e565b6040516103619190612530565b60405180910390f35b348015610375575f5ffd5b50610390600480360381019061038b919061270a565b610afa565b005b34801561039d575f5ffd5b506103b860048036038101906103b3919061275a565b610b5a565b005b3480156103c5575f5ffd5b506103e060048036038101906103db919061270a565b610c19565b005b3480156103ed575f5ffd5b5061040860048036038101906104039190612616565b610c38565b60405161041591906124a7565b60405180910390f35b348015610429575f5ffd5b50610444600480360381019061043f9190612616565b610c49565b005b348015610451575f5ffd5b5061046c60048036038101906104679190612616565b610d99565b6040516104799190612661565b60405180910390f35b61049c6004803603810190610497919061275a565b610e45565b005b3480156104a9575f5ffd5b506104c460048036038101906104bf919061275a565b610f1c565b005b3480156104d1575f5ffd5b506104ec60048036038101906104e7919061275a565b610fdb565b6040516104f991906126f1565b60405180910390f35b34801561050d575f5ffd5b5061051661108f565b005b348015610523575f5ffd5b5061053e600480360381019061053991906127e6565b611116565b005b34801561054b575f5ffd5b506105546111c8565b6040516105619190612661565b60405180910390f35b348015610575575f5ffd5b50610590600480360381019061058b9190612864565b6111ed565b005b34801561059d575f5ffd5b506105a661127f565b6040516105b39190612661565b60405180910390f35b3480156105c7575f5ffd5b506105d06112a7565b6040516105dd9190612530565b60405180910390f35b3480156105f1575f5ffd5b5061060c60048036038101906106079190612616565b611337565b6040516106199190612530565b60405180910390f35b34801561062d575f5ffd5b50610648600480360381019061064391906129d7565b6113d2565b6040516106559190612530565b60405180910390f35b348015610669575f5ffd5b50610684600480360381019061067f9190612a48565b611485565b005b348015610691575f5ffd5b506106ac60048036038101906106a79190612b24565b611600565b005b3480156106b9575f5ffd5b506106d460048036038101906106cf9190612616565b611662565b6040516106e19190612530565b60405180910390f35b3480156106f5575f5ffd5b50610710600480360381019061070b9190612ba4565b611707565b60405161071d91906124a7565b60405180910390f35b348015610731575f5ffd5b5061073a611795565b6040516107479190612c02565b60405180910390f35b34801561075b575f5ffd5b506107766004803603810190610771919061275a565b6117ba565b005b348015610783575f5ffd5b5061079e60048036038101906107999190612c56565b6118b0565b005b5f634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107f957506107f88261196f565b5b9050919050565b60605f805461080e90612cae565b80601f016020809104026020016040519081016040528092919081815260200182805461083a90612cae565b80156108855780601f1061085c57610100808354040283529160200191610885565b820191905f5260205f20905b81548152906001019060200180831161086857829003601f168201915b5050505050905090565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6108be82611a50565b6108fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f490612d4e565b60405180910390fd5b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61093f82610d99565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690612ddc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ce611ab8565b73ffffffffffffffffffffffffffffffffffffffff1614806109fd57506109fc816109f7611ab8565b611707565b5b610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3390612e6a565b60405180910390fd5b610a468383611abf565b505050565b600e602052805f5260405f205f915054906101000a900460ff1681565b60075481565b60088054610a7b90612cae565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa790612cae565b8015610af25780601f10610ac957610100808354040283529160200191610af2565b820191905f5260205f20905b815481529060010190602001808311610ad557829003601f168201915b505050505081565b610b0b610b05611ab8565b82611b75565b610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190612ef8565b60405180910390fd5b610b55838383611c51565b505050565b610b62611ab8565b73ffffffffffffffffffffffffffffffffffffffff16610b8061127f565b73ffffffffffffffffffffffffffffffffffffffff1614610bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcd90612f60565b60405180910390fd5b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610c3383838360405180602001604052805f815250611600565b505050565b5f610c4282611a50565b9050919050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf90612fee565b60405180910390fd5b600e5f8281526020019081526020015f205f9054906101000a900460ff1615610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90613056565b60405180910390fd5b6001600e5f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce781604051610d8e91906126f1565b60405180910390a150565b5f5f60025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e33906130e4565b60405180910390fd5b80915050919050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb9061314c565b60405180910390fd5b6008600c5f60075481526020019081526020015f209081610ef59190613328565b50610f0281600754611ea1565b60075f815480929190610f149061343a565b919050555050565b610f24611ab8565b73ffffffffffffffffffffffffffffffffffffffff16610f4261127f565b73ffffffffffffffffffffffffffffffffffffffff1614610f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f90612f60565b60405180910390fd5b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361104a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611041906134f1565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611097611ab8565b73ffffffffffffffffffffffffffffffffffffffff166110b561127f565b73ffffffffffffffffffffffffffffffffffffffff161461110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290612f60565b60405180910390fd5b6111145f611ebe565b565b61111e611ab8565b73ffffffffffffffffffffffffffffffffffffffff1661113c61127f565b73ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990612f60565b60405180910390fd5b8181600d86866040516111a692919061353d565b908152602001604051809103902091826111c192919061355f565b5050505050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111f5611ab8565b73ffffffffffffffffffffffffffffffffffffffff1661121361127f565b73ffffffffffffffffffffffffffffffffffffffff1614611269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126090612f60565b60405180910390fd5b81816008918261127a92919061355f565b505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112b690612cae565b80601f01602080910402602001604051908101604052809291908181526020018280546112e290612cae565b801561132d5780601f106113045761010080835404028352916020019161132d565b820191905f5260205f20905b81548152906001019060200180831161131057829003601f168201915b5050505050905090565b600c602052805f5260405f205f91509050805461135390612cae565b80601f016020809104026020016040519081016040528092919081815260200182805461137f90612cae565b80156113ca5780601f106113a1576101008083540402835291602001916113ca565b820191905f5260205f20905b8154815290600101906020018083116113ad57829003601f168201915b505050505081565b600d818051602081018201805184825260208301602085012081835280955050505050505f91509050805461140690612cae565b80601f016020809104026020016040519081016040528092919081815260200182805461143290612cae565b801561147d5780601f106114545761010080835404028352916020019161147d565b820191905f5260205f20905b81548152906001019060200180831161146057829003601f168201915b505050505081565b61148d611ab8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190613676565b60405180910390fd5b8060055f611506611ab8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115af611ab8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115f491906124a7565b60405180910390a35050565b61161161160b611ab8565b83611b75565b611650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164790612ef8565b60405180910390fd5b61165c84848484611f81565b50505050565b6060600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b81526004016116be91906126f1565b5f60405180830381865afa1580156116d8573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906117009190613702565b9050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117c2611ab8565b73ffffffffffffffffffffffffffffffffffffffff166117e061127f565b73ffffffffffffffffffffffffffffffffffffffff1614611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d90612f60565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b906137b9565b60405180910390fd5b6118ad81611ebe565b50565b6118b8611ab8565b73ffffffffffffffffffffffffffffffffffffffff166118d661127f565b73ffffffffffffffffffffffffffffffffffffffff161461192c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192390612f60565b60405180910390fd5b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a3957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a495750611a4882611fdd565b5b9050919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff1660025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b2f83610d99565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f611b7f82611a50565b611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb590613847565b60405180910390fd5b5f611bc883610d99565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c3757508373ffffffffffffffffffffffffffffffffffffffff16611c1f846108b4565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c485750611c478185611707565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c7182610d99565b73ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe906138d5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2c90613963565b60405180910390fd5b611d40838383612046565b611d4a5f82611abf565b600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d979190613981565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611deb91906139b4565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611eba828260405180602001604052805f81525061204b565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f8c848484611c51565b611f98848484846120a5565b611fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fce90613a57565b60405180910390fd5b50505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6120558383612227565b6120615f8484846120a5565b6120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209790613a57565b60405180910390fd5b505050565b5f6120c58473ffffffffffffffffffffffffffffffffffffffff166123eb565b1561221a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120ee611ab8565b8786866040518563ffffffff1660e01b81526004016121109493929190613ac7565b6020604051808303815f875af192505050801561214b57506040513d601f19601f820116820180604052508101906121489190613b25565b60015b6121ca573d805f8114612179576040519150601f19603f3d011682016040523d82523d5f602084013e61217e565b606091505b505f8151036121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b990613a57565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061221f565b600190505b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90613b9a565b60405180910390fd5b61229e81611a50565b156122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d590613c02565b60405180910390fd5b6122e95f8383612046565b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461233691906139b4565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f5f823b90505f8111915050919050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124418161240d565b811461244b575f5ffd5b50565b5f8135905061245c81612438565b92915050565b5f6020828403121561247757612476612405565b5b5f6124848482850161244e565b91505092915050565b5f8115159050919050565b6124a18161248d565b82525050565b5f6020820190506124ba5f830184612498565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612502826124c0565b61250c81856124ca565b935061251c8185602086016124da565b612525816124e8565b840191505092915050565b5f6020820190508181035f83015261254881846124f8565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61259261258d61258884612550565b61256f565b612550565b9050919050565b5f6125a382612578565b9050919050565b5f6125b482612599565b9050919050565b6125c4816125aa565b82525050565b5f6020820190506125dd5f8301846125bb565b92915050565b5f819050919050565b6125f5816125e3565b81146125ff575f5ffd5b50565b5f81359050612610816125ec565b92915050565b5f6020828403121561262b5761262a612405565b5b5f61263884828501612602565b91505092915050565b5f61264b82612550565b9050919050565b61265b81612641565b82525050565b5f6020820190506126745f830184612652565b92915050565b61268381612641565b811461268d575f5ffd5b50565b5f8135905061269e8161267a565b92915050565b5f5f604083850312156126ba576126b9612405565b5b5f6126c785828601612690565b92505060206126d885828601612602565b9150509250929050565b6126eb816125e3565b82525050565b5f6020820190506127045f8301846126e2565b92915050565b5f5f5f6060848603121561272157612720612405565b5b5f61272e86828701612690565b935050602061273f86828701612690565b925050604061275086828701612602565b9150509250925092565b5f6020828403121561276f5761276e612405565b5b5f61277c84828501612690565b91505092915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126127a6576127a5612785565b5b8235905067ffffffffffffffff8111156127c3576127c2612789565b5b6020830191508360018202830111156127df576127de61278d565b5b9250929050565b5f5f5f5f604085870312156127fe576127fd612405565b5b5f85013567ffffffffffffffff81111561281b5761281a612409565b5b61282787828801612791565b9450945050602085013567ffffffffffffffff81111561284a57612849612409565b5b61285687828801612791565b925092505092959194509250565b5f5f6020838503121561287a57612879612405565b5b5f83013567ffffffffffffffff81111561289757612896612409565b5b6128a385828601612791565b92509250509250929050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6128e9826124e8565b810181811067ffffffffffffffff82111715612908576129076128b3565b5b80604052505050565b5f61291a6123fc565b905061292682826128e0565b919050565b5f67ffffffffffffffff821115612945576129446128b3565b5b61294e826124e8565b9050602081019050919050565b828183375f83830152505050565b5f61297b6129768461292b565b612911565b905082815260208101848484011115612997576129966128af565b5b6129a284828561295b565b509392505050565b5f82601f8301126129be576129bd612785565b5b81356129ce848260208601612969565b91505092915050565b5f602082840312156129ec576129eb612405565b5b5f82013567ffffffffffffffff811115612a0957612a08612409565b5b612a15848285016129aa565b91505092915050565b612a278161248d565b8114612a31575f5ffd5b50565b5f81359050612a4281612a1e565b92915050565b5f5f60408385031215612a5e57612a5d612405565b5b5f612a6b85828601612690565b9250506020612a7c85828601612a34565b9150509250929050565b5f67ffffffffffffffff821115612aa057612a9f6128b3565b5b612aa9826124e8565b9050602081019050919050565b5f612ac8612ac384612a86565b612911565b905082815260208101848484011115612ae457612ae36128af565b5b612aef84828561295b565b509392505050565b5f82601f830112612b0b57612b0a612785565b5b8135612b1b848260208601612ab6565b91505092915050565b5f5f5f5f60808587031215612b3c57612b3b612405565b5b5f612b4987828801612690565b9450506020612b5a87828801612690565b9350506040612b6b87828801612602565b925050606085013567ffffffffffffffff811115612b8c57612b8b612409565b5b612b9887828801612af7565b91505092959194509250565b5f5f60408385031215612bba57612bb9612405565b5b5f612bc785828601612690565b9250506020612bd885828601612690565b9150509250929050565b5f612bec82612599565b9050919050565b612bfc81612be2565b82525050565b5f602082019050612c155f830184612bf3565b92915050565b5f612c2582612641565b9050919050565b612c3581612c1b565b8114612c3f575f5ffd5b50565b5f81359050612c5081612c2c565b92915050565b5f60208284031215612c6b57612c6a612405565b5b5f612c7884828501612c42565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612cc557607f821691505b602082108103612cd857612cd7612c81565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f612d38602c836124ca565b9150612d4382612cde565b604082019050919050565b5f6020820190508181035f830152612d6581612d2c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f612dc66021836124ca565b9150612dd182612d6c565b604082019050919050565b5f6020820190508181035f830152612df381612dba565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b5f612e546038836124ca565b9150612e5f82612dfa565b604082019050919050565b5f6020820190508181035f830152612e8181612e48565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f5f8201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b5f612ee26031836124ca565b9150612eed82612e88565b604082019050919050565b5f6020820190508181035f830152612f0f81612ed6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612f4a6020836124ca565b9150612f5582612f16565b602082019050919050565b5f6020820190508181035f830152612f7781612f3e565b9050919050565b7f4f6e6c79206275726e20636572656d6f6e792063616e207573652061677265655f8201527f6d656e7400000000000000000000000000000000000000000000000000000000602082015250565b5f612fd86024836124ca565b9150612fe382612f7e565b604082019050919050565b5f6020820190508181035f83015261300581612fcc565b9050919050565b7f41677265656d656e7420616c72656164792075736564000000000000000000005f82015250565b5f6130406016836124ca565b915061304b8261300c565b602082019050919050565b5f6020820190508181035f83015261306d81613034565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e65786973745f8201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b5f6130ce6029836124ca565b91506130d982613074565b604082019050919050565b5f6020820190508181035f8301526130fb816130c2565b9050919050565b7f4f6e6c79206d696e74696e6720616464726573732063616e206d696e740000005f82015250565b5f613136601d836124ca565b915061314182613102565b602082019050919050565b5f6020820190508181035f8301526131638161312a565b9050919050565b5f8154905061317881612cae565b9050919050565b5f819050815f5260205f209050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026131ed7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826131b2565b6131f786836131b2565b95508019841693508086168417925050509392505050565b5f61322961322461321f846125e3565b61256f565b6125e3565b9050919050565b5f819050919050565b6132428361320f565b61325661324e82613230565b8484546131be565b825550505050565b5f5f905090565b61326d61325e565b613278818484613239565b505050565b5b8181101561329b576132905f82613265565b60018101905061327e565b5050565b601f8211156132e0576132b18161317f565b6132ba846131a3565b810160208510156132c9578190505b6132dd6132d5856131a3565b83018261327d565b50505b505050565b5f82821c905092915050565b5f6133005f19846008026132e5565b1980831691505092915050565b5f61331883836132f1565b9150826002028217905092915050565b81810361333657505061340b565b61333f8261316a565b67ffffffffffffffff811115613358576133576128b3565b5b6133628254612cae565b61336d82828561329f565b5f601f83116001811461339a575f8415613388578287015490505b613392858261330d565b865550613404565b601f1984166133a887613191565b96506133b38661317f565b5f5b828110156133da578489015482556001820191506001850194506020810190506133b5565b868310156133f757848901546133f3601f8916826132f1565b8355505b6001600288020188555050505b5050505050505b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613444826125e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134765761347561340d565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a655f8201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b5f6134db602a836124ca565b91506134e682613481565b604082019050919050565b5f6020820190508181035f830152613508816134cf565b9050919050565b5f81905092915050565b5f613524838561350f565b935061353183858461295b565b82840190509392505050565b5f613549828486613519565b91508190509392505050565b5f82905092915050565b6135698383613555565b67ffffffffffffffff811115613582576135816128b3565b5b61358c8254612cae565b61359782828561329f565b5f601f8311600181146135c4575f84156135b2578287013590505b6135bc858261330d565b865550613623565b601f1984166135d28661317f565b5f5b828110156135f9578489013582556001820191506020850194506020810190506135d4565b868310156136165784890135613612601f8916826132f1565b8355505b6001600288020188555050505b50505050505050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f6136606019836124ca565b915061366b8261362c565b602082019050919050565b5f6020820190508181035f83015261368d81613654565b9050919050565b5f6136a66136a18461292b565b612911565b9050828152602081018484840111156136c2576136c16128af565b5b6136cd8482856124da565b509392505050565b5f82601f8301126136e9576136e8612785565b5b81516136f9848260208601613694565b91505092915050565b5f6020828403121561371757613716612405565b5b5f82015167ffffffffffffffff81111561373457613733612409565b5b613740848285016136d5565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6137a36026836124ca565b91506137ae82613749565b604082019050919050565b5f6020820190508181035f8301526137d081613797565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f613831602c836124ca565b915061383c826137d7565b604082019050919050565b5f6020820190508181035f83015261385e81613825565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e207468617420695f8201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b5f6138bf6029836124ca565b91506138ca82613865565b604082019050919050565b5f6020820190508181035f8301526138ec816138b3565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61394d6024836124ca565b9150613958826138f3565b604082019050919050565b5f6020820190508181035f83015261397a81613941565b9050919050565b5f61398b826125e3565b9150613996836125e3565b92508282039050818111156139ae576139ad61340d565b5b92915050565b5f6139be826125e3565b91506139c9836125e3565b92508282019050808211156139e1576139e061340d565b5b92915050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f613a416032836124ca565b9150613a4c826139e7565b604082019050919050565b5f6020820190508181035f830152613a6e81613a35565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f613a9982613a75565b613aa38185613a7f565b9350613ab38185602086016124da565b613abc816124e8565b840191505092915050565b5f608082019050613ada5f830187612652565b613ae76020830186612652565b613af460408301856126e2565b8181036060830152613b068184613a8f565b905095945050505050565b5f81519050613b1f81612438565b92915050565b5f60208284031215613b3a57613b39612405565b5b5f613b4784828501613b11565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f613b846020836124ca565b9150613b8f82613b50565b602082019050919050565b5f6020820190508181035f830152613bb181613b78565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f613bec601c836124ca565b9150613bf782613bb8565b602082019050919050565b5f6020820190508181035f830152613c1981613be0565b905091905056fea26469706673582212206fb81b8693ce1d33aee6847b3fb3384afea1554e4a1a041b0dcc0e6f4adf86ae64736f6c634300081c00336080604052348015600e575f5ffd5b50335f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506114cc8061005b5f395ff3fe608060405234801561000f575f5ffd5b5060043610610034575f3560e01c80637db3a94614610038578063c87b56dd14610056575b5f5ffd5b610040610086565b60405161004d91906106d9565b60405180910390f35b610070600480360381019061006b9190610736565b6100aa565b60405161007d91906107d1565b60405180910390f35b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60605f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311d9ddfa846040518263ffffffff1660e01b81526004016101069190610800565b602060405180830381865afa158015610121573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610145919061084e565b90505f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639d2bc642856040518263ffffffff1660e01b81526004016101a19190610800565b5f60405180830381865afa1580156101bb573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906101e39190610997565b90505f82610226576040518060400160405280600481526020017f236666660000000000000000000000000000000000000000000000000000000081525061025d565b6040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152505b90505f836102a0576040518060400160405280600481526020017f23303030000000000000000000000000000000000000000000000000000000008152506102d7565b6040518060400160405280600781526020017f23656637393166000000000000000000000000000000000000000000000000008152505b90505f610308828484876040516020016102f49493929190610d06565b6040516020818303038152906040526104cf565b6040516020016103189190610dc4565b60405160208183030381529060405290505f8460405160200161033b9190610e7b565b6040516020818303038152906040528661038a576040518060400160405280600581526020017f46616c73650000000000000000000000000000000000000000000000000000008152506103c1565b6040518060400160405280600481526020017f54727565000000000000000000000000000000000000000000000000000000008152505b6040516020016103d19190610f41565b6040516020818303038152906040526040516020016103f1929190610fbd565b604051602081830303815290604052905084825f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a05b5e3c886040518263ffffffff1660e01b815260040161045d91906107d1565b5f60405180830381865afa158015610477573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061049f9190610997565b836040516020016104b394939291906112e4565b6040516020818303038152906040529650505050505050919050565b60605f825190505f81036104f45760405180602001604052805f81525091505061065a565b5f60036002836105049190611385565b61050e91906113e5565b600461051a9190611415565b90505f60208261052a9190611385565b67ffffffffffffffff81111561054357610542610881565b5b6040519080825280601f01601f1916602001820160405280156105755781602001600182028036833780820191505090505b5090505f60405180606001604052806040815260200161145760409139905060018101602083015f5b868110156106175760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061059e565b50600386066001811461063157600281146106415761064c565b613d3d60f01b600283035261064c565b603d60f81b60018303525b508484525050819450505050505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f6106a161069c6106978461065f565b61067e565b61065f565b9050919050565b5f6106b282610687565b9050919050565b5f6106c3826106a8565b9050919050565b6106d3816106b9565b82525050565b5f6020820190506106ec5f8301846106ca565b92915050565b5f604051905090565b5f5ffd5b5f5ffd5b5f819050919050565b61071581610703565b811461071f575f5ffd5b50565b5f813590506107308161070c565b92915050565b5f6020828403121561074b5761074a6106fb565b5b5f61075884828501610722565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6107a382610761565b6107ad818561076b565b93506107bd81856020860161077b565b6107c681610789565b840191505092915050565b5f6020820190508181035f8301526107e98184610799565b905092915050565b6107fa81610703565b82525050565b5f6020820190506108135f8301846107f1565b92915050565b5f8115159050919050565b61082d81610819565b8114610837575f5ffd5b50565b5f8151905061084881610824565b92915050565b5f60208284031215610863576108626106fb565b5b5f6108708482850161083a565b91505092915050565b5f5ffd5b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6108b782610789565b810181811067ffffffffffffffff821117156108d6576108d5610881565b5b80604052505050565b5f6108e86106f2565b90506108f482826108ae565b919050565b5f67ffffffffffffffff82111561091357610912610881565b5b61091c82610789565b9050602081019050919050565b5f61093b610936846108f9565b6108df565b9050828152602081018484840111156109575761095661087d565b5b61096284828561077b565b509392505050565b5f82601f83011261097e5761097d610879565b5b815161098e848260208601610929565b91505092915050565b5f602082840312156109ac576109ab6106fb565b5b5f82015167ffffffffffffffff8111156109c9576109c86106ff565b5b6109d58482850161096a565b91505092915050565b5f81905092915050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f32305f8201527f30302f737667222076696577426f783d22302030203835302031313030223e3c60208201527f7374796c653e746578747b666f6e743a626f6c6420353070782073616e732d7360408201527f657269663b66696c6c3a00000000000000000000000000000000000000000000606082015250565b5f610a8e606a836109de565b9150610a99826109e8565b606a82019050919050565b5f610aae82610761565b610ab881856109de565b9350610ac881856020860161077b565b80840191505092915050565b7f3b746578742d616e63686f723a206d6964646c657d3c2f7374796c653e3c72655f8201527f63742077696474683d2238353022206865696768743d22313130302220783d2260208201527f302220793d2230222066696c6c3d220000000000000000000000000000000000604082015250565b5f610b54604f836109de565b9150610b5f82610ad4565b604f82019050919050565b7f22207374726f6b653d226e6f6e65222f3e3c7265637420783d223135302220795f8201527f3d22313530222077696474683d2235353022206865696768743d22383030222060208201527f7374796c653d2266696c6c3a6e6f6e653b7374726f6b653a0000000000000000604082015250565b5f610bea6058836109de565b9150610bf582610b6a565b605882019050919050565b7f3b7374726f6b652d77696474683a372e357078222f3e3c7465787420783d22345f8201527f32352220793d22343530223e4255524e3c2f746578743e3c7465787420783d2260208201527f3432352220793d22353530223e41475245454d454e543c2f746578743e3c746560408201527f787420783d223432352220793d22363530223e76000000000000000000000000606082015250565b5f610ca66074836109de565b9150610cb182610c00565b607482019050919050565b7f3c2f746578743e3c2f7376673e000000000000000000000000000000000000005f82015250565b5f610cf0600d836109de565b9150610cfb82610cbc565b600d82019050919050565b5f610d1082610a82565b9150610d1c8287610aa4565b9150610d2782610b48565b9150610d338286610aa4565b9150610d3e82610bde565b9150610d4a8285610aa4565b9150610d5582610c9a565b9150610d618284610aa4565b9150610d6c82610ce4565b915081905095945050505050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000005f82015250565b5f610dae601a836109de565b9150610db982610d7a565b601a82019050919050565b5f610dce82610da2565b9150610dda8284610aa4565b915081905092915050565b7f7b202274726169745f74797065223a202241677265656d656e742056657273695f8201527f6f6e222c202276616c7565223a20220000000000000000000000000000000000602082015250565b5f610e3f602f836109de565b9150610e4a82610de5565b602f82019050919050565b7f22207d2c00000000000000000000000000000000000000000000000000000000815250565b5f610e8582610e33565b9150610e918284610aa4565b9150610e9c82610e55565b60048201915081905092915050565b7f7b202274726169745f74797065223a202241677265656d656e742055736564225f8201527f2c202276616c7565223a20220000000000000000000000000000000000000000602082015250565b5f610f05602c836109de565b9150610f1082610eab565b602c82019050919050565b7f22207d0000000000000000000000000000000000000000000000000000000000815250565b5f610f4b82610ef9565b9150610f578284610aa4565b9150610f6282610f1b565b60038201915081905092915050565b7f5b00000000000000000000000000000000000000000000000000000000000000815250565b7f5d00000000000000000000000000000000000000000000000000000000000000815250565b5f610fc782610f71565b600182019150610fd78285610aa4565b9150610fe38284610aa4565b9150610fee82610f97565b6001820191508190509392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d5f8201527f65223a20224275726e2041677265656d656e7420760000000000000000000000602082015250565b5f6110586035836109de565b915061106382610ffe565b603582019050919050565b7f222c20226465736372697074696f6e223a202242792070757263686173696e675f8201527f207468697320746f6b656e20796f7520696d706c696369746c7920616772656560208201527f20746f20746865207465726d73206f6620746869732061677265656d656e742e60408201527f204f776e657273686970206f662074686973204e465420646f6573206e6f742060608201527f67756172616e7465652070617274696369706174696f6e20696e20612042757260808201527f6e20436572656d6f6e792e2050617274696369706174696f6e207368616c6c2060a08201527f6265206c65667420746f207468652066756c6c2064697363726574696f6e206f60c08201527f6620746865204275726e204167656e742e222c2022696d616765223a2022000060e082015250565b5f6111ac60fe836109de565b91506111b78261106e565b60fe82019050919050565b5f81519050919050565b5f81905092915050565b5f6111e0826111c2565b6111ea81856111cc565b93506111fa81856020860161077b565b80840191505092915050565b7f222c2022616e696d6174696f6e5f75726c223a202200000000000000000000005f82015250565b5f61123a6015836109de565b915061124582611206565b601582019050919050565b7f222c202261747472696275746573223a000000000000000000000000000000005f82015250565b5f6112846010836109de565b915061128f82611250565b601082019050919050565b7f7d000000000000000000000000000000000000000000000000000000000000005f82015250565b5f6112ce6001836109de565b91506112d98261129a565b600182019050919050565b5f6112ee8261104c565b91506112fa8287610aa4565b9150611305826111a0565b915061131182866111d6565b915061131c8261122e565b91506113288285610aa4565b915061133382611278565b915061133f8284610aa4565b915061134a826112c2565b915081905095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61138f82610703565b915061139a83610703565b92508282019050808211156113b2576113b1611358565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6113ef82610703565b91506113fa83610703565b92508261140a576114096113b8565b5b828204905092915050565b5f61141f82610703565b915061142a83610703565b925082820261143881610703565b9150828204841483151761144f5761144e611358565b5b509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa264697066735822122055b3849a04f3a6f1802a3f5934604733b3e39105228bf7873e8b35f6bb28549364736f6c634300081c00336080604052662386f26fc100005f553480156018575f5ffd5b503360015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610894806100665f395ff3fe608060405260043610610049575f3560e01c80631249c58b1461004d5780632e1a7d4d1461005757806391b7f5ed1461007f578063a035b1fe146100a7578063accca1dc146100d1575b5f5ffd5b6100556100fb565b005b348015610062575f5ffd5b5061007d60048036038101906100789190610561565b6101c8565b005b34801561008a575f5ffd5b506100a560048036038101906100a09190610561565b6103fc565b005b3480156100b2575f5ffd5b506100bb610500565b6040516100c8919061059b565b60405180910390f35b3480156100dc575f5ffd5b506100e5610505565b6040516100f2919061062e565b60405180910390f35b5f5434101561013f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610136906106a1565b60405180910390fd5b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b815260040161019991906106df565b5f604051808303815f87803b1580156101b0575f5ffd5b505af11580156101c2573d5f5f3e3d5ffd5b50505050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610232573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102569190610722565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102ba90610797565b60405180910390fd5b5f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561032e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103529190610722565b73ffffffffffffffffffffffffffffffffffffffff1682604051610375906107e2565b5f6040518083038185875af1925050503d805f81146103af576040519150601f19603f3d011682016040523d82523d5f602084013e6103b4565b606091505b50509050806103f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103ef90610840565b60405180910390fd5b5050565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610466573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048a9190610722565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ee90610797565b60405180910390fd5b805f8190555050565b5f5481565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5ffd5b5f819050919050565b6105408161052e565b811461054a575f5ffd5b50565b5f8135905061055b81610537565b92915050565b5f602082840312156105765761057561052a565b5b5f6105838482850161054d565b91505092915050565b6105958161052e565b82525050565b5f6020820190506105ae5f83018461058c565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f6105f66105f16105ec846105b4565b6105d3565b6105b4565b9050919050565b5f610607826105dc565b9050919050565b5f610618826105fd565b9050919050565b6106288161060e565b82525050565b5f6020820190506106415f83018461061f565b92915050565b5f82825260208201905092915050565b7f496e76616c69642076616c7565000000000000000000000000000000000000005f82015250565b5f61068b600d83610647565b915061069682610657565b602082019050919050565b5f6020820190508181035f8301526106b88161067f565b9050919050565b5f6106c9826105b4565b9050919050565b6106d9816106bf565b82525050565b5f6020820190506106f25f8301846106d0565b92915050565b610701816106bf565b811461070b575f5ffd5b50565b5f8151905061071c816106f8565b92915050565b5f602082840312156107375761073661052a565b5b5f6107448482850161070e565b91505092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f610781602083610647565b915061078c8261074d565b602082019050919050565b5f6020820190508181035f8301526107ae81610775565b9050919050565b5f81905092915050565b50565b5f6107cd5f836107b5565b91506107d8826107bf565b5f82019050919050565b5f6107ec826107c2565b9150819050919050565b7f5472616e73666572206661696c656400000000000000000000000000000000005f82015250565b5f61082a600f83610647565b9150610835826107f6565b602082019050919050565b5f6020820190508181035f8301526108578161081e565b905091905056fea2646970667358221220ee070aec328444c3bbc85445a12e1884c243b3404ce6615fd14551589f35e72164736f6c634300081c00330000000000000000000000000400b4d05090fb3da2d6857280ab7e7648bc544c
Deployed Bytecode
0x6080604052600436106101e2575f3560e01c806370a0823111610101578063a05b5e3c11610094578063e985e9c511610063578063e985e9c5146106ea578063eac989f814610726578063f2fde38b14610750578063fca3b5aa14610778576101e2565b8063a05b5e3c14610622578063a22cb4651461065e578063b88d4fde14610686578063c87b56dd146106ae576101e2565b80638a025219116100d05780638a0252191461056a5780638da5cb5b1461059257806395d89b41146105bc5780639d2bc642146105e6576101e2565b806370a08231146104c6578063715018a6146105025780637761bb77146105185780637a4bf6d614610540576101e2565b806323b872dd116101795780635a20e1ac116101485780635a20e1ac1461041e5780636352211e146104465780636a627842146104825780636c1a17791461049e576101e2565b806323b872dd1461036a57806333a345711461039257806342842e0e146103ba5780634f558e79146103e2576101e2565b8063095ea7b3116101b5578063095ea7b3146102b257806311d9ddfa146102da57806318160ddd1461031657806318aa244f14610340576101e2565b806301ffc9a7146101e657806306fdde0314610222578063075461721461024c578063081812fc14610276575b5f5ffd5b3480156101f1575f5ffd5b5061020c60048036038101906102079190612462565b6107a0565b60405161021991906124a7565b60405180910390f35b34801561022d575f5ffd5b50610236610800565b6040516102439190612530565b60405180910390f35b348015610257575f5ffd5b5061026061088f565b60405161026d91906125ca565b60405180910390f35b348015610281575f5ffd5b5061029c60048036038101906102979190612616565b6108b4565b6040516102a99190612661565b60405180910390f35b3480156102bd575f5ffd5b506102d860048036038101906102d391906126a4565b610935565b005b3480156102e5575f5ffd5b5061030060048036038101906102fb9190612616565b610a4b565b60405161030d91906124a7565b60405180910390f35b348015610321575f5ffd5b5061032a610a68565b60405161033791906126f1565b60405180910390f35b34801561034b575f5ffd5b50610354610a6e565b6040516103619190612530565b60405180910390f35b348015610375575f5ffd5b50610390600480360381019061038b919061270a565b610afa565b005b34801561039d575f5ffd5b506103b860048036038101906103b3919061275a565b610b5a565b005b3480156103c5575f5ffd5b506103e060048036038101906103db919061270a565b610c19565b005b3480156103ed575f5ffd5b5061040860048036038101906104039190612616565b610c38565b60405161041591906124a7565b60405180910390f35b348015610429575f5ffd5b50610444600480360381019061043f9190612616565b610c49565b005b348015610451575f5ffd5b5061046c60048036038101906104679190612616565b610d99565b6040516104799190612661565b60405180910390f35b61049c6004803603810190610497919061275a565b610e45565b005b3480156104a9575f5ffd5b506104c460048036038101906104bf919061275a565b610f1c565b005b3480156104d1575f5ffd5b506104ec60048036038101906104e7919061275a565b610fdb565b6040516104f991906126f1565b60405180910390f35b34801561050d575f5ffd5b5061051661108f565b005b348015610523575f5ffd5b5061053e600480360381019061053991906127e6565b611116565b005b34801561054b575f5ffd5b506105546111c8565b6040516105619190612661565b60405180910390f35b348015610575575f5ffd5b50610590600480360381019061058b9190612864565b6111ed565b005b34801561059d575f5ffd5b506105a661127f565b6040516105b39190612661565b60405180910390f35b3480156105c7575f5ffd5b506105d06112a7565b6040516105dd9190612530565b60405180910390f35b3480156105f1575f5ffd5b5061060c60048036038101906106079190612616565b611337565b6040516106199190612530565b60405180910390f35b34801561062d575f5ffd5b50610648600480360381019061064391906129d7565b6113d2565b6040516106559190612530565b60405180910390f35b348015610669575f5ffd5b50610684600480360381019061067f9190612a48565b611485565b005b348015610691575f5ffd5b506106ac60048036038101906106a79190612b24565b611600565b005b3480156106b9575f5ffd5b506106d460048036038101906106cf9190612616565b611662565b6040516106e19190612530565b60405180910390f35b3480156106f5575f5ffd5b50610710600480360381019061070b9190612ba4565b611707565b60405161071d91906124a7565b60405180910390f35b348015610731575f5ffd5b5061073a611795565b6040516107479190612c02565b60405180910390f35b34801561075b575f5ffd5b506107766004803603810190610771919061275a565b6117ba565b005b348015610783575f5ffd5b5061079e60048036038101906107999190612c56565b6118b0565b005b5f634906490660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107f957506107f88261196f565b5b9050919050565b60605f805461080e90612cae565b80601f016020809104026020016040519081016040528092919081815260200182805461083a90612cae565b80156108855780601f1061085c57610100808354040283529160200191610885565b820191905f5260205f20905b81548152906001019060200180831161086857829003601f168201915b5050505050905090565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f6108be82611a50565b6108fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f490612d4e565b60405180910390fd5b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f61093f82610d99565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690612ddc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109ce611ab8565b73ffffffffffffffffffffffffffffffffffffffff1614806109fd57506109fc816109f7611ab8565b611707565b5b610a3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3390612e6a565b60405180910390fd5b610a468383611abf565b505050565b600e602052805f5260405f205f915054906101000a900460ff1681565b60075481565b60088054610a7b90612cae565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa790612cae565b8015610af25780601f10610ac957610100808354040283529160200191610af2565b820191905f5260205f20905b815481529060010190602001808311610ad557829003601f168201915b505050505081565b610b0b610b05611ab8565b82611b75565b610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190612ef8565b60405180910390fd5b610b55838383611c51565b505050565b610b62611ab8565b73ffffffffffffffffffffffffffffffffffffffff16610b8061127f565b73ffffffffffffffffffffffffffffffffffffffff1614610bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcd90612f60565b60405180910390fd5b8060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610c3383838360405180602001604052805f815250611600565b505050565b5f610c4282611a50565b9050919050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf90612fee565b60405180910390fd5b600e5f8281526020019081526020015f205f9054906101000a900460ff1615610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90613056565b60405180910390fd5b6001600e5f8381526020019081526020015f205f6101000a81548160ff0219169083151502179055507ff8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce781604051610d8e91906126f1565b60405180910390a150565b5f5f60025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e33906130e4565b60405180910390fd5b80915050919050565b600b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ed4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecb9061314c565b60405180910390fd5b6008600c5f60075481526020019081526020015f209081610ef59190613328565b50610f0281600754611ea1565b60075f815480929190610f149061343a565b919050555050565b610f24611ab8565b73ffffffffffffffffffffffffffffffffffffffff16610f4261127f565b73ffffffffffffffffffffffffffffffffffffffff1614610f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f90612f60565b60405180910390fd5b80600a5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361104a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611041906134f1565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611097611ab8565b73ffffffffffffffffffffffffffffffffffffffff166110b561127f565b73ffffffffffffffffffffffffffffffffffffffff161461110b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110290612f60565b60405180910390fd5b6111145f611ebe565b565b61111e611ab8565b73ffffffffffffffffffffffffffffffffffffffff1661113c61127f565b73ffffffffffffffffffffffffffffffffffffffff1614611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118990612f60565b60405180910390fd5b8181600d86866040516111a692919061353d565b908152602001604051809103902091826111c192919061355f565b5050505050565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111f5611ab8565b73ffffffffffffffffffffffffffffffffffffffff1661121361127f565b73ffffffffffffffffffffffffffffffffffffffff1614611269576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126090612f60565b60405180910390fd5b81816008918261127a92919061355f565b505050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112b690612cae565b80601f01602080910402602001604051908101604052809291908181526020018280546112e290612cae565b801561132d5780601f106113045761010080835404028352916020019161132d565b820191905f5260205f20905b81548152906001019060200180831161131057829003601f168201915b5050505050905090565b600c602052805f5260405f205f91509050805461135390612cae565b80601f016020809104026020016040519081016040528092919081815260200182805461137f90612cae565b80156113ca5780601f106113a1576101008083540402835291602001916113ca565b820191905f5260205f20905b8154815290600101906020018083116113ad57829003601f168201915b505050505081565b600d818051602081018201805184825260208301602085012081835280955050505050505f91509050805461140690612cae565b80601f016020809104026020016040519081016040528092919081815260200182805461143290612cae565b801561147d5780601f106114545761010080835404028352916020019161147d565b820191905f5260205f20905b81548152906001019060200180831161146057829003601f168201915b505050505081565b61148d611ab8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190613676565b60405180910390fd5b8060055f611506611ab8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115af611ab8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115f491906124a7565b60405180910390a35050565b61161161160b611ab8565b83611b75565b611650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164790612ef8565b60405180910390fd5b61165c84848484611f81565b50505050565b6060600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b81526004016116be91906126f1565b5f60405180830381865afa1580156116d8573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906117009190613702565b9050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b600a5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6117c2611ab8565b73ffffffffffffffffffffffffffffffffffffffff166117e061127f565b73ffffffffffffffffffffffffffffffffffffffff1614611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d90612f60565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b906137b9565b60405180910390fd5b6118ad81611ebe565b50565b6118b8611ab8565b73ffffffffffffffffffffffffffffffffffffffff166118d661127f565b73ffffffffffffffffffffffffffffffffffffffff161461192c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192390612f60565b60405180910390fd5b80600b5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a3957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a495750611a4882611fdd565b5b9050919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff1660025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b2f83610d99565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f611b7f82611a50565b611bbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb590613847565b60405180910390fd5b5f611bc883610d99565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c3757508373ffffffffffffffffffffffffffffffffffffffff16611c1f846108b4565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c485750611c478185611707565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c7182610d99565b73ffffffffffffffffffffffffffffffffffffffff1614611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe906138d5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2c90613963565b60405180910390fd5b611d40838383612046565b611d4a5f82611abf565b600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d979190613981565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611deb91906139b4565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611eba828260405180602001604052805f81525061204b565b5050565b5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f8c848484611c51565b611f98848484846120a5565b611fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fce90613a57565b60405180910390fd5b50505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6120558383612227565b6120615f8484846120a5565b6120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209790613a57565b60405180910390fd5b505050565b5f6120c58473ffffffffffffffffffffffffffffffffffffffff166123eb565b1561221a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120ee611ab8565b8786866040518563ffffffff1660e01b81526004016121109493929190613ac7565b6020604051808303815f875af192505050801561214b57506040513d601f19601f820116820180604052508101906121489190613b25565b60015b6121ca573d805f8114612179576040519150601f19603f3d011682016040523d82523d5f602084013e61217e565b606091505b505f8151036121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b990613a57565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061221f565b600190505b949350505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228c90613b9a565b60405180910390fd5b61229e81611a50565b156122de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122d590613c02565b60405180910390fd5b6122e95f8383612046565b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461233691906139b4565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f5f823b90505f8111915050919050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6124418161240d565b811461244b575f5ffd5b50565b5f8135905061245c81612438565b92915050565b5f6020828403121561247757612476612405565b5b5f6124848482850161244e565b91505092915050565b5f8115159050919050565b6124a18161248d565b82525050565b5f6020820190506124ba5f830184612498565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612502826124c0565b61250c81856124ca565b935061251c8185602086016124da565b612525816124e8565b840191505092915050565b5f6020820190508181035f83015261254881846124f8565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f819050919050565b5f61259261258d61258884612550565b61256f565b612550565b9050919050565b5f6125a382612578565b9050919050565b5f6125b482612599565b9050919050565b6125c4816125aa565b82525050565b5f6020820190506125dd5f8301846125bb565b92915050565b5f819050919050565b6125f5816125e3565b81146125ff575f5ffd5b50565b5f81359050612610816125ec565b92915050565b5f6020828403121561262b5761262a612405565b5b5f61263884828501612602565b91505092915050565b5f61264b82612550565b9050919050565b61265b81612641565b82525050565b5f6020820190506126745f830184612652565b92915050565b61268381612641565b811461268d575f5ffd5b50565b5f8135905061269e8161267a565b92915050565b5f5f604083850312156126ba576126b9612405565b5b5f6126c785828601612690565b92505060206126d885828601612602565b9150509250929050565b6126eb816125e3565b82525050565b5f6020820190506127045f8301846126e2565b92915050565b5f5f5f6060848603121561272157612720612405565b5b5f61272e86828701612690565b935050602061273f86828701612690565b925050604061275086828701612602565b9150509250925092565b5f6020828403121561276f5761276e612405565b5b5f61277c84828501612690565b91505092915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f8401126127a6576127a5612785565b5b8235905067ffffffffffffffff8111156127c3576127c2612789565b5b6020830191508360018202830111156127df576127de61278d565b5b9250929050565b5f5f5f5f604085870312156127fe576127fd612405565b5b5f85013567ffffffffffffffff81111561281b5761281a612409565b5b61282787828801612791565b9450945050602085013567ffffffffffffffff81111561284a57612849612409565b5b61285687828801612791565b925092505092959194509250565b5f5f6020838503121561287a57612879612405565b5b5f83013567ffffffffffffffff81111561289757612896612409565b5b6128a385828601612791565b92509250509250929050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6128e9826124e8565b810181811067ffffffffffffffff82111715612908576129076128b3565b5b80604052505050565b5f61291a6123fc565b905061292682826128e0565b919050565b5f67ffffffffffffffff821115612945576129446128b3565b5b61294e826124e8565b9050602081019050919050565b828183375f83830152505050565b5f61297b6129768461292b565b612911565b905082815260208101848484011115612997576129966128af565b5b6129a284828561295b565b509392505050565b5f82601f8301126129be576129bd612785565b5b81356129ce848260208601612969565b91505092915050565b5f602082840312156129ec576129eb612405565b5b5f82013567ffffffffffffffff811115612a0957612a08612409565b5b612a15848285016129aa565b91505092915050565b612a278161248d565b8114612a31575f5ffd5b50565b5f81359050612a4281612a1e565b92915050565b5f5f60408385031215612a5e57612a5d612405565b5b5f612a6b85828601612690565b9250506020612a7c85828601612a34565b9150509250929050565b5f67ffffffffffffffff821115612aa057612a9f6128b3565b5b612aa9826124e8565b9050602081019050919050565b5f612ac8612ac384612a86565b612911565b905082815260208101848484011115612ae457612ae36128af565b5b612aef84828561295b565b509392505050565b5f82601f830112612b0b57612b0a612785565b5b8135612b1b848260208601612ab6565b91505092915050565b5f5f5f5f60808587031215612b3c57612b3b612405565b5b5f612b4987828801612690565b9450506020612b5a87828801612690565b9350506040612b6b87828801612602565b925050606085013567ffffffffffffffff811115612b8c57612b8b612409565b5b612b9887828801612af7565b91505092959194509250565b5f5f60408385031215612bba57612bb9612405565b5b5f612bc785828601612690565b9250506020612bd885828601612690565b9150509250929050565b5f612bec82612599565b9050919050565b612bfc81612be2565b82525050565b5f602082019050612c155f830184612bf3565b92915050565b5f612c2582612641565b9050919050565b612c3581612c1b565b8114612c3f575f5ffd5b50565b5f81359050612c5081612c2c565b92915050565b5f60208284031215612c6b57612c6a612405565b5b5f612c7884828501612c42565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680612cc557607f821691505b602082108103612cd857612cd7612c81565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f612d38602c836124ca565b9150612d4382612cde565b604082019050919050565b5f6020820190508181035f830152612d6581612d2c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f612dc66021836124ca565b9150612dd182612d6c565b604082019050919050565b5f6020820190508181035f830152612df381612dba565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b5f612e546038836124ca565b9150612e5f82612dfa565b604082019050919050565b5f6020820190508181035f830152612e8181612e48565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f5f8201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b5f612ee26031836124ca565b9150612eed82612e88565b604082019050919050565b5f6020820190508181035f830152612f0f81612ed6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f612f4a6020836124ca565b9150612f5582612f16565b602082019050919050565b5f6020820190508181035f830152612f7781612f3e565b9050919050565b7f4f6e6c79206275726e20636572656d6f6e792063616e207573652061677265655f8201527f6d656e7400000000000000000000000000000000000000000000000000000000602082015250565b5f612fd86024836124ca565b9150612fe382612f7e565b604082019050919050565b5f6020820190508181035f83015261300581612fcc565b9050919050565b7f41677265656d656e7420616c72656164792075736564000000000000000000005f82015250565b5f6130406016836124ca565b915061304b8261300c565b602082019050919050565b5f6020820190508181035f83015261306d81613034565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e65786973745f8201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b5f6130ce6029836124ca565b91506130d982613074565b604082019050919050565b5f6020820190508181035f8301526130fb816130c2565b9050919050565b7f4f6e6c79206d696e74696e6720616464726573732063616e206d696e740000005f82015250565b5f613136601d836124ca565b915061314182613102565b602082019050919050565b5f6020820190508181035f8301526131638161312a565b9050919050565b5f8154905061317881612cae565b9050919050565b5f819050815f5260205f209050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026131ed7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826131b2565b6131f786836131b2565b95508019841693508086168417925050509392505050565b5f61322961322461321f846125e3565b61256f565b6125e3565b9050919050565b5f819050919050565b6132428361320f565b61325661324e82613230565b8484546131be565b825550505050565b5f5f905090565b61326d61325e565b613278818484613239565b505050565b5b8181101561329b576132905f82613265565b60018101905061327e565b5050565b601f8211156132e0576132b18161317f565b6132ba846131a3565b810160208510156132c9578190505b6132dd6132d5856131a3565b83018261327d565b50505b505050565b5f82821c905092915050565b5f6133005f19846008026132e5565b1980831691505092915050565b5f61331883836132f1565b9150826002028217905092915050565b81810361333657505061340b565b61333f8261316a565b67ffffffffffffffff811115613358576133576128b3565b5b6133628254612cae565b61336d82828561329f565b5f601f83116001811461339a575f8415613388578287015490505b613392858261330d565b865550613404565b601f1984166133a887613191565b96506133b38661317f565b5f5b828110156133da578489015482556001820191506001850194506020810190506133b5565b868310156133f757848901546133f3601f8916826132f1565b8355505b6001600288020188555050505b5050505050505b565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f613444826125e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036134765761347561340d565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a655f8201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b5f6134db602a836124ca565b91506134e682613481565b604082019050919050565b5f6020820190508181035f830152613508816134cf565b9050919050565b5f81905092915050565b5f613524838561350f565b935061353183858461295b565b82840190509392505050565b5f613549828486613519565b91508190509392505050565b5f82905092915050565b6135698383613555565b67ffffffffffffffff811115613582576135816128b3565b5b61358c8254612cae565b61359782828561329f565b5f601f8311600181146135c4575f84156135b2578287013590505b6135bc858261330d565b865550613623565b601f1984166135d28661317f565b5f5b828110156135f9578489013582556001820191506020850194506020810190506135d4565b868310156136165784890135613612601f8916826132f1565b8355505b6001600288020188555050505b50505050505050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f6136606019836124ca565b915061366b8261362c565b602082019050919050565b5f6020820190508181035f83015261368d81613654565b9050919050565b5f6136a66136a18461292b565b612911565b9050828152602081018484840111156136c2576136c16128af565b5b6136cd8482856124da565b509392505050565b5f82601f8301126136e9576136e8612785565b5b81516136f9848260208601613694565b91505092915050565b5f6020828403121561371757613716612405565b5b5f82015167ffffffffffffffff81111561373457613733612409565b5b613740848285016136d5565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6137a36026836124ca565b91506137ae82613749565b604082019050919050565b5f6020820190508181035f8301526137d081613797565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f613831602c836124ca565b915061383c826137d7565b604082019050919050565b5f6020820190508181035f83015261385e81613825565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e207468617420695f8201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b5f6138bf6029836124ca565b91506138ca82613865565b604082019050919050565b5f6020820190508181035f8301526138ec816138b3565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61394d6024836124ca565b9150613958826138f3565b604082019050919050565b5f6020820190508181035f83015261397a81613941565b9050919050565b5f61398b826125e3565b9150613996836125e3565b92508282039050818111156139ae576139ad61340d565b5b92915050565b5f6139be826125e3565b91506139c9836125e3565b92508282019050808211156139e1576139e061340d565b5b92915050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f613a416032836124ca565b9150613a4c826139e7565b604082019050919050565b5f6020820190508181035f830152613a6e81613a35565b9050919050565b5f81519050919050565b5f82825260208201905092915050565b5f613a9982613a75565b613aa38185613a7f565b9350613ab38185602086016124da565b613abc816124e8565b840191505092915050565b5f608082019050613ada5f830187612652565b613ae76020830186612652565b613af460408301856126e2565b8181036060830152613b068184613a8f565b905095945050505050565b5f81519050613b1f81612438565b92915050565b5f60208284031215613b3a57613b39612405565b5b5f613b4784828501613b11565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f613b846020836124ca565b9150613b8f82613b50565b602082019050919050565b5f6020820190508181035f830152613bb181613b78565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f613bec601c836124ca565b9150613bf782613bb8565b602082019050919050565b5f6020820190508181035f830152613c1981613be0565b905091905056fea26469706673582212206fb81b8693ce1d33aee6847b3fb3384afea1554e4a1a041b0dcc0e6f4adf86ae64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000400B4D05090FB3DA2d6857280ab7e7648BC544c
-----Decoded View---------------
Arg [0] : ceremony (address): 0x0400B4D05090FB3DA2d6857280ab7e7648BC544c
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000400B4D05090FB3DA2d6857280ab7e7648BC544c
Deployed Bytecode Sourcemap
600:3073:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3481:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24508:98:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;792:33:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26019:217:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25557:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1176:45:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;646:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;680:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26883:330:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2812:106:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27279:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1782:96:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2431:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24211:235:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2047:260:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3385:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23949:205:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21789:92;;;;;;;;;;;;;:::i;:::-;;3074:175:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;730:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2922:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21157:85:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24670:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;896:59:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1028;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26303:290:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27524:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3254:127:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26659:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;761:27:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22030:189:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2709:98:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3481:190;3574:4;3615:10;3608:18;;3593:33;;;:11;:33;;;;:73;;;;3630:36;3654:11;3630:23;:36::i;:::-;3593:73;3586:80;;3481:190;;;:::o;24508:98:1:-;24562:13;24594:5;24587:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24508:98;:::o;792:33:0:-;;;;;;;;;;;;;:::o;26019:217:1:-;26095:7;26122:16;26130:7;26122;:16::i;:::-;26114:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26205:15;:24;26221:7;26205:24;;;;;;;;;;;;;;;;;;;;;26198:31;;26019:217;;;:::o;25557:401::-;25637:13;25653:23;25668:7;25653:14;:23::i;:::-;25637:39;;25700:5;25694:11;;:2;:11;;;25686:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25791:5;25775:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25800:37;25817:5;25824:12;:10;:12::i;:::-;25800:16;:37::i;:::-;25775:62;25754:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;25930:21;25939:2;25943:7;25930:8;:21::i;:::-;25627:331;25557:401;;:::o;1176:45:0:-;;;;;;;;;;;;;;;;;;;;;;:::o;646:30::-;;;;:::o;680:46::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26883:330:1:-;27072:41;27091:12;:10;:12::i;:::-;27105:7;27072:18;:41::i;:::-;27064:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27178:28;27188:4;27194:2;27198:7;27178:9;:28::i;:::-;26883:330;;;:::o;2812:106:0:-;21380:12:1;:10;:12::i;:::-;21369:23;;:7;:5;:7::i;:::-;:23;;;21361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2900:13:0::1;2885:12;;:28;;;;;;;;;;;;;;;;;;2812:106:::0;:::o;27279:179:1:-;27412:39;27429:4;27435:2;27439:7;27412:39;;;;;;;;;;;;:16;:39::i;:::-;27279:179;;;:::o;1782:96:0:-;1838:4;1857:16;1865:7;1857;:16::i;:::-;1850:23;;1782:96;;;:::o;2431:273::-;2512:12;;;;;;;;;;;2498:26;;:10;:26;;;2490:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2580:13;:22;2594:7;2580:22;;;;;;;;;;;;;;;;;;;;;2579:23;2571:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2661:4;2636:13;:22;2650:7;2636:22;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;2676:23;2691:7;2676:23;;;;;;:::i;:::-;;;;;;;;2431:273;:::o;24211:235:1:-;24283:7;24302:13;24318:7;:16;24326:7;24318:16;;;;;;;;;;;;;;;;;;;;;24302:32;;24369:1;24352:19;;:5;:19;;;24344:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24434:5;24427:12;;;24211:235;;;:::o;2047:260:0:-;2133:6;;;;;;;;;;;2111:29;;:10;:29;;;2103:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;2222:22;2181:25;:38;2207:11;;2181:38;;;;;;;;;;;:63;;;;;;:::i;:::-;;2250:33;2260:9;2271:11;;2250:9;:33::i;:::-;2289:11;;:13;;;;;;;;;:::i;:::-;;;;;;2047:260;:::o;3385:92::-;21380:12:1;:10;:12::i;:::-;21369:23;;:7;:5;:7::i;:::-;:23;;;21361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3465:6:0::1;3442:3;;:30;;;;;;;;;;;;;;;;;;3385:92:::0;:::o;23949:205:1:-;24021:7;24065:1;24048:19;;:5;:19;;;24040:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24131:9;:16;24141:5;24131:16;;;;;;;;;;;;;;;;24124:23;;23949:205;;;:::o;21789:92::-;21380:12;:10;:12::i;:::-;21369:23;;:7;:5;:7::i;:::-;:23;;;21361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21853:21:::1;21871:1;21853:9;:21::i;:::-;21789:92::o:0;3074:175:0:-;21380:12:1;:10;:12::i;:::-;21369:23;;:7;:5;:7::i;:::-;:23;;;21361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3236:8:0::1;;3189:26;3216:16;;3189:44;;;;;;;:::i;:::-;;;;;;;;;;;;;:55;;;;;;;:::i;:::-;;3074:175:::0;;;;:::o;730:27::-;;;;;;;;;;;;;:::o;2922:147::-;21380:12:1;:10;:12::i;:::-;21369:23;;:7;:5;:7::i;:::-;:23;;;21361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3041:23:0::1;;3016:22;:48;;;;;;;:::i;:::-;;2922:147:::0;;:::o;21157:85:1:-;21203:7;21229:6;;;;;;;;;;;21222:13;;21157:85;:::o;24670:102::-;24726:13;24758:7;24751:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24670:102;:::o;896:59:0:-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1028:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26303:290:1:-;26417:12;:10;:12::i;:::-;26405:24;;:8;:24;;;26397:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26515:8;26470:18;:32;26489:12;:10;:12::i;:::-;26470:32;;;;;;;;;;;;;;;:42;26503:8;26470:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26567:8;26538:48;;26553:12;:10;:12::i;:::-;26538:48;;;26577:8;26538:48;;;;;;:::i;:::-;;;;;;;;26303:290;;:::o;27524:320::-;27693:41;27712:12;:10;:12::i;:::-;27726:7;27693:18;:41::i;:::-;27685:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27798:39;27812:4;27818:2;27822:7;27831:5;27798:13;:39::i;:::-;27524:320;;;;:::o;3254:127:0:-;3327:13;3355:3;;;;;;;;;;;:12;;;3368:7;3355:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3348:28;;3254:127;;;:::o;26659:162:1:-;26756:4;26779:18;:25;26798:5;26779:25;;;;;;;;;;;;;;;:35;26805:8;26779:35;;;;;;;;;;;;;;;;;;;;;;;;;26772:42;;26659:162;;;;:::o;761:27:0:-;;;;;;;;;;;;;:::o;22030:189:1:-;21380:12;:10;:12::i;:::-;21369:23;;:7;:5;:7::i;:::-;:23;;;21361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22138:1:::1;22118:22;;:8;:22;;::::0;22110:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22193:19;22203:8;22193:9;:19::i;:::-;22030:189:::0;:::o;2709:98:0:-;21380:12:1;:10;:12::i;:::-;21369:23;;:7;:5;:7::i;:::-;:23;;;21361:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2793:9:0::1;2784:6;;:18;;;;;;;;;;;;;;;;;;2709:98:::0;:::o;23590:300:1:-;23692:4;23742:25;23727:40;;;:11;:40;;;;:104;;;;23798:33;23783:48;;;:11;:48;;;;23727:104;:156;;;;23847:36;23871:11;23847:23;:36::i;:::-;23727:156;23708:175;;23590:300;;;:::o;29316:125::-;29381:4;29432:1;29404:30;;:7;:16;29412:7;29404:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29397:37;;29316:125;;;:::o;15379:96::-;15432:7;15458:10;15451:17;;15379:96;:::o;33167:171::-;33268:2;33241:15;:24;33257:7;33241:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33323:7;33319:2;33285:46;;33294:23;33309:7;33294:14;:23::i;:::-;33285:46;;;;;;;;;;;;33167:171;;:::o;29599:344::-;29692:4;29716:16;29724:7;29716;:16::i;:::-;29708:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29791:13;29807:23;29822:7;29807:14;:23::i;:::-;29791:39;;29859:5;29848:16;;:7;:16;;;:51;;;;29892:7;29868:31;;:20;29880:7;29868:11;:20::i;:::-;:31;;;29848:51;:87;;;;29903:32;29920:5;29927:7;29903:16;:32::i;:::-;29848:87;29840:96;;;29599:344;;;;:::o;32496:560::-;32650:4;32623:31;;:23;32638:7;32623:14;:23::i;:::-;:31;;;32615:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32732:1;32718:16;;:2;:16;;;32710:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32786:39;32807:4;32813:2;32817:7;32786:20;:39::i;:::-;32887:29;32904:1;32908:7;32887:8;:29::i;:::-;32946:1;32927:9;:15;32937:4;32927:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32974:1;32957:9;:13;32967:2;32957:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33004:2;32985:7;:16;32993:7;32985:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33041:7;33037:2;33022:27;;33031:4;33022:27;;;;;;;;;;;;32496:560;;;:::o;30273:108::-;30348:26;30358:2;30362:7;30348:26;;;;;;;;;;;;:9;:26::i;:::-;30273:108;;:::o;22225:169::-;22280:16;22299:6;;;;;;;;;;;22280:25;;22324:8;22315:6;;:17;;;;;;;;;;;;;;;;;;22378:8;22347:40;;22368:8;22347:40;;;;;;;;;;;;22270:124;22225:169;:::o;28706:307::-;28857:28;28867:4;28873:2;28877:7;28857:9;:28::i;:::-;28903:48;28926:4;28932:2;28936:7;28945:5;28903:22;:48::i;:::-;28895:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28706:307;;;;:::o;20113:155::-;20198:4;20236:25;20221:40;;;:11;:40;;;;20214:47;;20113:155;;;:::o;35229:122::-;;;;:::o;30602:311::-;30727:18;30733:2;30737:7;30727:5;:18::i;:::-;30776:54;30807:1;30811:2;30815:7;30824:5;30776:22;:54::i;:::-;30755:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;30602:311;;;:::o;33891:782::-;34041:4;34061:15;:2;:13;;;:15::i;:::-;34057:610;;;34112:2;34096:36;;;34133:12;:10;:12::i;:::-;34147:4;34153:7;34162:5;34096:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34092:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34356:1;34339:6;:13;:18;34335:266;;34381:60;;;;;;;;;;:::i;:::-;;;;;;;;34335:266;34553:6;34547:13;34538:6;34534:2;34530:15;34523:38;34092:523;34228:45;;;34218:55;;;:6;:55;;;;34211:62;;;;;34057:610;34652:4;34645:11;;33891:782;;;;;;;:::o;31235:372::-;31328:1;31314:16;;:2;:16;;;31306:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31386:16;31394:7;31386;:16::i;:::-;31385:17;31377:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31446:45;31475:1;31479:2;31483:7;31446:20;:45::i;:::-;31519:1;31502:9;:13;31512:2;31502:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31549:2;31530:7;:16;31538:7;31530:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31592:7;31588:2;31567:33;;31584:1;31567:33;;;;;;;;;;;;31235:372;;:::o;7462:377::-;7522:4;7725:12;7790:7;7778:20;7770:28;;7831:1;7824:4;:8;7817:15;;;7462:377;;;:::o;7:75:2:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:139::-;1887:6;1882:3;1877;1871:23;1928:1;1919:6;1914:3;1910:16;1903:27;1798:139;;;:::o;1943:102::-;1984:6;2035:2;2031:7;2026:2;2019:5;2015:14;2011:28;2001:38;;1943:102;;;:::o;2051:377::-;2139:3;2167:39;2200:5;2167:39;:::i;:::-;2222:71;2286:6;2281:3;2222:71;:::i;:::-;2215:78;;2302:65;2360:6;2355:3;2348:4;2341:5;2337:16;2302:65;:::i;:::-;2392:29;2414:6;2392:29;:::i;:::-;2387:3;2383:39;2376:46;;2143:285;2051:377;;;;:::o;2434:313::-;2547:4;2585:2;2574:9;2570:18;2562:26;;2634:9;2628:4;2624:20;2620:1;2609:9;2605:17;2598:47;2662:78;2735:4;2726:6;2662:78;:::i;:::-;2654:86;;2434:313;;;;:::o;2753:126::-;2790:7;2830:42;2823:5;2819:54;2808:65;;2753:126;;;:::o;2885:60::-;2913:3;2934:5;2927:12;;2885:60;;;:::o;2951:142::-;3001:9;3034:53;3052:34;3061:24;3079:5;3061:24;:::i;:::-;3052:34;:::i;:::-;3034:53;:::i;:::-;3021:66;;2951:142;;;:::o;3099:126::-;3149:9;3182:37;3213:5;3182:37;:::i;:::-;3169:50;;3099:126;;;:::o;3231:153::-;3308:9;3341:37;3372:5;3341:37;:::i;:::-;3328:50;;3231:153;;;:::o;3390:185::-;3504:64;3562:5;3504:64;:::i;:::-;3499:3;3492:77;3390:185;;:::o;3581:276::-;3701:4;3739:2;3728:9;3724:18;3716:26;;3752:98;3847:1;3836:9;3832:17;3823:6;3752:98;:::i;:::-;3581:276;;;;:::o;3863:77::-;3900:7;3929:5;3918:16;;3863:77;;;:::o;3946:122::-;4019:24;4037:5;4019:24;:::i;:::-;4012:5;4009:35;3999:63;;4058:1;4055;4048:12;3999:63;3946:122;:::o;4074:139::-;4120:5;4158:6;4145:20;4136:29;;4174:33;4201:5;4174:33;:::i;:::-;4074:139;;;;:::o;4219:329::-;4278:6;4327:2;4315:9;4306:7;4302:23;4298:32;4295:119;;;4333:79;;:::i;:::-;4295:119;4453:1;4478:53;4523:7;4514:6;4503:9;4499:22;4478:53;:::i;:::-;4468:63;;4424:117;4219:329;;;;:::o;4554:96::-;4591:7;4620:24;4638:5;4620:24;:::i;:::-;4609:35;;4554:96;;;:::o;4656:118::-;4743:24;4761:5;4743:24;:::i;:::-;4738:3;4731:37;4656:118;;:::o;4780:222::-;4873:4;4911:2;4900:9;4896:18;4888:26;;4924:71;4992:1;4981:9;4977:17;4968:6;4924:71;:::i;:::-;4780:222;;;;:::o;5008:122::-;5081:24;5099:5;5081:24;:::i;:::-;5074:5;5071:35;5061:63;;5120:1;5117;5110:12;5061:63;5008:122;:::o;5136:139::-;5182:5;5220:6;5207:20;5198:29;;5236:33;5263:5;5236:33;:::i;:::-;5136:139;;;;:::o;5281:474::-;5349:6;5357;5406:2;5394:9;5385:7;5381:23;5377:32;5374:119;;;5412:79;;:::i;:::-;5374:119;5532:1;5557:53;5602:7;5593:6;5582:9;5578:22;5557:53;:::i;:::-;5547:63;;5503:117;5659:2;5685:53;5730:7;5721:6;5710:9;5706:22;5685:53;:::i;:::-;5675:63;;5630:118;5281:474;;;;;:::o;5761:118::-;5848:24;5866:5;5848:24;:::i;:::-;5843:3;5836:37;5761:118;;:::o;5885:222::-;5978:4;6016:2;6005:9;6001:18;5993:26;;6029:71;6097:1;6086:9;6082:17;6073:6;6029:71;:::i;:::-;5885:222;;;;:::o;6113:619::-;6190:6;6198;6206;6255:2;6243:9;6234:7;6230:23;6226:32;6223:119;;;6261:79;;:::i;:::-;6223:119;6381:1;6406:53;6451:7;6442:6;6431:9;6427:22;6406:53;:::i;:::-;6396:63;;6352:117;6508:2;6534:53;6579:7;6570:6;6559:9;6555:22;6534:53;:::i;:::-;6524:63;;6479:118;6636:2;6662:53;6707:7;6698:6;6687:9;6683:22;6662:53;:::i;:::-;6652:63;;6607:118;6113:619;;;;;:::o;6738:329::-;6797:6;6846:2;6834:9;6825:7;6821:23;6817:32;6814:119;;;6852:79;;:::i;:::-;6814:119;6972:1;6997:53;7042:7;7033:6;7022:9;7018:22;6997:53;:::i;:::-;6987:63;;6943:117;6738:329;;;;:::o;7073:117::-;7182:1;7179;7172:12;7196:117;7305:1;7302;7295:12;7319:117;7428:1;7425;7418:12;7456:553;7514:8;7524:6;7574:3;7567:4;7559:6;7555:17;7551:27;7541:122;;7582:79;;:::i;:::-;7541:122;7695:6;7682:20;7672:30;;7725:18;7717:6;7714:30;7711:117;;;7747:79;;:::i;:::-;7711:117;7861:4;7853:6;7849:17;7837:29;;7915:3;7907:4;7899:6;7895:17;7885:8;7881:32;7878:41;7875:128;;;7922:79;;:::i;:::-;7875:128;7456:553;;;;;:::o;8015:874::-;8107:6;8115;8123;8131;8180:2;8168:9;8159:7;8155:23;8151:32;8148:119;;;8186:79;;:::i;:::-;8148:119;8334:1;8323:9;8319:17;8306:31;8364:18;8356:6;8353:30;8350:117;;;8386:79;;:::i;:::-;8350:117;8499:65;8556:7;8547:6;8536:9;8532:22;8499:65;:::i;:::-;8481:83;;;;8277:297;8641:2;8630:9;8626:18;8613:32;8672:18;8664:6;8661:30;8658:117;;;8694:79;;:::i;:::-;8658:117;8807:65;8864:7;8855:6;8844:9;8840:22;8807:65;:::i;:::-;8789:83;;;;8584:298;8015:874;;;;;;;:::o;8895:529::-;8966:6;8974;9023:2;9011:9;9002:7;8998:23;8994:32;8991:119;;;9029:79;;:::i;:::-;8991:119;9177:1;9166:9;9162:17;9149:31;9207:18;9199:6;9196:30;9193:117;;;9229:79;;:::i;:::-;9193:117;9342:65;9399:7;9390:6;9379:9;9375:22;9342:65;:::i;:::-;9324:83;;;;9120:297;8895:529;;;;;:::o;9430:117::-;9539:1;9536;9529:12;9553:180;9601:77;9598:1;9591:88;9698:4;9695:1;9688:15;9722:4;9719:1;9712:15;9739:281;9822:27;9844:4;9822:27;:::i;:::-;9814:6;9810:40;9952:6;9940:10;9937:22;9916:18;9904:10;9901:34;9898:62;9895:88;;;9963:18;;:::i;:::-;9895:88;10003:10;9999:2;9992:22;9782:238;9739:281;;:::o;10026:129::-;10060:6;10087:20;;:::i;:::-;10077:30;;10116:33;10144:4;10136:6;10116:33;:::i;:::-;10026:129;;;:::o;10161:308::-;10223:4;10313:18;10305:6;10302:30;10299:56;;;10335:18;;:::i;:::-;10299:56;10373:29;10395:6;10373:29;:::i;:::-;10365:37;;10457:4;10451;10447:15;10439:23;;10161:308;;;:::o;10475:148::-;10573:6;10568:3;10563;10550:30;10614:1;10605:6;10600:3;10596:16;10589:27;10475:148;;;:::o;10629:425::-;10707:5;10732:66;10748:49;10790:6;10748:49;:::i;:::-;10732:66;:::i;:::-;10723:75;;10821:6;10814:5;10807:21;10859:4;10852:5;10848:16;10897:3;10888:6;10883:3;10879:16;10876:25;10873:112;;;10904:79;;:::i;:::-;10873:112;10994:54;11041:6;11036:3;11031;10994:54;:::i;:::-;10713:341;10629:425;;;;;:::o;11074:340::-;11130:5;11179:3;11172:4;11164:6;11160:17;11156:27;11146:122;;11187:79;;:::i;:::-;11146:122;11304:6;11291:20;11329:79;11404:3;11396:6;11389:4;11381:6;11377:17;11329:79;:::i;:::-;11320:88;;11136:278;11074:340;;;;:::o;11420:509::-;11489:6;11538:2;11526:9;11517:7;11513:23;11509:32;11506:119;;;11544:79;;:::i;:::-;11506:119;11692:1;11681:9;11677:17;11664:31;11722:18;11714:6;11711:30;11708:117;;;11744:79;;:::i;:::-;11708:117;11849:63;11904:7;11895:6;11884:9;11880:22;11849:63;:::i;:::-;11839:73;;11635:287;11420:509;;;;:::o;11935:116::-;12005:21;12020:5;12005:21;:::i;:::-;11998:5;11995:32;11985:60;;12041:1;12038;12031:12;11985:60;11935:116;:::o;12057:133::-;12100:5;12138:6;12125:20;12116:29;;12154:30;12178:5;12154:30;:::i;:::-;12057:133;;;;:::o;12196:468::-;12261:6;12269;12318:2;12306:9;12297:7;12293:23;12289:32;12286:119;;;12324:79;;:::i;:::-;12286:119;12444:1;12469:53;12514:7;12505:6;12494:9;12490:22;12469:53;:::i;:::-;12459:63;;12415:117;12571:2;12597:50;12639:7;12630:6;12619:9;12615:22;12597:50;:::i;:::-;12587:60;;12542:115;12196:468;;;;;:::o;12670:307::-;12731:4;12821:18;12813:6;12810:30;12807:56;;;12843:18;;:::i;:::-;12807:56;12881:29;12903:6;12881:29;:::i;:::-;12873:37;;12965:4;12959;12955:15;12947:23;;12670:307;;;:::o;12983:423::-;13060:5;13085:65;13101:48;13142:6;13101:48;:::i;:::-;13085:65;:::i;:::-;13076:74;;13173:6;13166:5;13159:21;13211:4;13204:5;13200:16;13249:3;13240:6;13235:3;13231:16;13228:25;13225:112;;;13256:79;;:::i;:::-;13225:112;13346:54;13393:6;13388:3;13383;13346:54;:::i;:::-;13066:340;12983:423;;;;;:::o;13425:338::-;13480:5;13529:3;13522:4;13514:6;13510:17;13506:27;13496:122;;13537:79;;:::i;:::-;13496:122;13654:6;13641:20;13679:78;13753:3;13745:6;13738:4;13730:6;13726:17;13679:78;:::i;:::-;13670:87;;13486:277;13425:338;;;;:::o;13769:943::-;13864:6;13872;13880;13888;13937:3;13925:9;13916:7;13912:23;13908:33;13905:120;;;13944:79;;:::i;:::-;13905:120;14064:1;14089:53;14134:7;14125:6;14114:9;14110:22;14089:53;:::i;:::-;14079:63;;14035:117;14191:2;14217:53;14262:7;14253:6;14242:9;14238:22;14217:53;:::i;:::-;14207:63;;14162:118;14319:2;14345:53;14390:7;14381:6;14370:9;14366:22;14345:53;:::i;:::-;14335:63;;14290:118;14475:2;14464:9;14460:18;14447:32;14506:18;14498:6;14495:30;14492:117;;;14528:79;;:::i;:::-;14492:117;14633:62;14687:7;14678:6;14667:9;14663:22;14633:62;:::i;:::-;14623:72;;14418:287;13769:943;;;;;;;:::o;14718:474::-;14786:6;14794;14843:2;14831:9;14822:7;14818:23;14814:32;14811:119;;;14849:79;;:::i;:::-;14811:119;14969:1;14994:53;15039:7;15030:6;15019:9;15015:22;14994:53;:::i;:::-;14984:63;;14940:117;15096:2;15122:53;15167:7;15158:6;15147:9;15143:22;15122:53;:::i;:::-;15112:63;;15067:118;14718:474;;;;;:::o;15198:150::-;15272:9;15305:37;15336:5;15305:37;:::i;:::-;15292:50;;15198:150;;;:::o;15354:179::-;15465:61;15520:5;15465:61;:::i;:::-;15460:3;15453:74;15354:179;;:::o;15539:270::-;15656:4;15694:2;15683:9;15679:18;15671:26;;15707:95;15799:1;15788:9;15784:17;15775:6;15707:95;:::i;:::-;15539:270;;;;:::o;15815:123::-;15879:7;15908:24;15926:5;15908:24;:::i;:::-;15897:35;;15815:123;;;:::o;15944:176::-;16044:51;16089:5;16044:51;:::i;:::-;16037:5;16034:62;16024:90;;16110:1;16107;16100:12;16024:90;15944:176;:::o;16126:193::-;16199:5;16237:6;16224:20;16215:29;;16253:60;16307:5;16253:60;:::i;:::-;16126:193;;;;:::o;16325:383::-;16411:6;16460:2;16448:9;16439:7;16435:23;16431:32;16428:119;;;16466:79;;:::i;:::-;16428:119;16586:1;16611:80;16683:7;16674:6;16663:9;16659:22;16611:80;:::i;:::-;16601:90;;16557:144;16325:383;;;;:::o;16714:180::-;16762:77;16759:1;16752:88;16859:4;16856:1;16849:15;16883:4;16880:1;16873:15;16900:320;16944:6;16981:1;16975:4;16971:12;16961:22;;17028:1;17022:4;17018:12;17049:18;17039:81;;17105:4;17097:6;17093:17;17083:27;;17039:81;17167:2;17159:6;17156:14;17136:18;17133:38;17130:84;;17186:18;;:::i;:::-;17130:84;16951:269;16900:320;;;:::o;17226:231::-;17366:34;17362:1;17354:6;17350:14;17343:58;17435:14;17430:2;17422:6;17418:15;17411:39;17226:231;:::o;17463:366::-;17605:3;17626:67;17690:2;17685:3;17626:67;:::i;:::-;17619:74;;17702:93;17791:3;17702:93;:::i;:::-;17820:2;17815:3;17811:12;17804:19;;17463:366;;;:::o;17835:419::-;18001:4;18039:2;18028:9;18024:18;18016:26;;18088:9;18082:4;18078:20;18074:1;18063:9;18059:17;18052:47;18116:131;18242:4;18116:131;:::i;:::-;18108:139;;17835:419;;;:::o;18260:220::-;18400:34;18396:1;18388:6;18384:14;18377:58;18469:3;18464:2;18456:6;18452:15;18445:28;18260:220;:::o;18486:366::-;18628:3;18649:67;18713:2;18708:3;18649:67;:::i;:::-;18642:74;;18725:93;18814:3;18725:93;:::i;:::-;18843:2;18838:3;18834:12;18827:19;;18486:366;;;:::o;18858:419::-;19024:4;19062:2;19051:9;19047:18;19039:26;;19111:9;19105:4;19101:20;19097:1;19086:9;19082:17;19075:47;19139:131;19265:4;19139:131;:::i;:::-;19131:139;;18858:419;;;:::o;19283:243::-;19423:34;19419:1;19411:6;19407:14;19400:58;19492:26;19487:2;19479:6;19475:15;19468:51;19283:243;:::o;19532:366::-;19674:3;19695:67;19759:2;19754:3;19695:67;:::i;:::-;19688:74;;19771:93;19860:3;19771:93;:::i;:::-;19889:2;19884:3;19880:12;19873:19;;19532:366;;;:::o;19904:419::-;20070:4;20108:2;20097:9;20093:18;20085:26;;20157:9;20151:4;20147:20;20143:1;20132:9;20128:17;20121:47;20185:131;20311:4;20185:131;:::i;:::-;20177:139;;19904:419;;;:::o;20329:236::-;20469:34;20465:1;20457:6;20453:14;20446:58;20538:19;20533:2;20525:6;20521:15;20514:44;20329:236;:::o;20571:366::-;20713:3;20734:67;20798:2;20793:3;20734:67;:::i;:::-;20727:74;;20810:93;20899:3;20810:93;:::i;:::-;20928:2;20923:3;20919:12;20912:19;;20571:366;;;:::o;20943:419::-;21109:4;21147:2;21136:9;21132:18;21124:26;;21196:9;21190:4;21186:20;21182:1;21171:9;21167:17;21160:47;21224:131;21350:4;21224:131;:::i;:::-;21216:139;;20943:419;;;:::o;21368:182::-;21508:34;21504:1;21496:6;21492:14;21485:58;21368:182;:::o;21556:366::-;21698:3;21719:67;21783:2;21778:3;21719:67;:::i;:::-;21712:74;;21795:93;21884:3;21795:93;:::i;:::-;21913:2;21908:3;21904:12;21897:19;;21556:366;;;:::o;21928:419::-;22094:4;22132:2;22121:9;22117:18;22109:26;;22181:9;22175:4;22171:20;22167:1;22156:9;22152:17;22145:47;22209:131;22335:4;22209:131;:::i;:::-;22201:139;;21928:419;;;:::o;22353:223::-;22493:34;22489:1;22481:6;22477:14;22470:58;22562:6;22557:2;22549:6;22545:15;22538:31;22353:223;:::o;22582:366::-;22724:3;22745:67;22809:2;22804:3;22745:67;:::i;:::-;22738:74;;22821:93;22910:3;22821:93;:::i;:::-;22939:2;22934:3;22930:12;22923:19;;22582:366;;;:::o;22954:419::-;23120:4;23158:2;23147:9;23143:18;23135:26;;23207:9;23201:4;23197:20;23193:1;23182:9;23178:17;23171:47;23235:131;23361:4;23235:131;:::i;:::-;23227:139;;22954:419;;;:::o;23379:172::-;23519:24;23515:1;23507:6;23503:14;23496:48;23379:172;:::o;23557:366::-;23699:3;23720:67;23784:2;23779:3;23720:67;:::i;:::-;23713:74;;23796:93;23885:3;23796:93;:::i;:::-;23914:2;23909:3;23905:12;23898:19;;23557:366;;;:::o;23929:419::-;24095:4;24133:2;24122:9;24118:18;24110:26;;24182:9;24176:4;24172:20;24168:1;24157:9;24153:17;24146:47;24210:131;24336:4;24210:131;:::i;:::-;24202:139;;23929:419;;;:::o;24354:228::-;24494:34;24490:1;24482:6;24478:14;24471:58;24563:11;24558:2;24550:6;24546:15;24539:36;24354:228;:::o;24588:366::-;24730:3;24751:67;24815:2;24810:3;24751:67;:::i;:::-;24744:74;;24827:93;24916:3;24827:93;:::i;:::-;24945:2;24940:3;24936:12;24929:19;;24588:366;;;:::o;24960:419::-;25126:4;25164:2;25153:9;25149:18;25141:26;;25213:9;25207:4;25203:20;25199:1;25188:9;25184:17;25177:47;25241:131;25367:4;25241:131;:::i;:::-;25233:139;;24960:419;;;:::o;25385:179::-;25525:31;25521:1;25513:6;25509:14;25502:55;25385:179;:::o;25570:366::-;25712:3;25733:67;25797:2;25792:3;25733:67;:::i;:::-;25726:74;;25809:93;25898:3;25809:93;:::i;:::-;25927:2;25922:3;25918:12;25911:19;;25570:366;;;:::o;25942:419::-;26108:4;26146:2;26135:9;26131:18;26123:26;;26195:9;26189:4;26185:20;26181:1;26170:9;26166:17;26159:47;26223:131;26349:4;26223:131;:::i;:::-;26215:139;;25942:419;;;:::o;26367:153::-;26420:6;26454:5;26448:12;26438:22;;26480:33;26506:6;26480:33;:::i;:::-;26470:43;;26367:153;;;:::o;26526:141::-;26575:4;26598:3;26590:11;;26621:3;26618:1;26611:14;26655:4;26652:1;26642:18;26634:26;;26526:141;;;:::o;26673:145::-;26726:4;26749:3;26741:11;;26772:3;26769:1;26762:14;26806:4;26803:1;26793:18;26785:26;;26673:145;;;:::o;26824:93::-;26861:6;26908:2;26903;26896:5;26892:14;26888:23;26878:33;;26824:93;;;:::o;26923:107::-;26967:8;27017:5;27011:4;27007:16;26986:37;;26923:107;;;;:::o;27036:393::-;27105:6;27155:1;27143:10;27139:18;27178:97;27208:66;27197:9;27178:97;:::i;:::-;27296:39;27326:8;27315:9;27296:39;:::i;:::-;27284:51;;27368:4;27364:9;27357:5;27353:21;27344:30;;27417:4;27407:8;27403:19;27396:5;27393:30;27383:40;;27112:317;;27036:393;;;;;:::o;27435:142::-;27485:9;27518:53;27536:34;27545:24;27563:5;27545:24;:::i;:::-;27536:34;:::i;:::-;27518:53;:::i;:::-;27505:66;;27435:142;;;:::o;27583:75::-;27626:3;27647:5;27640:12;;27583:75;;;:::o;27664:269::-;27774:39;27805:7;27774:39;:::i;:::-;27835:91;27884:41;27908:16;27884:41;:::i;:::-;27876:6;27869:4;27863:11;27835:91;:::i;:::-;27829:4;27822:105;27740:193;27664:269;;;:::o;27939:73::-;27984:3;28005:1;27998:8;;27939:73;:::o;28018:189::-;28095:32;;:::i;:::-;28136:65;28194:6;28186;28180:4;28136:65;:::i;:::-;28071:136;28018:189;;:::o;28213:186::-;28273:120;28290:3;28283:5;28280:14;28273:120;;;28344:39;28381:1;28374:5;28344:39;:::i;:::-;28317:1;28310:5;28306:13;28297:22;;28273:120;;;28213:186;;:::o;28405:543::-;28506:2;28501:3;28498:11;28495:446;;;28540:38;28572:5;28540:38;:::i;:::-;28624:29;28642:10;28624:29;:::i;:::-;28614:8;28610:44;28807:2;28795:10;28792:18;28789:49;;;28828:8;28813:23;;28789:49;28851:80;28907:22;28925:3;28907:22;:::i;:::-;28897:8;28893:37;28880:11;28851:80;:::i;:::-;28510:431;;28495:446;28405:543;;;:::o;28954:117::-;29008:8;29058:5;29052:4;29048:16;29027:37;;28954:117;;;;:::o;29077:169::-;29121:6;29154:51;29202:1;29198:6;29190:5;29187:1;29183:13;29154:51;:::i;:::-;29150:56;29235:4;29229;29225:15;29215:25;;29128:118;29077:169;;;;:::o;29251:295::-;29327:4;29473:29;29498:3;29492:4;29473:29;:::i;:::-;29465:37;;29535:3;29532:1;29528:11;29522:4;29519:21;29511:29;;29251:295;;;;:::o;29551:1463::-;29666:3;29660:4;29657:13;29654:26;;29673:5;;;;29654:26;29704:38;29738:3;29704:38;:::i;:::-;29807:18;29799:6;29796:30;29793:56;;;29829:18;;:::i;:::-;29793:56;29873:38;29905:4;29899:11;29873:38;:::i;:::-;29958:67;30018:6;30010;30004:4;29958:67;:::i;:::-;30052:1;30081:2;30073:6;30070:14;30098:1;30093:676;;;;30813:1;30830:6;30827:77;;;30879:9;30874:3;30870:19;30864:26;30855:35;;30827:77;30930:67;30990:6;30983:5;30930:67;:::i;:::-;30924:4;30917:81;30786:222;30063:945;;30093:676;30145:4;30141:9;30133:6;30129:22;30171:40;30207:3;30171:40;:::i;:::-;30164:47;;30238:37;30270:4;30238:37;:::i;:::-;30297:1;30311:207;30325:7;30322:1;30319:14;30311:207;;;30404:9;30399:3;30395:19;30389:26;30381:6;30374:42;30455:1;30447:6;30443:14;30433:24;;30502:1;30491:9;30487:17;30474:30;;30348:4;30345:1;30341:12;30336:17;;30311:207;;;30546:6;30537:7;30534:19;30531:179;;;30604:9;30599:3;30595:19;30589:26;30647:48;30689:4;30681:6;30677:17;30666:9;30647:48;:::i;:::-;30639:6;30632:64;30554:156;30531:179;30756:1;30752;30744:6;30740:14;30736:22;30730:4;30723:36;30100:669;;;30063:945;;29644:1370;;;29551:1463;;;:::o;31020:180::-;31068:77;31065:1;31058:88;31165:4;31162:1;31155:15;31189:4;31186:1;31179:15;31206:233;31245:3;31268:24;31286:5;31268:24;:::i;:::-;31259:33;;31314:66;31307:5;31304:77;31301:103;;31384:18;;:::i;:::-;31301:103;31431:1;31424:5;31420:13;31413:20;;31206:233;;;:::o;31445:229::-;31585:34;31581:1;31573:6;31569:14;31562:58;31654:12;31649:2;31641:6;31637:15;31630:37;31445:229;:::o;31680:366::-;31822:3;31843:67;31907:2;31902:3;31843:67;:::i;:::-;31836:74;;31919:93;32008:3;31919:93;:::i;:::-;32037:2;32032:3;32028:12;32021:19;;31680:366;;;:::o;32052:419::-;32218:4;32256:2;32245:9;32241:18;32233:26;;32305:9;32299:4;32295:20;32291:1;32280:9;32276:17;32269:47;32333:131;32459:4;32333:131;:::i;:::-;32325:139;;32052:419;;;:::o;32477:148::-;32579:11;32616:3;32601:18;;32477:148;;;;:::o;32655:330::-;32771:3;32792:89;32874:6;32869:3;32792:89;:::i;:::-;32785:96;;32891:56;32940:6;32935:3;32928:5;32891:56;:::i;:::-;32972:6;32967:3;32963:16;32956:23;;32655:330;;;;;:::o;32991:295::-;33133:3;33155:105;33256:3;33247:6;33239;33155:105;:::i;:::-;33148:112;;33277:3;33270:10;;32991:295;;;;;:::o;33292:97::-;33351:6;33379:3;33369:13;;33292:97;;;;:::o;33395:1403::-;33519:44;33559:3;33554;33519:44;:::i;:::-;33628:18;33620:6;33617:30;33614:56;;;33650:18;;:::i;:::-;33614:56;33694:38;33726:4;33720:11;33694:38;:::i;:::-;33779:67;33839:6;33831;33825:4;33779:67;:::i;:::-;33873:1;33902:2;33894:6;33891:14;33919:1;33914:632;;;;34590:1;34607:6;34604:84;;;34663:9;34658:3;34654:19;34641:33;34632:42;;34604:84;34714:67;34774:6;34767:5;34714:67;:::i;:::-;34708:4;34701:81;34563:229;33884:908;;33914:632;33966:4;33962:9;33954:6;33950:22;34000:37;34032:4;34000:37;:::i;:::-;34059:1;34073:215;34087:7;34084:1;34081:14;34073:215;;;34173:9;34168:3;34164:19;34151:33;34143:6;34136:49;34224:1;34216:6;34212:14;34202:24;;34271:2;34260:9;34256:18;34243:31;;34110:4;34107:1;34103:12;34098:17;;34073:215;;;34316:6;34307:7;34304:19;34301:186;;;34381:9;34376:3;34372:19;34359:33;34424:48;34466:4;34458:6;34454:17;34443:9;34424:48;:::i;:::-;34416:6;34409:64;34324:163;34301:186;34533:1;34529;34521:6;34517:14;34513:22;34507:4;34500:36;33921:625;;;33884:908;;33494:1304;;;33395:1403;;;:::o;34804:175::-;34944:27;34940:1;34932:6;34928:14;34921:51;34804:175;:::o;34985:366::-;35127:3;35148:67;35212:2;35207:3;35148:67;:::i;:::-;35141:74;;35224:93;35313:3;35224:93;:::i;:::-;35342:2;35337:3;35333:12;35326:19;;34985:366;;;:::o;35357:419::-;35523:4;35561:2;35550:9;35546:18;35538:26;;35610:9;35604:4;35600:20;35596:1;35585:9;35581:17;35574:47;35638:131;35764:4;35638:131;:::i;:::-;35630:139;;35357:419;;;:::o;35782:434::-;35871:5;35896:66;35912:49;35954:6;35912:49;:::i;:::-;35896:66;:::i;:::-;35887:75;;35985:6;35978:5;35971:21;36023:4;36016:5;36012:16;36061:3;36052:6;36047:3;36043:16;36040:25;36037:112;;;36068:79;;:::i;:::-;36037:112;36158:52;36203:6;36198:3;36193;36158:52;:::i;:::-;35877:339;35782:434;;;;;:::o;36236:355::-;36303:5;36352:3;36345:4;36337:6;36333:17;36329:27;36319:122;;36360:79;;:::i;:::-;36319:122;36470:6;36464:13;36495:90;36581:3;36573:6;36566:4;36558:6;36554:17;36495:90;:::i;:::-;36486:99;;36309:282;36236:355;;;;:::o;36597:524::-;36677:6;36726:2;36714:9;36705:7;36701:23;36697:32;36694:119;;;36732:79;;:::i;:::-;36694:119;36873:1;36862:9;36858:17;36852:24;36903:18;36895:6;36892:30;36889:117;;;36925:79;;:::i;:::-;36889:117;37030:74;37096:7;37087:6;37076:9;37072:22;37030:74;:::i;:::-;37020:84;;36823:291;36597:524;;;;:::o;37127:225::-;37267:34;37263:1;37255:6;37251:14;37244:58;37336:8;37331:2;37323:6;37319:15;37312:33;37127:225;:::o;37358:366::-;37500:3;37521:67;37585:2;37580:3;37521:67;:::i;:::-;37514:74;;37597:93;37686:3;37597:93;:::i;:::-;37715:2;37710:3;37706:12;37699:19;;37358:366;;;:::o;37730:419::-;37896:4;37934:2;37923:9;37919:18;37911:26;;37983:9;37977:4;37973:20;37969:1;37958:9;37954:17;37947:47;38011:131;38137:4;38011:131;:::i;:::-;38003:139;;37730:419;;;:::o;38155:231::-;38295:34;38291:1;38283:6;38279:14;38272:58;38364:14;38359:2;38351:6;38347:15;38340:39;38155:231;:::o;38392:366::-;38534:3;38555:67;38619:2;38614:3;38555:67;:::i;:::-;38548:74;;38631:93;38720:3;38631:93;:::i;:::-;38749:2;38744:3;38740:12;38733:19;;38392:366;;;:::o;38764:419::-;38930:4;38968:2;38957:9;38953:18;38945:26;;39017:9;39011:4;39007:20;39003:1;38992:9;38988:17;38981:47;39045:131;39171:4;39045:131;:::i;:::-;39037:139;;38764:419;;;:::o;39189:228::-;39329:34;39325:1;39317:6;39313:14;39306:58;39398:11;39393:2;39385:6;39381:15;39374:36;39189:228;:::o;39423:366::-;39565:3;39586:67;39650:2;39645:3;39586:67;:::i;:::-;39579:74;;39662:93;39751:3;39662:93;:::i;:::-;39780:2;39775:3;39771:12;39764:19;;39423:366;;;:::o;39795:419::-;39961:4;39999:2;39988:9;39984:18;39976:26;;40048:9;40042:4;40038:20;40034:1;40023:9;40019:17;40012:47;40076:131;40202:4;40076:131;:::i;:::-;40068:139;;39795:419;;;:::o;40220:223::-;40360:34;40356:1;40348:6;40344:14;40337:58;40429:6;40424:2;40416:6;40412:15;40405:31;40220:223;:::o;40449:366::-;40591:3;40612:67;40676:2;40671:3;40612:67;:::i;:::-;40605:74;;40688:93;40777:3;40688:93;:::i;:::-;40806:2;40801:3;40797:12;40790:19;;40449:366;;;:::o;40821:419::-;40987:4;41025:2;41014:9;41010:18;41002:26;;41074:9;41068:4;41064:20;41060:1;41049:9;41045:17;41038:47;41102:131;41228:4;41102:131;:::i;:::-;41094:139;;40821:419;;;:::o;41246:194::-;41286:4;41306:20;41324:1;41306:20;:::i;:::-;41301:25;;41340:20;41358:1;41340:20;:::i;:::-;41335:25;;41384:1;41381;41377:9;41369:17;;41408:1;41402:4;41399:11;41396:37;;;41413:18;;:::i;:::-;41396:37;41246:194;;;;:::o;41446:191::-;41486:3;41505:20;41523:1;41505:20;:::i;:::-;41500:25;;41539:20;41557:1;41539:20;:::i;:::-;41534:25;;41582:1;41579;41575:9;41568:16;;41603:3;41600:1;41597:10;41594:36;;;41610:18;;:::i;:::-;41594:36;41446:191;;;;:::o;41643:237::-;41783:34;41779:1;41771:6;41767:14;41760:58;41852:20;41847:2;41839:6;41835:15;41828:45;41643:237;:::o;41886:366::-;42028:3;42049:67;42113:2;42108:3;42049:67;:::i;:::-;42042:74;;42125:93;42214:3;42125:93;:::i;:::-;42243:2;42238:3;42234:12;42227:19;;41886:366;;;:::o;42258:419::-;42424:4;42462:2;42451:9;42447:18;42439:26;;42511:9;42505:4;42501:20;42497:1;42486:9;42482:17;42475:47;42539:131;42665:4;42539:131;:::i;:::-;42531:139;;42258:419;;;:::o;42683:98::-;42734:6;42768:5;42762:12;42752:22;;42683:98;;;:::o;42787:168::-;42870:11;42904:6;42899:3;42892:19;42944:4;42939:3;42935:14;42920:29;;42787:168;;;;:::o;42961:373::-;43047:3;43075:38;43107:5;43075:38;:::i;:::-;43129:70;43192:6;43187:3;43129:70;:::i;:::-;43122:77;;43208:65;43266:6;43261:3;43254:4;43247:5;43243:16;43208:65;:::i;:::-;43298:29;43320:6;43298:29;:::i;:::-;43293:3;43289:39;43282:46;;43051:283;42961:373;;;;:::o;43340:640::-;43535:4;43573:3;43562:9;43558:19;43550:27;;43587:71;43655:1;43644:9;43640:17;43631:6;43587:71;:::i;:::-;43668:72;43736:2;43725:9;43721:18;43712:6;43668:72;:::i;:::-;43750;43818:2;43807:9;43803:18;43794:6;43750:72;:::i;:::-;43869:9;43863:4;43859:20;43854:2;43843:9;43839:18;43832:48;43897:76;43968:4;43959:6;43897:76;:::i;:::-;43889:84;;43340:640;;;;;;;:::o;43986:141::-;44042:5;44073:6;44067:13;44058:22;;44089:32;44115:5;44089:32;:::i;:::-;43986:141;;;;:::o;44133:349::-;44202:6;44251:2;44239:9;44230:7;44226:23;44222:32;44219:119;;;44257:79;;:::i;:::-;44219:119;44377:1;44402:63;44457:7;44448:6;44437:9;44433:22;44402:63;:::i;:::-;44392:73;;44348:127;44133:349;;;;:::o;44488:182::-;44628:34;44624:1;44616:6;44612:14;44605:58;44488:182;:::o;44676:366::-;44818:3;44839:67;44903:2;44898:3;44839:67;:::i;:::-;44832:74;;44915:93;45004:3;44915:93;:::i;:::-;45033:2;45028:3;45024:12;45017:19;;44676:366;;;:::o;45048:419::-;45214:4;45252:2;45241:9;45237:18;45229:26;;45301:9;45295:4;45291:20;45287:1;45276:9;45272:17;45265:47;45329:131;45455:4;45329:131;:::i;:::-;45321:139;;45048:419;;;:::o;45473:178::-;45613:30;45609:1;45601:6;45597:14;45590:54;45473:178;:::o;45657:366::-;45799:3;45820:67;45884:2;45879:3;45820:67;:::i;:::-;45813:74;;45896:93;45985:3;45896:93;:::i;:::-;46014:2;46009:3;46005:12;45998:19;;45657:366;;;:::o;46029:419::-;46195:4;46233:2;46222:9;46218:18;46210:26;;46282:9;46276:4;46272:20;46268:1;46257:9;46253:17;46246:47;46310:131;46436:4;46310:131;:::i;:::-;46302:139;;46029:419;;;:::o
Swarm Source
ipfs://ee070aec328444c3bbc85445a12e1884c243b3404ce6615fd14551589f35e721
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.