Token
KISSA (KISSA)
ERC-20
FxChild
Overview
Max Total Supply
1,000,969 KISSA
Holders
3
Market
Price
$0.00 @ 0.000000 MATIC
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
500 KISSALoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
KissaChild
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity Multiple files format)
//SPDX-License-Identifier: Unlicense import {KissaBase} from "./KissaBase.sol"; import {IERC20} from "./IERC20.sol"; import {SafeERC20} from "./SafeERC20.sol"; import {IChildToken, AccessControlMixin, NativeMetaTransaction, ContextMixin} from "./BridgeHelpers.sol"; pragma solidity 0.8.4; /* KISSA * * By the Mittenz Team. * * Learn more at mittenz.tech. * */ /** * @dev Implementation of KISSA as a non-mintable child token in Polygon Matic. * */ contract KissaChild is KissaBase, IChildToken, AccessControlMixin, NativeMetaTransaction, ContextMixin { using SafeERC20 for KissaBase; bytes32 public constant DEPOSITOR_ROLE = keccak256("DEPOSITOR_ROLE"); // Max tokens mintable by admin role for launch. uint256 private _availableLaunchSupply = 4000000 * 10**18; constructor( address childChainManager ) KissaBase() { _setupContractId("Kissa"); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(DEPOSITOR_ROLE, childChainManager); _initializeEIP712("Kissa"); } // This is to support Native meta transactions // never use msg.sender directly, use _msgSender() instead function _msgSender() internal override view returns (address payable sender) { return ContextMixin.msgSender(); } /** * @notice called when token is deposited on root chain * @dev Should be callable only by ChildChainManager * Should handle deposit by minting the required amount for user * Make sure minting is done only by this function * @param user user address for whom deposit is being done * @param depositData abi encoded amount of KISSA * */ function deposit(address user, bytes calldata depositData) external override only(DEPOSITOR_ROLE) { uint256 amount = abi.decode(depositData, (uint256)); _mint(user, amount); } /** * @notice called when user wants to withdraw tokens back to root chain * @dev Should burn user's tokens. This transaction will be verified when exiting on root chain * @param amount amount of KISSA * */ function withdraw(uint256 amount) external { _burn(_msgSender(), amount); } /** * @notice Example function to handle minting tokens on matic chain * @dev Minting can be done as per requirement, * This implementation allows only admin to mint tokens but it can be changed as per requirement * @param user user for whom tokens are being minted * @param amount amount of token to mint * @dev Function is only here to satisfy PoS mapping requirements. All Kissa tokens * are minted at launch or created by converting Mittenz. No more can be minted. */ function mint(address user, uint256 amount) public only(DEFAULT_ADMIN_ROLE) { require(amount <= _availableLaunchSupply, "Amount exceeds launch supply limit."); _availableLaunchSupply -= amount; _mint(user, amount); } }
//SPDX-License-Identifier: Unlicense import {Context, Address, SafeMath, IERC20} from "./KissaBase.sol"; pragma solidity 0.8.4; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context { using EnumerableSet for EnumerableSet.AddressSet; using Address for address; struct RoleData { EnumerableSet.AddressSet members; bytes32 adminRole; } mapping (bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view returns (bool) { return _roles[role].members.contains(account); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view returns (uint256) { return _roles[role].members.length(); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view returns (address) { return _roles[role].members.at(index); } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant"); _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual { require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke"); _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, _roles[role].adminRole, adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (_roles[role].members.add(account)) { emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (_roles[role].members.remove(account)) { emit RoleRevoked(role, account, _msgSender()); } } } contract AccessControlMixin is AccessControl { string private _revertMsg; function _setupContractId(string memory contractId) internal { _revertMsg = string(abi.encodePacked(contractId, ": INSUFFICIENT_PERMISSIONS")); } modifier only(bytes32 role) { require( hasRole(role, _msgSender()), _revertMsg ); _; } } interface IChildToken { function deposit(address user, bytes calldata depositData) external; } contract Initializable { bool inited = false; modifier initializer() { require(!inited, "already inited"); _; inited = true; } } contract EIP712Base is Initializable { struct EIP712Domain { string name; string version; address verifyingContract; bytes32 salt; } string constant public ERC712_VERSION = "1"; bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256( bytes( "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)" ) ); bytes32 internal domainSeperator; // supposed to be called once while initializing. // one of the contractsa that inherits this contract follows proxy pattern // so it is not possible to do this in a constructor function _initializeEIP712( string memory name ) internal initializer { _setDomainSeperator(name); } function _setDomainSeperator(string memory name) internal { domainSeperator = keccak256( abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256(bytes(name)), keccak256(bytes(ERC712_VERSION)), address(this), bytes32(getChainId()) ) ); } function getDomainSeperator() public view returns (bytes32) { return domainSeperator; } function getChainId() public view returns (uint256) { uint256 id; assembly { id := chainid() } return id; } /** * Accept message hash and returns hash message in EIP712 compatible form * So that it can be used to recover signer from signature signed using EIP712 formatted data * https://eips.ethereum.org/EIPS/eip-712 * "\\x19" makes the encoding deterministic * "\\x01" is the version byte to make it compatible to EIP-191 */ function toTypedMessageHash(bytes32 messageHash) internal view returns (bytes32) { return keccak256( abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash) ); } } contract NativeMetaTransaction is EIP712Base { using SafeMath for uint256; bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256( bytes( "MetaTransaction(uint256 nonce,address from,bytes functionSignature)" ) ); event MetaTransactionExecuted( address userAddress, address payable relayerAddress, bytes functionSignature ); mapping(address => uint256) nonces; /* * Meta transaction structure. * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas * He should call the desired function directly in that case. */ struct MetaTransaction { uint256 nonce; address from; bytes functionSignature; } function executeMetaTransaction( address userAddress, bytes memory functionSignature, bytes32 sigR, bytes32 sigS, uint8 sigV ) public payable returns (bytes memory) { MetaTransaction memory metaTx = MetaTransaction({ nonce: nonces[userAddress], from: userAddress, functionSignature: functionSignature }); require( verify(userAddress, metaTx, sigR, sigS, sigV), "Signer and signature do not match" ); // increase nonce for user (to avoid re-use) nonces[userAddress] = nonces[userAddress].add(1); emit MetaTransactionExecuted( userAddress, payable(msg.sender), functionSignature ); // Append userAddress and relayer address at the end to extract it from calling context (bool success, bytes memory returnData) = address(this).call( abi.encodePacked(functionSignature, userAddress) ); require(success, "Function call not successful"); return returnData; } function hashMetaTransaction(MetaTransaction memory metaTx) internal pure returns (bytes32) { return keccak256( abi.encode( META_TRANSACTION_TYPEHASH, metaTx.nonce, metaTx.from, keccak256(metaTx.functionSignature) ) ); } function getNonce(address user) public view returns (uint256 nonce) { nonce = nonces[user]; } function verify( address signer, MetaTransaction memory metaTx, bytes32 sigR, bytes32 sigS, uint8 sigV ) internal view returns (bool) { require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER"); return signer == ecrecover( toTypedMessageHash(hashMetaTransaction(metaTx)), sigV, sigR, sigS ); } } abstract contract ContextMixin { function msgSender() internal view returns (address payable sender) { if (msg.sender == address(this)) { bytes memory array = msg.data; uint256 index = msg.data.length; assembly { // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those. sender := and( mload(add(array, index)), 0xffffffffffffffffffffffffffffffffffffffff ) } } else { sender = payable(msg.sender); } return sender; } } interface IMintableERC20 is IERC20 { /** * @notice called by predicate contract to mint tokens while withdrawing * @dev Should be callable only by MintableERC20Predicate * Make sure minting is done only by this function * @param user user address for whom token is being minted * @param amount amount of token being minted */ function mint(address user, uint256 amount) external; }
//SPDX-License-Identifier: Unlicense pragma solidity 0.8.4; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
//SPDX-License-Identifier: Unlicense import {IERC20} from "./IERC20.sol"; pragma solidity 0.8.4; /* * @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 payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * @dev Base implementation of KISSA as an ERC20 token. */ contract KissaBase is Context, IERC20, IERC20Metadata { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string constant private _name = "KISSA"; string constant private _symbol = "KISSA"; /** * @dev Constructor. */ constructor () {} /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "KISSA: transfer amount exceeds allowance"); _approve(sender, _msgSender(), currentAllowance - amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "KISSA: decreased allowance below zero"); _approve(_msgSender(), spender, currentAllowance - subtractedValue); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "KISSA: transfer from the zero address"); require(recipient != address(0), "KISSA: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "KISSA: transfer amount exceeds balance"); _balances[sender] = senderBalance - amount; _balances[recipient] += amount; emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "KISSA: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "KISSA: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "KISSA: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= amount; emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "KISSA: approve from the zero address"); require(spender != address(0), "KISSA: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } }
//SPDX-License-Identifier: Unlicense import {IERC20} from "./IERC20.sol"; pragma solidity 0.8.4; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { function safeTransfer( IERC20 token, address to, uint256 value ) internal { require(token.transfer(to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { require(token.transferFrom(from, to, value)); } function safeApprove( IERC20 token, address spender, uint256 value ) internal { require(token.approve(spender, value)); } }
[{"inputs":[{"internalType":"address","name":"childChainManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSITOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bytes","name":"depositData","type":"bytes"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600560006101000a81548160ff0219169083151502179055506a034f086f3b33b6840000006008553480156200003b57600080fd5b5060405162003ef638038062003ef68339818101604052810190620000619190620005ea565b620000a76040518060400160405280600581526020017f4b697373610000000000000000000000000000000000000000000000000000008152506200014a60201b60201c565b620000cb6000801b620000bf6200018760201b60201c565b620001a360201b60201c565b620000fd7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a982620001a360201b60201c565b620001436040518060400160405280600581526020017f4b69737361000000000000000000000000000000000000000000000000000000815250620001b960201b60201c565b50620008ce565b806040516020016200015d9190620006bd565b604051602081830303815290604052600490805190602001906200018392919062000523565b5050565b60006200019e6200023b60201b6200123a1760201c565b905090565b620001b58282620002ee60201b60201c565b5050565b600560009054906101000a900460ff16156200020c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002039062000740565b60405180910390fd5b6200021d816200039260201b60201c565b6001600560006101000a81548160ff02191690831515021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415620002e757600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050620002eb565b3390505b90565b6200031d81600360008581526020019081526020016000206000016200044160201b620012eb1790919060201c565b156200038e57620003336200018760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6040518060800160405280604f815260200162003ea7604f91398051906020012081805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012030620004096200047960201b60201c565b60001b60405160200162000422959493929190620006e3565b6040516020818303038152906040528051906020012060068190555050565b600062000471836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200048660201b60201c565b905092915050565b6000804690508091505090565b60006200049a83836200050060201b60201c565b620004f5578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620004fa565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b8280546200053190620007fd565b90600052602060002090601f016020900481019282620005555760008555620005a1565b82601f106200057057805160ff1916838001178555620005a1565b82800160010185558215620005a1579182015b82811115620005a057825182559160200191906001019062000583565b5b509050620005b09190620005b4565b5090565b5b80821115620005cf576000816000905550600101620005b5565b5090565b600081519050620005e481620008b4565b92915050565b600060208284031215620005fd57600080fd5b60006200060d84828501620005d3565b91505092915050565b620006218162000789565b82525050565b62000632816200079d565b82525050565b6000620006458262000762565b6200065181856200077e565b935062000663818560208601620007c7565b80840191505092915050565b60006200067e601a836200077e565b91506200068b8262000862565b601a82019050919050565b6000620006a5600e836200076d565b9150620006b2826200088b565b602082019050919050565b6000620006cb828462000638565b9150620006d8826200066f565b915081905092915050565b600060a082019050620006fa600083018862000627565b62000709602083018762000627565b62000718604083018662000627565b62000727606083018562000616565b62000736608083018462000627565b9695505050505050565b600060208201905081810360008301526200075b8162000696565b9050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b60006200079682620007a7565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015620007e7578082015181840152602081019050620007ca565b83811115620007f7576000848401525b50505050565b600060028204905060018216806200081657607f821691505b602082108114156200082d576200082c62000833565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f3a20494e53554646494349454e545f5045524d495353494f4e53000000000000600082015250565b7f616c726561647920696e69746564000000000000000000000000000000000000600082015250565b620008bf8162000789565b8114620008cb57600080fd5b50565b6135c980620008de6000396000f3fe6080604052600436106101b75760003560e01c806339509351116100ec578063a3b0b5a31161008a578063ca15c87311610064578063ca15c87314610675578063cf2c52cb146106b2578063d547741f146106db578063dd62ed3e14610704576101b7565b8063a3b0b5a3146105d0578063a457c2d7146105fb578063a9059cbb14610638576101b7565b80639010d07c116100c65780639010d07c1461050057806391d148541461053d57806395d89b411461057a578063a217fddf146105a5576101b7565b8063395093511461045d57806340c10f191461049a57806370a08231146104c3576101b7565b8063248a9ca3116101595780632f2ff15d116101335780632f2ff15d146103b5578063313ce567146103de5780633408e4701461040957806336568abe14610434576101b7565b8063248a9ca3146103125780632d0335ab1461034f5780632e1a7d4d1461038c576101b7565b80630f7e5970116101955780630f7e59701461025457806318160ddd1461027f57806320379ee5146102aa57806323b872dd146102d5576101b7565b806306fdde03146101bc578063095ea7b3146101e75780630c53c51c14610224575b600080fd5b3480156101c857600080fd5b506101d1610741565b6040516101de9190612a0c565b60405180910390f35b3480156101f357600080fd5b5061020e60048036038101906102099190612334565b61077e565b60405161021b919061292a565b60405180910390f35b61023e600480360381019061023991906122a5565b61079c565b60405161024b91906129ea565b60405180910390f35b34801561026057600080fd5b50610269610a0e565b6040516102769190612a0c565b60405180910390f35b34801561028b57600080fd5b50610294610a47565b6040516102a19190612c70565b60405180910390f35b3480156102b657600080fd5b506102bf610a51565b6040516102cc9190612945565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f791906121fe565b610a5b565b604051610309919061292a565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612370565b610b5c565b6040516103469190612945565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190612199565b610b7c565b6040516103839190612c70565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae9190612411565b610bc5565b005b3480156103c157600080fd5b506103dc60048036038101906103d79190612399565b610bd9565b005b3480156103ea57600080fd5b506103f3610c4d565b6040516104009190612c8b565b60405180910390f35b34801561041557600080fd5b5061041e610c56565b60405161042b9190612c70565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190612399565b610c63565b005b34801561046957600080fd5b50610484600480360381019061047f9190612334565b610ce6565b604051610491919061292a565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc9190612334565b610d92565b005b3480156104cf57600080fd5b506104ea60048036038101906104e59190612199565b610e58565b6040516104f79190612c70565b60405180910390f35b34801561050c57600080fd5b50610527600480360381019061052291906123d5565b610ea0565b60405161053491906128d1565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190612399565b610ed2565b604051610571919061292a565b60405180910390f35b34801561058657600080fd5b5061058f610f04565b60405161059c9190612a0c565b60405180910390f35b3480156105b157600080fd5b506105ba610f41565b6040516105c79190612945565b60405180910390f35b3480156105dc57600080fd5b506105e5610f48565b6040516105f29190612945565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190612334565b610f6c565b60405161062f919061292a565b60405180910390f35b34801561064457600080fd5b5061065f600480360381019061065a9190612334565b611060565b60405161066c919061292a565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190612370565b61107e565b6040516106a99190612c70565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d4919061224d565b6110a5565b005b3480156106e757600080fd5b5061070260048036038101906106fd9190612399565b61113f565b005b34801561071057600080fd5b5061072b600480360381019061072691906121c2565b6111b3565b6040516107389190612c70565b60405180910390f35b60606040518060400160405280600581526020017f4b49535341000000000000000000000000000000000000000000000000000000815250905090565b600061079261078b61131b565b848461132a565b6001905092915050565b606060006040518060600160405280600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187815250905061081f87828787876114f5565b61085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085590612bb0565b60405180910390fd5b6108b16001600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115fe90919063ffffffff16565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610927939291906128ec565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a60405160200161095c929190612872565b604051602081830303815290604052604051610978919061285b565b6000604051808303816000865af19150503d80600081146109b5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ba565b606091505b5091509150816109ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f690612ad0565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600254905090565b6000600654905090565b6000610a68848484611614565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610ab361131b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90612a50565b60405180910390fd5b610b5085610b3f61131b565b8584610b4b9190612db5565b61132a565b60019150509392505050565b600060036000838152602001908152602001600020600201549050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bd6610bd061131b565b82611893565b50565b610c006003600084815260200190815260200160002060020154610bfb61131b565b610ed2565b610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612a70565b60405180910390fd5b610c498282611a67565b5050565b60006012905090565b6000804690508091505090565b610c6b61131b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf90612c50565b60405180910390fd5b610ce28282611afb565b5050565b6000610d88610cf361131b565b848460016000610d0161131b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d839190612d5f565b61132a565b6001905092915050565b6000801b610da781610da261131b565b610ed2565b600490610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de19190612a2e565b60405180910390fd5b50600854821115610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2790612bf0565b60405180910390fd5b8160086000828254610e429190612db5565b92505081905550610e538383611b8f565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610eca8260036000868152602001908152602001600020600001611ce390919063ffffffff16565b905092915050565b6000610efc8260036000868152602001908152602001600020600001611cfd90919063ffffffff16565b905092915050565b60606040518060400160405280600581526020017f4b49535341000000000000000000000000000000000000000000000000000000815250905090565b6000801b81565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a981565b60008060016000610f7b61131b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f90612a90565b60405180910390fd5b61105561104361131b565b8585846110509190612db5565b61132a565b600191505092915050565b600061107461106d61131b565b8484611614565b6001905092915050565b600061109e60036000848152602001908152602001600020600001611d2d565b9050919050565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a96110d7816110d261131b565b610ed2565b60049061111a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111119190612a2e565b60405180910390fd5b506000838381019061112c9190612411565b90506111388582611b8f565b5050505050565b611166600360008481526020019081526020016000206002015461116161131b565b610ed2565b6111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c90612b50565b60405180910390fd5b6111af8282611afb565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156112e457600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506112e8565b3390505b90565b6000611313836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611d42565b905092915050565b600061132561123a565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190612ab0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190612c10565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114e89190612c70565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90612b70565b60405180910390fd5b600161157961157487611db2565b611e1a565b8386866040516000815260200160405260405161159994939291906129a5565b6020604051602081039080840390855afa1580156115bb573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b6000818361160c9190612d5f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167b90612b10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90612b30565b60405180910390fd5b6116ff838383611e53565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c90612b90565b60405180910390fd5b81816117919190612db5565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118219190612d5f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118859190612c70565b60405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90612af0565b60405180910390fd5b61190f82600083611e53565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c90612bd0565b60405180910390fd5b81816119a19190612db5565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546119f59190612db5565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a5a9190612c70565b60405180910390a3505050565b611a8f81600360008581526020019081526020016000206000016112eb90919063ffffffff16565b15611af757611a9c61131b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611b238160036000858152602001908152602001600020600001611e5890919063ffffffff16565b15611b8b57611b3061131b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690612c30565b60405180910390fd5b611c0b60008383611e53565b8060026000828254611c1d9190612d5f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c729190612d5f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611cd79190612c70565b60405180910390a35050565b6000611cf28360000183611e88565b60001c905092915050565b6000611d25836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611ed9565b905092915050565b6000611d3b82600001611efc565b9050919050565b6000611d4e8383611ed9565b611da7578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611dac565b600090505b92915050565b6000604051806080016040528060438152602001613551604391398051906020012082600001518360200151846040015180519060200120604051602001611dfd9493929190612960565b604051602081830303815290604052805190602001209050919050565b6000611e24610a51565b82604051602001611e3692919061289a565b604051602081830303815290604052805190602001209050919050565b505050565b6000611e80836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611f0d565b905092915050565b6000826000018281548110611ec6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b60008083600101600084815260200190815260200160002054905060008114612087576000600182611f3f9190612db5565b9050600060018660000180549050611f579190612db5565b9050818114612012576000866000018281548110611f9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110611fe8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061204c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061208d565b60009150505b92915050565b60006120a66120a184612ccb565b612ca6565b9050828152602081018484840111156120be57600080fd5b6120c9848285612e5a565b509392505050565b6000813590506120e0816134f4565b92915050565b6000813590506120f58161350b565b92915050565b60008083601f84011261210d57600080fd5b8235905067ffffffffffffffff81111561212657600080fd5b60208301915083600182028301111561213e57600080fd5b9250929050565b600082601f83011261215657600080fd5b8135612166848260208601612093565b91505092915050565b60008135905061217e81613522565b92915050565b60008135905061219381613539565b92915050565b6000602082840312156121ab57600080fd5b60006121b9848285016120d1565b91505092915050565b600080604083850312156121d557600080fd5b60006121e3858286016120d1565b92505060206121f4858286016120d1565b9150509250929050565b60008060006060848603121561221357600080fd5b6000612221868287016120d1565b9350506020612232868287016120d1565b92505060406122438682870161216f565b9150509250925092565b60008060006040848603121561226257600080fd5b6000612270868287016120d1565b935050602084013567ffffffffffffffff81111561228d57600080fd5b612299868287016120fb565b92509250509250925092565b600080600080600060a086880312156122bd57600080fd5b60006122cb888289016120d1565b955050602086013567ffffffffffffffff8111156122e857600080fd5b6122f488828901612145565b9450506040612305888289016120e6565b9350506060612316888289016120e6565b925050608061232788828901612184565b9150509295509295909350565b6000806040838503121561234757600080fd5b6000612355858286016120d1565b92505060206123668582860161216f565b9150509250929050565b60006020828403121561238257600080fd5b6000612390848285016120e6565b91505092915050565b600080604083850312156123ac57600080fd5b60006123ba858286016120e6565b92505060206123cb858286016120d1565b9150509250929050565b600080604083850312156123e857600080fd5b60006123f6858286016120e6565b92505060206124078582860161216f565b9150509250929050565b60006020828403121561242357600080fd5b60006124318482850161216f565b91505092915050565b61244381612dfb565b82525050565b61245281612de9565b82525050565b61246961246482612de9565b612eff565b82525050565b61247881612e0d565b82525050565b61248781612e19565b82525050565b61249e61249982612e19565b612f11565b82525050565b60006124af82612d11565b6124b98185612d27565b93506124c9818560208601612e69565b6124d281612fba565b840191505092915050565b60006124e882612d11565b6124f28185612d38565b9350612502818560208601612e69565b80840191505092915050565b600061251982612d1c565b6125238185612d43565b9350612533818560208601612e69565b61253c81612fba565b840191505092915050565b6000815461255481612e9c565b61255e8186612d43565b94506001821660008114612579576001811461258b576125be565b60ff19831686526020860193506125be565b61259485612cfc565b60005b838110156125b657815481890152600182019150602081019050612597565b808801955050505b50505092915050565b60006125d4602883612d43565b91506125df82612fd8565b604082019050919050565b60006125f7602f83612d43565b915061260282613027565b604082019050919050565b600061261a602583612d43565b915061262582613076565b604082019050919050565b600061263d602483612d43565b9150612648826130c5565b604082019050919050565b6000612660601c83612d43565b915061266b82613114565b602082019050919050565b6000612683602183612d43565b915061268e8261313d565b604082019050919050565b60006126a6600283612d54565b91506126b18261318c565b600282019050919050565b60006126c9602583612d43565b91506126d4826131b5565b604082019050919050565b60006126ec602383612d43565b91506126f782613204565b604082019050919050565b600061270f603083612d43565b915061271a82613253565b604082019050919050565b6000612732602583612d43565b915061273d826132a2565b604082019050919050565b6000612755602683612d43565b9150612760826132f1565b604082019050919050565b6000612778602183612d43565b915061278382613340565b604082019050919050565b600061279b602283612d43565b91506127a68261338f565b604082019050919050565b60006127be602383612d43565b91506127c9826133de565b604082019050919050565b60006127e1602283612d43565b91506127ec8261342d565b604082019050919050565b6000612804601f83612d43565b915061280f8261347c565b602082019050919050565b6000612827602f83612d43565b9150612832826134a5565b604082019050919050565b61284681612e43565b82525050565b61285581612e4d565b82525050565b600061286782846124dd565b915081905092915050565b600061287e82856124dd565b915061288a8284612458565b6014820191508190509392505050565b60006128a582612699565b91506128b1828561248d565b6020820191506128c1828461248d565b6020820191508190509392505050565b60006020820190506128e66000830184612449565b92915050565b60006060820190506129016000830186612449565b61290e602083018561243a565b818103604083015261292081846124a4565b9050949350505050565b600060208201905061293f600083018461246f565b92915050565b600060208201905061295a600083018461247e565b92915050565b6000608082019050612975600083018761247e565b612982602083018661283d565b61298f6040830185612449565b61299c606083018461247e565b95945050505050565b60006080820190506129ba600083018761247e565b6129c7602083018661284c565b6129d4604083018561247e565b6129e1606083018461247e565b95945050505050565b60006020820190508181036000830152612a0481846124a4565b905092915050565b60006020820190508181036000830152612a26818461250e565b905092915050565b60006020820190508181036000830152612a488184612547565b905092915050565b60006020820190508181036000830152612a69816125c7565b9050919050565b60006020820190508181036000830152612a89816125ea565b9050919050565b60006020820190508181036000830152612aa98161260d565b9050919050565b60006020820190508181036000830152612ac981612630565b9050919050565b60006020820190508181036000830152612ae981612653565b9050919050565b60006020820190508181036000830152612b0981612676565b9050919050565b60006020820190508181036000830152612b29816126bc565b9050919050565b60006020820190508181036000830152612b49816126df565b9050919050565b60006020820190508181036000830152612b6981612702565b9050919050565b60006020820190508181036000830152612b8981612725565b9050919050565b60006020820190508181036000830152612ba981612748565b9050919050565b60006020820190508181036000830152612bc98161276b565b9050919050565b60006020820190508181036000830152612be98161278e565b9050919050565b60006020820190508181036000830152612c09816127b1565b9050919050565b60006020820190508181036000830152612c29816127d4565b9050919050565b60006020820190508181036000830152612c49816127f7565b9050919050565b60006020820190508181036000830152612c698161281a565b9050919050565b6000602082019050612c85600083018461283d565b92915050565b6000602082019050612ca0600083018461284c565b92915050565b6000612cb0612cc1565b9050612cbc8282612ece565b919050565b6000604051905090565b600067ffffffffffffffff821115612ce657612ce5612f8b565b5b612cef82612fba565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d6a82612e43565b9150612d7583612e43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612daa57612da9612f2d565b5b828201905092915050565b6000612dc082612e43565b9150612dcb83612e43565b925082821015612dde57612ddd612f2d565b5b828203905092915050565b6000612df482612e23565b9050919050565b6000612e0682612e23565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612e87578082015181840152602081019050612e6c565b83811115612e96576000848401525b50505050565b60006002820490506001821680612eb457607f821691505b60208210811415612ec857612ec7612f5c565b5b50919050565b612ed782612fba565b810181811067ffffffffffffffff82111715612ef657612ef5612f8b565b5b80604052505050565b6000612f0a82612f1b565b9050919050565b6000819050919050565b6000612f2682612fcb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4b495353413a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f206772616e740000000000000000000000000000000000602082015250565b7f4b495353413a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4b495353413a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4b495353413a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f207265766f6b6500000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e742065786365656473206c61756e636820737570706c79206c696d60008201527f69742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6134fd81612de9565b811461350857600080fd5b50565b61351481612e19565b811461351f57600080fd5b50565b61352b81612e43565b811461353657600080fd5b50565b61354281612e4d565b811461354d57600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212201c924ad678ca8097d800b0da58b4f84808576d09751ed1fde4a2136edd8a89b464736f6c63430008040033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000b5505a6d998549090530911180f38ac5130101c6
Deployed Bytecode
0x6080604052600436106101b75760003560e01c806339509351116100ec578063a3b0b5a31161008a578063ca15c87311610064578063ca15c87314610675578063cf2c52cb146106b2578063d547741f146106db578063dd62ed3e14610704576101b7565b8063a3b0b5a3146105d0578063a457c2d7146105fb578063a9059cbb14610638576101b7565b80639010d07c116100c65780639010d07c1461050057806391d148541461053d57806395d89b411461057a578063a217fddf146105a5576101b7565b8063395093511461045d57806340c10f191461049a57806370a08231146104c3576101b7565b8063248a9ca3116101595780632f2ff15d116101335780632f2ff15d146103b5578063313ce567146103de5780633408e4701461040957806336568abe14610434576101b7565b8063248a9ca3146103125780632d0335ab1461034f5780632e1a7d4d1461038c576101b7565b80630f7e5970116101955780630f7e59701461025457806318160ddd1461027f57806320379ee5146102aa57806323b872dd146102d5576101b7565b806306fdde03146101bc578063095ea7b3146101e75780630c53c51c14610224575b600080fd5b3480156101c857600080fd5b506101d1610741565b6040516101de9190612a0c565b60405180910390f35b3480156101f357600080fd5b5061020e60048036038101906102099190612334565b61077e565b60405161021b919061292a565b60405180910390f35b61023e600480360381019061023991906122a5565b61079c565b60405161024b91906129ea565b60405180910390f35b34801561026057600080fd5b50610269610a0e565b6040516102769190612a0c565b60405180910390f35b34801561028b57600080fd5b50610294610a47565b6040516102a19190612c70565b60405180910390f35b3480156102b657600080fd5b506102bf610a51565b6040516102cc9190612945565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f791906121fe565b610a5b565b604051610309919061292a565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612370565b610b5c565b6040516103469190612945565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190612199565b610b7c565b6040516103839190612c70565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae9190612411565b610bc5565b005b3480156103c157600080fd5b506103dc60048036038101906103d79190612399565b610bd9565b005b3480156103ea57600080fd5b506103f3610c4d565b6040516104009190612c8b565b60405180910390f35b34801561041557600080fd5b5061041e610c56565b60405161042b9190612c70565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190612399565b610c63565b005b34801561046957600080fd5b50610484600480360381019061047f9190612334565b610ce6565b604051610491919061292a565b60405180910390f35b3480156104a657600080fd5b506104c160048036038101906104bc9190612334565b610d92565b005b3480156104cf57600080fd5b506104ea60048036038101906104e59190612199565b610e58565b6040516104f79190612c70565b60405180910390f35b34801561050c57600080fd5b50610527600480360381019061052291906123d5565b610ea0565b60405161053491906128d1565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190612399565b610ed2565b604051610571919061292a565b60405180910390f35b34801561058657600080fd5b5061058f610f04565b60405161059c9190612a0c565b60405180910390f35b3480156105b157600080fd5b506105ba610f41565b6040516105c79190612945565b60405180910390f35b3480156105dc57600080fd5b506105e5610f48565b6040516105f29190612945565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190612334565b610f6c565b60405161062f919061292a565b60405180910390f35b34801561064457600080fd5b5061065f600480360381019061065a9190612334565b611060565b60405161066c919061292a565b60405180910390f35b34801561068157600080fd5b5061069c60048036038101906106979190612370565b61107e565b6040516106a99190612c70565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d4919061224d565b6110a5565b005b3480156106e757600080fd5b5061070260048036038101906106fd9190612399565b61113f565b005b34801561071057600080fd5b5061072b600480360381019061072691906121c2565b6111b3565b6040516107389190612c70565b60405180910390f35b60606040518060400160405280600581526020017f4b49535341000000000000000000000000000000000000000000000000000000815250905090565b600061079261078b61131b565b848461132a565b6001905092915050565b606060006040518060600160405280600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff16815260200187815250905061081f87828787876114f5565b61085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085590612bb0565b60405180910390fd5b6108b16001600760008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115fe90919063ffffffff16565b600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610927939291906128ec565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a60405160200161095c929190612872565b604051602081830303815290604052604051610978919061285b565b6000604051808303816000865af19150503d80600081146109b5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ba565b606091505b5091509150816109ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f690612ad0565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600254905090565b6000600654905090565b6000610a68848484611614565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610ab361131b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90612a50565b60405180910390fd5b610b5085610b3f61131b565b8584610b4b9190612db5565b61132a565b60019150509392505050565b600060036000838152602001908152602001600020600201549050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610bd6610bd061131b565b82611893565b50565b610c006003600084815260200190815260200160002060020154610bfb61131b565b610ed2565b610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690612a70565b60405180910390fd5b610c498282611a67565b5050565b60006012905090565b6000804690508091505090565b610c6b61131b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf90612c50565b60405180910390fd5b610ce28282611afb565b5050565b6000610d88610cf361131b565b848460016000610d0161131b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d839190612d5f565b61132a565b6001905092915050565b6000801b610da781610da261131b565b610ed2565b600490610dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de19190612a2e565b60405180910390fd5b50600854821115610e30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2790612bf0565b60405180910390fd5b8160086000828254610e429190612db5565b92505081905550610e538383611b8f565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610eca8260036000868152602001908152602001600020600001611ce390919063ffffffff16565b905092915050565b6000610efc8260036000868152602001908152602001600020600001611cfd90919063ffffffff16565b905092915050565b60606040518060400160405280600581526020017f4b49535341000000000000000000000000000000000000000000000000000000815250905090565b6000801b81565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a981565b60008060016000610f7b61131b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f90612a90565b60405180910390fd5b61105561104361131b565b8585846110509190612db5565b61132a565b600191505092915050565b600061107461106d61131b565b8484611614565b6001905092915050565b600061109e60036000848152602001908152602001600020600001611d2d565b9050919050565b7f8f4f2da22e8ac8f11e15f9fc141cddbb5deea8800186560abb6e68c5496619a96110d7816110d261131b565b610ed2565b60049061111a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111119190612a2e565b60405180910390fd5b506000838381019061112c9190612411565b90506111388582611b8f565b5050505050565b611166600360008481526020019081526020016000206002015461116161131b565b610ed2565b6111a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119c90612b50565b60405180910390fd5b6111af8282611afb565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156112e457600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff8183015116925050506112e8565b3390505b90565b6000611313836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611d42565b905092915050565b600061132561123a565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190612ab0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561140a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140190612c10565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114e89190612c70565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611566576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155d90612b70565b60405180910390fd5b600161157961157487611db2565b611e1a565b8386866040516000815260200160405260405161159994939291906129a5565b6020604051602081039080840390855afa1580156115bb573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b6000818361160c9190612d5f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611684576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167b90612b10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116eb90612b30565b60405180910390fd5b6116ff838383611e53565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c90612b90565b60405180910390fd5b81816117919190612db5565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118219190612d5f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118859190612c70565b60405180910390a350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90612af0565b60405180910390fd5b61190f82600083611e53565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198c90612bd0565b60405180910390fd5b81816119a19190612db5565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546119f59190612db5565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a5a9190612c70565b60405180910390a3505050565b611a8f81600360008581526020019081526020016000206000016112eb90919063ffffffff16565b15611af757611a9c61131b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b611b238160036000858152602001908152602001600020600001611e5890919063ffffffff16565b15611b8b57611b3061131b565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690612c30565b60405180910390fd5b611c0b60008383611e53565b8060026000828254611c1d9190612d5f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c729190612d5f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611cd79190612c70565b60405180910390a35050565b6000611cf28360000183611e88565b60001c905092915050565b6000611d25836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611ed9565b905092915050565b6000611d3b82600001611efc565b9050919050565b6000611d4e8383611ed9565b611da7578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611dac565b600090505b92915050565b6000604051806080016040528060438152602001613551604391398051906020012082600001518360200151846040015180519060200120604051602001611dfd9493929190612960565b604051602081830303815290604052805190602001209050919050565b6000611e24610a51565b82604051602001611e3692919061289a565b604051602081830303815290604052805190602001209050919050565b505050565b6000611e80836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611f0d565b905092915050565b6000826000018281548110611ec6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b60008083600101600084815260200190815260200160002054905060008114612087576000600182611f3f9190612db5565b9050600060018660000180549050611f579190612db5565b9050818114612012576000866000018281548110611f9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110611fe8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061204c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061208d565b60009150505b92915050565b60006120a66120a184612ccb565b612ca6565b9050828152602081018484840111156120be57600080fd5b6120c9848285612e5a565b509392505050565b6000813590506120e0816134f4565b92915050565b6000813590506120f58161350b565b92915050565b60008083601f84011261210d57600080fd5b8235905067ffffffffffffffff81111561212657600080fd5b60208301915083600182028301111561213e57600080fd5b9250929050565b600082601f83011261215657600080fd5b8135612166848260208601612093565b91505092915050565b60008135905061217e81613522565b92915050565b60008135905061219381613539565b92915050565b6000602082840312156121ab57600080fd5b60006121b9848285016120d1565b91505092915050565b600080604083850312156121d557600080fd5b60006121e3858286016120d1565b92505060206121f4858286016120d1565b9150509250929050565b60008060006060848603121561221357600080fd5b6000612221868287016120d1565b9350506020612232868287016120d1565b92505060406122438682870161216f565b9150509250925092565b60008060006040848603121561226257600080fd5b6000612270868287016120d1565b935050602084013567ffffffffffffffff81111561228d57600080fd5b612299868287016120fb565b92509250509250925092565b600080600080600060a086880312156122bd57600080fd5b60006122cb888289016120d1565b955050602086013567ffffffffffffffff8111156122e857600080fd5b6122f488828901612145565b9450506040612305888289016120e6565b9350506060612316888289016120e6565b925050608061232788828901612184565b9150509295509295909350565b6000806040838503121561234757600080fd5b6000612355858286016120d1565b92505060206123668582860161216f565b9150509250929050565b60006020828403121561238257600080fd5b6000612390848285016120e6565b91505092915050565b600080604083850312156123ac57600080fd5b60006123ba858286016120e6565b92505060206123cb858286016120d1565b9150509250929050565b600080604083850312156123e857600080fd5b60006123f6858286016120e6565b92505060206124078582860161216f565b9150509250929050565b60006020828403121561242357600080fd5b60006124318482850161216f565b91505092915050565b61244381612dfb565b82525050565b61245281612de9565b82525050565b61246961246482612de9565b612eff565b82525050565b61247881612e0d565b82525050565b61248781612e19565b82525050565b61249e61249982612e19565b612f11565b82525050565b60006124af82612d11565b6124b98185612d27565b93506124c9818560208601612e69565b6124d281612fba565b840191505092915050565b60006124e882612d11565b6124f28185612d38565b9350612502818560208601612e69565b80840191505092915050565b600061251982612d1c565b6125238185612d43565b9350612533818560208601612e69565b61253c81612fba565b840191505092915050565b6000815461255481612e9c565b61255e8186612d43565b94506001821660008114612579576001811461258b576125be565b60ff19831686526020860193506125be565b61259485612cfc565b60005b838110156125b657815481890152600182019150602081019050612597565b808801955050505b50505092915050565b60006125d4602883612d43565b91506125df82612fd8565b604082019050919050565b60006125f7602f83612d43565b915061260282613027565b604082019050919050565b600061261a602583612d43565b915061262582613076565b604082019050919050565b600061263d602483612d43565b9150612648826130c5565b604082019050919050565b6000612660601c83612d43565b915061266b82613114565b602082019050919050565b6000612683602183612d43565b915061268e8261313d565b604082019050919050565b60006126a6600283612d54565b91506126b18261318c565b600282019050919050565b60006126c9602583612d43565b91506126d4826131b5565b604082019050919050565b60006126ec602383612d43565b91506126f782613204565b604082019050919050565b600061270f603083612d43565b915061271a82613253565b604082019050919050565b6000612732602583612d43565b915061273d826132a2565b604082019050919050565b6000612755602683612d43565b9150612760826132f1565b604082019050919050565b6000612778602183612d43565b915061278382613340565b604082019050919050565b600061279b602283612d43565b91506127a68261338f565b604082019050919050565b60006127be602383612d43565b91506127c9826133de565b604082019050919050565b60006127e1602283612d43565b91506127ec8261342d565b604082019050919050565b6000612804601f83612d43565b915061280f8261347c565b602082019050919050565b6000612827602f83612d43565b9150612832826134a5565b604082019050919050565b61284681612e43565b82525050565b61285581612e4d565b82525050565b600061286782846124dd565b915081905092915050565b600061287e82856124dd565b915061288a8284612458565b6014820191508190509392505050565b60006128a582612699565b91506128b1828561248d565b6020820191506128c1828461248d565b6020820191508190509392505050565b60006020820190506128e66000830184612449565b92915050565b60006060820190506129016000830186612449565b61290e602083018561243a565b818103604083015261292081846124a4565b9050949350505050565b600060208201905061293f600083018461246f565b92915050565b600060208201905061295a600083018461247e565b92915050565b6000608082019050612975600083018761247e565b612982602083018661283d565b61298f6040830185612449565b61299c606083018461247e565b95945050505050565b60006080820190506129ba600083018761247e565b6129c7602083018661284c565b6129d4604083018561247e565b6129e1606083018461247e565b95945050505050565b60006020820190508181036000830152612a0481846124a4565b905092915050565b60006020820190508181036000830152612a26818461250e565b905092915050565b60006020820190508181036000830152612a488184612547565b905092915050565b60006020820190508181036000830152612a69816125c7565b9050919050565b60006020820190508181036000830152612a89816125ea565b9050919050565b60006020820190508181036000830152612aa98161260d565b9050919050565b60006020820190508181036000830152612ac981612630565b9050919050565b60006020820190508181036000830152612ae981612653565b9050919050565b60006020820190508181036000830152612b0981612676565b9050919050565b60006020820190508181036000830152612b29816126bc565b9050919050565b60006020820190508181036000830152612b49816126df565b9050919050565b60006020820190508181036000830152612b6981612702565b9050919050565b60006020820190508181036000830152612b8981612725565b9050919050565b60006020820190508181036000830152612ba981612748565b9050919050565b60006020820190508181036000830152612bc98161276b565b9050919050565b60006020820190508181036000830152612be98161278e565b9050919050565b60006020820190508181036000830152612c09816127b1565b9050919050565b60006020820190508181036000830152612c29816127d4565b9050919050565b60006020820190508181036000830152612c49816127f7565b9050919050565b60006020820190508181036000830152612c698161281a565b9050919050565b6000602082019050612c85600083018461283d565b92915050565b6000602082019050612ca0600083018461284c565b92915050565b6000612cb0612cc1565b9050612cbc8282612ece565b919050565b6000604051905090565b600067ffffffffffffffff821115612ce657612ce5612f8b565b5b612cef82612fba565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d6a82612e43565b9150612d7583612e43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612daa57612da9612f2d565b5b828201905092915050565b6000612dc082612e43565b9150612dcb83612e43565b925082821015612dde57612ddd612f2d565b5b828203905092915050565b6000612df482612e23565b9050919050565b6000612e0682612e23565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015612e87578082015181840152602081019050612e6c565b83811115612e96576000848401525b50505050565b60006002820490506001821680612eb457607f821691505b60208210811415612ec857612ec7612f5c565b5b50919050565b612ed782612fba565b810181811067ffffffffffffffff82111715612ef657612ef5612f8b565b5b80604052505050565b6000612f0a82612f1b565b9050919050565b6000819050919050565b6000612f2682612fcb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4b495353413a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f206772616e740000000000000000000000000000000000602082015250565b7f4b495353413a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4b495353413a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4b495353413a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e60008201527f2061646d696e20746f207265766f6b6500000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f416d6f756e742065786365656473206c61756e636820737570706c79206c696d60008201527f69742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4b495353413a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6134fd81612de9565b811461350857600080fd5b50565b61351481612e19565b811461351f57600080fd5b50565b61352b81612e43565b811461353657600080fd5b50565b61354281612e4d565b811461354d57600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212201c924ad678ca8097d800b0da58b4f84808576d09751ed1fde4a2136edd8a89b464736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b5505a6d998549090530911180f38ac5130101c6
-----Decoded View---------------
Arg [0] : childChainManager (address): 0xb5505a6d998549090530911180f38aC5130101c6
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b5505a6d998549090530911180f38ac5130101c6
Deployed Bytecode Sourcemap
485:2636:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16882:100:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19049:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20599:1151:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17861:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18002:108:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18871:101:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19700:422:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13761:114:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22176:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2248:89:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14137:227:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17844:93:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18980:161:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15346:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20531:215:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2870:248:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18173:127:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13434:138:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12395:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17101:104:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11140:49:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;657:68:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21249:377:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18513:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12708:127:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1768:230:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14609::0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18751:151:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16882:100;16936:13;16969:5;;;;;;;;;;;;;;;;;16962:12;;16882:100;:::o;19049:169::-;19132:4;19149:39;19158:12;:10;:12::i;:::-;19172:7;19181:6;19149:8;:39::i;:::-;19206:4;19199:11;;19049:169;;;;:::o;20599:1151:0:-;20800:12;20825:29;20857:152;;;;;;;;20895:6;:19;20902:11;20895:19;;;;;;;;;;;;;;;;20857:152;;;;20935:11;20857:152;;;;;;20980:17;20857:152;;;20825:184;;21044:45;21051:11;21064:6;21072:4;21078;21084;21044:6;:45::i;:::-;21022:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;21239:26;21263:1;21239:6;:19;21246:11;21239:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;21217:6;:19;21224:11;21217:19;;;;;;;;;;;;;;;:48;;;;21283:126;21321:11;21355:10;21381:17;21283:126;;;;;;;;:::i;:::-;;;;;;;;21520:12;21534:23;21569:4;21561:18;;21611:17;21630:11;21594:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21561:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21519:134;;;;21672:7;21664:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;21732:10;21725:17;;;;;20599:1151;;;;;;;:::o;17861:43::-;;;;;;;;;;;;;;;;;;;:::o;18002:108:2:-;18063:7;18090:12;;18083:19;;18002:108;:::o;18871:101:0:-;18922:7;18949:15;;18942:22;;18871:101;:::o;19700:422:2:-;19806:4;19823:36;19833:6;19841:9;19852:6;19823:9;:36::i;:::-;19872:24;19899:11;:19;19911:6;19899:19;;;;;;;;;;;;;;;:33;19919:12;:10;:12::i;:::-;19899:33;;;;;;;;;;;;;;;;19872:60;;19971:6;19951:16;:26;;19943:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;20033:57;20042:6;20050:12;:10;:12::i;:::-;20083:6;20064:16;:25;;;;:::i;:::-;20033:8;:57::i;:::-;20110:4;20103:11;;;19700:422;;;;;:::o;13761:114:0:-;13818:7;13845:6;:12;13852:4;13845:12;;;;;;;;;;;:22;;;13838:29;;13761:114;;;:::o;22176:107::-;22229:13;22263:6;:12;22270:4;22263:12;;;;;;;;;;;;;;;;22255:20;;22176:107;;;:::o;2248:89:3:-;2302:27;2308:12;:10;:12::i;:::-;2322:6;2302:5;:27::i;:::-;2248:89;:::o;14137:227:0:-;14221:45;14229:6;:12;14236:4;14229:12;;;;;;;;;;;:22;;;14253:12;:10;:12::i;:::-;14221:7;:45::i;:::-;14213:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;14331:25;14342:4;14348:7;14331:10;:25::i;:::-;14137:227;;:::o;17844:93:2:-;17902:5;17927:2;17920:9;;17844:93;:::o;18980:161:0:-;19023:7;19043:10;19094:9;19088:15;;19131:2;19124:9;;;18980:161;:::o;15346:209::-;15444:12;:10;:12::i;:::-;15433:23;;:7;:23;;;15425:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;15521:26;15533:4;15539:7;15521:11;:26::i;:::-;15346:209;;:::o;20531:215:2:-;20619:4;20636:80;20645:12;:10;:12::i;:::-;20659:7;20705:10;20668:11;:25;20680:12;:10;:12::i;:::-;20668:25;;;;;;;;;;;;;;;:34;20694:7;20668:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;20636:8;:80::i;:::-;20734:4;20727:11;;20531:215;;;;:::o;2870:248:3:-;11185:4:0;2926:18:3;;17298:27:0;17306:4;17312:12;:10;:12::i;:::-;17298:7;:27::i;:::-;17340:10;17276:85;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;2975:22:3::1;;2965:6;:32;;2957:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;3074:6;3048:22;;:32;;;;;;;:::i;:::-;;;;;;;;3091:19;3097:4;3103:6;3091:5;:19::i;:::-;2870:248:::0;;;:::o;18173:127:2:-;18247:7;18274:9;:18;18284:7;18274:18;;;;;;;;;;;;;;;;18267:25;;18173:127;;;:::o;13434:138:0:-;13507:7;13534:30;13558:5;13534:6;:12;13541:4;13534:12;;;;;;;;;;;:20;;:23;;:30;;;;:::i;:::-;13527:37;;13434:138;;;;:::o;12395:139::-;12464:4;12488:38;12518:7;12488:6;:12;12495:4;12488:12;;;;;;;;;;;:20;;:29;;:38;;;;:::i;:::-;12481:45;;12395:139;;;;:::o;17101:104:2:-;17157:13;17190:7;;;;;;;;;;;;;;;;;17183:14;;17101:104;:::o;11140:49:0:-;11185:4;11140:49;;;:::o;657:68:3:-;698:27;657:68;:::o;21249:377:2:-;21342:4;21359:24;21386:11;:25;21398:12;:10;:12::i;:::-;21386:25;;;;;;;;;;;;;;;:34;21412:7;21386:34;;;;;;;;;;;;;;;;21359:61;;21459:15;21439:16;:35;;21431:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;21527:67;21536:12;:10;:12::i;:::-;21550:7;21578:15;21559:16;:34;;;;:::i;:::-;21527:8;:67::i;:::-;21614:4;21607:11;;;21249:377;;;;:::o;18513:175::-;18599:4;18616:42;18626:12;:10;:12::i;:::-;18640:9;18651:6;18616:9;:42::i;:::-;18676:4;18669:11;;18513:175;;;;:::o;12708:127:0:-;12771:7;12798:29;:6;:12;12805:4;12798:12;;;;;;;;;;;:20;;:27;:29::i;:::-;12791:36;;12708:127;;;:::o;1768:230:3:-;698:27;17298::0;17306:4;17312:12;:10;:12::i;:::-;17298:7;:27::i;:::-;17340:10;17276:85;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;1909:14:3::1;1937:11;;1926:34;;;;;;;:::i;:::-;1909:51;;1971:19;1977:4;1983:6;1971:5;:19::i;:::-;17372:1:0;1768:230:3::0;;;;:::o;14609::0:-;14694:45;14702:6;:12;14709:4;14702:12;;;;;;;;;;;:22;;;14726:12;:10;:12::i;:::-;14694:7;:45::i;:::-;14686:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;14805:26;14817:4;14823:7;14805:11;:26::i;:::-;14609:230;;:::o;18751:151:2:-;18840:7;18867:11;:18;18879:5;18867:18;;;;;;;;;;;;;;;:27;18886:7;18867:27;;;;;;;;;;;;;;;;18860:34;;18751:151;;;;:::o;22824:650:0:-;22895:22;22961:4;22939:27;;:10;:27;;;22935:508;;;22983:18;23004:8;;22983:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23027:13;23043:8;;:15;;23027:31;;23295:42;23265:5;23258;23254:17;23248:24;23222:134;23212:144;;23082:289;;;;;23420:10;23403:28;;22935:508;22824:650;:::o;6473:152::-;6543:4;6567:50;6572:3;:10;;6608:5;6592:23;;6584:32;;6567:4;:50::i;:::-;6560:57;;6473:152;;;;:::o;1237:133:3:-;1291:22;1338:24;:22;:24::i;:::-;1331:31;;1237:133;:::o;24610:346:2:-;24729:1;24712:19;;:5;:19;;;;24704:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24810:1;24791:21;;:7;:21;;;;24783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24894:6;24864:11;:18;24876:5;24864:18;;;;;;;;;;;;;;;:27;24883:7;24864:27;;;;;;;;;;;;;;;:36;;;;24932:7;24916:32;;24925:5;24916:32;;;24941:6;24916:32;;;;;;:::i;:::-;;;;;;;;24610:346;;;:::o;22291:486:0:-;22469:4;22512:1;22494:20;;:6;:20;;;;22486:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;22610:159;22638:47;22657:27;22677:6;22657:19;:27::i;:::-;22638:18;:47::i;:::-;22704:4;22727;22750;22610:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22587:182;;:6;:182;;;22567:202;;22291:486;;;;;;;:::o;3711:98:2:-;3769:7;3800:1;3796;:5;;;;:::i;:::-;3789:12;;3711:98;;;;:::o;22116:604::-;22240:1;22222:20;;:6;:20;;;;22214:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;22324:1;22303:23;;:9;:23;;;;22295:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;22379:47;22400:6;22408:9;22419:6;22379:20;:47::i;:::-;22439:21;22463:9;:17;22473:6;22463:17;;;;;;;;;;;;;;;;22439:41;;22516:6;22499:13;:23;;22491:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22612:6;22596:13;:22;;;;:::i;:::-;22576:9;:17;22586:6;22576:17;;;;;;;;;;;;;;;:42;;;;22653:6;22629:9;:20;22639:9;22629:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;22694:9;22677:35;;22686:6;22677:35;;;22705:6;22677:35;;;;;;:::i;:::-;;;;;;;;22116:604;;;;:::o;23678:494::-;23781:1;23762:21;;:7;:21;;;;23754:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23834:49;23855:7;23872:1;23876:6;23834:20;:49::i;:::-;23896:22;23921:9;:18;23931:7;23921:18;;;;;;;;;;;;;;;;23896:43;;23976:6;23958:14;:24;;23950:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;24070:6;24053:14;:23;;;;:::i;:::-;24032:9;:18;24042:7;24032:18;;;;;;;;;;;;;;;:44;;;;24103:6;24087:12;;:22;;;;;;;:::i;:::-;;;;;;;;24153:1;24127:37;;24136:7;24127:37;;;24157:6;24127:37;;;;;;:::i;:::-;;;;;;;;23678:494;;;:::o;16589:188:0:-;16663:33;16688:7;16663:6;:12;16670:4;16663:12;;;;;;;;;;;:20;;:24;;:33;;;;:::i;:::-;16659:111;;;16745:12;:10;:12::i;:::-;16718:40;;16736:7;16718:40;;16730:4;16718:40;;;;;;;;;;16659:111;16589:188;;:::o;16785:192::-;16860:36;16888:7;16860:6;:12;16867:4;16860:12;;;;;;;;;;;:20;;:27;;:36;;;;:::i;:::-;16856:114;;;16945:12;:10;:12::i;:::-;16918:40;;16936:7;16918:40;;16930:4;16918:40;;;;;;;;;;16856:114;16785:192;;:::o;23007:338:2:-;23110:1;23091:21;;:7;:21;;;;23083:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;23161:49;23190:1;23194:7;23203:6;23161:20;:49::i;:::-;23239:6;23223:12;;:22;;;;;;;:::i;:::-;;;;;;;;23278:6;23256:9;:18;23266:7;23256:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;23321:7;23300:37;;23317:1;23300:37;;;23330:6;23300:37;;;;;;:::i;:::-;;;;;;;;23007:338;;:::o;7759:158:0:-;7833:7;7884:22;7888:3;:10;;7900:5;7884:3;:22::i;:::-;7876:31;;7853:56;;7759:158;;;;:::o;7045:167::-;7125:4;7149:55;7159:3;:10;;7195:5;7179:23;;7171:32;;7149:9;:55::i;:::-;7142:62;;7045:167;;;;:::o;7298:117::-;7361:7;7388:19;7396:3;:10;;7388:7;:19::i;:::-;7381:26;;7298:117;;;:::o;1758:414::-;1821:4;1843:21;1853:3;1858:5;1843:9;:21::i;:::-;1838:327;;1881:3;:11;;1898:5;1881:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2064:3;:11;;:18;;;;2042:3;:12;;:19;2055:5;2042:19;;;;;;;;;;;:40;;;;2104:4;2097:11;;;;1838:327;2148:5;2141:12;;1758:414;;;;;:::o;21758:410::-;21868:7;19935:100;;;;;;;;;;;;;;;;;19915:127;;;;;;22022:6;:12;;;22057:6;:11;;;22101:6;:24;;;22091:35;;;;;;21941:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21913:247;;;;;;21893:267;;21758:410;;;:::o;19510:258::-;19609:7;19711:20;:18;:20::i;:::-;19733:11;19682:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19654:106;;;;;;19634:126;;19510:258;;;:::o;25559:92:2:-;;;;:::o;6801:158:0:-;6874:4;6898:53;6906:3;:10;;6942:5;6926:23;;6918:32;;6898:7;:53::i;:::-;6891:60;;6801:158;;;;:::o;4509:120::-;4576:7;4603:3;:11;;4615:5;4603:18;;;;;;;;;;;;;;;;;;;;;;;;4596:25;;4509:120;;;;:::o;3841:129::-;3914:4;3961:1;3938:3;:12;;:19;3951:5;3938:19;;;;;;;;;;;;:24;;3931:31;;3841:129;;;;:::o;4056:109::-;4112:7;4139:3;:11;;:18;;;;4132:25;;4056:109;;;:::o;2348:1407::-;2414:4;2532:18;2553:3;:12;;:19;2566:5;2553:19;;;;;;;;;;;;2532:40;;2603:1;2589:10;:15;2585:1163;;2951:21;2988:1;2975:10;:14;;;;:::i;:::-;2951:38;;3004:17;3045:1;3024:3;:11;;:18;;;;:22;;;;:::i;:::-;3004:42;;3080:13;3067:9;:26;3063:405;;3114:17;3134:3;:11;;3146:9;3134:22;;;;;;;;;;;;;;;;;;;;;;;;3114:42;;3288:9;3259:3;:11;;3271:13;3259:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;3399:10;3373:3;:12;;:23;3386:9;3373:23;;;;;;;;;;;:36;;;;3063:405;;3549:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3644:3;:12;;:19;3657:5;3644:19;;;;;;;;;;;3637:26;;;3687:4;3680:11;;;;;;;2585:1163;3731:5;3724:12;;;2348:1407;;;;;:::o;7:343:5:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:139::-;547:5;585:6;572:20;563:29;;601:33;628:5;601:33;:::i;:::-;553:87;;;;:::o;659:351::-;716:8;726:6;776:3;769:4;761:6;757:17;753:27;743:2;;794:1;791;784:12;743:2;830:6;817:20;807:30;;860:18;852:6;849:30;846:2;;;892:1;889;882:12;846:2;929:4;921:6;917:17;905:29;;983:3;975:4;967:6;963:17;953:8;949:32;946:41;943:2;;;1000:1;997;990:12;943:2;733:277;;;;;:::o;1029:271::-;1084:5;1133:3;1126:4;1118:6;1114:17;1110:27;1100:2;;1151:1;1148;1141:12;1100:2;1191:6;1178:20;1216:78;1290:3;1282:6;1275:4;1267:6;1263:17;1216:78;:::i;:::-;1207:87;;1090:210;;;;;:::o;1306:139::-;1352:5;1390:6;1377:20;1368:29;;1406:33;1433:5;1406:33;:::i;:::-;1358:87;;;;:::o;1451:135::-;1495:5;1533:6;1520:20;1511:29;;1549:31;1574:5;1549:31;:::i;:::-;1501:85;;;;:::o;1592:262::-;1651:6;1700:2;1688:9;1679:7;1675:23;1671:32;1668:2;;;1716:1;1713;1706:12;1668:2;1759:1;1784:53;1829:7;1820:6;1809:9;1805:22;1784:53;:::i;:::-;1774:63;;1730:117;1658:196;;;;:::o;1860:407::-;1928:6;1936;1985:2;1973:9;1964:7;1960:23;1956:32;1953:2;;;2001:1;1998;1991:12;1953:2;2044:1;2069:53;2114:7;2105:6;2094:9;2090:22;2069:53;:::i;:::-;2059:63;;2015:117;2171:2;2197:53;2242:7;2233:6;2222:9;2218:22;2197:53;:::i;:::-;2187:63;;2142:118;1943:324;;;;;:::o;2273:552::-;2350:6;2358;2366;2415:2;2403:9;2394:7;2390:23;2386:32;2383:2;;;2431:1;2428;2421:12;2383:2;2474:1;2499:53;2544:7;2535:6;2524:9;2520:22;2499:53;:::i;:::-;2489:63;;2445:117;2601:2;2627:53;2672:7;2663:6;2652:9;2648:22;2627:53;:::i;:::-;2617:63;;2572:118;2729:2;2755:53;2800:7;2791:6;2780:9;2776:22;2755:53;:::i;:::-;2745:63;;2700:118;2373:452;;;;;:::o;2831:538::-;2910:6;2918;2926;2975:2;2963:9;2954:7;2950:23;2946:32;2943:2;;;2991:1;2988;2981:12;2943:2;3034:1;3059:53;3104:7;3095:6;3084:9;3080:22;3059:53;:::i;:::-;3049:63;;3005:117;3189:2;3178:9;3174:18;3161:32;3220:18;3212:6;3209:30;3206:2;;;3252:1;3249;3242:12;3206:2;3288:64;3344:7;3335:6;3324:9;3320:22;3288:64;:::i;:::-;3270:82;;;;3132:230;2933:436;;;;;:::o;3375:951::-;3477:6;3485;3493;3501;3509;3558:3;3546:9;3537:7;3533:23;3529:33;3526:2;;;3575:1;3572;3565:12;3526:2;3618:1;3643:53;3688:7;3679:6;3668:9;3664:22;3643:53;:::i;:::-;3633:63;;3589:117;3773:2;3762:9;3758:18;3745:32;3804:18;3796:6;3793:30;3790:2;;;3836:1;3833;3826:12;3790:2;3864:62;3918:7;3909:6;3898:9;3894:22;3864:62;:::i;:::-;3854:72;;3716:220;3975:2;4001:53;4046:7;4037:6;4026:9;4022:22;4001:53;:::i;:::-;3991:63;;3946:118;4103:2;4129:53;4174:7;4165:6;4154:9;4150:22;4129:53;:::i;:::-;4119:63;;4074:118;4231:3;4258:51;4301:7;4292:6;4281:9;4277:22;4258:51;:::i;:::-;4248:61;;4202:117;3516:810;;;;;;;;:::o;4332:407::-;4400:6;4408;4457:2;4445:9;4436:7;4432:23;4428:32;4425:2;;;4473:1;4470;4463:12;4425:2;4516:1;4541:53;4586:7;4577:6;4566:9;4562:22;4541:53;:::i;:::-;4531:63;;4487:117;4643:2;4669:53;4714:7;4705:6;4694:9;4690:22;4669:53;:::i;:::-;4659:63;;4614:118;4415:324;;;;;:::o;4745:262::-;4804:6;4853:2;4841:9;4832:7;4828:23;4824:32;4821:2;;;4869:1;4866;4859:12;4821:2;4912:1;4937:53;4982:7;4973:6;4962:9;4958:22;4937:53;:::i;:::-;4927:63;;4883:117;4811:196;;;;:::o;5013:407::-;5081:6;5089;5138:2;5126:9;5117:7;5113:23;5109:32;5106:2;;;5154:1;5151;5144:12;5106:2;5197:1;5222:53;5267:7;5258:6;5247:9;5243:22;5222:53;:::i;:::-;5212:63;;5168:117;5324:2;5350:53;5395:7;5386:6;5375:9;5371:22;5350:53;:::i;:::-;5340:63;;5295:118;5096:324;;;;;:::o;5426:407::-;5494:6;5502;5551:2;5539:9;5530:7;5526:23;5522:32;5519:2;;;5567:1;5564;5557:12;5519:2;5610:1;5635:53;5680:7;5671:6;5660:9;5656:22;5635:53;:::i;:::-;5625:63;;5581:117;5737:2;5763:53;5808:7;5799:6;5788:9;5784:22;5763:53;:::i;:::-;5753:63;;5708:118;5509:324;;;;;:::o;5839:262::-;5898:6;5947:2;5935:9;5926:7;5922:23;5918:32;5915:2;;;5963:1;5960;5953:12;5915:2;6006:1;6031:53;6076:7;6067:6;6056:9;6052:22;6031:53;:::i;:::-;6021:63;;5977:117;5905:196;;;;:::o;6107:142::-;6210:32;6236:5;6210:32;:::i;:::-;6205:3;6198:45;6188:61;;:::o;6255:118::-;6342:24;6360:5;6342:24;:::i;:::-;6337:3;6330:37;6320:53;;:::o;6379:157::-;6484:45;6504:24;6522:5;6504:24;:::i;:::-;6484:45;:::i;:::-;6479:3;6472:58;6462:74;;:::o;6542:109::-;6623:21;6638:5;6623:21;:::i;:::-;6618:3;6611:34;6601:50;;:::o;6657:118::-;6744:24;6762:5;6744:24;:::i;:::-;6739:3;6732:37;6722:53;;:::o;6781:157::-;6886:45;6906:24;6924:5;6906:24;:::i;:::-;6886:45;:::i;:::-;6881:3;6874:58;6864:74;;:::o;6944:360::-;7030:3;7058:38;7090:5;7058:38;:::i;:::-;7112:70;7175:6;7170:3;7112:70;:::i;:::-;7105:77;;7191:52;7236:6;7231:3;7224:4;7217:5;7213:16;7191:52;:::i;:::-;7268:29;7290:6;7268:29;:::i;:::-;7263:3;7259:39;7252:46;;7034:270;;;;;:::o;7310:373::-;7414:3;7442:38;7474:5;7442:38;:::i;:::-;7496:88;7577:6;7572:3;7496:88;:::i;:::-;7489:95;;7593:52;7638:6;7633:3;7626:4;7619:5;7615:16;7593:52;:::i;:::-;7670:6;7665:3;7661:16;7654:23;;7418:265;;;;;:::o;7689:364::-;7777:3;7805:39;7838:5;7805:39;:::i;:::-;7860:71;7924:6;7919:3;7860:71;:::i;:::-;7853:78;;7940:52;7985:6;7980:3;7973:4;7966:5;7962:16;7940:52;:::i;:::-;8017:29;8039:6;8017:29;:::i;:::-;8012:3;8008:39;8001:46;;7781:272;;;;;:::o;8083:802::-;8168:3;8205:5;8199:12;8234:36;8260:9;8234:36;:::i;:::-;8286:71;8350:6;8345:3;8286:71;:::i;:::-;8279:78;;8388:1;8377:9;8373:17;8404:1;8399:135;;;;8548:1;8543:336;;;;8366:513;;8399:135;8483:4;8479:9;8468;8464:25;8459:3;8452:38;8519:4;8514:3;8510:14;8503:21;;8399:135;;8543:336;8610:38;8642:5;8610:38;:::i;:::-;8670:1;8684:154;8698:6;8695:1;8692:13;8684:154;;;8772:7;8766:14;8762:1;8757:3;8753:11;8746:35;8822:1;8813:7;8809:15;8798:26;;8720:4;8717:1;8713:12;8708:17;;8684:154;;;8867:1;8862:3;8858:11;8851:18;;8550:329;;8366:513;;8172:713;;;;;;:::o;8891:366::-;9033:3;9054:67;9118:2;9113:3;9054:67;:::i;:::-;9047:74;;9130:93;9219:3;9130:93;:::i;:::-;9248:2;9243:3;9239:12;9232:19;;9037:220;;;:::o;9263:366::-;9405:3;9426:67;9490:2;9485:3;9426:67;:::i;:::-;9419:74;;9502:93;9591:3;9502:93;:::i;:::-;9620:2;9615:3;9611:12;9604:19;;9409:220;;;:::o;9635:366::-;9777:3;9798:67;9862:2;9857:3;9798:67;:::i;:::-;9791:74;;9874:93;9963:3;9874:93;:::i;:::-;9992:2;9987:3;9983:12;9976:19;;9781:220;;;:::o;10007:366::-;10149:3;10170:67;10234:2;10229:3;10170:67;:::i;:::-;10163:74;;10246:93;10335:3;10246:93;:::i;:::-;10364:2;10359:3;10355:12;10348:19;;10153:220;;;:::o;10379:366::-;10521:3;10542:67;10606:2;10601:3;10542:67;:::i;:::-;10535:74;;10618:93;10707:3;10618:93;:::i;:::-;10736:2;10731:3;10727:12;10720:19;;10525:220;;;:::o;10751:366::-;10893:3;10914:67;10978:2;10973:3;10914:67;:::i;:::-;10907:74;;10990:93;11079:3;10990:93;:::i;:::-;11108:2;11103:3;11099:12;11092:19;;10897:220;;;:::o;11123:400::-;11283:3;11304:84;11386:1;11381:3;11304:84;:::i;:::-;11297:91;;11397:93;11486:3;11397:93;:::i;:::-;11515:1;11510:3;11506:11;11499:18;;11287:236;;;:::o;11529:366::-;11671:3;11692:67;11756:2;11751:3;11692:67;:::i;:::-;11685:74;;11768:93;11857:3;11768:93;:::i;:::-;11886:2;11881:3;11877:12;11870:19;;11675:220;;;:::o;11901:366::-;12043:3;12064:67;12128:2;12123:3;12064:67;:::i;:::-;12057:74;;12140:93;12229:3;12140:93;:::i;:::-;12258:2;12253:3;12249:12;12242:19;;12047:220;;;:::o;12273:366::-;12415:3;12436:67;12500:2;12495:3;12436:67;:::i;:::-;12429:74;;12512:93;12601:3;12512:93;:::i;:::-;12630:2;12625:3;12621:12;12614:19;;12419:220;;;:::o;12645:366::-;12787:3;12808:67;12872:2;12867:3;12808:67;:::i;:::-;12801:74;;12884:93;12973:3;12884:93;:::i;:::-;13002:2;12997:3;12993:12;12986:19;;12791:220;;;:::o;13017:366::-;13159:3;13180:67;13244:2;13239:3;13180:67;:::i;:::-;13173:74;;13256:93;13345:3;13256:93;:::i;:::-;13374:2;13369:3;13365:12;13358:19;;13163:220;;;:::o;13389:366::-;13531:3;13552:67;13616:2;13611:3;13552:67;:::i;:::-;13545:74;;13628:93;13717:3;13628:93;:::i;:::-;13746:2;13741:3;13737:12;13730:19;;13535:220;;;:::o;13761:366::-;13903:3;13924:67;13988:2;13983:3;13924:67;:::i;:::-;13917:74;;14000:93;14089:3;14000:93;:::i;:::-;14118:2;14113:3;14109:12;14102:19;;13907:220;;;:::o;14133:366::-;14275:3;14296:67;14360:2;14355:3;14296:67;:::i;:::-;14289:74;;14372:93;14461:3;14372:93;:::i;:::-;14490:2;14485:3;14481:12;14474:19;;14279:220;;;:::o;14505:366::-;14647:3;14668:67;14732:2;14727:3;14668:67;:::i;:::-;14661:74;;14744:93;14833:3;14744:93;:::i;:::-;14862:2;14857:3;14853:12;14846:19;;14651:220;;;:::o;14877:366::-;15019:3;15040:67;15104:2;15099:3;15040:67;:::i;:::-;15033:74;;15116:93;15205:3;15116:93;:::i;:::-;15234:2;15229:3;15225:12;15218:19;;15023:220;;;:::o;15249:366::-;15391:3;15412:67;15476:2;15471:3;15412:67;:::i;:::-;15405:74;;15488:93;15577:3;15488:93;:::i;:::-;15606:2;15601:3;15597:12;15590:19;;15395:220;;;:::o;15621:118::-;15708:24;15726:5;15708:24;:::i;:::-;15703:3;15696:37;15686:53;;:::o;15745:112::-;15828:22;15844:5;15828:22;:::i;:::-;15823:3;15816:35;15806:51;;:::o;15863:271::-;15993:3;16015:93;16104:3;16095:6;16015:93;:::i;:::-;16008:100;;16125:3;16118:10;;15997:137;;;;:::o;16140:412::-;16298:3;16320:93;16409:3;16400:6;16320:93;:::i;:::-;16313:100;;16423:75;16494:3;16485:6;16423:75;:::i;:::-;16523:2;16518:3;16514:12;16507:19;;16543:3;16536:10;;16302:250;;;;;:::o;16558:663::-;16799:3;16821:148;16965:3;16821:148;:::i;:::-;16814:155;;16979:75;17050:3;17041:6;16979:75;:::i;:::-;17079:2;17074:3;17070:12;17063:19;;17092:75;17163:3;17154:6;17092:75;:::i;:::-;17192:2;17187:3;17183:12;17176:19;;17212:3;17205:10;;16803:418;;;;;:::o;17227:222::-;17320:4;17358:2;17347:9;17343:18;17335:26;;17371:71;17439:1;17428:9;17424:17;17415:6;17371:71;:::i;:::-;17325:124;;;;:::o;17455:561::-;17638:4;17676:2;17665:9;17661:18;17653:26;;17689:71;17757:1;17746:9;17742:17;17733:6;17689:71;:::i;:::-;17770:88;17854:2;17843:9;17839:18;17830:6;17770:88;:::i;:::-;17905:9;17899:4;17895:20;17890:2;17879:9;17875:18;17868:48;17933:76;18004:4;17995:6;17933:76;:::i;:::-;17925:84;;17643:373;;;;;;:::o;18022:210::-;18109:4;18147:2;18136:9;18132:18;18124:26;;18160:65;18222:1;18211:9;18207:17;18198:6;18160:65;:::i;:::-;18114:118;;;;:::o;18238:222::-;18331:4;18369:2;18358:9;18354:18;18346:26;;18382:71;18450:1;18439:9;18435:17;18426:6;18382:71;:::i;:::-;18336:124;;;;:::o;18466:553::-;18643:4;18681:3;18670:9;18666:19;18658:27;;18695:71;18763:1;18752:9;18748:17;18739:6;18695:71;:::i;:::-;18776:72;18844:2;18833:9;18829:18;18820:6;18776:72;:::i;:::-;18858;18926:2;18915:9;18911:18;18902:6;18858:72;:::i;:::-;18940;19008:2;18997:9;18993:18;18984:6;18940:72;:::i;:::-;18648:371;;;;;;;:::o;19025:545::-;19198:4;19236:3;19225:9;19221:19;19213:27;;19250:71;19318:1;19307:9;19303:17;19294:6;19250:71;:::i;:::-;19331:68;19395:2;19384:9;19380:18;19371:6;19331:68;:::i;:::-;19409:72;19477:2;19466:9;19462:18;19453:6;19409:72;:::i;:::-;19491;19559:2;19548:9;19544:18;19535:6;19491:72;:::i;:::-;19203:367;;;;;;;:::o;19576:309::-;19687:4;19725:2;19714:9;19710:18;19702:26;;19774:9;19768:4;19764:20;19760:1;19749:9;19745:17;19738:47;19802:76;19873:4;19864:6;19802:76;:::i;:::-;19794:84;;19692:193;;;;:::o;19891:313::-;20004:4;20042:2;20031:9;20027:18;20019:26;;20091:9;20085:4;20081:20;20077:1;20066:9;20062:17;20055:47;20119:78;20192:4;20183:6;20119:78;:::i;:::-;20111:86;;20009:195;;;;:::o;20210:307::-;20320:4;20358:2;20347:9;20343:18;20335:26;;20407:9;20401:4;20397:20;20393:1;20382:9;20378:17;20371:47;20435:75;20505:4;20496:6;20435:75;:::i;:::-;20427:83;;20325:192;;;;:::o;20523:419::-;20689:4;20727:2;20716:9;20712:18;20704:26;;20776:9;20770:4;20766:20;20762:1;20751:9;20747:17;20740:47;20804:131;20930:4;20804:131;:::i;:::-;20796:139;;20694:248;;;:::o;20948:419::-;21114:4;21152:2;21141:9;21137:18;21129:26;;21201:9;21195:4;21191:20;21187:1;21176:9;21172:17;21165:47;21229:131;21355:4;21229:131;:::i;:::-;21221:139;;21119:248;;;:::o;21373:419::-;21539:4;21577:2;21566:9;21562:18;21554:26;;21626:9;21620:4;21616:20;21612:1;21601:9;21597:17;21590:47;21654:131;21780:4;21654:131;:::i;:::-;21646:139;;21544:248;;;:::o;21798:419::-;21964:4;22002:2;21991:9;21987:18;21979:26;;22051:9;22045:4;22041:20;22037:1;22026:9;22022:17;22015:47;22079:131;22205:4;22079:131;:::i;:::-;22071:139;;21969:248;;;:::o;22223:419::-;22389:4;22427:2;22416:9;22412:18;22404:26;;22476:9;22470:4;22466:20;22462:1;22451:9;22447:17;22440:47;22504:131;22630:4;22504:131;:::i;:::-;22496:139;;22394:248;;;:::o;22648:419::-;22814:4;22852:2;22841:9;22837:18;22829:26;;22901:9;22895:4;22891:20;22887:1;22876:9;22872:17;22865:47;22929:131;23055:4;22929:131;:::i;:::-;22921:139;;22819:248;;;:::o;23073:419::-;23239:4;23277:2;23266:9;23262:18;23254:26;;23326:9;23320:4;23316:20;23312:1;23301:9;23297:17;23290:47;23354:131;23480:4;23354:131;:::i;:::-;23346:139;;23244:248;;;:::o;23498:419::-;23664:4;23702:2;23691:9;23687:18;23679:26;;23751:9;23745:4;23741:20;23737:1;23726:9;23722:17;23715:47;23779:131;23905:4;23779:131;:::i;:::-;23771:139;;23669:248;;;:::o;23923:419::-;24089:4;24127:2;24116:9;24112:18;24104:26;;24176:9;24170:4;24166:20;24162:1;24151:9;24147:17;24140:47;24204:131;24330:4;24204:131;:::i;:::-;24196:139;;24094:248;;;:::o;24348:419::-;24514:4;24552:2;24541:9;24537:18;24529:26;;24601:9;24595:4;24591:20;24587:1;24576:9;24572:17;24565:47;24629:131;24755:4;24629:131;:::i;:::-;24621:139;;24519:248;;;:::o;24773:419::-;24939:4;24977:2;24966:9;24962:18;24954:26;;25026:9;25020:4;25016:20;25012:1;25001:9;24997:17;24990:47;25054:131;25180:4;25054:131;:::i;:::-;25046:139;;24944:248;;;:::o;25198:419::-;25364:4;25402:2;25391:9;25387:18;25379:26;;25451:9;25445:4;25441:20;25437:1;25426:9;25422:17;25415:47;25479:131;25605:4;25479:131;:::i;:::-;25471:139;;25369:248;;;:::o;25623:419::-;25789:4;25827:2;25816:9;25812:18;25804:26;;25876:9;25870:4;25866:20;25862:1;25851:9;25847:17;25840:47;25904:131;26030:4;25904:131;:::i;:::-;25896:139;;25794:248;;;:::o;26048:419::-;26214:4;26252:2;26241:9;26237:18;26229:26;;26301:9;26295:4;26291:20;26287:1;26276:9;26272:17;26265:47;26329:131;26455:4;26329:131;:::i;:::-;26321:139;;26219:248;;;:::o;26473:419::-;26639:4;26677:2;26666:9;26662:18;26654:26;;26726:9;26720:4;26716:20;26712:1;26701:9;26697:17;26690:47;26754:131;26880:4;26754:131;:::i;:::-;26746:139;;26644:248;;;:::o;26898:419::-;27064:4;27102:2;27091:9;27087:18;27079:26;;27151:9;27145:4;27141:20;27137:1;27126:9;27122:17;27115:47;27179:131;27305:4;27179:131;:::i;:::-;27171:139;;27069:248;;;:::o;27323:419::-;27489:4;27527:2;27516:9;27512:18;27504:26;;27576:9;27570:4;27566:20;27562:1;27551:9;27547:17;27540:47;27604:131;27730:4;27604:131;:::i;:::-;27596:139;;27494:248;;;:::o;27748:222::-;27841:4;27879:2;27868:9;27864:18;27856:26;;27892:71;27960:1;27949:9;27945:17;27936:6;27892:71;:::i;:::-;27846:124;;;;:::o;27976:214::-;28065:4;28103:2;28092:9;28088:18;28080:26;;28116:67;28180:1;28169:9;28165:17;28156:6;28116:67;:::i;:::-;28070:120;;;;:::o;28196:129::-;28230:6;28257:20;;:::i;:::-;28247:30;;28286:33;28314:4;28306:6;28286:33;:::i;:::-;28237:88;;;:::o;28331:75::-;28364:6;28397:2;28391:9;28381:19;;28371:35;:::o;28412:307::-;28473:4;28563:18;28555:6;28552:30;28549:2;;;28585:18;;:::i;:::-;28549:2;28623:29;28645:6;28623:29;:::i;:::-;28615:37;;28707:4;28701;28697:15;28689:23;;28478:241;;;:::o;28725:141::-;28774:4;28797:3;28789:11;;28820:3;28817:1;28810:14;28854:4;28851:1;28841:18;28833:26;;28779:87;;;:::o;28872:98::-;28923:6;28957:5;28951:12;28941:22;;28930:40;;;:::o;28976:99::-;29028:6;29062:5;29056:12;29046:22;;29035:40;;;:::o;29081:168::-;29164:11;29198:6;29193:3;29186:19;29238:4;29233:3;29229:14;29214:29;;29176:73;;;;:::o;29255:147::-;29356:11;29393:3;29378:18;;29368:34;;;;:::o;29408:169::-;29492:11;29526:6;29521:3;29514:19;29566:4;29561:3;29557:14;29542:29;;29504:73;;;;:::o;29583:148::-;29685:11;29722:3;29707:18;;29697:34;;;;:::o;29737:305::-;29777:3;29796:20;29814:1;29796:20;:::i;:::-;29791:25;;29830:20;29848:1;29830:20;:::i;:::-;29825:25;;29984:1;29916:66;29912:74;29909:1;29906:81;29903:2;;;29990:18;;:::i;:::-;29903:2;30034:1;30031;30027:9;30020:16;;29781:261;;;;:::o;30048:191::-;30088:4;30108:20;30126:1;30108:20;:::i;:::-;30103:25;;30142:20;30160:1;30142:20;:::i;:::-;30137:25;;30181:1;30178;30175:8;30172:2;;;30186:18;;:::i;:::-;30172:2;30231:1;30228;30224:9;30216:17;;30093:146;;;;:::o;30245:96::-;30282:7;30311:24;30329:5;30311:24;:::i;:::-;30300:35;;30290:51;;;:::o;30347:104::-;30392:7;30421:24;30439:5;30421:24;:::i;:::-;30410:35;;30400:51;;;:::o;30457:90::-;30491:7;30534:5;30527:13;30520:21;30509:32;;30499:48;;;:::o;30553:77::-;30590:7;30619:5;30608:16;;30598:32;;;:::o;30636:126::-;30673:7;30713:42;30706:5;30702:54;30691:65;;30681:81;;;:::o;30768:77::-;30805:7;30834:5;30823:16;;30813:32;;;:::o;30851:86::-;30886:7;30926:4;30919:5;30915:16;30904:27;;30894:43;;;:::o;30943:154::-;31027:6;31022:3;31017;31004:30;31089:1;31080:6;31075:3;31071:16;31064:27;30994:103;;;:::o;31103:307::-;31171:1;31181:113;31195:6;31192:1;31189:13;31181:113;;;31280:1;31275:3;31271:11;31265:18;31261:1;31256:3;31252:11;31245:39;31217:2;31214:1;31210:10;31205:15;;31181:113;;;31312:6;31309:1;31306:13;31303:2;;;31392:1;31383:6;31378:3;31374:16;31367:27;31303:2;31152:258;;;;:::o;31416:320::-;31460:6;31497:1;31491:4;31487:12;31477:22;;31544:1;31538:4;31534:12;31565:18;31555:2;;31621:4;31613:6;31609:17;31599:27;;31555:2;31683;31675:6;31672:14;31652:18;31649:38;31646:2;;;31702:18;;:::i;:::-;31646:2;31467:269;;;;:::o;31742:281::-;31825:27;31847:4;31825:27;:::i;:::-;31817:6;31813:40;31955:6;31943:10;31940:22;31919:18;31907:10;31904:34;31901:62;31898:2;;;31966:18;;:::i;:::-;31898:2;32006:10;32002:2;31995:22;31785:238;;;:::o;32029:100::-;32068:7;32097:26;32117:5;32097:26;:::i;:::-;32086:37;;32076:53;;;:::o;32135:79::-;32174:7;32203:5;32192:16;;32182:32;;;:::o;32220:94::-;32259:7;32288:20;32302:5;32288:20;:::i;:::-;32277:31;;32267:47;;;:::o;32320:180::-;32368:77;32365:1;32358:88;32465:4;32462:1;32455:15;32489:4;32486:1;32479:15;32506:180;32554:77;32551:1;32544:88;32651:4;32648:1;32641:15;32675:4;32672:1;32665:15;32692:180;32740:77;32737:1;32730:88;32837:4;32834:1;32827:15;32861:4;32858:1;32851:15;32878:102;32919:6;32970:2;32966:7;32961:2;32954:5;32950:14;32946:28;32936:38;;32926:54;;;:::o;32986:94::-;33019:8;33067:5;33063:2;33059:14;33038:35;;33028:52;;;:::o;33086:227::-;33226:34;33222:1;33214:6;33210:14;33203:58;33295:10;33290:2;33282:6;33278:15;33271:35;33192:121;:::o;33319:234::-;33459:34;33455:1;33447:6;33443:14;33436:58;33528:17;33523:2;33515:6;33511:15;33504:42;33425:128;:::o;33559:224::-;33699:34;33695:1;33687:6;33683:14;33676:58;33768:7;33763:2;33755:6;33751:15;33744:32;33665:118;:::o;33789:223::-;33929:34;33925:1;33917:6;33913:14;33906:58;33998:6;33993:2;33985:6;33981:15;33974:31;33895:117;:::o;34018:178::-;34158:30;34154:1;34146:6;34142:14;34135:54;34124:72;:::o;34202:220::-;34342:34;34338:1;34330:6;34326:14;34319:58;34411:3;34406:2;34398:6;34394:15;34387:28;34308:114;:::o;34428:214::-;34568:66;34564:1;34556:6;34552:14;34545:90;34534:108;:::o;34648:224::-;34788:34;34784:1;34776:6;34772:14;34765:58;34857:7;34852:2;34844:6;34840:15;34833:32;34754:118;:::o;34878:222::-;35018:34;35014:1;35006:6;35002:14;34995:58;35087:5;35082:2;35074:6;35070:15;35063:30;34984:116;:::o;35106:235::-;35246:34;35242:1;35234:6;35230:14;35223:58;35315:18;35310:2;35302:6;35298:15;35291:43;35212:129;:::o;35347:224::-;35487:34;35483:1;35475:6;35471:14;35464:58;35556:7;35551:2;35543:6;35539:15;35532:32;35453:118;:::o;35577:225::-;35717:34;35713:1;35705:6;35701:14;35694:58;35786:8;35781:2;35773:6;35769:15;35762:33;35683:119;:::o;35808:220::-;35948:34;35944:1;35936:6;35932:14;35925:58;36017:3;36012:2;36004:6;36000:15;35993:28;35914:114;:::o;36034:221::-;36174:34;36170:1;36162:6;36158:14;36151:58;36243:4;36238:2;36230:6;36226:15;36219:29;36140:115;:::o;36261:222::-;36401:34;36397:1;36389:6;36385:14;36378:58;36470:5;36465:2;36457:6;36453:15;36446:30;36367:116;:::o;36489:221::-;36629:34;36625:1;36617:6;36613:14;36606:58;36698:4;36693:2;36685:6;36681:15;36674:29;36595:115;:::o;36716:181::-;36856:33;36852:1;36844:6;36840:14;36833:57;36822:75;:::o;36903:234::-;37043:34;37039:1;37031:6;37027:14;37020:58;37112:17;37107:2;37099:6;37095:15;37088:42;37009:128;:::o;37143:122::-;37216:24;37234:5;37216:24;:::i;:::-;37209:5;37206:35;37196:2;;37255:1;37252;37245:12;37196:2;37186:79;:::o;37271:122::-;37344:24;37362:5;37344:24;:::i;:::-;37337:5;37334:35;37324:2;;37383:1;37380;37373:12;37324:2;37314:79;:::o;37399:122::-;37472:24;37490:5;37472:24;:::i;:::-;37465:5;37462:35;37452:2;;37511:1;37508;37501:12;37452:2;37442:79;:::o;37527:118::-;37598:22;37614:5;37598:22;:::i;:::-;37591:5;37588:33;37578:2;;37635:1;37632;37625:12;37578:2;37568:77;:::o
Swarm Source
ipfs://1c924ad678ca8097d800b0da58b4f84808576d09751ed1fde4a2136edd8a89b4
[ 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.