ERC-1155
Overview
Max Total Supply
517 FINSXM
Holders
269
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FinsXM
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-25 */ // File: contracts/filter/IOperatorFilterRegistry.sol pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } // File: contracts/filter/OperatorFilterer.sol pragma solidity ^0.8.13; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } } // File: contracts/filter/DefaultOperatorFilterer.sol pragma solidity ^0.8.13; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: contracts/lib/MerkleDistributor.sol pragma solidity ^0.8.0; contract MerkleDistributor { bytes32 public merkleRoot; bool public allowListActive = false; mapping(address => uint256) private _allowListNumMinted; /** * @dev emitted when an account has claimed some tokens */ event Claimed(address indexed account, uint256 amount); /** * @dev emitted when the merkle root has changed */ event MerkleRootChanged(bytes32 merkleRoot); /** * @dev throws when allow list is not active */ modifier isAllowListActive() { require(allowListActive, 'Allow list is not active'); _; } /** * @dev throws when number of tokens exceeds total token amount */ modifier tokensAvailable( address to, uint256 numberOfTokens, uint256 totalTokenAmount ) { uint256 claimed = getAllowListMinted(to); require(claimed + numberOfTokens <= totalTokenAmount, 'Purchase would exceed number of tokens allotted'); _; } /** * @dev throws when parameters sent by claimer is incorrect */ modifier ableToClaim(address claimer, bytes32[] memory proof) { require(onAllowList(claimer, proof), 'Not on allow list'); _; } /** * @dev sets the state of the allow list */ function _setAllowListActive(bool allowListActive_) internal virtual { allowListActive = allowListActive_; } /** * @dev sets the merkle root */ function _setAllowList(bytes32 merkleRoot_) internal virtual { merkleRoot = merkleRoot_; emit MerkleRootChanged(merkleRoot); } /** * @dev adds the number of tokens to the incoming address */ function _setAllowListMinted(address to, uint256 numberOfTokens) internal virtual { _allowListNumMinted[to] += numberOfTokens; emit Claimed(to, numberOfTokens); } /** * @dev gets the number of tokens from the address */ function getAllowListMinted(address from) public view virtual returns (uint256) { return _allowListNumMinted[from]; } /** * @dev checks if the claimer has a valid proof */ function onAllowList(address claimer, bytes32[] memory proof) public view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(claimer)); return MerkleProof.verify(proof, merkleRoot, leaf); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _burnBatch(account, ids, values); } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 supply = _totalSupply[id]; require(supply >= amount, "ERC1155: burn amount exceeds totalSupply"); unchecked { _totalSupply[id] = supply - amount; } } } } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/FinsX.sol pragma solidity ^0.8.17; contract FinsXM is MerkleDistributor, ReentrancyGuard, DefaultOperatorFilterer, ERC1155, ERC1155Supply, ERC1155Burnable, Ownable{ string public name = "FinsXM"; string public symbol = "FINSXM"; /// is the mint/claim active? bool public mintIsActive = false; /// keep track of which round of the game we are in uint256 public currentRound = 0; /// supply cap for each round of minting uint256[5] public supplyByRound = [625, 300, 100, 50, 20]; /// odds of rolling a special token are better with each progressive round uint256 currentOdds = supplyByRound[currentRound]/2; /// the number of special tokens that can exist at once uint256 MAX_SUPPLY_SPECIAL = 5; /// track how many total tokens have been minted each round mapping (uint256 => uint256) public totalTokensMintedPerRound; /// track how many total tokens have been minted each round for this user mapping (address => bool[5]) public addressMintedEachRound; uint256 private nonce; constructor(string memory _uri) ERC1155(_uri) { /// set the token uri _setURI(_uri); /// mint the first token when the contract is created _mint(msg.sender, 0, 5, ""); /// keep track of this token totalTokensMintedPerRound[0] = 5; } /// @dev set the URI to your base URI here, don't forget the {id} param. function setURI(string memory newuri) external onlyOwner { _setURI(newuri); } function setMintIsActive(bool _mintIsActive) external onlyOwner { mintIsActive = _mintIsActive; } function setAllowListActive(bool _allowListActive) external onlyOwner { _setAllowListActive(_allowListActive); } function setAllowList(bytes32 _merkleRoot) external onlyOwner { _setAllowList(_merkleRoot); } function setCurrentRound(uint256 _round) external onlyOwner { require(_round >= 0 && _round <= 4, "Round must be between 0 and 4"); currentRound = _round; } /// a function to check if the address owns every token up to the current one function _hasEveryTokenSoFar(address _address) internal view returns(bool) { /// check the current balance of each token up to the current round for (uint256 i; i < currentRound; ++i) { /// if the address is mising any token before this one, return false if(balanceOf(_address, i) < 1){ return false; } } return true; } /// generate a kind of random number function _kindaRandom(uint256 _max) internal returns (uint256) { uint256 kindaRandomnumber = uint256(keccak256(abi.encodePacked(block.timestamp, msg.sender, nonce))) % _max; nonce++; return kindaRandomnumber; } function mint(bytes32[] memory _merkleProof) external nonReentrant { /// ensure the mint is active require(mintIsActive, "Mint is not active"); /// if the allowlist is active, require them to be on it if (allowListActive){ /// ensure the address is on the allowlist require(onAllowList(msg.sender, _merkleProof), "Not on allow list"); } /// make sure the address has not minted a token during the current round require(addressMintedEachRound[msg.sender][currentRound] == false, "Already minted a token this round"); /// make sure we haven't exceeded the supply for the given round require(totalTokensMintedPerRound[currentRound] < supplyByRound[currentRound], "No remaning supply this round"); /// make sure they have every token up to the current one require(_hasEveryTokenSoFar(msg.sender), "Address is missing a token"); uint256 idToMint = currentRound; /// have a chance at minting an ultra-rare token as long as max supply hasn't been reached and it's not the final round if (totalSupply(5) < MAX_SUPPLY_SPECIAL && currentRound != 4){ if (_kindaRandom(supplyByRound[currentRound]) == 10){ idToMint = 5; } } /// increase the total number of tokens minted during the current round by 1 unless it's the special if (idToMint != 5){ totalTokensMintedPerRound[currentRound] = totalTokensMintedPerRound[currentRound] + 1; } /// increase the total number of tokens minted during the current round by 1 addressMintedEachRound[msg.sender][currentRound] = true; _mint(msg.sender, idToMint, 1, ""); } /// @dev allows the owner to withdraw the funds in this contract function withdrawBalance(address payable _address) external onlyOwner { (bool success, ) = _address.call{value: address(this).balance}(""); require(success, "Withdraw failed"); } function setApprovalForAll( address _operator, bool _approved ) public override onlyAllowedOperatorApproval(_operator) { super.setApprovalForAll(_operator, _approved); } function safeTransferFrom( address _from, address _to, uint256 _tokenId, uint256 _amount, bytes memory _data ) public override onlyAllowedOperator(_from) { super.safeTransferFrom(_from, _to, _tokenId, _amount, _data); } function safeBatchTransferFrom( address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data ) public virtual override onlyAllowedOperator(_from) { super.safeBatchTransferFrom(_from, _to, _ids, _amounts, _data); } function _beforeTokenTransfer( address _operator, address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data ) internal override(ERC1155, ERC1155Supply) { super._beforeTokenTransfer(_operator, _from, _to, _ids, _amounts, _data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"MerkleRootChanged","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressMintedEachRound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"getAllowListMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimer","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"onAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","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":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_allowListActive","type":"bool"}],"name":"setAllowListActive","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":"uint256","name":"_round","type":"uint256"}],"name":"setCurrentRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintIsActive","type":"bool"}],"name":"setMintIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supplyByRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalTokensMintedPerRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_address","type":"address"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600160006101000a81548160ff0219169083151502179055506040518060400160405280600681526020017f46696e73584d00000000000000000000000000000000000000000000000000008152506009908162000065919062000e9b565b506040518060400160405280600681526020017f46494e53584d0000000000000000000000000000000000000000000000000000815250600a9081620000ac919062000e9b565b506000600b60006101000a81548160ff0219169083151502179055506000600c556040518060a0016040528061027161ffff16815260200161012c61ffff168152602001606461ffff168152602001603261ffff168152602001601461ffff16815250600d9060056200012192919062000bb7565b506002600d600c54600581106200013d576200013c62000f82565b5b01546200014b91906200100f565b60125560056013553480156200016057600080fd5b506040516200697c3803806200697c8339818101604052810190620001869190620011ab565b80733cc6cdda760b79bafa08df41ecfa224f810dceb660018060038190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200039a57801562000260576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200022692919062001241565b600060405180830381600087803b1580156200024157600080fd5b505af115801562000256573d6000803e3d6000fd5b5050505062000399565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200031a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002e092919062001241565b600060405180830381600087803b158015620002fb57600080fd5b505af115801562000310573d6000803e3d6000fd5b5050505062000398565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200036391906200126e565b600060405180830381600087803b1580156200037e57600080fd5b505af115801562000393573d6000803e3d6000fd5b505050505b5b5b5050620003ad816200042460201b60201c565b50620003ce620003c26200043960201b60201c565b6200044160201b60201c565b620003df816200042460201b60201c565b620004043360006005604051806020016040528060008152506200050760201b60201c565b600560146000808152602001908152602001600020819055505062001844565b806006908162000435919062000e9b565b5050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362000579576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005709062001312565b60405180910390fd5b60006200058b6200043960201b60201c565b90506000620005a085620006ef60201b60201c565b90506000620005b585620006ef60201b60201c565b9050620005ce836000898585896200077060201b60201c565b846004600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000630919062001334565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051620006b092919062001380565b60405180910390a4620006cf836000898585896200079360201b60201c565b620006e6836000898989896200079b60201b60201c565b50505050505050565b60606000600167ffffffffffffffff81111562000711576200071062000c2c565b5b604051908082528060200260200182016040528015620007405781602001602082028036833780820191505090505b50905082816000815181106200075b576200075a62000f82565b5b60200260200101818152505080915050919050565b6200078b8686868686866200099460201b620014ab1760201c565b505050505050565b505050505050565b620007c78473ffffffffffffffffffffffffffffffffffffffff1662000b8c60201b6200167b1760201c565b156200098c578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401620008109594939291906200140a565b6020604051808303816000875af19250505080156200084f57506040513d601f19601f820116820180604052508101906200084c9190620014cb565b60015b62000900576200085e6200150a565b806308c379a003620008c15750620008756200152f565b80620008825750620008c3565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008b891906200160b565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008f790620016a5565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146200098a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000981906200173d565b60405180910390fd5b505b505050505050565b620009af86868686868662000baf60201b6200169e1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160362000a6d5760005b835181101562000a6b5782818151811062000a075762000a0662000f82565b5b60200260200101516007600086848151811062000a295762000a2862000f82565b5b60200260200101518152602001908152602001600020600082825462000a50919062001334565b925050819055508062000a63906200175f565b9050620009e7565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362000b845760005b835181101562000b8257600084828151811062000ac75762000ac662000f82565b5b60200260200101519050600084838151811062000ae95762000ae862000f82565b5b602002602001015190506000600760008481526020019081526020016000205490508181101562000b51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b489062001822565b60405180910390fd5b81810360076000858152602001908152602001600020819055505050508062000b7a906200175f565b905062000aa5565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b826005810192821562000bef579160200282015b8281111562000bee578251829061ffff1690559160200191906001019062000bcb565b5b50905062000bfe919062000c02565b5090565b5b8082111562000c1d57600081600090555060010162000c03565b5090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000ca357607f821691505b60208210810362000cb95762000cb862000c5b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000d237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000ce4565b62000d2f868362000ce4565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000d7c62000d7662000d708462000d47565b62000d51565b62000d47565b9050919050565b6000819050919050565b62000d988362000d5b565b62000db062000da78262000d83565b84845462000cf1565b825550505050565b600090565b62000dc762000db8565b62000dd481848462000d8d565b505050565b5b8181101562000dfc5762000df060008262000dbd565b60018101905062000dda565b5050565b601f82111562000e4b5762000e158162000cbf565b62000e208462000cd4565b8101602085101562000e30578190505b62000e4862000e3f8562000cd4565b83018262000dd9565b50505b505050565b600082821c905092915050565b600062000e706000198460080262000e50565b1980831691505092915050565b600062000e8b838362000e5d565b9150826002028217905092915050565b62000ea68262000c21565b67ffffffffffffffff81111562000ec25762000ec162000c2c565b5b62000ece825462000c8a565b62000edb82828562000e00565b600060209050601f83116001811462000f13576000841562000efe578287015190505b62000f0a858262000e7d565b86555062000f7a565b601f19841662000f238662000cbf565b60005b8281101562000f4d5784890151825560018201915060208501945060208101905062000f26565b8683101562000f6d578489015162000f69601f89168262000e5d565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200101c8262000d47565b9150620010298362000d47565b9250826200103c576200103b62000fb1565b5b828204905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b620010818262001065565b810181811067ffffffffffffffff82111715620010a357620010a262000c2c565b5b80604052505050565b6000620010b862001047565b9050620010c6828262001076565b919050565b600067ffffffffffffffff821115620010e957620010e862000c2c565b5b620010f48262001065565b9050602081019050919050565b60005b838110156200112157808201518184015260208101905062001104565b60008484015250505050565b6000620011446200113e84620010cb565b620010ac565b90508281526020810184848401111562001163576200116262001060565b5b6200117084828562001101565b509392505050565b600082601f83011262001190576200118f6200105b565b5b8151620011a28482602086016200112d565b91505092915050565b600060208284031215620011c457620011c362001051565b5b600082015167ffffffffffffffff811115620011e557620011e462001056565b5b620011f38482850162001178565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200122982620011fc565b9050919050565b6200123b816200121c565b82525050565b600060408201905062001258600083018562001230565b62001267602083018462001230565b9392505050565b600060208201905062001285600083018462001230565b92915050565b600082825260208201905092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000620012fa6021836200128b565b915062001307826200129c565b604082019050919050565b600060208201905081810360008301526200132d81620012eb565b9050919050565b6000620013418262000d47565b91506200134e8362000d47565b925082820190508082111562001369576200136862000fe0565b5b92915050565b6200137a8162000d47565b82525050565b60006040820190506200139760008301856200136f565b620013a660208301846200136f565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000620013d682620013ad565b620013e28185620013b8565b9350620013f481856020860162001101565b620013ff8162001065565b840191505092915050565b600060a08201905062001421600083018862001230565b62001430602083018762001230565b6200143f60408301866200136f565b6200144e60608301856200136f565b8181036080830152620014628184620013c9565b90509695505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b620014a5816200146e565b8114620014b157600080fd5b50565b600081519050620014c5816200149a565b92915050565b600060208284031215620014e457620014e362001051565b5b6000620014f484828501620014b4565b91505092915050565b60008160e01c9050919050565b600060033d11156200152c5760046000803e62001529600051620014fd565b90505b90565b600060443d10620015c7576200154462001047565b60043d036004823e80513d602482011167ffffffffffffffff821117156200156e575050620015c7565b808201805167ffffffffffffffff8111156200158e5750505050620015c7565b80602083010160043d038501811115620015ad575050505050620015c7565b620015be8260200185018662001076565b82955050505050505b90565b6000620015d78262000c21565b620015e381856200128b565b9350620015f581856020860162001101565b620016008162001065565b840191505092915050565b60006020820190508181036000830152620016278184620015ca565b905092915050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006200168d6034836200128b565b91506200169a826200162f565b604082019050919050565b60006020820190508181036000830152620016c0816200167e565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000620017256028836200128b565b91506200173282620016c7565b604082019050919050565b60006020820190508181036000830152620017588162001716565b9050919050565b60006200176c8262000d47565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620017a157620017a062000fe0565b5b600182019050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b60006200180a6028836200128b565b91506200181782620017ac565b604082019050919050565b600060208201905081810360008301526200183d81620017fb565b9050919050565b61512880620018546000396000f3fe608060405234801561001057600080fd5b50600436106102055760003560e01c8063756af45f1161011a578063b32c5680116100ad578063d19653fb1161007c578063d19653fb14610610578063e985e9c51461062c578063f242432a1461065c578063f2fde38b14610678578063f5298aca1461069457610205565b8063b32c568014610564578063b77a147b14610594578063b822030f146105b0578063bd85b039146105e057610205565b8063957d7d0c116100e9578063957d7d0c146104ca57806395d89b41146104fa5780639d6378d814610518578063a22cb4651461054857610205565b8063756af45f1461045657806384584d07146104725780638a19c8bc1461048e5780638da5cb5b146104ac57610205565b80633bc91e281161019d5780634e1273f41161016c5780634e1273f4146103a05780634f558e79146103d05780635ea1ef52146104005780636b20c45414610430578063715018a61461044c57610205565b80633bc91e281461032a57806341f4343414610346578063457dbf2114610364578063471a42941461038257610205565b80630e89341c116101d95780630e89341c146102a45780632eb2c2d6146102d45780632eb4a7ab146102f05780633a73c58d1461030e57610205565b8062fdd58e1461020a57806301ffc9a71461023a57806302fe53051461026a57806306fdde0314610286575b600080fd5b610224600480360381019061021f9190612fb8565b6106b0565b6040516102319190613007565b60405180910390f35b610254600480360381019061024f919061307a565b610779565b60405161026191906130c2565b60405180910390f35b610284600480360381019061027f9190613223565b61085b565b005b61028e61086f565b60405161029b91906132eb565b60405180910390f35b6102be60048036038101906102b9919061330d565b6108fd565b6040516102cb91906132eb565b60405180910390f35b6102ee60048036038101906102e991906134a3565b610991565b005b6102f86109e4565b604051610305919061358b565b60405180910390f35b610328600480360381019061032391906135d2565b6109ea565b005b610344600480360381019061033f919061330d565b6109fe565b005b61034e610a61565b60405161035b919061365e565b60405180910390f35b61036c610a73565b60405161037991906130c2565b60405180910390f35b61038a610a86565b60405161039791906130c2565b60405180910390f35b6103ba60048036038101906103b5919061373c565b610a99565b6040516103c79190613872565b60405180910390f35b6103ea60048036038101906103e5919061330d565b610bb2565b6040516103f791906130c2565b60405180910390f35b61041a60048036038101906104159190613894565b610bc6565b6040516104279190613007565b60405180910390f35b61044a600480360381019061044591906138c1565b610c0f565b005b610454610cac565b005b610470600480360381019061046b919061398a565b610cc0565b005b61048c600480360381019061048791906139e3565b610d78565b005b610496610d8c565b6040516104a39190613007565b60405180910390f35b6104b4610d92565b6040516104c19190613a1f565b60405180910390f35b6104e460048036038101906104df9190612fb8565b610dbc565b6040516104f191906130c2565b60405180910390f35b610502610df5565b60405161050f91906132eb565b60405180910390f35b610532600480360381019061052d919061330d565b610e83565b60405161053f9190613007565b60405180910390f35b610562600480360381019061055d9190613a3a565b610e9e565b005b61057e60048036038101906105799190613b3d565b610eb7565b60405161058b91906130c2565b60405180910390f35b6105ae60048036038101906105a99190613b99565b610ef9565b005b6105ca60048036038101906105c5919061330d565b61124a565b6040516105d79190613007565b60405180910390f35b6105fa60048036038101906105f5919061330d565b611262565b6040516106079190613007565b60405180910390f35b61062a600480360381019061062591906135d2565b61127f565b005b61064660048036038101906106419190613be2565b6112a4565b60405161065391906130c2565b60405180910390f35b61067660048036038101906106719190613c22565b611338565b005b610692600480360381019061068d9190613894565b61138b565b005b6106ae60048036038101906106a99190613cb9565b61140e565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071790613d7e565b60405180910390fd5b6004600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108545750610853826116a6565b5b9050919050565b610863611710565b61086c8161178e565b50565b6009805461087c90613dcd565b80601f01602080910402602001604051908101604052809291908181526020018280546108a890613dcd565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b505050505081565b60606006805461090c90613dcd565b80601f016020809104026020016040519081016040528092919081815260200182805461093890613dcd565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b50505050509050919050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109cf576109ce336117a1565b5b6109dc868686868661189e565b505050505050565b60005481565b6109f2611710565b6109fb8161193f565b50565b610a06611710565b60008110158015610a18575060048111155b610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e90613e4a565b60405180910390fd5b80600c8190555050565b6daaeb6d7670e522a718067333cd4e81565b600160009054906101000a900460ff1681565b600b60009054906101000a900460ff1681565b60608151835114610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad690613edc565b60405180910390fd5b6000835167ffffffffffffffff811115610afc57610afb6130f8565b5b604051908082528060200260200182016040528015610b2a5781602001602082028036833780820191505090505b50905060005b8451811015610ba757610b77858281518110610b4f57610b4e613efc565b5b6020026020010151858381518110610b6a57610b69613efc565b5b60200260200101516106b0565b828281518110610b8a57610b89613efc565b5b60200260200101818152505080610ba090613f5a565b9050610b30565b508091505092915050565b600080610bbe83611262565b119050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c1761195c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610c5d5750610c5c83610c5761195c565b6112a4565b5b610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390614014565b60405180910390fd5b610ca7838383611964565b505050565b610cb4611710565b610cbe6000611c34565b565b610cc8611710565b60008173ffffffffffffffffffffffffffffffffffffffff1647604051610cee90614065565b60006040518083038185875af1925050503d8060008114610d2b576040519150601f19603f3d011682016040523d82523d6000602084013e610d30565b606091505b5050905080610d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b906140c6565b60405180910390fd5b5050565b610d80611710565b610d8981611cfa565b50565b600c5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528160005260406000208160058110610dd857600080fd5b60209182820401919006915091509054906101000a900460ff1681565b600a8054610e0290613dcd565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2e90613dcd565b8015610e7b5780601f10610e5057610100808354040283529160200191610e7b565b820191906000526020600020905b815481529060010190602001808311610e5e57829003601f168201915b505050505081565b600d8160058110610e9357600080fd5b016000915090505481565b81610ea8816117a1565b610eb28383611d3d565b505050565b60008083604051602001610ecb919061412e565b604051602081830303815290604052805190602001209050610ef08360005483611d53565b91505092915050565b610f01611d6a565b600b60009054906101000a900460ff16610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790614195565b60405180910390fd5b600160009054906101000a900460ff1615610faf57610f6f3382610eb7565b610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590614201565b60405180910390fd5b5b60001515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600c546005811061100657611005613efc565b5b602091828204019190069054906101000a900460ff1615151461105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590614293565b60405180910390fd5b600d600c546005811061107457611073613efc565b5b015460146000600c54815260200190815260200160002054106110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c3906142ff565b60405180910390fd5b6110d533611db9565b611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b9061436b565b60405180910390fd5b6000600c5490506013546111286005611262565b10801561113857506004600c5414155b1561116a57600a61115f600d600c546005811061115857611157613efc565b5b0154611dff565b0361116957600590505b5b600581146111ae57600160146000600c54815260200190815260200160002054611194919061438b565b60146000600c548152602001908152602001600020819055505b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600c546005811061120357611202613efc565b5b602091828204019190066101000a81548160ff02191690831515021790555061123e3382600160405180602001604052806000815250611e60565b50611247612011565b50565b60146020528060005260406000206000915090505481565b600060076000838152602001908152602001600020549050919050565b611287611710565b80600b60006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461137657611375336117a1565b5b611383868686868661201b565b505050505050565b611393611710565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990614431565b60405180910390fd5b61140b81611c34565b50565b61141661195c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061145c575061145b8361145661195c565b6112a4565b5b61149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614014565b60405180910390fd5b6114a68383836120bc565b505050565b6114b986868686868661169e565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361156a5760005b83518110156115685782818151811061150c5761150b613efc565b5b60200260200101516007600086848151811061152b5761152a613efc565b5b602002602001015181526020019081526020016000206000828254611550919061438b565b925050819055508061156190613f5a565b90506114f0565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036116735760005b83518110156116715760008482815181106115bf576115be613efc565b5b6020026020010151905060008483815181106115de576115dd613efc565b5b6020026020010151905060006007600084815260200190815260200160002054905081811015611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163a906144c3565b60405180910390fd5b81810360076000858152602001908152602001600020819055505050508061166a90613f5a565b90506115a1565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61171861195c565b73ffffffffffffffffffffffffffffffffffffffff16611736610d92565b73ffffffffffffffffffffffffffffffffffffffff161461178c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117839061452f565b60405180910390fd5b565b806006908161179d91906146f1565b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561189b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016118189291906147c3565b602060405180830381865afa158015611835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118599190614801565b61189a57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016118919190613a1f565b60405180910390fd5b5b50565b6118a661195c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806118ec57506118eb856118e661195c565b6112a4565b5b61192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290614014565b60405180910390fd5b6119388585858585612304565b5050505050565b80600160006101000a81548160ff02191690831515021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ca906148a0565b60405180910390fd5b8051825114611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90614932565b60405180910390fd5b6000611a2161195c565b9050611a4181856000868660405180602001604052806000815250612628565b60005b8351811015611b90576000848281518110611a6257611a61613efc565b5b602002602001015190506000848381518110611a8157611a80613efc565b5b6020026020010151905060006004600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1a906149c4565b60405180910390fd5b8181036004600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611b8890613f5a565b915050611a44565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611c089291906149e4565b60405180910390a4611c2e8185600086866040518060200160405280600081525061263e565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806000819055507f1b930366dfeaa7eb3b325021e4ae81e36527063452ee55b86c95f85b36f4c31c600054604051611d32919061358b565b60405180910390a150565b611d4f611d4861195c565b8383612646565b5050565b600082611d6085846127b2565b1490509392505050565b600260035403611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690614a67565b60405180910390fd5b6002600381905550565b6000805b600c54811015611df4576001611dd384836106b0565b1015611de3576000915050611dfa565b80611ded90613f5a565b9050611dbd565b50600190505b919050565b600080824233601654604051602001611e1a93929190614aa8565b6040516020818303038152906040528051906020012060001c611e3d9190614b14565b905060166000815480929190611e5290613f5a565b919050555080915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec690614bb7565b60405180910390fd5b6000611ed961195c565b90506000611ee685612808565b90506000611ef385612808565b9050611f0483600089858589612628565b846004600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f64919061438b565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611fe2929190614bd7565b60405180910390a4611ff98360008985858961263e565b61200883600089898989612882565b50505050505050565b6001600381905550565b61202361195c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061206957506120688561206361195c565b6112a4565b5b6120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90614014565b60405180910390fd5b6120b58585858585612a59565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361212b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612122906148a0565b60405180910390fd5b600061213561195c565b9050600061214284612808565b9050600061214f84612808565b905061216f83876000858560405180602001604052806000815250612628565b60006004600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe906149c4565b60405180910390fd5b8481036004600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516122d5929190614bd7565b60405180910390a46122fb8488600086866040518060200160405280600081525061263e565b50505050505050565b8151835114612348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233f90614932565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036123b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ae90614c72565b60405180910390fd5b60006123c161195c565b90506123d1818787878787612628565b60005b84518110156125855760008582815181106123f2576123f1613efc565b5b60200260200101519050600085838151811061241157612410613efc565b5b6020026020010151905060006004600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156124b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124aa90614d04565b60405180910390fd5b8181036004600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816004600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256a919061438b565b925050819055505050508061257e90613f5a565b90506123d4565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516125fc9291906149e4565b60405180910390a461261281878787878761263e565b612620818787878787612cf7565b505050505050565b6126368686868686866114ab565b505050505050565b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ab90614d96565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127a591906130c2565b60405180910390a3505050565b60008082905060005b84518110156127fd576127e8828683815181106127db576127da613efc565b5b6020026020010151612ece565b915080806127f590613f5a565b9150506127bb565b508091505092915050565b60606000600167ffffffffffffffff811115612827576128266130f8565b5b6040519080825280602002602001820160405280156128555781602001602082028036833780820191505090505b509050828160008151811061286d5761286c613efc565b5b60200260200101818152505080915050919050565b6128a18473ffffffffffffffffffffffffffffffffffffffff1661167b565b15612a51578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016128e7959493929190614e0b565b6020604051808303816000875af192505050801561292357506040513d601f19601f820116820180604052508101906129209190614e7a565b60015b6129c85761292f614eb4565b806308c379a00361298b5750612943614ed6565b8061294e575061298d565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298291906132eb565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bf90614fd8565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a469061506a565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abf90614c72565b60405180910390fd5b6000612ad261195c565b90506000612adf85612808565b90506000612aec85612808565b9050612afc838989858589612628565b60006004600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8b90614d04565b60405180910390fd5b8581036004600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856004600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c4b919061438b565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612cc8929190614bd7565b60405180910390a4612cde848a8a86868a61263e565b612cec848a8a8a8a8a612882565b505050505050505050565b612d168473ffffffffffffffffffffffffffffffffffffffff1661167b565b15612ec6578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612d5c95949392919061508a565b6020604051808303816000875af1925050508015612d9857506040513d601f19601f82011682018060405250810190612d959190614e7a565b60015b612e3d57612da4614eb4565b806308c379a003612e005750612db8614ed6565b80612dc35750612e02565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df791906132eb565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3490614fd8565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebb9061506a565b60405180910390fd5b505b505050505050565b6000818310612ee657612ee18284612ef9565b612ef1565b612ef08383612ef9565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f4f82612f24565b9050919050565b612f5f81612f44565b8114612f6a57600080fd5b50565b600081359050612f7c81612f56565b92915050565b6000819050919050565b612f9581612f82565b8114612fa057600080fd5b50565b600081359050612fb281612f8c565b92915050565b60008060408385031215612fcf57612fce612f1a565b5b6000612fdd85828601612f6d565b9250506020612fee85828601612fa3565b9150509250929050565b61300181612f82565b82525050565b600060208201905061301c6000830184612ff8565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61305781613022565b811461306257600080fd5b50565b6000813590506130748161304e565b92915050565b6000602082840312156130905761308f612f1a565b5b600061309e84828501613065565b91505092915050565b60008115159050919050565b6130bc816130a7565b82525050565b60006020820190506130d760008301846130b3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613130826130e7565b810181811067ffffffffffffffff8211171561314f5761314e6130f8565b5b80604052505050565b6000613162612f10565b905061316e8282613127565b919050565b600067ffffffffffffffff82111561318e5761318d6130f8565b5b613197826130e7565b9050602081019050919050565b82818337600083830152505050565b60006131c66131c184613173565b613158565b9050828152602081018484840111156131e2576131e16130e2565b5b6131ed8482856131a4565b509392505050565b600082601f83011261320a576132096130dd565b5b813561321a8482602086016131b3565b91505092915050565b60006020828403121561323957613238612f1a565b5b600082013567ffffffffffffffff81111561325757613256612f1f565b5b613263848285016131f5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132a657808201518184015260208101905061328b565b60008484015250505050565b60006132bd8261326c565b6132c78185613277565b93506132d7818560208601613288565b6132e0816130e7565b840191505092915050565b6000602082019050818103600083015261330581846132b2565b905092915050565b60006020828403121561332357613322612f1a565b5b600061333184828501612fa3565b91505092915050565b600067ffffffffffffffff821115613355576133546130f8565b5b602082029050602081019050919050565b600080fd5b600061337e6133798461333a565b613158565b905080838252602082019050602084028301858111156133a1576133a0613366565b5b835b818110156133ca57806133b68882612fa3565b8452602084019350506020810190506133a3565b5050509392505050565b600082601f8301126133e9576133e86130dd565b5b81356133f984826020860161336b565b91505092915050565b600067ffffffffffffffff82111561341d5761341c6130f8565b5b613426826130e7565b9050602081019050919050565b600061344661344184613402565b613158565b905082815260208101848484011115613462576134616130e2565b5b61346d8482856131a4565b509392505050565b600082601f83011261348a576134896130dd565b5b813561349a848260208601613433565b91505092915050565b600080600080600060a086880312156134bf576134be612f1a565b5b60006134cd88828901612f6d565b95505060206134de88828901612f6d565b945050604086013567ffffffffffffffff8111156134ff576134fe612f1f565b5b61350b888289016133d4565b935050606086013567ffffffffffffffff81111561352c5761352b612f1f565b5b613538888289016133d4565b925050608086013567ffffffffffffffff81111561355957613558612f1f565b5b61356588828901613475565b9150509295509295909350565b6000819050919050565b61358581613572565b82525050565b60006020820190506135a0600083018461357c565b92915050565b6135af816130a7565b81146135ba57600080fd5b50565b6000813590506135cc816135a6565b92915050565b6000602082840312156135e8576135e7612f1a565b5b60006135f6848285016135bd565b91505092915050565b6000819050919050565b600061362461361f61361a84612f24565b6135ff565b612f24565b9050919050565b600061363682613609565b9050919050565b60006136488261362b565b9050919050565b6136588161363d565b82525050565b6000602082019050613673600083018461364f565b92915050565b600067ffffffffffffffff821115613694576136936130f8565b5b602082029050602081019050919050565b60006136b86136b384613679565b613158565b905080838252602082019050602084028301858111156136db576136da613366565b5b835b8181101561370457806136f08882612f6d565b8452602084019350506020810190506136dd565b5050509392505050565b600082601f830112613723576137226130dd565b5b81356137338482602086016136a5565b91505092915050565b6000806040838503121561375357613752612f1a565b5b600083013567ffffffffffffffff81111561377157613770612f1f565b5b61377d8582860161370e565b925050602083013567ffffffffffffffff81111561379e5761379d612f1f565b5b6137aa858286016133d4565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137e981612f82565b82525050565b60006137fb83836137e0565b60208301905092915050565b6000602082019050919050565b600061381f826137b4565b61382981856137bf565b9350613834836137d0565b8060005b8381101561386557815161384c88826137ef565b975061385783613807565b925050600181019050613838565b5085935050505092915050565b6000602082019050818103600083015261388c8184613814565b905092915050565b6000602082840312156138aa576138a9612f1a565b5b60006138b884828501612f6d565b91505092915050565b6000806000606084860312156138da576138d9612f1a565b5b60006138e886828701612f6d565b935050602084013567ffffffffffffffff81111561390957613908612f1f565b5b613915868287016133d4565b925050604084013567ffffffffffffffff81111561393657613935612f1f565b5b613942868287016133d4565b9150509250925092565b600061395782612f24565b9050919050565b6139678161394c565b811461397257600080fd5b50565b6000813590506139848161395e565b92915050565b6000602082840312156139a05761399f612f1a565b5b60006139ae84828501613975565b91505092915050565b6139c081613572565b81146139cb57600080fd5b50565b6000813590506139dd816139b7565b92915050565b6000602082840312156139f9576139f8612f1a565b5b6000613a07848285016139ce565b91505092915050565b613a1981612f44565b82525050565b6000602082019050613a346000830184613a10565b92915050565b60008060408385031215613a5157613a50612f1a565b5b6000613a5f85828601612f6d565b9250506020613a70858286016135bd565b9150509250929050565b600067ffffffffffffffff821115613a9557613a946130f8565b5b602082029050602081019050919050565b6000613ab9613ab484613a7a565b613158565b90508083825260208201905060208402830185811115613adc57613adb613366565b5b835b81811015613b055780613af188826139ce565b845260208401935050602081019050613ade565b5050509392505050565b600082601f830112613b2457613b236130dd565b5b8135613b34848260208601613aa6565b91505092915050565b60008060408385031215613b5457613b53612f1a565b5b6000613b6285828601612f6d565b925050602083013567ffffffffffffffff811115613b8357613b82612f1f565b5b613b8f85828601613b0f565b9150509250929050565b600060208284031215613baf57613bae612f1a565b5b600082013567ffffffffffffffff811115613bcd57613bcc612f1f565b5b613bd984828501613b0f565b91505092915050565b60008060408385031215613bf957613bf8612f1a565b5b6000613c0785828601612f6d565b9250506020613c1885828601612f6d565b9150509250929050565b600080600080600060a08688031215613c3e57613c3d612f1a565b5b6000613c4c88828901612f6d565b9550506020613c5d88828901612f6d565b9450506040613c6e88828901612fa3565b9350506060613c7f88828901612fa3565b925050608086013567ffffffffffffffff811115613ca057613c9f612f1f565b5b613cac88828901613475565b9150509295509295909350565b600080600060608486031215613cd257613cd1612f1a565b5b6000613ce086828701612f6d565b9350506020613cf186828701612fa3565b9250506040613d0286828701612fa3565b9150509250925092565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613d68602a83613277565b9150613d7382613d0c565b604082019050919050565b60006020820190508181036000830152613d9781613d5b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613de557607f821691505b602082108103613df857613df7613d9e565b5b50919050565b7f526f756e64206d757374206265206265747765656e203020616e642034000000600082015250565b6000613e34601d83613277565b9150613e3f82613dfe565b602082019050919050565b60006020820190508181036000830152613e6381613e27565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000613ec6602983613277565b9150613ed182613e6a565b604082019050919050565b60006020820190508181036000830152613ef581613eb9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f6582612f82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f9757613f96613f2b565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000613ffe602f83613277565b915061400982613fa2565b604082019050919050565b6000602082019050818103600083015261402d81613ff1565b9050919050565b600081905092915050565b50565b600061404f600083614034565b915061405a8261403f565b600082019050919050565b600061407082614042565b9150819050919050565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b60006140b0600f83613277565b91506140bb8261407a565b602082019050919050565b600060208201905081810360008301526140df816140a3565b9050919050565b60008160601b9050919050565b60006140fe826140e6565b9050919050565b6000614110826140f3565b9050919050565b61412861412382612f44565b614105565b82525050565b600061413a8284614117565b60148201915081905092915050565b7f4d696e74206973206e6f74206163746976650000000000000000000000000000600082015250565b600061417f601283613277565b915061418a82614149565b602082019050919050565b600060208201905081810360008301526141ae81614172565b9050919050565b7f4e6f74206f6e20616c6c6f77206c697374000000000000000000000000000000600082015250565b60006141eb601183613277565b91506141f6826141b5565b602082019050919050565b6000602082019050818103600083015261421a816141de565b9050919050565b7f416c7265616479206d696e746564206120746f6b656e207468697320726f756e60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061427d602183613277565b915061428882614221565b604082019050919050565b600060208201905081810360008301526142ac81614270565b9050919050565b7f4e6f2072656d616e696e6720737570706c79207468697320726f756e64000000600082015250565b60006142e9601d83613277565b91506142f4826142b3565b602082019050919050565b60006020820190508181036000830152614318816142dc565b9050919050565b7f41646472657373206973206d697373696e67206120746f6b656e000000000000600082015250565b6000614355601a83613277565b91506143608261431f565b602082019050919050565b6000602082019050818103600083015261438481614348565b9050919050565b600061439682612f82565b91506143a183612f82565b92508282019050808211156143b9576143b8613f2b565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061441b602683613277565b9150614426826143bf565b604082019050919050565b6000602082019050818103600083015261444a8161440e565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b60006144ad602883613277565b91506144b882614451565b604082019050919050565b600060208201905081810360008301526144dc816144a0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614519602083613277565b9150614524826144e3565b602082019050919050565b600060208201905081810360008301526145488161450c565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026145b17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614574565b6145bb8683614574565b95508019841693508086168417925050509392505050565b60006145ee6145e96145e484612f82565b6135ff565b612f82565b9050919050565b6000819050919050565b614608836145d3565b61461c614614826145f5565b848454614581565b825550505050565b600090565b614631614624565b61463c8184846145ff565b505050565b5b8181101561466057614655600082614629565b600181019050614642565b5050565b601f8211156146a5576146768161454f565b61467f84614564565b8101602085101561468e578190505b6146a261469a85614564565b830182614641565b50505b505050565b600082821c905092915050565b60006146c8600019846008026146aa565b1980831691505092915050565b60006146e183836146b7565b9150826002028217905092915050565b6146fa8261326c565b67ffffffffffffffff811115614713576147126130f8565b5b61471d8254613dcd565b614728828285614664565b600060209050601f83116001811461475b5760008415614749578287015190505b61475385826146d5565b8655506147bb565b601f1984166147698661454f565b60005b828110156147915784890151825560018201915060208501945060208101905061476c565b868310156147ae57848901516147aa601f8916826146b7565b8355505b6001600288020188555050505b505050505050565b60006040820190506147d86000830185613a10565b6147e56020830184613a10565b9392505050565b6000815190506147fb816135a6565b92915050565b60006020828403121561481757614816612f1a565b5b6000614825848285016147ec565b91505092915050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061488a602383613277565b91506148958261482e565b604082019050919050565b600060208201905081810360008301526148b98161487d565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b600061491c602883613277565b9150614927826148c0565b604082019050919050565b6000602082019050818103600083015261494b8161490f565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006149ae602483613277565b91506149b982614952565b604082019050919050565b600060208201905081810360008301526149dd816149a1565b9050919050565b600060408201905081810360008301526149fe8185613814565b90508181036020830152614a128184613814565b90509392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614a51601f83613277565b9150614a5c82614a1b565b602082019050919050565b60006020820190508181036000830152614a8081614a44565b9050919050565b6000819050919050565b614aa2614a9d82612f82565b614a87565b82525050565b6000614ab48286614a91565b602082019150614ac48285614117565b601482019150614ad48284614a91565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b1f82612f82565b9150614b2a83612f82565b925082614b3a57614b39614ae5565b5b828206905092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ba1602183613277565b9150614bac82614b45565b604082019050919050565b60006020820190508181036000830152614bd081614b94565b9050919050565b6000604082019050614bec6000830185612ff8565b614bf96020830184612ff8565b9392505050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c5c602583613277565b9150614c6782614c00565b604082019050919050565b60006020820190508181036000830152614c8b81614c4f565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614cee602a83613277565b9150614cf982614c92565b604082019050919050565b60006020820190508181036000830152614d1d81614ce1565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614d80602983613277565b9150614d8b82614d24565b604082019050919050565b60006020820190508181036000830152614daf81614d73565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614ddd82614db6565b614de78185614dc1565b9350614df7818560208601613288565b614e00816130e7565b840191505092915050565b600060a082019050614e206000830188613a10565b614e2d6020830187613a10565b614e3a6040830186612ff8565b614e476060830185612ff8565b8181036080830152614e598184614dd2565b90509695505050505050565b600081519050614e748161304e565b92915050565b600060208284031215614e9057614e8f612f1a565b5b6000614e9e84828501614e65565b91505092915050565b60008160e01c9050919050565b600060033d1115614ed35760046000803e614ed0600051614ea7565b90505b90565b600060443d10614f6357614ee8612f10565b60043d036004823e80513d602482011167ffffffffffffffff82111715614f10575050614f63565b808201805167ffffffffffffffff811115614f2e5750505050614f63565b80602083010160043d038501811115614f4b575050505050614f63565b614f5a82602001850186613127565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614fc2603483613277565b9150614fcd82614f66565b604082019050919050565b60006020820190508181036000830152614ff181614fb5565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615054602883613277565b915061505f82614ff8565b604082019050919050565b6000602082019050818103600083015261508381615047565b9050919050565b600060a08201905061509f6000830188613a10565b6150ac6020830187613a10565b81810360408301526150be8186613814565b905081810360608301526150d28185613814565b905081810360808301526150e68184614dd2565b9050969550505050505056fea26469706673582212201439b4226428d3116e871f96ed80a1e2e82141610a3a4ec9e1e95ba4fcc0115564736f6c634300081100330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f6d657461646174612e6172746c61622e78797a2f30313835633134382d626433302d386434392d383336622d3566386561623466636466662f7b69647d000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102055760003560e01c8063756af45f1161011a578063b32c5680116100ad578063d19653fb1161007c578063d19653fb14610610578063e985e9c51461062c578063f242432a1461065c578063f2fde38b14610678578063f5298aca1461069457610205565b8063b32c568014610564578063b77a147b14610594578063b822030f146105b0578063bd85b039146105e057610205565b8063957d7d0c116100e9578063957d7d0c146104ca57806395d89b41146104fa5780639d6378d814610518578063a22cb4651461054857610205565b8063756af45f1461045657806384584d07146104725780638a19c8bc1461048e5780638da5cb5b146104ac57610205565b80633bc91e281161019d5780634e1273f41161016c5780634e1273f4146103a05780634f558e79146103d05780635ea1ef52146104005780636b20c45414610430578063715018a61461044c57610205565b80633bc91e281461032a57806341f4343414610346578063457dbf2114610364578063471a42941461038257610205565b80630e89341c116101d95780630e89341c146102a45780632eb2c2d6146102d45780632eb4a7ab146102f05780633a73c58d1461030e57610205565b8062fdd58e1461020a57806301ffc9a71461023a57806302fe53051461026a57806306fdde0314610286575b600080fd5b610224600480360381019061021f9190612fb8565b6106b0565b6040516102319190613007565b60405180910390f35b610254600480360381019061024f919061307a565b610779565b60405161026191906130c2565b60405180910390f35b610284600480360381019061027f9190613223565b61085b565b005b61028e61086f565b60405161029b91906132eb565b60405180910390f35b6102be60048036038101906102b9919061330d565b6108fd565b6040516102cb91906132eb565b60405180910390f35b6102ee60048036038101906102e991906134a3565b610991565b005b6102f86109e4565b604051610305919061358b565b60405180910390f35b610328600480360381019061032391906135d2565b6109ea565b005b610344600480360381019061033f919061330d565b6109fe565b005b61034e610a61565b60405161035b919061365e565b60405180910390f35b61036c610a73565b60405161037991906130c2565b60405180910390f35b61038a610a86565b60405161039791906130c2565b60405180910390f35b6103ba60048036038101906103b5919061373c565b610a99565b6040516103c79190613872565b60405180910390f35b6103ea60048036038101906103e5919061330d565b610bb2565b6040516103f791906130c2565b60405180910390f35b61041a60048036038101906104159190613894565b610bc6565b6040516104279190613007565b60405180910390f35b61044a600480360381019061044591906138c1565b610c0f565b005b610454610cac565b005b610470600480360381019061046b919061398a565b610cc0565b005b61048c600480360381019061048791906139e3565b610d78565b005b610496610d8c565b6040516104a39190613007565b60405180910390f35b6104b4610d92565b6040516104c19190613a1f565b60405180910390f35b6104e460048036038101906104df9190612fb8565b610dbc565b6040516104f191906130c2565b60405180910390f35b610502610df5565b60405161050f91906132eb565b60405180910390f35b610532600480360381019061052d919061330d565b610e83565b60405161053f9190613007565b60405180910390f35b610562600480360381019061055d9190613a3a565b610e9e565b005b61057e60048036038101906105799190613b3d565b610eb7565b60405161058b91906130c2565b60405180910390f35b6105ae60048036038101906105a99190613b99565b610ef9565b005b6105ca60048036038101906105c5919061330d565b61124a565b6040516105d79190613007565b60405180910390f35b6105fa60048036038101906105f5919061330d565b611262565b6040516106079190613007565b60405180910390f35b61062a600480360381019061062591906135d2565b61127f565b005b61064660048036038101906106419190613be2565b6112a4565b60405161065391906130c2565b60405180910390f35b61067660048036038101906106719190613c22565b611338565b005b610692600480360381019061068d9190613894565b61138b565b005b6106ae60048036038101906106a99190613cb9565b61140e565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071790613d7e565b60405180910390fd5b6004600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108545750610853826116a6565b5b9050919050565b610863611710565b61086c8161178e565b50565b6009805461087c90613dcd565b80601f01602080910402602001604051908101604052809291908181526020018280546108a890613dcd565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b505050505081565b60606006805461090c90613dcd565b80601f016020809104026020016040519081016040528092919081815260200182805461093890613dcd565b80156109855780601f1061095a57610100808354040283529160200191610985565b820191906000526020600020905b81548152906001019060200180831161096857829003601f168201915b50505050509050919050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109cf576109ce336117a1565b5b6109dc868686868661189e565b505050505050565b60005481565b6109f2611710565b6109fb8161193f565b50565b610a06611710565b60008110158015610a18575060048111155b610a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4e90613e4a565b60405180910390fd5b80600c8190555050565b6daaeb6d7670e522a718067333cd4e81565b600160009054906101000a900460ff1681565b600b60009054906101000a900460ff1681565b60608151835114610adf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad690613edc565b60405180910390fd5b6000835167ffffffffffffffff811115610afc57610afb6130f8565b5b604051908082528060200260200182016040528015610b2a5781602001602082028036833780820191505090505b50905060005b8451811015610ba757610b77858281518110610b4f57610b4e613efc565b5b6020026020010151858381518110610b6a57610b69613efc565b5b60200260200101516106b0565b828281518110610b8a57610b89613efc565b5b60200260200101818152505080610ba090613f5a565b9050610b30565b508091505092915050565b600080610bbe83611262565b119050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c1761195c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610c5d5750610c5c83610c5761195c565b6112a4565b5b610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9390614014565b60405180910390fd5b610ca7838383611964565b505050565b610cb4611710565b610cbe6000611c34565b565b610cc8611710565b60008173ffffffffffffffffffffffffffffffffffffffff1647604051610cee90614065565b60006040518083038185875af1925050503d8060008114610d2b576040519150601f19603f3d011682016040523d82523d6000602084013e610d30565b606091505b5050905080610d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b906140c6565b60405180910390fd5b5050565b610d80611710565b610d8981611cfa565b50565b600c5481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60156020528160005260406000208160058110610dd857600080fd5b60209182820401919006915091509054906101000a900460ff1681565b600a8054610e0290613dcd565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2e90613dcd565b8015610e7b5780601f10610e5057610100808354040283529160200191610e7b565b820191906000526020600020905b815481529060010190602001808311610e5e57829003601f168201915b505050505081565b600d8160058110610e9357600080fd5b016000915090505481565b81610ea8816117a1565b610eb28383611d3d565b505050565b60008083604051602001610ecb919061412e565b604051602081830303815290604052805190602001209050610ef08360005483611d53565b91505092915050565b610f01611d6a565b600b60009054906101000a900460ff16610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790614195565b60405180910390fd5b600160009054906101000a900460ff1615610faf57610f6f3382610eb7565b610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590614201565b60405180910390fd5b5b60001515601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600c546005811061100657611005613efc565b5b602091828204019190069054906101000a900460ff1615151461105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590614293565b60405180910390fd5b600d600c546005811061107457611073613efc565b5b015460146000600c54815260200190815260200160002054106110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c3906142ff565b60405180910390fd5b6110d533611db9565b611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b9061436b565b60405180910390fd5b6000600c5490506013546111286005611262565b10801561113857506004600c5414155b1561116a57600a61115f600d600c546005811061115857611157613efc565b5b0154611dff565b0361116957600590505b5b600581146111ae57600160146000600c54815260200190815260200160002054611194919061438b565b60146000600c548152602001908152602001600020819055505b6001601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600c546005811061120357611202613efc565b5b602091828204019190066101000a81548160ff02191690831515021790555061123e3382600160405180602001604052806000815250611e60565b50611247612011565b50565b60146020528060005260406000206000915090505481565b600060076000838152602001908152602001600020549050919050565b611287611710565b80600b60006101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461137657611375336117a1565b5b611383868686868661201b565b505050505050565b611393611710565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990614431565b60405180910390fd5b61140b81611c34565b50565b61141661195c565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061145c575061145b8361145661195c565b6112a4565b5b61149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614014565b60405180910390fd5b6114a68383836120bc565b505050565b6114b986868686868661169e565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361156a5760005b83518110156115685782818151811061150c5761150b613efc565b5b60200260200101516007600086848151811061152b5761152a613efc565b5b602002602001015181526020019081526020016000206000828254611550919061438b565b925050819055508061156190613f5a565b90506114f0565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036116735760005b83518110156116715760008482815181106115bf576115be613efc565b5b6020026020010151905060008483815181106115de576115dd613efc565b5b6020026020010151905060006007600084815260200190815260200160002054905081811015611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163a906144c3565b60405180910390fd5b81810360076000858152602001908152602001600020819055505050508061166a90613f5a565b90506115a1565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61171861195c565b73ffffffffffffffffffffffffffffffffffffffff16611736610d92565b73ffffffffffffffffffffffffffffffffffffffff161461178c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117839061452f565b60405180910390fd5b565b806006908161179d91906146f1565b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561189b576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016118189291906147c3565b602060405180830381865afa158015611835573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118599190614801565b61189a57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016118919190613a1f565b60405180910390fd5b5b50565b6118a661195c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806118ec57506118eb856118e661195c565b6112a4565b5b61192b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192290614014565b60405180910390fd5b6119388585858585612304565b5050505050565b80600160006101000a81548160ff02191690831515021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036119d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ca906148a0565b60405180910390fd5b8051825114611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e90614932565b60405180910390fd5b6000611a2161195c565b9050611a4181856000868660405180602001604052806000815250612628565b60005b8351811015611b90576000848281518110611a6257611a61613efc565b5b602002602001015190506000848381518110611a8157611a80613efc565b5b6020026020010151905060006004600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1a906149c4565b60405180910390fd5b8181036004600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611b8890613f5a565b915050611a44565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611c089291906149e4565b60405180910390a4611c2e8185600086866040518060200160405280600081525061263e565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806000819055507f1b930366dfeaa7eb3b325021e4ae81e36527063452ee55b86c95f85b36f4c31c600054604051611d32919061358b565b60405180910390a150565b611d4f611d4861195c565b8383612646565b5050565b600082611d6085846127b2565b1490509392505050565b600260035403611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690614a67565b60405180910390fd5b6002600381905550565b6000805b600c54811015611df4576001611dd384836106b0565b1015611de3576000915050611dfa565b80611ded90613f5a565b9050611dbd565b50600190505b919050565b600080824233601654604051602001611e1a93929190614aa8565b6040516020818303038152906040528051906020012060001c611e3d9190614b14565b905060166000815480929190611e5290613f5a565b919050555080915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ecf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec690614bb7565b60405180910390fd5b6000611ed961195c565b90506000611ee685612808565b90506000611ef385612808565b9050611f0483600089858589612628565b846004600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f64919061438b565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611fe2929190614bd7565b60405180910390a4611ff98360008985858961263e565b61200883600089898989612882565b50505050505050565b6001600381905550565b61202361195c565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061206957506120688561206361195c565b6112a4565b5b6120a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209f90614014565b60405180910390fd5b6120b58585858585612a59565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361212b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612122906148a0565b60405180910390fd5b600061213561195c565b9050600061214284612808565b9050600061214f84612808565b905061216f83876000858560405180602001604052806000815250612628565b60006004600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612207576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fe906149c4565b60405180910390fd5b8481036004600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516122d5929190614bd7565b60405180910390a46122fb8488600086866040518060200160405280600081525061263e565b50505050505050565b8151835114612348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233f90614932565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036123b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ae90614c72565b60405180910390fd5b60006123c161195c565b90506123d1818787878787612628565b60005b84518110156125855760008582815181106123f2576123f1613efc565b5b60200260200101519050600085838151811061241157612410613efc565b5b6020026020010151905060006004600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156124b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124aa90614d04565b60405180910390fd5b8181036004600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816004600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461256a919061438b565b925050819055505050508061257e90613f5a565b90506123d4565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516125fc9291906149e4565b60405180910390a461261281878787878761263e565b612620818787878787612cf7565b505050505050565b6126368686868686866114ab565b505050505050565b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ab90614d96565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516127a591906130c2565b60405180910390a3505050565b60008082905060005b84518110156127fd576127e8828683815181106127db576127da613efc565b5b6020026020010151612ece565b915080806127f590613f5a565b9150506127bb565b508091505092915050565b60606000600167ffffffffffffffff811115612827576128266130f8565b5b6040519080825280602002602001820160405280156128555781602001602082028036833780820191505090505b509050828160008151811061286d5761286c613efc565b5b60200260200101818152505080915050919050565b6128a18473ffffffffffffffffffffffffffffffffffffffff1661167b565b15612a51578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016128e7959493929190614e0b565b6020604051808303816000875af192505050801561292357506040513d601f19601f820116820180604052508101906129209190614e7a565b60015b6129c85761292f614eb4565b806308c379a00361298b5750612943614ed6565b8061294e575061298d565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298291906132eb565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bf90614fd8565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a469061506a565b60405180910390fd5b505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abf90614c72565b60405180910390fd5b6000612ad261195c565b90506000612adf85612808565b90506000612aec85612808565b9050612afc838989858589612628565b60006004600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8b90614d04565b60405180910390fd5b8581036004600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856004600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c4b919061438b565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612cc8929190614bd7565b60405180910390a4612cde848a8a86868a61263e565b612cec848a8a8a8a8a612882565b505050505050505050565b612d168473ffffffffffffffffffffffffffffffffffffffff1661167b565b15612ec6578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401612d5c95949392919061508a565b6020604051808303816000875af1925050508015612d9857506040513d601f19601f82011682018060405250810190612d959190614e7a565b60015b612e3d57612da4614eb4565b806308c379a003612e005750612db8614ed6565b80612dc35750612e02565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df791906132eb565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3490614fd8565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebb9061506a565b60405180910390fd5b505b505050505050565b6000818310612ee657612ee18284612ef9565b612ef1565b612ef08383612ef9565b5b905092915050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612f4f82612f24565b9050919050565b612f5f81612f44565b8114612f6a57600080fd5b50565b600081359050612f7c81612f56565b92915050565b6000819050919050565b612f9581612f82565b8114612fa057600080fd5b50565b600081359050612fb281612f8c565b92915050565b60008060408385031215612fcf57612fce612f1a565b5b6000612fdd85828601612f6d565b9250506020612fee85828601612fa3565b9150509250929050565b61300181612f82565b82525050565b600060208201905061301c6000830184612ff8565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61305781613022565b811461306257600080fd5b50565b6000813590506130748161304e565b92915050565b6000602082840312156130905761308f612f1a565b5b600061309e84828501613065565b91505092915050565b60008115159050919050565b6130bc816130a7565b82525050565b60006020820190506130d760008301846130b3565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613130826130e7565b810181811067ffffffffffffffff8211171561314f5761314e6130f8565b5b80604052505050565b6000613162612f10565b905061316e8282613127565b919050565b600067ffffffffffffffff82111561318e5761318d6130f8565b5b613197826130e7565b9050602081019050919050565b82818337600083830152505050565b60006131c66131c184613173565b613158565b9050828152602081018484840111156131e2576131e16130e2565b5b6131ed8482856131a4565b509392505050565b600082601f83011261320a576132096130dd565b5b813561321a8482602086016131b3565b91505092915050565b60006020828403121561323957613238612f1a565b5b600082013567ffffffffffffffff81111561325757613256612f1f565b5b613263848285016131f5565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156132a657808201518184015260208101905061328b565b60008484015250505050565b60006132bd8261326c565b6132c78185613277565b93506132d7818560208601613288565b6132e0816130e7565b840191505092915050565b6000602082019050818103600083015261330581846132b2565b905092915050565b60006020828403121561332357613322612f1a565b5b600061333184828501612fa3565b91505092915050565b600067ffffffffffffffff821115613355576133546130f8565b5b602082029050602081019050919050565b600080fd5b600061337e6133798461333a565b613158565b905080838252602082019050602084028301858111156133a1576133a0613366565b5b835b818110156133ca57806133b68882612fa3565b8452602084019350506020810190506133a3565b5050509392505050565b600082601f8301126133e9576133e86130dd565b5b81356133f984826020860161336b565b91505092915050565b600067ffffffffffffffff82111561341d5761341c6130f8565b5b613426826130e7565b9050602081019050919050565b600061344661344184613402565b613158565b905082815260208101848484011115613462576134616130e2565b5b61346d8482856131a4565b509392505050565b600082601f83011261348a576134896130dd565b5b813561349a848260208601613433565b91505092915050565b600080600080600060a086880312156134bf576134be612f1a565b5b60006134cd88828901612f6d565b95505060206134de88828901612f6d565b945050604086013567ffffffffffffffff8111156134ff576134fe612f1f565b5b61350b888289016133d4565b935050606086013567ffffffffffffffff81111561352c5761352b612f1f565b5b613538888289016133d4565b925050608086013567ffffffffffffffff81111561355957613558612f1f565b5b61356588828901613475565b9150509295509295909350565b6000819050919050565b61358581613572565b82525050565b60006020820190506135a0600083018461357c565b92915050565b6135af816130a7565b81146135ba57600080fd5b50565b6000813590506135cc816135a6565b92915050565b6000602082840312156135e8576135e7612f1a565b5b60006135f6848285016135bd565b91505092915050565b6000819050919050565b600061362461361f61361a84612f24565b6135ff565b612f24565b9050919050565b600061363682613609565b9050919050565b60006136488261362b565b9050919050565b6136588161363d565b82525050565b6000602082019050613673600083018461364f565b92915050565b600067ffffffffffffffff821115613694576136936130f8565b5b602082029050602081019050919050565b60006136b86136b384613679565b613158565b905080838252602082019050602084028301858111156136db576136da613366565b5b835b8181101561370457806136f08882612f6d565b8452602084019350506020810190506136dd565b5050509392505050565b600082601f830112613723576137226130dd565b5b81356137338482602086016136a5565b91505092915050565b6000806040838503121561375357613752612f1a565b5b600083013567ffffffffffffffff81111561377157613770612f1f565b5b61377d8582860161370e565b925050602083013567ffffffffffffffff81111561379e5761379d612f1f565b5b6137aa858286016133d4565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6137e981612f82565b82525050565b60006137fb83836137e0565b60208301905092915050565b6000602082019050919050565b600061381f826137b4565b61382981856137bf565b9350613834836137d0565b8060005b8381101561386557815161384c88826137ef565b975061385783613807565b925050600181019050613838565b5085935050505092915050565b6000602082019050818103600083015261388c8184613814565b905092915050565b6000602082840312156138aa576138a9612f1a565b5b60006138b884828501612f6d565b91505092915050565b6000806000606084860312156138da576138d9612f1a565b5b60006138e886828701612f6d565b935050602084013567ffffffffffffffff81111561390957613908612f1f565b5b613915868287016133d4565b925050604084013567ffffffffffffffff81111561393657613935612f1f565b5b613942868287016133d4565b9150509250925092565b600061395782612f24565b9050919050565b6139678161394c565b811461397257600080fd5b50565b6000813590506139848161395e565b92915050565b6000602082840312156139a05761399f612f1a565b5b60006139ae84828501613975565b91505092915050565b6139c081613572565b81146139cb57600080fd5b50565b6000813590506139dd816139b7565b92915050565b6000602082840312156139f9576139f8612f1a565b5b6000613a07848285016139ce565b91505092915050565b613a1981612f44565b82525050565b6000602082019050613a346000830184613a10565b92915050565b60008060408385031215613a5157613a50612f1a565b5b6000613a5f85828601612f6d565b9250506020613a70858286016135bd565b9150509250929050565b600067ffffffffffffffff821115613a9557613a946130f8565b5b602082029050602081019050919050565b6000613ab9613ab484613a7a565b613158565b90508083825260208201905060208402830185811115613adc57613adb613366565b5b835b81811015613b055780613af188826139ce565b845260208401935050602081019050613ade565b5050509392505050565b600082601f830112613b2457613b236130dd565b5b8135613b34848260208601613aa6565b91505092915050565b60008060408385031215613b5457613b53612f1a565b5b6000613b6285828601612f6d565b925050602083013567ffffffffffffffff811115613b8357613b82612f1f565b5b613b8f85828601613b0f565b9150509250929050565b600060208284031215613baf57613bae612f1a565b5b600082013567ffffffffffffffff811115613bcd57613bcc612f1f565b5b613bd984828501613b0f565b91505092915050565b60008060408385031215613bf957613bf8612f1a565b5b6000613c0785828601612f6d565b9250506020613c1885828601612f6d565b9150509250929050565b600080600080600060a08688031215613c3e57613c3d612f1a565b5b6000613c4c88828901612f6d565b9550506020613c5d88828901612f6d565b9450506040613c6e88828901612fa3565b9350506060613c7f88828901612fa3565b925050608086013567ffffffffffffffff811115613ca057613c9f612f1f565b5b613cac88828901613475565b9150509295509295909350565b600080600060608486031215613cd257613cd1612f1a565b5b6000613ce086828701612f6d565b9350506020613cf186828701612fa3565b9250506040613d0286828701612fa3565b9150509250925092565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b6000613d68602a83613277565b9150613d7382613d0c565b604082019050919050565b60006020820190508181036000830152613d9781613d5b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613de557607f821691505b602082108103613df857613df7613d9e565b5b50919050565b7f526f756e64206d757374206265206265747765656e203020616e642034000000600082015250565b6000613e34601d83613277565b9150613e3f82613dfe565b602082019050919050565b60006020820190508181036000830152613e6381613e27565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000613ec6602983613277565b9150613ed182613e6a565b604082019050919050565b60006020820190508181036000830152613ef581613eb9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613f6582612f82565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f9757613f96613f2b565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000613ffe602f83613277565b915061400982613fa2565b604082019050919050565b6000602082019050818103600083015261402d81613ff1565b9050919050565b600081905092915050565b50565b600061404f600083614034565b915061405a8261403f565b600082019050919050565b600061407082614042565b9150819050919050565b7f5769746864726177206661696c65640000000000000000000000000000000000600082015250565b60006140b0600f83613277565b91506140bb8261407a565b602082019050919050565b600060208201905081810360008301526140df816140a3565b9050919050565b60008160601b9050919050565b60006140fe826140e6565b9050919050565b6000614110826140f3565b9050919050565b61412861412382612f44565b614105565b82525050565b600061413a8284614117565b60148201915081905092915050565b7f4d696e74206973206e6f74206163746976650000000000000000000000000000600082015250565b600061417f601283613277565b915061418a82614149565b602082019050919050565b600060208201905081810360008301526141ae81614172565b9050919050565b7f4e6f74206f6e20616c6c6f77206c697374000000000000000000000000000000600082015250565b60006141eb601183613277565b91506141f6826141b5565b602082019050919050565b6000602082019050818103600083015261421a816141de565b9050919050565b7f416c7265616479206d696e746564206120746f6b656e207468697320726f756e60008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b600061427d602183613277565b915061428882614221565b604082019050919050565b600060208201905081810360008301526142ac81614270565b9050919050565b7f4e6f2072656d616e696e6720737570706c79207468697320726f756e64000000600082015250565b60006142e9601d83613277565b91506142f4826142b3565b602082019050919050565b60006020820190508181036000830152614318816142dc565b9050919050565b7f41646472657373206973206d697373696e67206120746f6b656e000000000000600082015250565b6000614355601a83613277565b91506143608261431f565b602082019050919050565b6000602082019050818103600083015261438481614348565b9050919050565b600061439682612f82565b91506143a183612f82565b92508282019050808211156143b9576143b8613f2b565b5b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061441b602683613277565b9150614426826143bf565b604082019050919050565b6000602082019050818103600083015261444a8161440e565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b60006144ad602883613277565b91506144b882614451565b604082019050919050565b600060208201905081810360008301526144dc816144a0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614519602083613277565b9150614524826144e3565b602082019050919050565b600060208201905081810360008301526145488161450c565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026145b17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614574565b6145bb8683614574565b95508019841693508086168417925050509392505050565b60006145ee6145e96145e484612f82565b6135ff565b612f82565b9050919050565b6000819050919050565b614608836145d3565b61461c614614826145f5565b848454614581565b825550505050565b600090565b614631614624565b61463c8184846145ff565b505050565b5b8181101561466057614655600082614629565b600181019050614642565b5050565b601f8211156146a5576146768161454f565b61467f84614564565b8101602085101561468e578190505b6146a261469a85614564565b830182614641565b50505b505050565b600082821c905092915050565b60006146c8600019846008026146aa565b1980831691505092915050565b60006146e183836146b7565b9150826002028217905092915050565b6146fa8261326c565b67ffffffffffffffff811115614713576147126130f8565b5b61471d8254613dcd565b614728828285614664565b600060209050601f83116001811461475b5760008415614749578287015190505b61475385826146d5565b8655506147bb565b601f1984166147698661454f565b60005b828110156147915784890151825560018201915060208501945060208101905061476c565b868310156147ae57848901516147aa601f8916826146b7565b8355505b6001600288020188555050505b505050505050565b60006040820190506147d86000830185613a10565b6147e56020830184613a10565b9392505050565b6000815190506147fb816135a6565b92915050565b60006020828403121561481757614816612f1a565b5b6000614825848285016147ec565b91505092915050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061488a602383613277565b91506148958261482e565b604082019050919050565b600060208201905081810360008301526148b98161487d565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b600061491c602883613277565b9150614927826148c0565b604082019050919050565b6000602082019050818103600083015261494b8161490f565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006149ae602483613277565b91506149b982614952565b604082019050919050565b600060208201905081810360008301526149dd816149a1565b9050919050565b600060408201905081810360008301526149fe8185613814565b90508181036020830152614a128184613814565b90509392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614a51601f83613277565b9150614a5c82614a1b565b602082019050919050565b60006020820190508181036000830152614a8081614a44565b9050919050565b6000819050919050565b614aa2614a9d82612f82565b614a87565b82525050565b6000614ab48286614a91565b602082019150614ac48285614117565b601482019150614ad48284614a91565b602082019150819050949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614b1f82612f82565b9150614b2a83612f82565b925082614b3a57614b39614ae5565b5b828206905092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000614ba1602183613277565b9150614bac82614b45565b604082019050919050565b60006020820190508181036000830152614bd081614b94565b9050919050565b6000604082019050614bec6000830185612ff8565b614bf96020830184612ff8565b9392505050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614c5c602583613277565b9150614c6782614c00565b604082019050919050565b60006020820190508181036000830152614c8b81614c4f565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614cee602a83613277565b9150614cf982614c92565b604082019050919050565b60006020820190508181036000830152614d1d81614ce1565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614d80602983613277565b9150614d8b82614d24565b604082019050919050565b60006020820190508181036000830152614daf81614d73565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614ddd82614db6565b614de78185614dc1565b9350614df7818560208601613288565b614e00816130e7565b840191505092915050565b600060a082019050614e206000830188613a10565b614e2d6020830187613a10565b614e3a6040830186612ff8565b614e476060830185612ff8565b8181036080830152614e598184614dd2565b90509695505050505050565b600081519050614e748161304e565b92915050565b600060208284031215614e9057614e8f612f1a565b5b6000614e9e84828501614e65565b91505092915050565b60008160e01c9050919050565b600060033d1115614ed35760046000803e614ed0600051614ea7565b90505b90565b600060443d10614f6357614ee8612f10565b60043d036004823e80513d602482011167ffffffffffffffff82111715614f10575050614f63565b808201805167ffffffffffffffff811115614f2e5750505050614f63565b80602083010160043d038501811115614f4b575050505050614f63565b614f5a82602001850186613127565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000614fc2603483613277565b9150614fcd82614f66565b604082019050919050565b60006020820190508181036000830152614ff181614fb5565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615054602883613277565b915061505f82614ff8565b604082019050919050565b6000602082019050818103600083015261508381615047565b9050919050565b600060a08201905061509f6000830188613a10565b6150ac6020830187613a10565b81810360408301526150be8186613814565b905081810360608301526150d28185613814565b905081810360808301526150e68184614dd2565b9050969550505050505056fea26469706673582212201439b4226428d3116e871f96ed80a1e2e82141610a3a4ec9e1e95ba4fcc0115564736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f6d657461646174612e6172746c61622e78797a2f30313835633134382d626433302d386434392d383336622d3566386561623466636466662f7b69647d000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _uri (string): https://metadata.artlab.xyz/0185c148-bd30-8d49-836b-5f8eab4fcdff/{id}
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000045
Arg [2] : 68747470733a2f2f6d657461646174612e6172746c61622e78797a2f30313835
Arg [3] : 633134382d626433302d386434392d383336622d356638656162346663646666
Arg [4] : 2f7b69647d000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
62890:6154:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41356:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40379:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64328:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63027:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41100:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68379:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15059:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64546:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64795:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2901:143;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15091:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63138:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41752:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58981:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17051:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57664:359;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61999:103;;;:::i;:::-;;67660:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64680:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63240:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61351:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63850:58;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63063:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63326:57;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67869:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17261:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65783:1799;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63701:61;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58770:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64427:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42576:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68084:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62257:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57329:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41356:230;41442:7;41489:1;41470:21;;:7;:21;;;41462:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;41556:9;:13;41566:2;41556:13;;;;;;;;;;;:22;41570:7;41556:22;;;;;;;;;;;;;;;;41549:29;;41356:230;;;;:::o;40379:310::-;40481:4;40533:26;40518:41;;;:11;:41;;;;:110;;;;40591:37;40576:52;;;:11;:52;;;;40518:110;:163;;;;40645:36;40669:11;40645:23;:36::i;:::-;40518:163;40498:183;;40379:310;;;:::o;64328:91::-;61237:13;:11;:13::i;:::-;64396:15:::1;64404:6;64396:7;:15::i;:::-;64328:91:::0;:::o;63027:29::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41100:105::-;41160:13;41193:4;41186:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41100:105;;;:::o;68379:313::-;68604:5;4250:10;4242:18;;:4;:18;;;4238:83;;4277:32;4298:10;4277:20;:32::i;:::-;4238:83;68622:62:::1;68650:5;68657:3;68662:4;68668:8;68678:5;68622:27;:62::i;:::-;68379:313:::0;;;;;;:::o;15059:25::-;;;;:::o;64546:126::-;61237:13;:11;:13::i;:::-;64627:37:::1;64647:16;64627:19;:37::i;:::-;64546:126:::0;:::o;64795:179::-;61237:13;:11;:13::i;:::-;64884:1:::1;64874:6;:11;;:26;;;;;64899:1;64889:6;:11;;64874:26;64866:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64960:6;64945:12;:21;;;;64795:179:::0;:::o;2901:143::-;3001:42;2901:143;:::o;15091:35::-;;;;;;;;;;;;;:::o;63138:32::-;;;;;;;;;;;;;:::o;41752:524::-;41908:16;41969:3;:10;41950:8;:15;:29;41942:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;42038:30;42085:8;:15;42071:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42038:63;;42119:9;42114:122;42138:8;:15;42134:1;:19;42114:122;;;42194:30;42204:8;42213:1;42204:11;;;;;;;;:::i;:::-;;;;;;;;42217:3;42221:1;42217:6;;;;;;;;:::i;:::-;;;;;;;;42194:9;:30::i;:::-;42175:13;42189:1;42175:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;42155:3;;;;:::i;:::-;;;42114:122;;;;42255:13;42248:20;;;41752:524;;;;:::o;58981:122::-;59038:4;59094:1;59062:29;59088:2;59062:25;:29::i;:::-;:33;59055:40;;58981:122;;;:::o;17051:131::-;17122:7;17149:19;:25;17169:4;17149:25;;;;;;;;;;;;;;;;17142:32;;17051:131;;;:::o;57664:359::-;57840:12;:10;:12::i;:::-;57829:23;;:7;:23;;;:66;;;;57856:39;57873:7;57882:12;:10;:12::i;:::-;57856:16;:39::i;:::-;57829:66;57807:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;57983:32;57994:7;58003:3;58008:6;57983:10;:32::i;:::-;57664:359;;;:::o;61999:103::-;61237:13;:11;:13::i;:::-;62064:30:::1;62091:1;62064:18;:30::i;:::-;61999:103::o:0;67660:201::-;61237:13;:11;:13::i;:::-;67742:12:::1;67760:8;:13;;67781:21;67760:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67741:66;;;67826:7;67818:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;67730:131;67660:201:::0;:::o;64680:107::-;61237:13;:11;:13::i;:::-;64753:26:::1;64767:11;64753:13;:26::i;:::-;64680:107:::0;:::o;63240:31::-;;;;:::o;61351:87::-;61397:7;61424:6;;;;;;;;;;;61417:13;;61351:87;:::o;63850:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63063:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63326:57::-;;;;;;;;;;;;;;;;;;;;:::o;67869:207::-;68001:9;4422:30;4443:8;4422:20;:30::i;:::-;68023:45:::1;68047:9;68058;68023:23;:45::i;:::-;67869:207:::0;;;:::o;17261:220::-;17344:4;17361:12;17403:7;17386:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;17376:36;;;;;;17361:51;;17430:43;17449:5;17456:10;;17468:4;17430:18;:43::i;:::-;17423:50;;;17261:220;;;;:::o;65783:1799::-;19831:21;:19;:21::i;:::-;65908:12:::1;;;;;;;;;;;65900:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;66026:15;;;;;;;;;;;66022:170;;;66121:37;66133:10;66145:12;66121:11;:37::i;:::-;66113:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;66022:170;66347:5;66295:57;;:22;:34;66318:10;66295:34;;;;;;;;;;;;;;;66330:12;;66295:48;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;:57;;;66287:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;66527:13;66541:12;;66527:27;;;;;;;:::i;:::-;;;;66485:25;:39;66511:12;;66485:39;;;;;;;;;;;;:69;66477:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;66676:31;66696:10;66676:19;:31::i;:::-;66668:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;66751:16;66770:12;;66751:31;;66945:18;;66928:14;66940:1;66928:11;:14::i;:::-;:35;:56;;;;;66983:1;66967:12;;:17;;66928:56;66924:186;;;67049:2;67004:41;67017:13;67031:12;;67017:27;;;;;;;:::i;:::-;;;;67004:12;:41::i;:::-;:47:::0;67000:99:::1;;67082:1;67071:12;;67000:99;66924:186;67252:1;67240:8;:13;67236:130;;67353:1;67311:25;:39;67337:12;;67311:39;;;;;;;;;;;;:43;;;;:::i;:::-;67269:25;:39;67295:12;;67269:39;;;;;;;;;;;:85;;;;67236:130;67523:4;67472:22;:34;67495:10;67472:34;;;;;;;;;;;;;;;67507:12;;67472:48;;;;;;;:::i;:::-;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;67540:34;67546:10;67558:8;67568:1;67540:34;;;;;;;;;;;::::0;:5:::1;:34::i;:::-;65850:1732;19875:20:::0;:18;:20::i;:::-;65783:1799;:::o;63701:61::-;;;;;;;;;;;;;;;;;:::o;58770:113::-;58832:7;58859:12;:16;58872:2;58859:16;;;;;;;;;;;;58852:23;;58770:113;;;:::o;64427:111::-;61237:13;:11;:13::i;:::-;64517::::1;64502:12;;:28;;;;;;;;;;;;;;;;;;64427:111:::0;:::o;42576:168::-;42675:4;42699:18;:27;42718:7;42699:27;;;;;;;;;;;;;;;:37;42727:8;42699:37;;;;;;;;;;;;;;;;;;;;;;;;;42692:44;;42576:168;;;;:::o;68084:287::-;68285:5;4250:10;4242:18;;:4;:18;;;4238:83;;4277:32;4298:10;4277:20;:32::i;:::-;4238:83;68303:60:::1;68326:5;68333:3;68338:8;68348:7;68357:5;68303:22;:60::i;:::-;68084:287:::0;;;;;;:::o;62257:201::-;61237:13;:11;:13::i;:::-;62366:1:::1;62346:22;;:8;:22;;::::0;62338:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;62422:28;62441:8;62422:18;:28::i;:::-;62257:201:::0;:::o;57329:327::-;57480:12;:10;:12::i;:::-;57469:23;;:7;:23;;;:66;;;;57496:39;57513:7;57522:12;:10;:12::i;:::-;57496:16;:39::i;:::-;57469:66;57447:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;57623:25;57629:7;57638:2;57642:5;57623;:25::i;:::-;57329:327;;;:::o;59178:931::-;59417:66;59444:8;59454:4;59460:2;59464:3;59469:7;59478:4;59417:26;:66::i;:::-;59516:1;59500:18;;:4;:18;;;59496:160;;59540:9;59535:110;59559:3;:10;59555:1;:14;59535:110;;;59619:7;59627:1;59619:10;;;;;;;;:::i;:::-;;;;;;;;59595:12;:20;59608:3;59612:1;59608:6;;;;;;;;:::i;:::-;;;;;;;;59595:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;59571:3;;;;:::i;:::-;;;59535:110;;;;59496:160;59686:1;59672:16;;:2;:16;;;59668:434;;59710:9;59705:386;59729:3;:10;59725:1;:14;59705:386;;;59765:10;59778:3;59782:1;59778:6;;;;;;;;:::i;:::-;;;;;;;;59765:19;;59803:14;59820:7;59828:1;59820:10;;;;;;;;:::i;:::-;;;;;;;;59803:27;;59849:14;59866:12;:16;59879:2;59866:16;;;;;;;;;;;;59849:33;;59919:6;59909;:16;;59901:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;60050:6;60041;:15;60022:12;:16;60035:2;60022:16;;;;;;;;;;;:34;;;;59746:345;;;59741:3;;;;:::i;:::-;;;59705:386;;;;59668:434;59178:931;;;;;;:::o;21665:326::-;21725:4;21982:1;21960:7;:19;;;:23;21953:30;;21665:326;;;:::o;53701:221::-;;;;;;;:::o;30767:157::-;30852:4;30891:25;30876:40;;;:11;:40;;;;30869:47;;30767:157;;;:::o;61516:132::-;61591:12;:10;:12::i;:::-;61580:23;;:7;:5;:7::i;:::-;:23;;;61572:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61516:132::o;47525:88::-;47599:6;47592:4;:13;;;;;;:::i;:::-;;47525:88;:::o;4480:419::-;4719:1;3001:42;4671:45;;;:49;4667:225;;;3001:42;4742;;;4793:4;4800:8;4742:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4737:144;;4856:8;4837:28;;;;;;;;;;;:::i;:::-;;;;;;;;4737:144;4667:225;4480:419;:::o;43300:439::-;43541:12;:10;:12::i;:::-;43533:20;;:4;:20;;;:60;;;;43557:36;43574:4;43580:12;:10;:12::i;:::-;43557:16;:36::i;:::-;43533:60;43511:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;43679:52;43702:4;43708:2;43712:3;43717:7;43726:4;43679:22;:52::i;:::-;43300:439;;;;;:::o;16360:122::-;16458:16;16440:15;;:34;;;;;;;;;;;;;;;;;;16360:122;:::o;39073:98::-;39126:7;39153:10;39146:17;;39073:98;:::o;51300:969::-;51468:1;51452:18;;:4;:18;;;51444:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;51543:7;:14;51529:3;:10;:28;51521:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51615:16;51634:12;:10;:12::i;:::-;51615:31;;51659:66;51680:8;51690:4;51704:1;51708:3;51713:7;51659:66;;;;;;;;;;;;:20;:66::i;:::-;51743:9;51738:373;51762:3;:10;51758:1;:14;51738:373;;;51794:10;51807:3;51811:1;51807:6;;;;;;;;:::i;:::-;;;;;;;;51794:19;;51828:14;51845:7;51853:1;51845:10;;;;;;;;:::i;:::-;;;;;;;;51828:27;;51872:19;51894:9;:13;51904:2;51894:13;;;;;;;;;;;:19;51908:4;51894:19;;;;;;;;;;;;;;;;51872:41;;51951:6;51936:11;:21;;51928:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;52078:6;52064:11;:20;52042:9;:13;52052:2;52042:13;;;;;;;;;;;:19;52056:4;52042:19;;;;;;;;;;;;;;;:42;;;;51779:332;;;51774:3;;;;;:::i;:::-;;;;51738:373;;;;52166:1;52128:55;;52152:4;52128:55;;52142:8;52128:55;;;52170:3;52175:7;52128:55;;;;;;;:::i;:::-;;;;;;;;52196:65;52216:8;52226:4;52240:1;52244:3;52249:7;52196:65;;;;;;;;;;;;:19;:65::i;:::-;51433:836;51300:969;;;:::o;62618:191::-;62692:16;62711:6;;;;;;;;;;;62692:25;;62737:8;62728:6;;:17;;;;;;;;;;;;;;;;;;62792:8;62761:40;;62782:8;62761:40;;;;;;;;;;;;62681:128;62618:191;:::o;16542:151::-;16627:11;16614:10;:24;;;;16656:29;16674:10;;16656:29;;;;;;:::i;:::-;;;;;;;;16542:151;:::o;42349:155::-;42444:52;42463:12;:10;:12::i;:::-;42477:8;42487;42444:18;:52::i;:::-;42349:155;;:::o;6605:190::-;6730:4;6783;6754:25;6767:5;6774:4;6754:12;:25::i;:::-;:33;6747:40;;6605:190;;;;;:::o;19911:293::-;19313:1;20045:7;;:19;20037:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;19313:1;20178:7;:18;;;;19911:293::o;65065:416::-;65134:4;65233:9;65228:224;65248:12;;65244:1;:16;65228:224;;;65392:1;65367:22;65377:8;65387:1;65367:9;:22::i;:::-;:26;65364:77;;;65420:5;65413:12;;;;;65364:77;65262:3;;;;:::i;:::-;;;65228:224;;;;65469:4;65462:11;;65065:416;;;;:::o;65531:242::-;65585:7;65605:25;65708:4;65668:15;65685:10;65697:5;;65651:52;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;65641:63;;;;;;65633:72;;:79;;;;:::i;:::-;65605:107;;65723:5;;:7;;;;;;;;;:::i;:::-;;;;;;65748:17;65741:24;;;65531:242;;;:::o;47999:729::-;48166:1;48152:16;;:2;:16;;;48144:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48219:16;48238:12;:10;:12::i;:::-;48219:31;;48261:20;48284:21;48302:2;48284:17;:21::i;:::-;48261:44;;48316:24;48343:25;48361:6;48343:17;:25::i;:::-;48316:52;;48381:66;48402:8;48420:1;48424:2;48428:3;48433:7;48442:4;48381:20;:66::i;:::-;48481:6;48460:9;:13;48470:2;48460:13;;;;;;;;;;;:17;48474:2;48460:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;48540:2;48503:52;;48536:1;48503:52;;48518:8;48503:52;;;48544:2;48548:6;48503:52;;;;;;;:::i;:::-;;;;;;;;48568:65;48588:8;48606:1;48610:2;48614:3;48619:7;48628:4;48568:19;:65::i;:::-;48646:74;48677:8;48695:1;48699:2;48703;48707:6;48715:4;48646:30;:74::i;:::-;48133:595;;;47999:729;;;;:::o;20212:213::-;19269:1;20395:7;:22;;;;20212:213::o;42816:407::-;43032:12;:10;:12::i;:::-;43024:20;;:4;:20;;;:60;;;;43048:36;43065:4;43071:12;:10;:12::i;:::-;43048:16;:36::i;:::-;43024:60;43002:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;43170:45;43188:4;43194:2;43198;43202:6;43210:4;43170:17;:45::i;:::-;42816:407;;;;;:::o;50242:808::-;50385:1;50369:18;;:4;:18;;;50361:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50440:16;50459:12;:10;:12::i;:::-;50440:31;;50482:20;50505:21;50523:2;50505:17;:21::i;:::-;50482:44;;50537:24;50564:25;50582:6;50564:17;:25::i;:::-;50537:52;;50602:66;50623:8;50633:4;50647:1;50651:3;50656:7;50602:66;;;;;;;;;;;;:20;:66::i;:::-;50681:19;50703:9;:13;50713:2;50703:13;;;;;;;;;;;:19;50717:4;50703:19;;;;;;;;;;;;;;;;50681:41;;50756:6;50741:11;:21;;50733:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50875:6;50861:11;:20;50839:9;:13;50849:2;50839:13;;;;;;;;;;;:19;50853:4;50839:19;;;;;;;;;;;;;;;:42;;;;50949:1;50910:54;;50935:4;50910:54;;50925:8;50910:54;;;50953:2;50957:6;50910:54;;;;;;;:::i;:::-;;;;;;;;50977:65;50997:8;51007:4;51021:1;51025:3;51030:7;50977:65;;;;;;;;;;;;:19;:65::i;:::-;50350:700;;;;50242:808;;;:::o;45535:1146::-;45762:7;:14;45748:3;:10;:28;45740:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45854:1;45840:16;;:2;:16;;;45832:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45911:16;45930:12;:10;:12::i;:::-;45911:31;;45955:60;45976:8;45986:4;45992:2;45996:3;46001:7;46010:4;45955:20;:60::i;:::-;46033:9;46028:421;46052:3;:10;46048:1;:14;46028:421;;;46084:10;46097:3;46101:1;46097:6;;;;;;;;:::i;:::-;;;;;;;;46084:19;;46118:14;46135:7;46143:1;46135:10;;;;;;;;:::i;:::-;;;;;;;;46118:27;;46162:19;46184:9;:13;46194:2;46184:13;;;;;;;;;;;:19;46198:4;46184:19;;;;;;;;;;;;;;;;46162:41;;46241:6;46226:11;:21;;46218:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46374:6;46360:11;:20;46338:9;:13;46348:2;46338:13;;;;;;;;;;;:19;46352:4;46338:19;;;;;;;;;;;;;;;:42;;;;46431:6;46410:9;:13;46420:2;46410:13;;;;;;;;;;;:17;46424:2;46410:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;46069:380;;;46064:3;;;;:::i;:::-;;;46028:421;;;;46496:2;46466:47;;46490:4;46466:47;;46480:8;46466:47;;;46500:3;46505:7;46466:47;;;;;;;:::i;:::-;;;;;;;;46526:59;46546:8;46556:4;46562:2;46566:3;46571:7;46580:4;46526:19;:59::i;:::-;46598:75;46634:8;46644:4;46650:2;46654:3;46659:7;46668:4;46598:35;:75::i;:::-;45729:952;45535:1146;;;;;:::o;68700:341::-;68961:72;68988:9;68999:5;69006:3;69011:4;69017:8;69027:5;68961:26;:72::i;:::-;68700:341;;;;;;:::o;54877:220::-;;;;;;;:::o;52412:331::-;52567:8;52558:17;;:5;:17;;;52550:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52670:8;52632:18;:25;52651:5;52632:25;;;;;;;;;;;;;;;:35;52658:8;52632:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52716:8;52694:41;;52709:5;52694:41;;;52726:8;52694:41;;;;;;:::i;:::-;;;;;;;;52412:331;;;:::o;7472:296::-;7555:7;7575:20;7598:4;7575:27;;7618:9;7613:118;7637:5;:12;7633:1;:16;7613:118;;;7686:33;7696:12;7710:5;7716:1;7710:8;;;;;;;;:::i;:::-;;;;;;;;7686:9;:33::i;:::-;7671:48;;7651:3;;;;;:::i;:::-;;;;7613:118;;;;7748:12;7741:19;;;7472:296;;;;:::o;56678:198::-;56744:16;56773:22;56812:1;56798:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56773:41;;56836:7;56825:5;56831:1;56825:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;56863:5;56856:12;;;56678:198;;;:::o;55105:744::-;55320:15;:2;:13;;;:15::i;:::-;55316:526;;;55373:2;55356:38;;;55395:8;55405:4;55411:2;55415:6;55423:4;55356:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55352:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;55704:6;55697:14;;;;;;;;;;;:::i;:::-;;;;;;;;55352:479;;;55753:62;;;;;;;;;;:::i;:::-;;;;;;;;55352:479;55490:43;;;55478:55;;;:8;:55;;;;55474:154;;55558:50;;;;;;;;;;:::i;:::-;;;;;;;;55474:154;55429:214;55316:526;55105:744;;;;;;:::o;44203:974::-;44405:1;44391:16;;:2;:16;;;44383:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44462:16;44481:12;:10;:12::i;:::-;44462:31;;44504:20;44527:21;44545:2;44527:17;:21::i;:::-;44504:44;;44559:24;44586:25;44604:6;44586:17;:25::i;:::-;44559:52;;44624:60;44645:8;44655:4;44661:2;44665:3;44670:7;44679:4;44624:20;:60::i;:::-;44697:19;44719:9;:13;44729:2;44719:13;;;;;;;;;;;:19;44733:4;44719:19;;;;;;;;;;;;;;;;44697:41;;44772:6;44757:11;:21;;44749:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;44897:6;44883:11;:20;44861:9;:13;44871:2;44861:13;;;;;;;;;;;:19;44875:4;44861:19;;;;;;;;;;;;;;;:42;;;;44946:6;44925:9;:13;44935:2;44925:13;;;;;;;;;;;:17;44939:2;44925:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;45001:2;44970:46;;44995:4;44970:46;;44985:8;44970:46;;;45005:2;45009:6;44970:46;;;;;;;:::i;:::-;;;;;;;;45029:59;45049:8;45059:4;45065:2;45069:3;45074:7;45083:4;45029:19;:59::i;:::-;45101:68;45132:8;45142:4;45148:2;45152;45156:6;45164:4;45101:30;:68::i;:::-;44372:805;;;;44203:974;;;;;:::o;55857:813::-;56097:15;:2;:13;;;:15::i;:::-;56093:570;;;56150:2;56133:43;;;56177:8;56187:4;56193:3;56198:7;56207:4;56133:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;56129:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;56525:6;56518:14;;;;;;;;;;;:::i;:::-;;;;;;;;56129:523;;;56574:62;;;;;;;;;;:::i;:::-;;;;;;;;56129:523;56306:48;;;56294:60;;;:8;:60;;;;56290:159;;56379:50;;;;;;;;;;:::i;:::-;;;;;;;;56290:159;56213:251;56093:570;55857:813;;;;;;:::o;14512:149::-;14575:7;14606:1;14602;:5;:51;;14633:20;14648:1;14651;14633:14;:20::i;:::-;14602:51;;;14610:20;14625:1;14628;14610:14;:20::i;:::-;14602:51;14595:58;;14512:149;;;;:::o;14669:268::-;14737:13;14844:1;14838:4;14831:15;14873:1;14867:4;14860:15;14914:4;14908;14898:21;14889:30;;14669:268;;;;:::o;7:75:1:-;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:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:146::-;4586:6;4581:3;4576;4563:30;4627:1;4618:6;4613:3;4609:16;4602:27;4489:146;;;:::o;4641:425::-;4719:5;4744:66;4760:49;4802:6;4760:49;:::i;:::-;4744:66;:::i;:::-;4735:75;;4833:6;4826:5;4819:21;4871:4;4864:5;4860:16;4909:3;4900:6;4895:3;4891:16;4888:25;4885:112;;;4916:79;;:::i;:::-;4885:112;5006:54;5053:6;5048:3;5043;5006:54;:::i;:::-;4725:341;4641:425;;;;;:::o;5086:340::-;5142:5;5191:3;5184:4;5176:6;5172:17;5168:27;5158:122;;5199:79;;:::i;:::-;5158:122;5316:6;5303:20;5341:79;5416:3;5408:6;5401:4;5393:6;5389:17;5341:79;:::i;:::-;5332:88;;5148:278;5086:340;;;;:::o;5432:509::-;5501:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:119;;;5556:79;;:::i;:::-;5518:119;5704:1;5693:9;5689:17;5676:31;5734:18;5726:6;5723:30;5720:117;;;5756:79;;:::i;:::-;5720:117;5861:63;5916:7;5907:6;5896:9;5892:22;5861:63;:::i;:::-;5851:73;;5647:287;5432:509;;;;:::o;5947:99::-;5999:6;6033:5;6027:12;6017:22;;5947:99;;;:::o;6052:169::-;6136:11;6170:6;6165:3;6158:19;6210:4;6205:3;6201:14;6186:29;;6052:169;;;;:::o;6227:246::-;6308:1;6318:113;6332:6;6329:1;6326:13;6318:113;;;6417:1;6412:3;6408:11;6402:18;6398:1;6393:3;6389:11;6382:39;6354:2;6351:1;6347:10;6342:15;;6318:113;;;6465:1;6456:6;6451:3;6447:16;6440:27;6289:184;6227:246;;;:::o;6479:377::-;6567:3;6595:39;6628:5;6595:39;:::i;:::-;6650:71;6714:6;6709:3;6650:71;:::i;:::-;6643:78;;6730:65;6788:6;6783:3;6776:4;6769:5;6765:16;6730:65;:::i;:::-;6820:29;6842:6;6820:29;:::i;:::-;6815:3;6811:39;6804:46;;6571:285;6479:377;;;;:::o;6862:313::-;6975:4;7013:2;7002:9;6998:18;6990:26;;7062:9;7056:4;7052:20;7048:1;7037:9;7033:17;7026:47;7090:78;7163:4;7154:6;7090:78;:::i;:::-;7082:86;;6862:313;;;;:::o;7181:329::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7386:117;7181:329;;;;:::o;7516:311::-;7593:4;7683:18;7675:6;7672:30;7669:56;;;7705:18;;:::i;:::-;7669:56;7755:4;7747:6;7743:17;7735:25;;7815:4;7809;7805:15;7797:23;;7516:311;;;:::o;7833:117::-;7942:1;7939;7932:12;7973:710;8069:5;8094:81;8110:64;8167:6;8110:64;:::i;:::-;8094:81;:::i;:::-;8085:90;;8195:5;8224:6;8217:5;8210:21;8258:4;8251:5;8247:16;8240:23;;8311:4;8303:6;8299:17;8291:6;8287:30;8340:3;8332:6;8329:15;8326:122;;;8359:79;;:::i;:::-;8326:122;8474:6;8457:220;8491:6;8486:3;8483:15;8457:220;;;8566:3;8595:37;8628:3;8616:10;8595:37;:::i;:::-;8590:3;8583:50;8662:4;8657:3;8653:14;8646:21;;8533:144;8517:4;8512:3;8508:14;8501:21;;8457:220;;;8461:21;8075:608;;7973:710;;;;;:::o;8706:370::-;8777:5;8826:3;8819:4;8811:6;8807:17;8803:27;8793:122;;8834:79;;:::i;:::-;8793:122;8951:6;8938:20;8976:94;9066:3;9058:6;9051:4;9043:6;9039:17;8976:94;:::i;:::-;8967:103;;8783:293;8706:370;;;;:::o;9082:307::-;9143:4;9233:18;9225:6;9222:30;9219:56;;;9255:18;;:::i;:::-;9219:56;9293:29;9315:6;9293:29;:::i;:::-;9285:37;;9377:4;9371;9367:15;9359:23;;9082:307;;;:::o;9395:423::-;9472:5;9497:65;9513:48;9554:6;9513:48;:::i;:::-;9497:65;:::i;:::-;9488:74;;9585:6;9578:5;9571:21;9623:4;9616:5;9612:16;9661:3;9652:6;9647:3;9643:16;9640:25;9637:112;;;9668:79;;:::i;:::-;9637:112;9758:54;9805:6;9800:3;9795;9758:54;:::i;:::-;9478:340;9395:423;;;;;:::o;9837:338::-;9892:5;9941:3;9934:4;9926:6;9922:17;9918:27;9908:122;;9949:79;;:::i;:::-;9908:122;10066:6;10053:20;10091:78;10165:3;10157:6;10150:4;10142:6;10138:17;10091:78;:::i;:::-;10082:87;;9898:277;9837:338;;;;:::o;10181:1509::-;10335:6;10343;10351;10359;10367;10416:3;10404:9;10395:7;10391:23;10387:33;10384:120;;;10423:79;;:::i;:::-;10384:120;10543:1;10568:53;10613:7;10604:6;10593:9;10589:22;10568:53;:::i;:::-;10558:63;;10514:117;10670:2;10696:53;10741:7;10732:6;10721:9;10717:22;10696:53;:::i;:::-;10686:63;;10641:118;10826:2;10815:9;10811:18;10798:32;10857:18;10849:6;10846:30;10843:117;;;10879:79;;:::i;:::-;10843:117;10984:78;11054:7;11045:6;11034:9;11030:22;10984:78;:::i;:::-;10974:88;;10769:303;11139:2;11128:9;11124:18;11111:32;11170:18;11162:6;11159:30;11156:117;;;11192:79;;:::i;:::-;11156:117;11297:78;11367:7;11358:6;11347:9;11343:22;11297:78;:::i;:::-;11287:88;;11082:303;11452:3;11441:9;11437:19;11424:33;11484:18;11476:6;11473:30;11470:117;;;11506:79;;:::i;:::-;11470:117;11611:62;11665:7;11656:6;11645:9;11641:22;11611:62;:::i;:::-;11601:72;;11395:288;10181:1509;;;;;;;;:::o;11696:77::-;11733:7;11762:5;11751:16;;11696:77;;;:::o;11779:118::-;11866:24;11884:5;11866:24;:::i;:::-;11861:3;11854:37;11779:118;;:::o;11903:222::-;11996:4;12034:2;12023:9;12019:18;12011:26;;12047:71;12115:1;12104:9;12100:17;12091:6;12047:71;:::i;:::-;11903:222;;;;:::o;12131:116::-;12201:21;12216:5;12201:21;:::i;:::-;12194:5;12191:32;12181:60;;12237:1;12234;12227:12;12181:60;12131:116;:::o;12253:133::-;12296:5;12334:6;12321:20;12312:29;;12350:30;12374:5;12350:30;:::i;:::-;12253:133;;;;:::o;12392:323::-;12448:6;12497:2;12485:9;12476:7;12472:23;12468:32;12465:119;;;12503:79;;:::i;:::-;12465:119;12623:1;12648:50;12690:7;12681:6;12670:9;12666:22;12648:50;:::i;:::-;12638:60;;12594:114;12392:323;;;;:::o;12721:60::-;12749:3;12770:5;12763:12;;12721:60;;;:::o;12787:142::-;12837:9;12870:53;12888:34;12897:24;12915:5;12897:24;:::i;:::-;12888:34;:::i;:::-;12870:53;:::i;:::-;12857:66;;12787:142;;;:::o;12935:126::-;12985:9;13018:37;13049:5;13018:37;:::i;:::-;13005:50;;12935:126;;;:::o;13067:157::-;13148:9;13181:37;13212:5;13181:37;:::i;:::-;13168:50;;13067:157;;;:::o;13230:193::-;13348:68;13410:5;13348:68;:::i;:::-;13343:3;13336:81;13230:193;;:::o;13429:284::-;13553:4;13591:2;13580:9;13576:18;13568:26;;13604:102;13703:1;13692:9;13688:17;13679:6;13604:102;:::i;:::-;13429:284;;;;:::o;13719:311::-;13796:4;13886:18;13878:6;13875:30;13872:56;;;13908:18;;:::i;:::-;13872:56;13958:4;13950:6;13946:17;13938:25;;14018:4;14012;14008:15;14000:23;;13719:311;;;:::o;14053:710::-;14149:5;14174:81;14190:64;14247:6;14190:64;:::i;:::-;14174:81;:::i;:::-;14165:90;;14275:5;14304:6;14297:5;14290:21;14338:4;14331:5;14327:16;14320:23;;14391:4;14383:6;14379:17;14371:6;14367:30;14420:3;14412:6;14409:15;14406:122;;;14439:79;;:::i;:::-;14406:122;14554:6;14537:220;14571:6;14566:3;14563:15;14537:220;;;14646:3;14675:37;14708:3;14696:10;14675:37;:::i;:::-;14670:3;14663:50;14742:4;14737:3;14733:14;14726:21;;14613:144;14597:4;14592:3;14588:14;14581:21;;14537:220;;;14541:21;14155:608;;14053:710;;;;;:::o;14786:370::-;14857:5;14906:3;14899:4;14891:6;14887:17;14883:27;14873:122;;14914:79;;:::i;:::-;14873:122;15031:6;15018:20;15056:94;15146:3;15138:6;15131:4;15123:6;15119:17;15056:94;:::i;:::-;15047:103;;14863:293;14786:370;;;;:::o;15162:894::-;15280:6;15288;15337:2;15325:9;15316:7;15312:23;15308:32;15305:119;;;15343:79;;:::i;:::-;15305:119;15491:1;15480:9;15476:17;15463:31;15521:18;15513:6;15510:30;15507:117;;;15543:79;;:::i;:::-;15507:117;15648:78;15718:7;15709:6;15698:9;15694:22;15648:78;:::i;:::-;15638:88;;15434:302;15803:2;15792:9;15788:18;15775:32;15834:18;15826:6;15823:30;15820:117;;;15856:79;;:::i;:::-;15820:117;15961:78;16031:7;16022:6;16011:9;16007:22;15961:78;:::i;:::-;15951:88;;15746:303;15162:894;;;;;:::o;16062:114::-;16129:6;16163:5;16157:12;16147:22;;16062:114;;;:::o;16182:184::-;16281:11;16315:6;16310:3;16303:19;16355:4;16350:3;16346:14;16331:29;;16182:184;;;;:::o;16372:132::-;16439:4;16462:3;16454:11;;16492:4;16487:3;16483:14;16475:22;;16372:132;;;:::o;16510:108::-;16587:24;16605:5;16587:24;:::i;:::-;16582:3;16575:37;16510:108;;:::o;16624:179::-;16693:10;16714:46;16756:3;16748:6;16714:46;:::i;:::-;16792:4;16787:3;16783:14;16769:28;;16624:179;;;;:::o;16809:113::-;16879:4;16911;16906:3;16902:14;16894:22;;16809:113;;;:::o;16958:732::-;17077:3;17106:54;17154:5;17106:54;:::i;:::-;17176:86;17255:6;17250:3;17176:86;:::i;:::-;17169:93;;17286:56;17336:5;17286:56;:::i;:::-;17365:7;17396:1;17381:284;17406:6;17403:1;17400:13;17381:284;;;17482:6;17476:13;17509:63;17568:3;17553:13;17509:63;:::i;:::-;17502:70;;17595:60;17648:6;17595:60;:::i;:::-;17585:70;;17441:224;17428:1;17425;17421:9;17416:14;;17381:284;;;17385:14;17681:3;17674:10;;17082:608;;;16958:732;;;;:::o;17696:373::-;17839:4;17877:2;17866:9;17862:18;17854:26;;17926:9;17920:4;17916:20;17912:1;17901:9;17897:17;17890:47;17954:108;18057:4;18048:6;17954:108;:::i;:::-;17946:116;;17696:373;;;;:::o;18075:329::-;18134:6;18183:2;18171:9;18162:7;18158:23;18154:32;18151:119;;;18189:79;;:::i;:::-;18151:119;18309:1;18334:53;18379:7;18370:6;18359:9;18355:22;18334:53;:::i;:::-;18324:63;;18280:117;18075:329;;;;:::o;18410:1039::-;18537:6;18545;18553;18602:2;18590:9;18581:7;18577:23;18573:32;18570:119;;;18608:79;;:::i;:::-;18570:119;18728:1;18753:53;18798:7;18789:6;18778:9;18774:22;18753:53;:::i;:::-;18743:63;;18699:117;18883:2;18872:9;18868:18;18855:32;18914:18;18906:6;18903:30;18900:117;;;18936:79;;:::i;:::-;18900:117;19041:78;19111:7;19102:6;19091:9;19087:22;19041:78;:::i;:::-;19031:88;;18826:303;19196:2;19185:9;19181:18;19168:32;19227:18;19219:6;19216:30;19213:117;;;19249:79;;:::i;:::-;19213:117;19354:78;19424:7;19415:6;19404:9;19400:22;19354:78;:::i;:::-;19344:88;;19139:303;18410:1039;;;;;:::o;19455:104::-;19500:7;19529:24;19547:5;19529:24;:::i;:::-;19518:35;;19455:104;;;:::o;19565:138::-;19646:32;19672:5;19646:32;:::i;:::-;19639:5;19636:43;19626:71;;19693:1;19690;19683:12;19626:71;19565:138;:::o;19709:155::-;19763:5;19801:6;19788:20;19779:29;;19817:41;19852:5;19817:41;:::i;:::-;19709:155;;;;:::o;19870:345::-;19937:6;19986:2;19974:9;19965:7;19961:23;19957:32;19954:119;;;19992:79;;:::i;:::-;19954:119;20112:1;20137:61;20190:7;20181:6;20170:9;20166:22;20137:61;:::i;:::-;20127:71;;20083:125;19870:345;;;;:::o;20221:122::-;20294:24;20312:5;20294:24;:::i;:::-;20287:5;20284:35;20274:63;;20333:1;20330;20323:12;20274:63;20221:122;:::o;20349:139::-;20395:5;20433:6;20420:20;20411:29;;20449:33;20476:5;20449:33;:::i;:::-;20349:139;;;;:::o;20494:329::-;20553:6;20602:2;20590:9;20581:7;20577:23;20573:32;20570:119;;;20608:79;;:::i;:::-;20570:119;20728:1;20753:53;20798:7;20789:6;20778:9;20774:22;20753:53;:::i;:::-;20743:63;;20699:117;20494:329;;;;:::o;20829:118::-;20916:24;20934:5;20916:24;:::i;:::-;20911:3;20904:37;20829:118;;:::o;20953:222::-;21046:4;21084:2;21073:9;21069:18;21061:26;;21097:71;21165:1;21154:9;21150:17;21141:6;21097:71;:::i;:::-;20953:222;;;;:::o;21181:468::-;21246:6;21254;21303:2;21291:9;21282:7;21278:23;21274:32;21271:119;;;21309:79;;:::i;:::-;21271:119;21429:1;21454:53;21499:7;21490:6;21479:9;21475:22;21454:53;:::i;:::-;21444:63;;21400:117;21556:2;21582:50;21624:7;21615:6;21604:9;21600:22;21582:50;:::i;:::-;21572:60;;21527:115;21181:468;;;;;:::o;21655:311::-;21732:4;21822:18;21814:6;21811:30;21808:56;;;21844:18;;:::i;:::-;21808:56;21894:4;21886:6;21882:17;21874:25;;21954:4;21948;21944:15;21936:23;;21655:311;;;:::o;21989:710::-;22085:5;22110:81;22126:64;22183:6;22126:64;:::i;:::-;22110:81;:::i;:::-;22101:90;;22211:5;22240:6;22233:5;22226:21;22274:4;22267:5;22263:16;22256:23;;22327:4;22319:6;22315:17;22307:6;22303:30;22356:3;22348:6;22345:15;22342:122;;;22375:79;;:::i;:::-;22342:122;22490:6;22473:220;22507:6;22502:3;22499:15;22473:220;;;22582:3;22611:37;22644:3;22632:10;22611:37;:::i;:::-;22606:3;22599:50;22678:4;22673:3;22669:14;22662:21;;22549:144;22533:4;22528:3;22524:14;22517:21;;22473:220;;;22477:21;22091:608;;21989:710;;;;;:::o;22722:370::-;22793:5;22842:3;22835:4;22827:6;22823:17;22819:27;22809:122;;22850:79;;:::i;:::-;22809:122;22967:6;22954:20;22992:94;23082:3;23074:6;23067:4;23059:6;23055:17;22992:94;:::i;:::-;22983:103;;22799:293;22722:370;;;;:::o;23098:684::-;23191:6;23199;23248:2;23236:9;23227:7;23223:23;23219:32;23216:119;;;23254:79;;:::i;:::-;23216:119;23374:1;23399:53;23444:7;23435:6;23424:9;23420:22;23399:53;:::i;:::-;23389:63;;23345:117;23529:2;23518:9;23514:18;23501:32;23560:18;23552:6;23549:30;23546:117;;;23582:79;;:::i;:::-;23546:117;23687:78;23757:7;23748:6;23737:9;23733:22;23687:78;:::i;:::-;23677:88;;23472:303;23098:684;;;;;:::o;23788:539::-;23872:6;23921:2;23909:9;23900:7;23896:23;23892:32;23889:119;;;23927:79;;:::i;:::-;23889:119;24075:1;24064:9;24060:17;24047:31;24105:18;24097:6;24094:30;24091:117;;;24127:79;;:::i;:::-;24091:117;24232:78;24302:7;24293:6;24282:9;24278:22;24232:78;:::i;:::-;24222:88;;24018:302;23788:539;;;;:::o;24333:474::-;24401:6;24409;24458:2;24446:9;24437:7;24433:23;24429:32;24426:119;;;24464:79;;:::i;:::-;24426:119;24584:1;24609:53;24654:7;24645:6;24634:9;24630:22;24609:53;:::i;:::-;24599:63;;24555:117;24711:2;24737:53;24782:7;24773:6;24762:9;24758:22;24737:53;:::i;:::-;24727:63;;24682:118;24333:474;;;;;:::o;24813:1089::-;24917:6;24925;24933;24941;24949;24998:3;24986:9;24977:7;24973:23;24969:33;24966:120;;;25005:79;;:::i;:::-;24966:120;25125:1;25150:53;25195:7;25186:6;25175:9;25171:22;25150:53;:::i;:::-;25140:63;;25096:117;25252:2;25278:53;25323:7;25314:6;25303:9;25299:22;25278:53;:::i;:::-;25268:63;;25223:118;25380:2;25406:53;25451:7;25442:6;25431:9;25427:22;25406:53;:::i;:::-;25396:63;;25351:118;25508:2;25534:53;25579:7;25570:6;25559:9;25555:22;25534:53;:::i;:::-;25524:63;;25479:118;25664:3;25653:9;25649:19;25636:33;25696:18;25688:6;25685:30;25682:117;;;25718:79;;:::i;:::-;25682:117;25823:62;25877:7;25868:6;25857:9;25853:22;25823:62;:::i;:::-;25813:72;;25607:288;24813:1089;;;;;;;;:::o;25908:619::-;25985:6;25993;26001;26050:2;26038:9;26029:7;26025:23;26021:32;26018:119;;;26056:79;;:::i;:::-;26018:119;26176:1;26201:53;26246:7;26237:6;26226:9;26222:22;26201:53;:::i;:::-;26191:63;;26147:117;26303:2;26329:53;26374:7;26365:6;26354:9;26350:22;26329:53;:::i;:::-;26319:63;;26274:118;26431:2;26457:53;26502:7;26493:6;26482:9;26478:22;26457:53;:::i;:::-;26447:63;;26402:118;25908:619;;;;;:::o;26533:229::-;26673:34;26669:1;26661:6;26657:14;26650:58;26742:12;26737:2;26729:6;26725:15;26718:37;26533:229;:::o;26768:366::-;26910:3;26931:67;26995:2;26990:3;26931:67;:::i;:::-;26924:74;;27007:93;27096:3;27007:93;:::i;:::-;27125:2;27120:3;27116:12;27109:19;;26768:366;;;:::o;27140:419::-;27306:4;27344:2;27333:9;27329:18;27321:26;;27393:9;27387:4;27383:20;27379:1;27368:9;27364:17;27357:47;27421:131;27547:4;27421:131;:::i;:::-;27413:139;;27140:419;;;:::o;27565:180::-;27613:77;27610:1;27603:88;27710:4;27707:1;27700:15;27734:4;27731:1;27724:15;27751:320;27795:6;27832:1;27826:4;27822:12;27812:22;;27879:1;27873:4;27869:12;27900:18;27890:81;;27956:4;27948:6;27944:17;27934:27;;27890:81;28018:2;28010:6;28007:14;27987:18;27984:38;27981:84;;28037:18;;:::i;:::-;27981:84;27802:269;27751:320;;;:::o;28077:179::-;28217:31;28213:1;28205:6;28201:14;28194:55;28077:179;:::o;28262:366::-;28404:3;28425:67;28489:2;28484:3;28425:67;:::i;:::-;28418:74;;28501:93;28590:3;28501:93;:::i;:::-;28619:2;28614:3;28610:12;28603:19;;28262:366;;;:::o;28634:419::-;28800:4;28838:2;28827:9;28823:18;28815:26;;28887:9;28881:4;28877:20;28873:1;28862:9;28858:17;28851:47;28915:131;29041:4;28915:131;:::i;:::-;28907:139;;28634:419;;;:::o;29059:228::-;29199:34;29195:1;29187:6;29183:14;29176:58;29268:11;29263:2;29255:6;29251:15;29244:36;29059:228;:::o;29293:366::-;29435:3;29456:67;29520:2;29515:3;29456:67;:::i;:::-;29449:74;;29532:93;29621:3;29532:93;:::i;:::-;29650:2;29645:3;29641:12;29634:19;;29293:366;;;:::o;29665:419::-;29831:4;29869:2;29858:9;29854:18;29846:26;;29918:9;29912:4;29908:20;29904:1;29893:9;29889:17;29882:47;29946:131;30072:4;29946:131;:::i;:::-;29938:139;;29665:419;;;:::o;30090:180::-;30138:77;30135:1;30128:88;30235:4;30232:1;30225:15;30259:4;30256:1;30249:15;30276:180;30324:77;30321:1;30314:88;30421:4;30418:1;30411:15;30445:4;30442:1;30435:15;30462:233;30501:3;30524:24;30542:5;30524:24;:::i;:::-;30515:33;;30570:66;30563:5;30560:77;30557:103;;30640:18;;:::i;:::-;30557:103;30687:1;30680:5;30676:13;30669:20;;30462:233;;;:::o;30701:234::-;30841:34;30837:1;30829:6;30825:14;30818:58;30910:17;30905:2;30897:6;30893:15;30886:42;30701:234;:::o;30941:366::-;31083:3;31104:67;31168:2;31163:3;31104:67;:::i;:::-;31097:74;;31180:93;31269:3;31180:93;:::i;:::-;31298:2;31293:3;31289:12;31282:19;;30941:366;;;:::o;31313:419::-;31479:4;31517:2;31506:9;31502:18;31494:26;;31566:9;31560:4;31556:20;31552:1;31541:9;31537:17;31530:47;31594:131;31720:4;31594:131;:::i;:::-;31586:139;;31313:419;;;:::o;31738:147::-;31839:11;31876:3;31861:18;;31738:147;;;;:::o;31891:114::-;;:::o;32011:398::-;32170:3;32191:83;32272:1;32267:3;32191:83;:::i;:::-;32184:90;;32283:93;32372:3;32283:93;:::i;:::-;32401:1;32396:3;32392:11;32385:18;;32011:398;;;:::o;32415:379::-;32599:3;32621:147;32764:3;32621:147;:::i;:::-;32614:154;;32785:3;32778:10;;32415:379;;;:::o;32800:165::-;32940:17;32936:1;32928:6;32924:14;32917:41;32800:165;:::o;32971:366::-;33113:3;33134:67;33198:2;33193:3;33134:67;:::i;:::-;33127:74;;33210:93;33299:3;33210:93;:::i;:::-;33328:2;33323:3;33319:12;33312:19;;32971:366;;;:::o;33343:419::-;33509:4;33547:2;33536:9;33532:18;33524:26;;33596:9;33590:4;33586:20;33582:1;33571:9;33567:17;33560:47;33624:131;33750:4;33624:131;:::i;:::-;33616:139;;33343:419;;;:::o;33768:94::-;33801:8;33849:5;33845:2;33841:14;33820:35;;33768:94;;;:::o;33868:::-;33907:7;33936:20;33950:5;33936:20;:::i;:::-;33925:31;;33868:94;;;:::o;33968:100::-;34007:7;34036:26;34056:5;34036:26;:::i;:::-;34025:37;;33968:100;;;:::o;34074:157::-;34179:45;34199:24;34217:5;34199:24;:::i;:::-;34179:45;:::i;:::-;34174:3;34167:58;34074:157;;:::o;34237:256::-;34349:3;34364:75;34435:3;34426:6;34364:75;:::i;:::-;34464:2;34459:3;34455:12;34448:19;;34484:3;34477:10;;34237:256;;;;:::o;34499:168::-;34639:20;34635:1;34627:6;34623:14;34616:44;34499:168;:::o;34673:366::-;34815:3;34836:67;34900:2;34895:3;34836:67;:::i;:::-;34829:74;;34912:93;35001:3;34912:93;:::i;:::-;35030:2;35025:3;35021:12;35014:19;;34673:366;;;:::o;35045:419::-;35211:4;35249:2;35238:9;35234:18;35226:26;;35298:9;35292:4;35288:20;35284:1;35273:9;35269:17;35262:47;35326:131;35452:4;35326:131;:::i;:::-;35318:139;;35045:419;;;:::o;35470:167::-;35610:19;35606:1;35598:6;35594:14;35587:43;35470:167;:::o;35643:366::-;35785:3;35806:67;35870:2;35865:3;35806:67;:::i;:::-;35799:74;;35882:93;35971:3;35882:93;:::i;:::-;36000:2;35995:3;35991:12;35984:19;;35643:366;;;:::o;36015:419::-;36181:4;36219:2;36208:9;36204:18;36196:26;;36268:9;36262:4;36258:20;36254:1;36243:9;36239:17;36232:47;36296:131;36422:4;36296:131;:::i;:::-;36288:139;;36015:419;;;:::o;36440:220::-;36580:34;36576:1;36568:6;36564:14;36557:58;36649:3;36644:2;36636:6;36632:15;36625:28;36440:220;:::o;36666:366::-;36808:3;36829:67;36893:2;36888:3;36829:67;:::i;:::-;36822:74;;36905:93;36994:3;36905:93;:::i;:::-;37023:2;37018:3;37014:12;37007:19;;36666:366;;;:::o;37038:419::-;37204:4;37242:2;37231:9;37227:18;37219:26;;37291:9;37285:4;37281:20;37277:1;37266:9;37262:17;37255:47;37319:131;37445:4;37319:131;:::i;:::-;37311:139;;37038:419;;;:::o;37463:179::-;37603:31;37599:1;37591:6;37587:14;37580:55;37463:179;:::o;37648:366::-;37790:3;37811:67;37875:2;37870:3;37811:67;:::i;:::-;37804:74;;37887:93;37976:3;37887:93;:::i;:::-;38005:2;38000:3;37996:12;37989:19;;37648:366;;;:::o;38020:419::-;38186:4;38224:2;38213:9;38209:18;38201:26;;38273:9;38267:4;38263:20;38259:1;38248:9;38244:17;38237:47;38301:131;38427:4;38301:131;:::i;:::-;38293:139;;38020:419;;;:::o;38445:176::-;38585:28;38581:1;38573:6;38569:14;38562:52;38445:176;:::o;38627:366::-;38769:3;38790:67;38854:2;38849:3;38790:67;:::i;:::-;38783:74;;38866:93;38955:3;38866:93;:::i;:::-;38984:2;38979:3;38975:12;38968:19;;38627:366;;;:::o;38999:419::-;39165:4;39203:2;39192:9;39188:18;39180:26;;39252:9;39246:4;39242:20;39238:1;39227:9;39223:17;39216:47;39280:131;39406:4;39280:131;:::i;:::-;39272:139;;38999:419;;;:::o;39424:191::-;39464:3;39483:20;39501:1;39483:20;:::i;:::-;39478:25;;39517:20;39535:1;39517:20;:::i;:::-;39512:25;;39560:1;39557;39553:9;39546:16;;39581:3;39578:1;39575:10;39572:36;;;39588:18;;:::i;:::-;39572:36;39424:191;;;;:::o;39621:225::-;39761:34;39757:1;39749:6;39745:14;39738:58;39830:8;39825:2;39817:6;39813:15;39806:33;39621:225;:::o;39852:366::-;39994:3;40015:67;40079:2;40074:3;40015:67;:::i;:::-;40008:74;;40091:93;40180:3;40091:93;:::i;:::-;40209:2;40204:3;40200:12;40193:19;;39852:366;;;:::o;40224:419::-;40390:4;40428:2;40417:9;40413:18;40405:26;;40477:9;40471:4;40467:20;40463:1;40452:9;40448:17;40441:47;40505:131;40631:4;40505:131;:::i;:::-;40497:139;;40224:419;;;:::o;40649:227::-;40789:34;40785:1;40777:6;40773:14;40766:58;40858:10;40853:2;40845:6;40841:15;40834:35;40649:227;:::o;40882:366::-;41024:3;41045:67;41109:2;41104:3;41045:67;:::i;:::-;41038:74;;41121:93;41210:3;41121:93;:::i;:::-;41239:2;41234:3;41230:12;41223:19;;40882:366;;;:::o;41254:419::-;41420:4;41458:2;41447:9;41443:18;41435:26;;41507:9;41501:4;41497:20;41493:1;41482:9;41478:17;41471:47;41535:131;41661:4;41535:131;:::i;:::-;41527:139;;41254:419;;;:::o;41679:182::-;41819:34;41815:1;41807:6;41803:14;41796:58;41679:182;:::o;41867:366::-;42009:3;42030:67;42094:2;42089:3;42030:67;:::i;:::-;42023:74;;42106:93;42195:3;42106:93;:::i;:::-;42224:2;42219:3;42215:12;42208:19;;41867:366;;;:::o;42239:419::-;42405:4;42443:2;42432:9;42428:18;42420:26;;42492:9;42486:4;42482:20;42478:1;42467:9;42463:17;42456:47;42520:131;42646:4;42520:131;:::i;:::-;42512:139;;42239:419;;;:::o;42664:141::-;42713:4;42736:3;42728:11;;42759:3;42756:1;42749:14;42793:4;42790:1;42780:18;42772:26;;42664:141;;;:::o;42811:93::-;42848:6;42895:2;42890;42883:5;42879:14;42875:23;42865:33;;42811:93;;;:::o;42910:107::-;42954:8;43004:5;42998:4;42994:16;42973:37;;42910:107;;;;:::o;43023:393::-;43092:6;43142:1;43130:10;43126:18;43165:97;43195:66;43184:9;43165:97;:::i;:::-;43283:39;43313:8;43302:9;43283:39;:::i;:::-;43271:51;;43355:4;43351:9;43344:5;43340:21;43331:30;;43404:4;43394:8;43390:19;43383:5;43380:30;43370:40;;43099:317;;43023:393;;;;;:::o;43422:142::-;43472:9;43505:53;43523:34;43532:24;43550:5;43532:24;:::i;:::-;43523:34;:::i;:::-;43505:53;:::i;:::-;43492:66;;43422:142;;;:::o;43570:75::-;43613:3;43634:5;43627:12;;43570:75;;;:::o;43651:269::-;43761:39;43792:7;43761:39;:::i;:::-;43822:91;43871:41;43895:16;43871:41;:::i;:::-;43863:6;43856:4;43850:11;43822:91;:::i;:::-;43816:4;43809:105;43727:193;43651:269;;;:::o;43926:73::-;43971:3;43926:73;:::o;44005:189::-;44082:32;;:::i;:::-;44123:65;44181:6;44173;44167:4;44123:65;:::i;:::-;44058:136;44005:189;;:::o;44200:186::-;44260:120;44277:3;44270:5;44267:14;44260:120;;;44331:39;44368:1;44361:5;44331:39;:::i;:::-;44304:1;44297:5;44293:13;44284:22;;44260:120;;;44200:186;;:::o;44392:543::-;44493:2;44488:3;44485:11;44482:446;;;44527:38;44559:5;44527:38;:::i;:::-;44611:29;44629:10;44611:29;:::i;:::-;44601:8;44597:44;44794:2;44782:10;44779:18;44776:49;;;44815:8;44800:23;;44776:49;44838:80;44894:22;44912:3;44894:22;:::i;:::-;44884:8;44880:37;44867:11;44838:80;:::i;:::-;44497:431;;44482:446;44392:543;;;:::o;44941:117::-;44995:8;45045:5;45039:4;45035:16;45014:37;;44941:117;;;;:::o;45064:169::-;45108:6;45141:51;45189:1;45185:6;45177:5;45174:1;45170:13;45141:51;:::i;:::-;45137:56;45222:4;45216;45212:15;45202:25;;45115:118;45064:169;;;;:::o;45238:295::-;45314:4;45460:29;45485:3;45479:4;45460:29;:::i;:::-;45452:37;;45522:3;45519:1;45515:11;45509:4;45506:21;45498:29;;45238:295;;;;:::o;45538:1395::-;45655:37;45688:3;45655:37;:::i;:::-;45757:18;45749:6;45746:30;45743:56;;;45779:18;;:::i;:::-;45743:56;45823:38;45855:4;45849:11;45823:38;:::i;:::-;45908:67;45968:6;45960;45954:4;45908:67;:::i;:::-;46002:1;46026:4;46013:17;;46058:2;46050:6;46047:14;46075:1;46070:618;;;;46732:1;46749:6;46746:77;;;46798:9;46793:3;46789:19;46783:26;46774:35;;46746:77;46849:67;46909:6;46902:5;46849:67;:::i;:::-;46843:4;46836:81;46705:222;46040:887;;46070:618;46122:4;46118:9;46110:6;46106:22;46156:37;46188:4;46156:37;:::i;:::-;46215:1;46229:208;46243:7;46240:1;46237:14;46229:208;;;46322:9;46317:3;46313:19;46307:26;46299:6;46292:42;46373:1;46365:6;46361:14;46351:24;;46420:2;46409:9;46405:18;46392:31;;46266:4;46263:1;46259:12;46254:17;;46229:208;;;46465:6;46456:7;46453:19;46450:179;;;46523:9;46518:3;46514:19;46508:26;46566:48;46608:4;46600:6;46596:17;46585:9;46566:48;:::i;:::-;46558:6;46551:64;46473:156;46450:179;46675:1;46671;46663:6;46659:14;46655:22;46649:4;46642:36;46077:611;;;46040:887;;45630:1303;;;45538:1395;;:::o;46939:332::-;47060:4;47098:2;47087:9;47083:18;47075:26;;47111:71;47179:1;47168:9;47164:17;47155:6;47111:71;:::i;:::-;47192:72;47260:2;47249:9;47245:18;47236:6;47192:72;:::i;:::-;46939:332;;;;;:::o;47277:137::-;47331:5;47362:6;47356:13;47347:22;;47378:30;47402:5;47378:30;:::i;:::-;47277:137;;;;:::o;47420:345::-;47487:6;47536:2;47524:9;47515:7;47511:23;47507:32;47504:119;;;47542:79;;:::i;:::-;47504:119;47662:1;47687:61;47740:7;47731:6;47720:9;47716:22;47687:61;:::i;:::-;47677:71;;47633:125;47420:345;;;;:::o;47771:222::-;47911:34;47907:1;47899:6;47895:14;47888:58;47980:5;47975:2;47967:6;47963:15;47956:30;47771:222;:::o;47999:366::-;48141:3;48162:67;48226:2;48221:3;48162:67;:::i;:::-;48155:74;;48238:93;48327:3;48238:93;:::i;:::-;48356:2;48351:3;48347:12;48340:19;;47999:366;;;:::o;48371:419::-;48537:4;48575:2;48564:9;48560:18;48552:26;;48624:9;48618:4;48614:20;48610:1;48599:9;48595:17;48588:47;48652:131;48778:4;48652:131;:::i;:::-;48644:139;;48371:419;;;:::o;48796:227::-;48936:34;48932:1;48924:6;48920:14;48913:58;49005:10;49000:2;48992:6;48988:15;48981:35;48796:227;:::o;49029:366::-;49171:3;49192:67;49256:2;49251:3;49192:67;:::i;:::-;49185:74;;49268:93;49357:3;49268:93;:::i;:::-;49386:2;49381:3;49377:12;49370:19;;49029:366;;;:::o;49401:419::-;49567:4;49605:2;49594:9;49590:18;49582:26;;49654:9;49648:4;49644:20;49640:1;49629:9;49625:17;49618:47;49682:131;49808:4;49682:131;:::i;:::-;49674:139;;49401:419;;;:::o;49826:223::-;49966:34;49962:1;49954:6;49950:14;49943:58;50035:6;50030:2;50022:6;50018:15;50011:31;49826:223;:::o;50055:366::-;50197:3;50218:67;50282:2;50277:3;50218:67;:::i;:::-;50211:74;;50294:93;50383:3;50294:93;:::i;:::-;50412:2;50407:3;50403:12;50396:19;;50055:366;;;:::o;50427:419::-;50593:4;50631:2;50620:9;50616:18;50608:26;;50680:9;50674:4;50670:20;50666:1;50655:9;50651:17;50644:47;50708:131;50834:4;50708:131;:::i;:::-;50700:139;;50427:419;;;:::o;50852:634::-;51073:4;51111:2;51100:9;51096:18;51088:26;;51160:9;51154:4;51150:20;51146:1;51135:9;51131:17;51124:47;51188:108;51291:4;51282:6;51188:108;:::i;:::-;51180:116;;51343:9;51337:4;51333:20;51328:2;51317:9;51313:18;51306:48;51371:108;51474:4;51465:6;51371:108;:::i;:::-;51363:116;;50852:634;;;;;:::o;51492:181::-;51632:33;51628:1;51620:6;51616:14;51609:57;51492:181;:::o;51679:366::-;51821:3;51842:67;51906:2;51901:3;51842:67;:::i;:::-;51835:74;;51918:93;52007:3;51918:93;:::i;:::-;52036:2;52031:3;52027:12;52020:19;;51679:366;;;:::o;52051:419::-;52217:4;52255:2;52244:9;52240:18;52232:26;;52304:9;52298:4;52294:20;52290:1;52279:9;52275:17;52268:47;52332:131;52458:4;52332:131;:::i;:::-;52324:139;;52051:419;;;:::o;52476:79::-;52515:7;52544:5;52533:16;;52476:79;;;:::o;52561:157::-;52666:45;52686:24;52704:5;52686:24;:::i;:::-;52666:45;:::i;:::-;52661:3;52654:58;52561:157;;:::o;52724:538::-;52892:3;52907:75;52978:3;52969:6;52907:75;:::i;:::-;53007:2;53002:3;52998:12;52991:19;;53020:75;53091:3;53082:6;53020:75;:::i;:::-;53120:2;53115:3;53111:12;53104:19;;53133:75;53204:3;53195:6;53133:75;:::i;:::-;53233:2;53228:3;53224:12;53217:19;;53253:3;53246:10;;52724:538;;;;;;:::o;53268:180::-;53316:77;53313:1;53306:88;53413:4;53410:1;53403:15;53437:4;53434:1;53427:15;53454:176;53486:1;53503:20;53521:1;53503:20;:::i;:::-;53498:25;;53537:20;53555:1;53537:20;:::i;:::-;53532:25;;53576:1;53566:35;;53581:18;;:::i;:::-;53566:35;53622:1;53619;53615:9;53610:14;;53454:176;;;;:::o;53636:220::-;53776:34;53772:1;53764:6;53760:14;53753:58;53845:3;53840:2;53832:6;53828:15;53821:28;53636:220;:::o;53862:366::-;54004:3;54025:67;54089:2;54084:3;54025:67;:::i;:::-;54018:74;;54101:93;54190:3;54101:93;:::i;:::-;54219:2;54214:3;54210:12;54203:19;;53862:366;;;:::o;54234:419::-;54400:4;54438:2;54427:9;54423:18;54415:26;;54487:9;54481:4;54477:20;54473:1;54462:9;54458:17;54451:47;54515:131;54641:4;54515:131;:::i;:::-;54507:139;;54234:419;;;:::o;54659:332::-;54780:4;54818:2;54807:9;54803:18;54795:26;;54831:71;54899:1;54888:9;54884:17;54875:6;54831:71;:::i;:::-;54912:72;54980:2;54969:9;54965:18;54956:6;54912:72;:::i;:::-;54659:332;;;;;:::o;54997:224::-;55137:34;55133:1;55125:6;55121:14;55114:58;55206:7;55201:2;55193:6;55189:15;55182:32;54997:224;:::o;55227:366::-;55369:3;55390:67;55454:2;55449:3;55390:67;:::i;:::-;55383:74;;55466:93;55555:3;55466:93;:::i;:::-;55584:2;55579:3;55575:12;55568:19;;55227:366;;;:::o;55599:419::-;55765:4;55803:2;55792:9;55788:18;55780:26;;55852:9;55846:4;55842:20;55838:1;55827:9;55823:17;55816:47;55880:131;56006:4;55880:131;:::i;:::-;55872:139;;55599:419;;;:::o;56024:229::-;56164:34;56160:1;56152:6;56148:14;56141:58;56233:12;56228:2;56220:6;56216:15;56209:37;56024:229;:::o;56259:366::-;56401:3;56422:67;56486:2;56481:3;56422:67;:::i;:::-;56415:74;;56498:93;56587:3;56498:93;:::i;:::-;56616:2;56611:3;56607:12;56600:19;;56259:366;;;:::o;56631:419::-;56797:4;56835:2;56824:9;56820:18;56812:26;;56884:9;56878:4;56874:20;56870:1;56859:9;56855:17;56848:47;56912:131;57038:4;56912:131;:::i;:::-;56904:139;;56631:419;;;:::o;57056:228::-;57196:34;57192:1;57184:6;57180:14;57173:58;57265:11;57260:2;57252:6;57248:15;57241:36;57056:228;:::o;57290:366::-;57432:3;57453:67;57517:2;57512:3;57453:67;:::i;:::-;57446:74;;57529:93;57618:3;57529:93;:::i;:::-;57647:2;57642:3;57638:12;57631:19;;57290:366;;;:::o;57662:419::-;57828:4;57866:2;57855:9;57851:18;57843:26;;57915:9;57909:4;57905:20;57901:1;57890:9;57886:17;57879:47;57943:131;58069:4;57943:131;:::i;:::-;57935:139;;57662:419;;;:::o;58087:98::-;58138:6;58172:5;58166:12;58156:22;;58087:98;;;:::o;58191:168::-;58274:11;58308:6;58303:3;58296:19;58348:4;58343:3;58339:14;58324:29;;58191:168;;;;:::o;58365:373::-;58451:3;58479:38;58511:5;58479:38;:::i;:::-;58533:70;58596:6;58591:3;58533:70;:::i;:::-;58526:77;;58612:65;58670:6;58665:3;58658:4;58651:5;58647:16;58612:65;:::i;:::-;58702:29;58724:6;58702:29;:::i;:::-;58697:3;58693:39;58686:46;;58455:283;58365:373;;;;:::o;58744:751::-;58967:4;59005:3;58994:9;58990:19;58982:27;;59019:71;59087:1;59076:9;59072:17;59063:6;59019:71;:::i;:::-;59100:72;59168:2;59157:9;59153:18;59144:6;59100:72;:::i;:::-;59182;59250:2;59239:9;59235:18;59226:6;59182:72;:::i;:::-;59264;59332:2;59321:9;59317:18;59308:6;59264:72;:::i;:::-;59384:9;59378:4;59374:20;59368:3;59357:9;59353:19;59346:49;59412:76;59483:4;59474:6;59412:76;:::i;:::-;59404:84;;58744:751;;;;;;;;:::o;59501:141::-;59557:5;59588:6;59582:13;59573:22;;59604:32;59630:5;59604:32;:::i;:::-;59501:141;;;;:::o;59648:349::-;59717:6;59766:2;59754:9;59745:7;59741:23;59737:32;59734:119;;;59772:79;;:::i;:::-;59734:119;59892:1;59917:63;59972:7;59963:6;59952:9;59948:22;59917:63;:::i;:::-;59907:73;;59863:127;59648:349;;;;:::o;60003:106::-;60047:8;60096:5;60091:3;60087:15;60066:36;;60003:106;;;:::o;60115:183::-;60150:3;60188:1;60170:16;60167:23;60164:128;;;60226:1;60223;60220;60205:23;60248:34;60279:1;60273:8;60248:34;:::i;:::-;60241:41;;60164:128;60115:183;:::o;60304:711::-;60343:3;60381:4;60363:16;60360:26;60389:5;60357:39;60418:20;;:::i;:::-;60493:1;60475:16;60471:24;60468:1;60462:4;60447:49;60526:4;60520:11;60625:16;60618:4;60610:6;60606:17;60603:39;60570:18;60562:6;60559:30;60543:113;60540:146;;;60671:5;;;;60540:146;60717:6;60711:4;60707:17;60753:3;60747:10;60780:18;60772:6;60769:30;60766:43;;;60802:5;;;;;;60766:43;60850:6;60843:4;60838:3;60834:14;60830:27;60909:1;60891:16;60887:24;60881:4;60877:35;60872:3;60869:44;60866:57;;;60916:5;;;;;;;60866:57;60933;60981:6;60975:4;60971:17;60963:6;60959:30;60953:4;60933:57;:::i;:::-;61006:3;60999:10;;60347:668;;;;;60304:711;;:::o;61021:239::-;61161:34;61157:1;61149:6;61145:14;61138:58;61230:22;61225:2;61217:6;61213:15;61206:47;61021:239;:::o;61266:366::-;61408:3;61429:67;61493:2;61488:3;61429:67;:::i;:::-;61422:74;;61505:93;61594:3;61505:93;:::i;:::-;61623:2;61618:3;61614:12;61607:19;;61266:366;;;:::o;61638:419::-;61804:4;61842:2;61831:9;61827:18;61819:26;;61891:9;61885:4;61881:20;61877:1;61866:9;61862:17;61855:47;61919:131;62045:4;61919:131;:::i;:::-;61911:139;;61638:419;;;:::o;62063:227::-;62203:34;62199:1;62191:6;62187:14;62180:58;62272:10;62267:2;62259:6;62255:15;62248:35;62063:227;:::o;62296:366::-;62438:3;62459:67;62523:2;62518:3;62459:67;:::i;:::-;62452:74;;62535:93;62624:3;62535:93;:::i;:::-;62653:2;62648:3;62644:12;62637:19;;62296:366;;;:::o;62668:419::-;62834:4;62872:2;62861:9;62857:18;62849:26;;62921:9;62915:4;62911:20;62907:1;62896:9;62892:17;62885:47;62949:131;63075:4;62949:131;:::i;:::-;62941:139;;62668:419;;;:::o;63093:1053::-;63416:4;63454:3;63443:9;63439:19;63431:27;;63468:71;63536:1;63525:9;63521:17;63512:6;63468:71;:::i;:::-;63549:72;63617:2;63606:9;63602:18;63593:6;63549:72;:::i;:::-;63668:9;63662:4;63658:20;63653:2;63642:9;63638:18;63631:48;63696:108;63799:4;63790:6;63696:108;:::i;:::-;63688:116;;63851:9;63845:4;63841:20;63836:2;63825:9;63821:18;63814:48;63879:108;63982:4;63973:6;63879:108;:::i;:::-;63871:116;;64035:9;64029:4;64025:20;64019:3;64008:9;64004:19;63997:49;64063:76;64134:4;64125:6;64063:76;:::i;:::-;64055:84;;63093:1053;;;;;;;;:::o
Swarm Source
ipfs://1439b4226428d3116e871f96ed80a1e2e82141610a3a4ec9e1e95ba4fcc01155
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.