Source Code
Overview
S Balance
0 S
Token Holdings
More Info
ContractCreator
Latest 25 from a total of 33 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 17515550 | 2 days ago | IN | 0 S | 0.00043905 | ||||
Deposit | 17515379 | 2 days ago | IN | 0 S | 0.00043905 | ||||
Deposit | 17507872 | 2 days ago | IN | 0 S | 0.00036436 | ||||
Deposit | 17507635 | 2 days ago | IN | 0 S | 0.00043904 | ||||
Deposit | 17491606 | 2 days ago | IN | 0 S | 0.00031369 | ||||
Deposit | 17491490 | 2 days ago | IN | 0 S | 0.00043908 | ||||
New Bond | 17491246 | 2 days ago | IN | 0 S | 0.00055598 | ||||
New Bond | 17490829 | 2 days ago | IN | 0 S | 0.00031951 | ||||
New Bond | 17490429 | 2 days ago | IN | 0 S | 0.0003195 | ||||
New Bond | 17489527 | 2 days ago | IN | 0 S | 0.00031951 | ||||
New Bond | 17489019 | 2 days ago | IN | 0 S | 0.00031951 | ||||
New Bond | 17488335 | 2 days ago | IN | 0 S | 0.00031951 | ||||
Whitelist Token | 17481618 | 2 days ago | IN | 0 S | 0.00010666 | ||||
Deposit | 17479479 | 2 days ago | IN | 0 S | 0.00031365 | ||||
Close Bond | 17479147 | 2 days ago | IN | 0 S | 0.00032304 | ||||
Deposit | 17473168 | 2 days ago | IN | 0 S | 0.00031366 | ||||
Deposit | 17472726 | 2 days ago | IN | 0 S | 0.00045935 | ||||
Deposit | 17472295 | 2 days ago | IN | 0 S | 0.00031619 | ||||
Approve | 17471053 | 2 days ago | IN | 0 S | 0.00029017 | ||||
Redeem | 17470982 | 2 days ago | IN | 0 S | 0.00004782 | ||||
Deposit | 17470112 | 2 days ago | IN | 0 S | 0.00036434 | ||||
Redeem | 17469265 | 2 days ago | IN | 0 S | 0.00004782 | ||||
Deposit | 17465316 | 2 days ago | IN | 0 S | 0.00036434 | ||||
Deposit | 17465183 | 2 days ago | IN | 0 S | 0.00036434 | ||||
Deposit | 17465082 | 2 days ago | IN | 0 S | 0.00031619 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
17515550 | 2 days ago | 0 S | ||||
17515550 | 2 days ago | 0 S | ||||
17515550 | 2 days ago | 0 S | ||||
17515550 | 2 days ago | 0 S | ||||
17515550 | 2 days ago | 0 S | ||||
17515550 | 2 days ago | 0 S | ||||
17515550 | 2 days ago | 0 S | ||||
17515550 | 2 days ago | 0 S | ||||
17515550 | 2 days ago | 0 S | ||||
17515550 | 2 days ago | 0 S | ||||
17515379 | 2 days ago | 0 S | ||||
17515379 | 2 days ago | 0 S | ||||
17515379 | 2 days ago | 0 S | ||||
17515379 | 2 days ago | 0 S | ||||
17515379 | 2 days ago | 0 S | ||||
17515379 | 2 days ago | 0 S | ||||
17515379 | 2 days ago | 0 S | ||||
17515379 | 2 days ago | 0 S | ||||
17515379 | 2 days ago | 0 S | ||||
17515379 | 2 days ago | 0 S | ||||
17507872 | 2 days ago | 0 S | ||||
17507872 | 2 days ago | 0 S | ||||
17507872 | 2 days ago | 0 S | ||||
17507635 | 2 days ago | 0 S | ||||
17507635 | 2 days ago | 0 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
BondDepository
Compiler Version
v0.8.27+commit.40a35a09
Contract Source Code (Solidity)
/** *Submitted for verification at testnet.sonicscan.org on 2025-02-01 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.20; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); } pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC-20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } } pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC-165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @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. */ 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. This account bears the admin role (for the granted role). * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}. */ 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) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @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) external; /** * @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) external; /** * @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 `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } pragma solidity ^0.8.20; /** * @dev External interface of AccessControlEnumerable declared to support ERC-165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @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) external view returns (address); /** * @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) external view returns (uint256); } pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.20; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * 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: * * ```solidity * 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}: * * ```solidity * 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. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @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 virtual 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. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _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. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _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 revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } } // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.20; /** * @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. * * ```solidity * 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. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ 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 is the index of the value in the `values` array plus 1. // Position 0 is used to mean a value is not in the set. mapping(bytes32 value => uint256) _positions; } /** * @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._positions[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 cache the value's position to prevent multiple reads from the same storage slot uint256 position = set._positions[value]; if (position != 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 valueIndex = position - 1; uint256 lastIndex = set._values.length - 1; if (valueIndex != lastIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the lastValue to the index where the value to delete is set._values[valueIndex] = lastValue; // Update the tracked position of the lastValue (that was just moved) set._positions[lastValue] = position; } // Delete the slot where the moved value was stored set._values.pop(); // Delete the tracked position for the deleted slot delete set._positions[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._positions[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]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // 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); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; assembly ("memory-safe") { result := store } return result; } // 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)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly ("memory-safe") { result := store } return result; } // 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 in 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 Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly ("memory-safe") { result := store } return result; } } pragma solidity ^0.8.20; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 role => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @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 virtual returns (address) { return _roleMembers[role].at(index); } /** * @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 virtual returns (uint256) { return _roleMembers[role].length(); } /** * @dev Return all accounts that have `role` * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function getRoleMembers(bytes32 role) public view virtual returns (address[] memory) { return _roleMembers[role].values(); } /** * @dev Overload {AccessControl-_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override returns (bool) { bool granted = super._grantRole(role, account); if (granted) { _roleMembers[role].add(account); } return granted; } /** * @dev Overload {AccessControl-_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override returns (bool) { bool revoked = super._revokeRole(role, account); if (revoked) { _roleMembers[role].remove(account); } return revoked; } } pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ 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); } //@author 0xPhant0m based on Ohm Bond Depository and Bond Protocol pragma solidity ^0.8.27; contract BondDepository is AccessControlEnumerable, ReentrancyGuard { using SafeERC20 for IERC20; bytes32 public constant AUCTIONEER_ROLE = keccak256("AUCTIONEER_ROLE"); bytes32 public constant TOKEN_WHITELISTER_ROLE = keccak256("TOKEN_WHITELISTER_ROLE"); bytes32 public constant EMERGENCY_ADMIN_ROLE = keccak256("EMERGENCY_ADMIN_ROLE"); bool public paused; event ContractPaused(address indexed by); event ContractUnpaused(address indexed by); event newBondCreated(uint256 indexed id, address indexed payoutToken, address indexed quoteToken, uint256 initialPrice ); event BondEnded(uint256 indexed id); event addedAuctioneer(address _auctioneer, address payoutToken); event removeAuctioneer(address auctioneer); event MarketTransferred( uint256 marketId, address owner, address newAuctioneer); event BondDeposited( address indexed user, uint256 indexed marketId, uint256 depositAmount, uint256 totalOwed, uint256 bondPrice ); event QuoteTokensWithdrawn( uint256 indexed marketId, address indexed auctioneer, uint256 amount, uint256 daoFee ); event FeeUpdated (uint256 oldFee, uint256 basePoints); event TokenUnwhitelisted( address _token); event TokenWhitelisted( address _token); uint256 public marketCounter; address [] public _payoutTokens; Terms[] public terms; mapping(uint256 => Adjust) public adjustments; mapping (address => bool) _whitelistedAuctioneer; mapping (address => bool) _whitelistedToken; mapping(uint256 => address) public marketsToAuctioneers; mapping(address => uint256[]) public marketsForQuote; mapping(address => uint256[]) public marketsForPayout; mapping( address => Bond[]) public bondInfo; address public immutable mSig; uint256 public feeToDao; uint256 public constant MAX_FEE = 1000; // Info for creating new bonds struct Terms { address quoteToken; //token requested address payoutToken; //token to be redeemed uint256 amountToBond; //Amount of payout Tokens dedicated to this request uint256 totalDebt; uint256 controlVariable; // scaling variable for price uint256 minimumPrice; // vs principle value add 3 decimals of precision uint256 maxDebt; // 9 decimal debt ratio, max % total supply created as debt uint256 maxPayout; // in thousandths of a %. i.e. 500 = 0.5% uint256 quoteTokensRaised; uint256 lastDecay; //block.timestamp of last decay (i.e last deposit) uint32 bondEnds; //Unix Timestamp of when the offer ends. uint32 vestingTerm; // How long each bond should vest for in seconds } struct Bond { address tokenBonded; //token to be distributed uint256 amountOwed; //amount of tokens owed to Bonder uint256 pricePaid; //price paid in PayoutToken uint256 marketId; //Which market does this belong uint32 startTime; // block timestamp uint32 endTime; //timestamp } struct Adjust { bool add; // addition or subtraction uint rate; // increment uint target; // BCV when adjustment finished uint buffer; // minimum length (in blocks) between adjustments uint lastBlock; // block when last adjustment made } //Strictly for front-end optimization struct BondMarketInfo { address quoteToken; address payoutToken; uint256 price; uint256 maxPayout; uint256 vestingTerm; uint256 amountToBond; address auctioneer; bool isLive; uint256 totalDebt; uint256 bondEnds; } constructor(address _mSig){ if (_mSig == address (0)) revert ("Invalid address"); mSig = _mSig; _grantRole(DEFAULT_ADMIN_ROLE, mSig); _grantRole(EMERGENCY_ADMIN_ROLE, mSig); _grantRole(TOKEN_WHITELISTER_ROLE, mSig); } /*================================= Auctioneer FUNCTIONS =================================*/ function newBond( address payoutToken_, IERC20 _quoteToken, uint256 [4] memory _terms, // [amountToBond, controlVariable, minimumPrice, maxDebt] uint32 [2] memory _vestingTerms // [bondEnds, vestingTerm] ) external onlyRole(AUCTIONEER_ROLE) whenNotPaused returns (uint256 marketID) { // Address validations require(payoutToken_ != address(0), "Invalid payout token"); require(address(_quoteToken) != address(0), "Invalid quote token"); require(address(_quoteToken) != payoutToken_, "Tokens must be different"); require(_whitelistedToken[payoutToken_], "Token not whitelisted"); require(!auctioneerHasMarketForQuote(msg.sender, address(_quoteToken)), "Already has market for quote token"); // Time validations require(_vestingTerms[0] > block.timestamp, "Bond end too early"); // Parameter validations require(_terms[0] > 0, "Amount must be > 0"); require(_terms[1] > 0, "Control variable must be > 0"); require(_terms[2] > 0, "Minimum price must be > 0"); require(_terms[3] > 0, "Max debt must be > 0"); uint256 secondsToConclusion = _vestingTerms[0] - block.timestamp; require(secondsToConclusion > 0, "Invalid vesting period"); // Calculate max payout with better precision uint256 _maxPayout = (_terms[3] * 1800) / 10000; // 18% of max debt _maxPayout = (_maxPayout * 1e18) / secondsToConclusion; // Scale by time // Transfer payout tokens (use amountToBond, not controlVariable) uint8 payoutDecimals = IERC20Metadata(payoutToken_).decimals(); IERC20(payoutToken_).safeTransferFrom(msg.sender, address(this), _terms[0] * 10**payoutDecimals); // Create market terms.push(Terms({ quoteToken: address(_quoteToken), payoutToken: payoutToken_, amountToBond: _terms[0] * 10**payoutDecimals, controlVariable: _terms[1], minimumPrice: (_terms[2] * 10 ** 18) / 1000, maxDebt: _terms[3] * 10**payoutDecimals, maxPayout: _maxPayout, quoteTokensRaised: 0, lastDecay: block.timestamp, bondEnds: _vestingTerms[0], vestingTerm: _vestingTerms[1], totalDebt: 0 })); // Market tracking uint256 marketId = marketCounter; marketsForPayout[payoutToken_].push(marketId); marketsForQuote[address(_quoteToken)].push(marketId); marketsToAuctioneers[marketId] = msg.sender; ++marketCounter; emit newBondCreated(marketId, payoutToken_, address(_quoteToken), _terms[1]); return marketId; } function closeBond(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { if (marketsToAuctioneers[_id] != msg.sender) revert ("Not your Bond"); terms[_id].bondEnds = uint32(block.timestamp); uint256 amountLeft = terms[_id].amountToBond - terms[_id].totalDebt; uint8 payoutDecimals = IERC20Metadata(terms[_id].payoutToken).decimals(); IERC20(terms[_id].payoutToken).safeTransfer(msg.sender, amountLeft * 10**payoutDecimals); emit BondEnded(_id); } function withdrawQuoteTokens(uint256 _id) external onlyRole(AUCTIONEER_ROLE) whenNotPaused { require(marketsToAuctioneers[_id] == msg.sender, "Not market's auctioneer"); require(block.timestamp > terms[_id].bondEnds, "Bond not yet concluded"); address quoteToken = terms[_id].quoteToken; uint256 balance = terms[_id].quoteTokensRaised; uint8 quoteDecimals = IERC20Metadata(quoteToken).decimals(); uint256 daoFee = 0; if (feeToDao > 0) { daoFee = (balance * feeToDao) / 10000; balance -= daoFee; } IERC20(quoteToken).safeTransfer(msg.sender, balance * 10**quoteDecimals); if (daoFee > 0) { IERC20(quoteToken).safeTransfer(mSig, daoFee * 10**quoteDecimals); } emit QuoteTokensWithdrawn(_id, msg.sender, balance, daoFee); } function transferMarket(uint256 marketId, address newAuctioneer) external { require(marketsToAuctioneers[marketId] == msg.sender, "Not market owner"); require(hasRole(AUCTIONEER_ROLE, newAuctioneer), "Not auctioneer"); marketsToAuctioneers[marketId] = newAuctioneer; emit MarketTransferred(marketId, msg.sender, newAuctioneer); } /*================================= User FUNCTIONS =================================*/ function deposit(uint256 _id, uint256 amount, address user) public nonReentrant { // Early validation checks require(user != address(0), "Invalid user address"); require(_id < terms.length, "Invalid market ID"); // Retrieve the specific bond terms Terms storage term = terms[_id]; // Comprehensive bond availability checks require(block.timestamp <= term.bondEnds, "Bond has ended"); require(term.totalDebt < term.maxDebt, "Maximum bond capacity reached"); // Decimal-aware minimum deposit calculation uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); uint256 minimumDeposit = calculateMinimumDeposit(quoteDecimals); // Deposit amount validations require(amount >= minimumDeposit, "Deposit below minimum threshold"); require(amount <= term.maxPayout, "Deposit exceeds maximum allowed"); // Reentrancy protection pattern // Decay debt before any state changes _tune(_id); _decayDebt(_id); // Transfer tokens with safety checks IERC20 quoteToken = IERC20(term.quoteToken); uint256 balanceBefore = quoteToken.balanceOf(address(this)); quoteToken.safeTransferFrom(msg.sender, address(this), amount); uint256 balanceAfter = quoteToken.balanceOf(address(this)); require(balanceAfter - balanceBefore == amount, "Incorrect transfer amount"); terms[_id].quoteTokensRaised += amount; // Calculate bond price with internal function uint256 price = _marketPrice(_id); // Precise total owed calculation uint256 totalOwed = calculateTotalOwed(amount, price); address payoutToken = term.payoutToken; // Validate total owed against remaining bond capacity require(term.totalDebt + totalOwed <= term.maxDebt, "Exceeds maximum bond debt"); // Create bond record with comprehensive details bondInfo[user].push(Bond({ tokenBonded: payoutToken, amountOwed: totalOwed, pricePaid: price, marketId: _id, startTime: uint32(block.timestamp), endTime: uint32(term.vestingTerm + block.timestamp) })); // Update total debt term.totalDebt += totalOwed; emit BondDeposited(user, _id, amount, totalOwed, price); } function redeem(uint256 _id, address user) external nonReentrant returns (uint256 amountRedeemed) { uint256 length = bondInfo[user].length; uint256 totalRedeemed = 0; uint8 payoutDecimals = IERC20Metadata(terms[_id].payoutToken).decimals(); for (uint256 i = length; i > 0;) { i--; Bond storage currentBond = bondInfo[user][i]; if (currentBond.marketId == _id) { uint256 amount = calculateLinearPayout(user, i); if (amount > 0) { currentBond.amountOwed -= amount; totalRedeemed += amount; // Scale amount by token decimals for transfer IERC20(terms[_id].payoutToken).safeTransfer(user, amount * 10**payoutDecimals); if (currentBond.amountOwed == 0) { if (i != bondInfo[user].length - 1) { bondInfo[user][i] = bondInfo[user][bondInfo[user].length - 1]; } bondInfo[user].pop(); } } } } return totalRedeemed; } /*================================= ADMIN FUNCTIONS =================================*/ function grantAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { // Additional validation require(_auctioneer != address(0), "Invalid auctioneer address"); require(!hasRole(AUCTIONEER_ROLE, _auctioneer), "Already an auctioneer"); _grantRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = true; emit RoleGranted(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function revokeAuctioneerRole(address _auctioneer) external onlyRole(DEFAULT_ADMIN_ROLE) { _revokeRole(AUCTIONEER_ROLE, _auctioneer); _whitelistedAuctioneer[_auctioneer] = false; emit RoleRevoked(AUCTIONEER_ROLE, _auctioneer, msg.sender); } function whitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_token != address(0), "Invalid token address"); require(!_whitelistedToken[_token], "Token already whitelisted"); // Additional token validation try IERC20Metadata(_token).decimals() returns (uint8) { _whitelistedToken[_token] = true; _payoutTokens.push(_token); } catch { revert("Invalid ERC20 token"); } } function unwhitelistToken(address _token) external onlyRole(TOKEN_WHITELISTER_ROLE) { require(_whitelistedToken[_token], "Token not whitelisted"); _whitelistedToken[_token] = false; emit TokenUnwhitelisted(_token); } function pauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = true; emit ContractPaused(msg.sender); } function unpauseContract() external onlyRole(EMERGENCY_ADMIN_ROLE) { paused = false; emit ContractUnpaused(msg.sender); } function setFeetoDao(uint32 basePoints) external onlyRole(DEFAULT_ADMIN_ROLE) { require(basePoints <= MAX_FEE, "Fee too high"); uint256 oldFee = feeToDao; feeToDao = basePoints; emit FeeUpdated(oldFee, basePoints); } /*================================= View Functions =================================*/ function getMarketsForQuote(address quoteToken) external view returns(uint256[] memory) { return marketsForQuote[quoteToken]; } function getMarketsForPayout(address payout) external view returns(uint256[] memory) { return marketsForPayout[payout]; } function getMarketsForUser(address user) external view returns(uint256[] memory) { uint256[] memory userMarkets = new uint256[](bondInfo[user].length); for (uint256 i = 0; i < bondInfo[user].length; i++) { userMarkets[i] = bondInfo[user][i].marketId; } return userMarkets; } function isLive(uint256 id_) public view returns (bool) { return block.timestamp <= terms[id_].bondEnds && terms[id_].totalDebt < terms[id_].maxDebt; } function bondPrice(uint256 id_) public view returns(uint256) { return _trueBondPrice(id_); } function isAuctioneer(address account) external view returns (bool) { return hasRole(AUCTIONEER_ROLE, account); } function calculateLinearPayout(address user, uint256 _bondId) public view returns (uint256) { Bond memory bond = bondInfo[user][_bondId]; Terms memory term = terms[bond.marketId]; // Check if bond is active if (block.timestamp < bond.startTime) { return 0; } // Calculate total vesting duration uint256 vestingTerm = term.vestingTerm; // Calculate time elapsed since bond start uint256 timeElapsed = block.timestamp > bond.endTime ? vestingTerm : block.timestamp - bond.startTime; // Calculate tokens per second uint256 tokensPerSecond = bond.amountOwed / vestingTerm; // Calculate current claimable amount uint256 currentClaimable = tokensPerSecond * timeElapsed; // Ensure we don't claim more than the total owed if (currentClaimable > bond.amountOwed) { currentClaimable = bond.amountOwed; } return currentClaimable; } function getBondMarketInfo(uint256 marketId) public view returns (BondMarketInfo memory) { Terms storage term = terms[marketId]; return BondMarketInfo({ quoteToken: term.quoteToken, payoutToken: term.payoutToken, price: _trueBondPrice(marketId), maxPayout: term.maxPayout, vestingTerm: term.vestingTerm, amountToBond: term.amountToBond, auctioneer: marketsToAuctioneers[marketId], isLive: isLive(marketId), totalDebt: term.totalDebt, bondEnds: term.bondEnds }); } function getBondMarketInfoBatch(uint256[] calldata marketIds) external view returns (BondMarketInfo[] memory) { BondMarketInfo[] memory markets = new BondMarketInfo[](marketIds.length); for (uint256 i = 0; i < marketIds.length; i++) { markets[i] = getBondMarketInfo(marketIds[i]); } return markets; } function payoutFor(address user, uint256 _bondId) public view returns (uint256 amount) { return calculateLinearPayout(user, _bondId); } function isMature(address user, uint256 _bondId) public view returns (bool) { Bond memory bond = bondInfo[user][_bondId]; return block.timestamp >= bond.endTime; } /*================================= Internal Functions =================================*/ function _decayDebt(uint256 _id) internal { Terms storage term = terms[_id]; uint256 currentDebt = term.totalDebt; if (currentDebt == 0) return; uint256 timeSinceLastDecay = block.timestamp - term.lastDecay; if (timeSinceLastDecay == 0) return; uint256 decay = (currentDebt * timeSinceLastDecay) / (term.vestingTerm * 100); term.totalDebt = decay > currentDebt ? 0 : currentDebt - decay; term.lastDecay = uint32(block.timestamp); } function _tune(uint256 _id) internal{ if (block.timestamp > adjustments[_id].lastBlock + adjustments[_id].buffer) { Terms storage term = terms[_id]; if (adjustments[_id].add) { term.controlVariable += adjustments[_id].rate; if (term.controlVariable >= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } else { term.controlVariable -= adjustments[_id].rate; if (term.controlVariable <= adjustments[_id].target) { term.controlVariable = adjustments[_id].target; } } adjustments[_id].lastBlock = uint32(block.timestamp); } } function _marketPrice(uint256 _id) internal view returns (uint256 price) { Terms memory term = terms[_id]; // Get decimals for both tokens for precise calculations uint8 payoutDecimals = IERC20Metadata(address(term.payoutToken)).decimals(); uint8 quoteDecimals = IERC20Metadata(address(term.quoteToken)).decimals(); // Get current control variable and debt ratio uint256 currentCV = _currentControlVariable(_id); uint256 debtRatio = _debtRatio(_id); // Scale up before division to maintain precision // Use a higher precision factor (1e36) to prevent overflow while maintaining precision uint256 scaledPrice = (currentCV * debtRatio) * (10 ** (36 - payoutDecimals - quoteDecimals)); // Perform division last to minimize precision loss // Divide by 1e18 twice because debtRatio is scaled by 1e18 and we want final precision of 1e18 price = scaledPrice / 1e18 / 1e18; // Apply minimum price check after all calculations if (price < term.minimumPrice) { price = term.minimumPrice; } // Add safety check for maximum price to prevent unreasonable values // This value should be adjusted based on your specific needs require(price <= type(uint256).max / 1e18, "Price overflow"); } function _trueBondPrice(uint256 _id) internal view returns(uint256 price){ price = _marketPrice(_id); } function _debtRatio(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; // Get decimals for precise calculation uint8 quoteDecimals = uint8(IERC20Metadata(address(term.quoteToken)).decimals()); uint8 payoutDecimals = uint8(IERC20Metadata(address(term.payoutToken)).decimals()); // Normalize totalDebt to 18 decimals (totalDebt is in payoutToken) uint256 totalDebt = term.totalDebt * (10**(18 - payoutDecimals)); // Normalize quote tokens raised to 18 decimals uint256 quoteBalance = term.quoteTokensRaised * (10 ** (18 - quoteDecimals)); // Prevent division by zero if (quoteBalance == 0) { return 1e18; } // Calculate debt ratio with high precision // Result is scaled to 1e18 uint256 debtRatio = (totalDebt * 1e18) / quoteBalance; return debtRatio; } function _currentControlVariable(uint256 _id) internal view returns (uint256) { Terms memory term = terms[_id]; Adjust memory adjustment = adjustments[_id]; // Base control variable uint256 baseCV = term.controlVariable; // Market-adaptive decay calculation uint256 currentDebtRatio = _debtRatio(_id); uint256 timeSinceBondStart = block.timestamp > term.bondEnds ? block.timestamp - term.bondEnds : 0; // Adaptive decay rate based on debt ratio // Higher debt ratio accelerates decay uint256 adaptiveDecayRate = (currentDebtRatio * 1e18) / term.maxDebt; // Calculate decay amount uint256 decayAmount = (baseCV * adaptiveDecayRate) / (timeSinceBondStart + 1); // Apply ongoing adjustment if within adjustment window if (block.timestamp <= adjustment.lastBlock + adjustment.buffer) { if (adjustment.add) { // Increasing control variable baseCV += adjustment.rate; // Cap at target if exceeded if (baseCV > adjustment.target) { baseCV = adjustment.target; } } else { // Decreasing control variable baseCV -= adjustment.rate; // Floor at target if fallen below if (baseCV < adjustment.target) { baseCV = adjustment.target; } } } // Apply decay if (baseCV > decayAmount) { return baseCV - decayAmount; } return 0; } // Helper function for minimum deposit calculation function calculateMinimumDeposit(uint8 decimals) internal pure returns (uint256) { // Ensures meaningful deposit across different token decimal configurations if (decimals > 2) { return 10 ** (decimals - 2); // 1% of smallest token unit } return 1; // Fallback for tokens with very few decimals } // Helper function for precise owed calculation function calculateTotalOwed(uint256 amount, uint256 price) internal pure returns (uint256) { return amount * price; } function auctioneerHasMarketForQuote(address auctioneer, address quoteToken) public view returns (bool) { uint256[] memory markets = marketsForQuote[quoteToken]; for(uint256 i = 0; i < markets.length; i++) { if(marketsToAuctioneers[markets[i]] == auctioneer && isLive(markets[i])) { return true; } } return false; } modifier whenNotPaused() { require(!paused, "Contract is paused"); _; } }
[{"inputs":[{"internalType":"address","name":"_mSig","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalOwed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bondPrice","type":"uint256"}],"name":"BondDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"BondEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"ContractUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"basePoints","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"MarketTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"auctioneer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daoFee","type":"uint256"}],"name":"QuoteTokensWithdrawn","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":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenUnwhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"TokenWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_auctioneer","type":"address"},{"indexed":false,"internalType":"address","name":"payoutToken","type":"address"}],"name":"addedAuctioneer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"payoutToken","type":"address"},{"indexed":true,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialPrice","type":"uint256"}],"name":"newBondCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"auctioneer","type":"address"}],"name":"removeAuctioneer","type":"event"},{"inputs":[],"name":"AUCTIONEER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_WHITELISTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_payoutTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adjustments","outputs":[{"internalType":"bool","name":"add","type":"bool"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"buffer","type":"uint256"},{"internalType":"uint256","name":"lastBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"address","name":"quoteToken","type":"address"}],"name":"auctioneerHasMarketForQuote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bondInfo","outputs":[{"internalType":"address","name":"tokenBonded","type":"address"},{"internalType":"uint256","name":"amountOwed","type":"uint256"},{"internalType":"uint256","name":"pricePaid","type":"uint256"},{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"uint32","name":"startTime","type":"uint32"},{"internalType":"uint32","name":"endTime","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"bondPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"calculateLinearPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"closeBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeToDao","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"}],"name":"getBondMarketInfo","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"marketIds","type":"uint256[]"}],"name":"getBondMarketInfoBatch","outputs":[{"components":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"vestingTerm","type":"uint256"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"address","name":"auctioneer","type":"address"},{"internalType":"bool","name":"isLive","type":"bool"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"bondEnds","type":"uint256"}],"internalType":"struct BondDepository.BondMarketInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payout","type":"address"}],"name":"getMarketsForPayout","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"quoteToken","type":"address"}],"name":"getMarketsForQuote","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getMarketsForUser","outputs":[{"internalType":"uint256[]","name":"","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"}],"name":"getRoleMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"grantAuctioneerRole","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"isAuctioneer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"name":"isLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"isMature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mSig","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForPayout","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsToAuctioneers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"payoutToken_","type":"address"},{"internalType":"contract IERC20","name":"_quoteToken","type":"address"},{"internalType":"uint256[4]","name":"_terms","type":"uint256[4]"},{"internalType":"uint32[2]","name":"_vestingTerms","type":"uint32[2]"}],"name":"newBond","outputs":[{"internalType":"uint256","name":"marketID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"_bondId","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amountRedeemed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_auctioneer","type":"address"}],"name":"revokeAuctioneerRole","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":[{"internalType":"uint32","name":"basePoints","type":"uint32"}],"name":"setFeetoDao","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"terms","outputs":[{"internalType":"address","name":"quoteToken","type":"address"},{"internalType":"address","name":"payoutToken","type":"address"},{"internalType":"uint256","name":"amountToBond","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"minimumPrice","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"quoteTokensRaised","type":"uint256"},{"internalType":"uint256","name":"lastDecay","type":"uint256"},{"internalType":"uint32","name":"bondEnds","type":"uint32"},{"internalType":"uint32","name":"vestingTerm","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketId","type":"uint256"},{"internalType":"address","name":"newAuctioneer","type":"address"}],"name":"transferMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"unwhitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"whitelistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"withdrawQuoteTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561000f575f5ffd5b5060405161475938038061475983398101604081905261002e91610237565b60016002556001600160a01b03811661007f5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b6001600160a01b0381166080819052610099905f90610106565b506100cc7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6360805161010660201b60201c565b506100ff7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e60805161010660201b60201c565b505061025d565b5f80610112848461013c565b90508015610133575f84815260016020526040902061013190846101e3565b505b90505b92915050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff166101dc575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101943390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610136565b505f610136565b5f610133836001600160a01b0384165f8181526001830160205260408120546101dc57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610136565b5f60208284031215610247575f5ffd5b81516001600160a01b0381168114610133575f5ffd5b6080516144dd61027c5f395f81816107e001526120ae01526144dd5ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c806391de4d071161017b578063c5f0d05c116100e4578063d547741f1161009e578063ddb2924711610079578063ddb29247146107a0578063ea5e0c60146107b3578063ed421a9c146107db578063f9a6466414610802575f5ffd5b8063d547741f14610771578063d627d25e14610784578063d918a16e14610797575f5ffd5b8063c5f0d05c146106fe578063c8558f1b14610711578063ca15c87314610724578063cfe9232b14610737578063d04cffeb1461074b578063d1af1fbc1461075e575f5ffd5b8063b33712c511610135578063b33712c5146105dd578063bc063e1a146105e5578063bc3b2b12146105ee578063be32ee2614610658578063c0680e201461066b578063c0aa0e8a1461067e575f5ffd5b806391de4d071461056a5780639b299d9a1461057d5780639cd85b5b14610590578063a217fddf146105a3578063a3246ad3146105aa578063b2f5de94146105ca575f5ffd5b806336568abe116102375780637b30564e116101f15780638dbdbe6d116101cc5780638dbdbe6d146104f25780639010d07c14610505578063909b2bb81461053057806391d1485414610557575f5ffd5b80637b30564e146104795780637bde82f21461048c5780638ad59c701461049f575f5ffd5b806336568abe14610404578063439766ce146104175780635c975abb1461041f5780636247f6f21461042c5780636e76fc8f1461043f578063725dafe014610466575f5ffd5b8063172c44ec11610288578063172c44ec1461038d5780631b014e85146103a057806324760807146103b3578063248a9ca3146103bc57806327507458146103de5780632f2ff15d146103f1575f5ffd5b806301ffc9a7146102cf57806306b40ea3146102f75780630868335e146103185780630fb81eb4146103385780631227b4021461034d578063154347b51461036d575b5f5ffd5b6102e26102dd366004613db4565b610815565b60405190151581526020015b60405180910390f35b61030a610305366004613def565b61083f565b6040519081526020016102ee565b61032b610326366004613e19565b61086a565b6040516102ee9190613f20565b61034b610346366004613f6e565b61091a565b005b61036061035b366004613f6e565b610b51565b6040516102ee9190613f85565b61038061037b366004613f94565b610c38565b6040516102ee9190613faf565b61030a61039b366004613f6e565b610ca1565b6103806103ae366004613f94565b610cab565b61030a60045481565b61030a6103ca366004613f6e565b5f9081526020819052604090206001015490565b6102e26103ec366004613f6e565b610d12565b61034b6103ff366004613fe6565b610d96565b61034b610412366004613fe6565b610dc0565b61034b610df8565b6003546102e29060ff1681565b61034b61043a366004613f94565b610e5c565b61030a7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6381565b61034b610474366004613fe6565b611042565b6102e2610487366004613def565b611161565b61030a61049a366004613fe6565b611205565b6104b26104ad366004613def565b611542565b604080516001600160a01b039097168752602087019590955293850192909252606084015263ffffffff90811660808401521660a082015260c0016102ee565b61034b610500366004614014565b6115a7565b61051861051336600461404a565b611bd3565b6040516001600160a01b0390911681526020016102ee565b61030a7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e81565b6102e2610565366004613fe6565b611bf1565b6102e261057836600461406a565b611c19565b61034b61058b366004613f94565b611d15565b6102e261059e366004613f94565b611e47565b61030a5f81565b6105bd6105b8366004613f6e565b611e5f565b6040516102ee9190614096565b61034b6105d8366004613f6e565b611e78565b61034b612127565b61030a6103e881565b61062e6105fc366004613f6e565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102ee565b61034b610666366004613f94565b612188565b61030a610679366004613def565b612205565b61069161068c366004613f6e565b61221e565b604080516001600160a01b039d8e1681529c909b1660208d0152998b019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015263ffffffff90811661014084015216610160820152610180016102ee565b61034b61070c3660046140ee565b6122a4565b61030a61071f366004613def565b612345565b61030a610732366004613f6e565b61253a565b61030a5f5160206144885f395f51905f5281565b610380610759366004613f94565b612550565b61051861076c366004613f6e565b612636565b61034b61077f366004613fe6565b61265e565b61034b610792366004613f94565b612682565b61030a600e5481565b61030a6107ae3660046141a3565b61275b565b6105186107c1366004613f6e565b600a6020525f90815260409020546001600160a01b031681565b6105187f000000000000000000000000000000000000000000000000000000000000000081565b61030a610810366004613def565b612f46565b5f6001600160e01b03198216635a05180f60e01b1480610839575061083982612f51565b92915050565b600c602052815f5260405f208181548110610858575f80fd5b905f5260205f20015f91509150505481565b60605f8267ffffffffffffffff81111561088657610886614107565b6040519080825280602002602001820160405280156108bf57816020015b6108ac613d4e565b8152602001906001900390816108a45790505b5090505f5b83811015610912576108ed8585838181106108e1576108e1614236565b90506020020135610b51565b8282815181106108ff576108ff614236565b60209081029190910101526001016108c4565b509392505050565b5f5160206144885f395f51905f5261093181612f85565b60035460ff161561095d5760405162461bcd60e51b81526004016109549061424a565b60405180910390fd5b5f828152600a60205260409020546001600160a01b031633146109b25760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b6044820152606401610954565b42600683815481106109c6576109c6614236565b905f5260205f2090600b0201600a015f6101000a81548163ffffffff021916908363ffffffff1602179055505f60068381548110610a0657610a06614236565b905f5260205f2090600b02016003015460068481548110610a2957610a29614236565b905f5260205f2090600b020160020154610a43919061428a565b90505f60068481548110610a5957610a59614236565b5f9182526020918290206001600b9092020101546040805163313ce56760e01b815290516001600160a01b039092169263313ce567926004808401938290030181865afa158015610aac573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad0919061429d565b9050610b2133610ae183600a6143a0565b610aeb90856143ae565b60068781548110610afe57610afe614236565b5f91825260209091206001600b9092020101546001600160a01b03169190612f92565b60405184907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a250505050565b610b59613d4e565b5f60068381548110610b6d57610b6d614236565b5f9182526020918290206040805161014081018252600b90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610bb585612ff1565b81526007830154602080830191909152600a80850154600160201b900463ffffffff16604080850191909152600286015460608501525f8881529190925220546001600160a01b0316608082015260a001610c0f85610d12565b1515815260038301546020820152600a9092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610c9557602002820191905f5260205f20905b815481526020019060010190808311610c81575b50505050509050919050565b5f61083982612ff1565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610c9557602002820191905f5260205f2090815481526020019060010190808311610c815750505050509050919050565b5f60068281548110610d2657610d26614236565b5f9182526020909120600a600b90920201015463ffffffff164211801590610839575060068281548110610d5c57610d5c614236565b905f5260205f2090600b02016006015460068381548110610d7f57610d7f614236565b905f5260205f2090600b0201600301541092915050565b5f82815260208190526040902060010154610db081612f85565b610dba8383612ffb565b50505050565b6001600160a01b0381163314610de95760405163334bd91960e11b815260040160405180910390fd5b610df38282613026565b505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63610e2281612f85565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e610e8681612f85565b6001600160a01b038216610ed45760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606401610954565b6001600160a01b0382165f9081526009602052604090205460ff1615610f3c5760405162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c72656164792077686974656c6973746564000000000000006044820152606401610954565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f96575060408051601f3d908101601f19168201909252610f939181019061429d565b60015b610fd85760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b6044820152606401610954565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b0316331461109a5760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b6044820152606401610954565b6110b15f5160206144885f395f51905f5282611bf1565b6110ee5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b6044820152606401610954565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061118d5761118d614236565b5f9182526020918290206040805160c081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015463ffffffff8082166080840152600160201b9091041660a090910181905242101591505092915050565b5f61120e613051565b6001600160a01b0382165f908152600d6020526040812054600680549192918291908790811061124057611240614236565b5f9182526020918290206001600b9092020101546040805163313ce56760e01b815290516001600160a01b039092169263313ce567926004808401938290030181865afa158015611293573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b7919061429d565b9050825b801561153257806112cb816143c5565b6001600160a01b0388165f908152600d60205260408120805492945090925090839081106112fb576112fb614236565b905f5260205f20906005020190508781600301540361152c575f61131f8884612345565b9050801561152a5780826001015f82825461133a919061428a565b9091555061134a905081866143da565b94506113788861135b86600a6143a0565b61136590846143ae565b60068c81548110610afe57610afe614236565b81600101545f0361152a576001600160a01b0388165f908152600d60205260409020546113a79060019061428a565b83146114b8576001600160a01b0388165f908152600d6020526040902080546113d29060019061428a565b815481106113e2576113e2614236565b905f5260205f209060050201600d5f8a6001600160a01b03166001600160a01b031681526020019081526020015f20848154811061142257611422614236565b5f9182526020909120825460059092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0388165f908152600d602052604090208054806114de576114de6143ed565b5f8281526020812060055f199093019283020180546001600160a01b031916815560018101829055600281018290556003810191909155600401805467ffffffffffffffff1916905590555b505b506112bb565b5090925050506108396001600255565b600d602052815f5260405f20818154811061155b575f80fd5b5f918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919063ffffffff80821691600160201b90041686565b6115af613051565b6001600160a01b0381166115fc5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b6044820152606401610954565b60065483106116415760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b6044820152606401610954565b5f6006848154811061165557611655614236565b5f9182526020909120600b90910201600a81015490915063ffffffff164211156116b25760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b6044820152606401610954565b80600601548160030154106117095760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e6420636170616369747920726561636865640000006044820152606401610954565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa15801561174f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611773919061429d565b90505f61177f826130a8565b9050808510156117d15760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c64006044820152606401610954565b82600701548511156118255760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f776564006044820152606401610954565b61182e866130d3565b61183786613215565b82546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa158015611880573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118a49190614401565b90506118bb6001600160a01b03831633308a6132d6565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa1580156118ff573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119239190614401565b905087611930838361428a565b1461197d5760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374207472616e7366657220616d6f756e74000000000000006044820152606401610954565b8760068a8154811061199157611991614236565b905f5260205f2090600b02016008015f8282546119ae91906143da565b909155505f90506119be8a61330f565b90505f6119cb8a83613573565b600189015460068a015460038b01549293506001600160a01b03909116916119f49084906143da565b1115611a425760405162461bcd60e51b815260206004820152601960248201527f45786365656473206d6178696d756d20626f6e642064656274000000000000006044820152606401610954565b600d5f8b6001600160a01b03166001600160a01b031681526020019081526020015f206040518060c00160405280836001600160a01b031681526020018481526020018581526020018e81526020014263ffffffff168152602001428c600a0160049054906101000a900463ffffffff1663ffffffff16611ac391906143da565b63ffffffff9081169091528254600181810185555f9485526020808620855160059094020180546001600160a01b039094166001600160a01b03199094169390931783558401519082015560408301516002820155606083015160038083019190915560808401516004909201805460a0909501518416600160201b0267ffffffffffffffff1990951692909316919091179290921790558a018054849290611b6d9084906143da565b9091555050604080518c8152602081018490529081018490528c906001600160a01b038c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f29060600160405180910390a3505050505050505050610df36001600255565b5f828152600160205260408120611bea908361357e565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611c7357602002820191905f5260205f20905b815481526020019060010190808311611c5f575b509394505f93505050505b8151811015611d0b57846001600160a01b0316600a5f848481518110611ca657611ca6614236565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611cf35750611cf3828281518110611ce657611ce6614236565b6020026020010151610d12565b15611d0357600192505050610839565b600101611c7e565b505f949350505050565b5f611d1f81612f85565b6001600160a01b038216611d755760405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642061756374696f6e65657220616464726573730000000000006044820152606401610954565b611d8c5f5160206144885f395f51905f5283611bf1565b15611dd15760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b6044820152606401610954565b611de85f5160206144885f395f51905f5283612ffb565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f5160206144885f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f6108395f5160206144885f395f51905f5283611bf1565b5f81815260016020526040902060609061083990613589565b5f5160206144885f395f51905f52611e8f81612f85565b60035460ff1615611eb25760405162461bcd60e51b81526004016109549061424a565b5f828152600a60205260409020546001600160a01b03163314611f175760405162461bcd60e51b815260206004820152601760248201527f4e6f74206d61726b657427732061756374696f6e6565720000000000000000006044820152606401610954565b60068281548110611f2a57611f2a614236565b5f9182526020909120600a600b90920201015463ffffffff164211611f8a5760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b6044820152606401610954565b5f60068381548110611f9e57611f9e614236565b5f91825260208220600b9091020154600680546001600160a01b0390921693509085908110611fcf57611fcf614236565b905f5260205f2090600b02016008015490505f826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561201e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612042919061429d565b600e549091505f901561207957612710600e548461206091906143ae565b61206a9190614418565b9050612076818461428a565b92505b6120a33361208884600a6143a0565b61209290866143ae565b6001600160a01b0387169190612f92565b80156120e2576120e27f00000000000000000000000000000000000000000000000000000000000000006120d884600a6143a0565b61209290846143ae565b6040805184815260208101839052339188917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a3505050505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6361215181612f85565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f61219281612f85565b6121a95f5160206144885f395f51905f5283613026565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f5160206144885f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f208181548110610858575f80fd5b6006818154811061222d575f80fd5b5f9182526020909120600b9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a01546001600160a01b03998a169b5097909816989597949693959294919390929063ffffffff80821691600160201b9004168c565b5f6122ae81612f85565b6103e88263ffffffff1611156122f55760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b6044820152606401610954565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061237157612371614236565b5f91825260208083206040805160c081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083015260038101546060830181905260049091015463ffffffff8082166080850152600160201b9091041660a0830152600680549294509181106123f1576123f1614236565b5f9182526020918290206040805161018081018252600b90930290910180546001600160a01b03908116845260018201541693830193909352600283015490820152600382015460608201526004820154608080830191909152600583015460a0830152600683015460c0830152600783015460e083015260088301546101008301526009830154610120830152600a9092015463ffffffff808216610140840152600160201b909104811661016083015291840151909250164210156124bc575f92505050610839565b5f81610160015163ffffffff1690505f8360a0015163ffffffff1642116124f75760808401516124f29063ffffffff164261428a565b6124f9565b815b90505f82856020015161250c9190614418565b90505f61251983836143ae565b9050856020015181111561252e575060208501515b98975050505050505050565b5f81815260016020526040812061083990613595565b6001600160a01b0381165f908152600d60205260408120546060919067ffffffffffffffff81111561258457612584614107565b6040519080825280602002602001820160405280156125ad578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d602052604090205481101561262f576001600160a01b0384165f908152600d602052604090208054829081106125fa576125fa614236565b905f5260205f2090600502016003015482828151811061261c5761261c614236565b60209081029190910101526001016125b2565b5092915050565b60058181548110612645575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f8281526020819052604090206001015461267881612f85565b610dba8383613026565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e6126ac81612f85565b6001600160a01b0382165f9081526009602052604090205460ff1661270b5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610954565b6001600160a01b0382165f81815260096020908152604091829020805460ff1916905590519182527f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a0619101611155565b5f5f5160206144885f395f51905f5261277381612f85565b60035460ff16156127965760405162461bcd60e51b81526004016109549061424a565b6001600160a01b0386166127e35760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b6044820152606401610954565b6001600160a01b03851661282f5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b6044820152606401610954565b856001600160a01b0316856001600160a01b0316036128905760405162461bcd60e51b815260206004820152601860248201527f546f6b656e73206d75737420626520646966666572656e7400000000000000006044820152606401610954565b6001600160a01b0386165f9081526009602052604090205460ff166128ef5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610954565b6128f93386611c19565b156129515760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b6064820152608401610954565b82514263ffffffff9091161161299e5760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b6044820152606401610954565b83516129e15760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b6044820152606401610954565b6020840151612a325760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e2030000000006044820152606401610954565b6040840151612a835760405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d207072696365206d757374206265203e2030000000000000006044820152606401610954565b6060840151612acb5760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b6044820152606401610954565b82515f90612ae090429063ffffffff1661428a565b90505f8111612b2a5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b6044820152606401610954565b5f6127108660036020020151612b42906107086143ae565b612b4c9190614418565b905081612b6182670de0b6b3a76400006143ae565b612b6b9190614418565b90505f886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612baa573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bce919061429d565b9050612bfe3330612be084600a6143a0565b8a51612bec91906143ae565b6001600160a01b038d169291906132d6565b60408051610180810182526001600160a01b03808b1682528b1660208201526006918101612c2d84600a6143a0565b8a51612c3991906143ae565b81525f6020808301919091528a015160408201526060016103e88a60026020020151612c6d90670de0b6b3a76400006143ae565b612c779190614418565b8152602001612c8784600a6143a0565b60608b0151612c9691906143ae565b81526020018481526020015f8152602001428152602001885f60028110612cbf57612cbf614236565b602002015163ffffffff16815260200188600160028110612ce257612ce2614236565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600b02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015f6101000a81548163ffffffff021916908363ffffffff16021790555061016082015181600a0160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8b6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612ee690614437565b909155506001600160a01b03808a16908b16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978b60016020020151604051612f3191815260200190565b60405180910390a49998505050505050505050565b5f611bea8383612345565b5f6001600160e01b03198216637965db0b60e01b148061083957506301ffc9a760e01b6001600160e01b0319831614610839565b612f8f813361359e565b50565b6040516001600160a01b03838116602483015260448201839052610df391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506135d7565b5f6108398261330f565b5f5f6130078484613643565b90508015611bea575f84815260016020526040902061091290846136d2565b5f5f61303284846136e6565b90508015611bea575f848152600160205260409020610912908461374f565b60028054036130a25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610954565b60028055565b5f60028260ff1611156130cb576130c060028361444f565b61083990600a6143a0565b506001919050565b5f81815260076020526040902060038101546004909101546130f591906143da565b421115612f8f575f6006828154811061311057613110614236565b5f91825260208083208584526007909152604090922054600b909102909101915060ff161561319b575f828152600760205260408120600101546004830180549192909161315f9084906143da565b90915550505f82815260076020526040902060020154600482015410613196575f8281526007602052604090206002015460048201555b6131f8565b5f82815260076020526040812060010154600483018054919290916131c190849061428a565b90915550505f828152600760205260409020600201546004820154116131f8575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061322957613229614236565b905f5260205f2090600b020190505f81600301549050805f0361324b57505050565b5f82600901544261325c919061428a565b9050805f0361326b5750505050565b600a8301545f9061328a90600160201b900463ffffffff166064614468565b63ffffffff1661329a83856143ae565b6132a49190614418565b90508281116132bc576132b7818461428a565b6132be565b5f5b600385015550505063ffffffff421660099091015550565b6040516001600160a01b038481166024830152838116604483015260648201839052610dba9186918216906323b872dd90608401612fbf565b5f5f6006838154811061332457613324614236565b5f91825260208083206040805161018081018252600b90940290910180546001600160a01b039081168552600182015416848401819052600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e087015260088301546101008701526009830154610120870152600a9092015463ffffffff808216610140880152600160201b90910416610160860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613406573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061342a919061429d565b90505f825f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561346c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613490919061429d565b90505f61349c86613763565b90505f6134a88761399a565b90505f836134b786602461444f565b6134c1919061444f565b6134cc90600a6143a0565b6134d683856143ae565b6134e091906143ae565b9050670de0b6b3a76400006134f58183614418565b6134ff9190614418565b96508560a00151871015613515578560a0015196505b613528670de0b6b3a76400005f19614418565b8711156135685760405162461bcd60e51b815260206004820152600e60248201526d5072696365206f766572666c6f7760901b6044820152606401610954565b505050505050919050565b5f611bea82846143ae565b5f611bea8383613ba9565b60605f611bea83613bcf565b5f610839825490565b6135a88282611bf1565b61103e5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610954565b5f5f60205f8451602086015f885af1806135f6576040513d5f823e3d81fd5b50505f513d9150811561360d57806001141561361a565b6001600160a01b0384163b155b15610dba57604051635274afe760e01b81526001600160a01b0385166004820152602401610954565b5f61364e8383611bf1565b6136cb575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556136833390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610839565b505f610839565b5f611bea836001600160a01b038416613c26565b5f6136f18383611bf1565b156136cb575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610839565b5f611bea836001600160a01b038416613c6b565b5f5f6006838154811061377857613778614236565b5f91825260208083206040805161018081018252600b90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260098a01546101208e0152600a9099015463ffffffff8082166101408f0152600160201b909104166101608d01528f8d52978a52888c2089519889018a52805460ff16151589529687015499880199909952938501549686019690965290830154908401529201549281019290925251919350916138828661399a565b90505f84610140015163ffffffff16421161389d575f6138b3565b6101408501516138b39063ffffffff164261428a565b90505f8560c0015183670de0b6b3a76400006138cf91906143ae565b6138d99190614418565b90505f6138e78360016143da565b6138f183876143ae565b6138fb9190614418565b90508560600151866080015161391191906143da565b421161396d5785511561394857602086015161392d90866143da565b9450856040015185111561394357856040015194505b61396d565b6020860151613957908661428a565b9450856040015185101561396d57856040015194505b8085111561398c5761397f818661428a565b9998505050505050505050565b505f98975050505050505050565b5f5f600683815481106139af576139af614236565b5f91825260208083206040805161018081018252600b90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e087015260088301546101008701526009830154610120870152600a9092015463ffffffff808216610140880152600160201b90910416610160860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613a92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ab6919061429d565b90505f82602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613af9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b1d919061429d565b90505f613b2b82601261444f565b613b3690600a6143a0565b8460600151613b4591906143ae565b90505f613b5384601261444f565b613b5e90600a6143a0565b856101000151613b6e91906143ae565b9050805f03613b8b5750670de0b6b3a76400009695505050505050565b5f81613b9f84670de0b6b3a76400006143ae565b61252e9190614418565b5f825f018281548110613bbe57613bbe614236565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9557602002820191905f5260205f2090815481526020019060010190808311610c815750505050509050919050565b5f8181526001830160205260408120546136cb57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610839565b5f8181526001830160205260408120548015613d45575f613c8d60018361428a565b85549091505f90613ca09060019061428a565b9050808214613cff575f865f018281548110613cbe57613cbe614236565b905f5260205f200154905080875f018481548110613cde57613cde614236565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613d1057613d106143ed565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610839565b5f915050610839565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613dc4575f5ffd5b81356001600160e01b031981168114611bea575f5ffd5b6001600160a01b0381168114612f8f575f5ffd5b5f5f60408385031215613e00575f5ffd5b8235613e0b81613ddb565b946020939093013593505050565b5f5f60208385031215613e2a575f5ffd5b823567ffffffffffffffff811115613e40575f5ffd5b8301601f81018513613e50575f5ffd5b803567ffffffffffffffff811115613e66575f5ffd5b8560208260051b8401011115613e7a575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613eb160208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613ef460c08401826001600160a01b03169052565b5060e0810151613f0860e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b81811015613f6357613f4c838551613e8a565b602093909301926101409290920191600101613f39565b509095945050505050565b5f60208284031215613f7e575f5ffd5b5035919050565b61014081016108398284613e8a565b5f60208284031215613fa4575f5ffd5b8135611bea81613ddb565b602080825282518282018190525f918401906040840190835b81811015613f63578351835260209384019390920191600101613fc8565b5f5f60408385031215613ff7575f5ffd5b82359150602083013561400981613ddb565b809150509250929050565b5f5f5f60608486031215614026575f5ffd5b8335925060208401359150604084013561403f81613ddb565b809150509250925092565b5f5f6040838503121561405b575f5ffd5b50508035926020909101359150565b5f5f6040838503121561407b575f5ffd5b823561408681613ddb565b9150602083013561400981613ddb565b602080825282518282018190525f918401906040840190835b81811015613f635783516001600160a01b03168352602093840193909201916001016140af565b803563ffffffff811681146140e9575f5ffd5b919050565b5f602082840312156140fe575f5ffd5b611bea826140d6565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561415057634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f830112614167575f5ffd5b614171604061411b565b806040840185811115614182575f5ffd5b845b81811015613f6357614195816140d6565b845260209384019301614184565b5f5f5f5f61010085870312156141b7575f5ffd5b84356141c281613ddb565b935060208501356141d281613ddb565b9250605f850186136141e2575f5ffd5b6141ec608061411b565b8060c08701888111156141fd575f5ffd5b604088015b8181101561421a578035845260209384019301614202565b508194506142288982614158565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561083957610839614276565b5f602082840312156142ad575f5ffd5b815160ff81168114611bea575f5ffd5b6001815b60018411156142f8578085048111156142dc576142dc614276565b60018416156142ea57908102905b60019390931c9280026142c1565b935093915050565b5f8261430e57506001610839565b8161431a57505f610839565b8160018114614330576002811461433a57614356565b6001915050610839565b60ff84111561434b5761434b614276565b50506001821b610839565b5060208310610133831016604e8410600b8410161715614379575081810a610839565b6143855f1984846142bd565b805f190482111561439857614398614276565b029392505050565b5f611bea60ff841683614300565b808202811582820484141761083957610839614276565b5f816143d3576143d3614276565b505f190190565b8082018082111561083957610839614276565b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215614411575f5ffd5b5051919050565b5f8261443257634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001820161444857614448614276565b5060010190565b60ff828116828216039081111561083957610839614276565b63ffffffff818116838216029081169081811461262f5761262f61427656fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891a26469706673582212204fdaa3d017ab4562926bae6e2910dd27e5e6bf03649a7b95d434a6fa701adc4c64736f6c634300081b00330000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c806391de4d071161017b578063c5f0d05c116100e4578063d547741f1161009e578063ddb2924711610079578063ddb29247146107a0578063ea5e0c60146107b3578063ed421a9c146107db578063f9a6466414610802575f5ffd5b8063d547741f14610771578063d627d25e14610784578063d918a16e14610797575f5ffd5b8063c5f0d05c146106fe578063c8558f1b14610711578063ca15c87314610724578063cfe9232b14610737578063d04cffeb1461074b578063d1af1fbc1461075e575f5ffd5b8063b33712c511610135578063b33712c5146105dd578063bc063e1a146105e5578063bc3b2b12146105ee578063be32ee2614610658578063c0680e201461066b578063c0aa0e8a1461067e575f5ffd5b806391de4d071461056a5780639b299d9a1461057d5780639cd85b5b14610590578063a217fddf146105a3578063a3246ad3146105aa578063b2f5de94146105ca575f5ffd5b806336568abe116102375780637b30564e116101f15780638dbdbe6d116101cc5780638dbdbe6d146104f25780639010d07c14610505578063909b2bb81461053057806391d1485414610557575f5ffd5b80637b30564e146104795780637bde82f21461048c5780638ad59c701461049f575f5ffd5b806336568abe14610404578063439766ce146104175780635c975abb1461041f5780636247f6f21461042c5780636e76fc8f1461043f578063725dafe014610466575f5ffd5b8063172c44ec11610288578063172c44ec1461038d5780631b014e85146103a057806324760807146103b3578063248a9ca3146103bc57806327507458146103de5780632f2ff15d146103f1575f5ffd5b806301ffc9a7146102cf57806306b40ea3146102f75780630868335e146103185780630fb81eb4146103385780631227b4021461034d578063154347b51461036d575b5f5ffd5b6102e26102dd366004613db4565b610815565b60405190151581526020015b60405180910390f35b61030a610305366004613def565b61083f565b6040519081526020016102ee565b61032b610326366004613e19565b61086a565b6040516102ee9190613f20565b61034b610346366004613f6e565b61091a565b005b61036061035b366004613f6e565b610b51565b6040516102ee9190613f85565b61038061037b366004613f94565b610c38565b6040516102ee9190613faf565b61030a61039b366004613f6e565b610ca1565b6103806103ae366004613f94565b610cab565b61030a60045481565b61030a6103ca366004613f6e565b5f9081526020819052604090206001015490565b6102e26103ec366004613f6e565b610d12565b61034b6103ff366004613fe6565b610d96565b61034b610412366004613fe6565b610dc0565b61034b610df8565b6003546102e29060ff1681565b61034b61043a366004613f94565b610e5c565b61030a7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6381565b61034b610474366004613fe6565b611042565b6102e2610487366004613def565b611161565b61030a61049a366004613fe6565b611205565b6104b26104ad366004613def565b611542565b604080516001600160a01b039097168752602087019590955293850192909252606084015263ffffffff90811660808401521660a082015260c0016102ee565b61034b610500366004614014565b6115a7565b61051861051336600461404a565b611bd3565b6040516001600160a01b0390911681526020016102ee565b61030a7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e81565b6102e2610565366004613fe6565b611bf1565b6102e261057836600461406a565b611c19565b61034b61058b366004613f94565b611d15565b6102e261059e366004613f94565b611e47565b61030a5f81565b6105bd6105b8366004613f6e565b611e5f565b6040516102ee9190614096565b61034b6105d8366004613f6e565b611e78565b61034b612127565b61030a6103e881565b61062e6105fc366004613f6e565b60076020525f90815260409020805460018201546002830154600384015460049094015460ff90931693919290919085565b6040805195151586526020860194909452928401919091526060830152608082015260a0016102ee565b61034b610666366004613f94565b612188565b61030a610679366004613def565b612205565b61069161068c366004613f6e565b61221e565b604080516001600160a01b039d8e1681529c909b1660208d0152998b019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015263ffffffff90811661014084015216610160820152610180016102ee565b61034b61070c3660046140ee565b6122a4565b61030a61071f366004613def565b612345565b61030a610732366004613f6e565b61253a565b61030a5f5160206144885f395f51905f5281565b610380610759366004613f94565b612550565b61051861076c366004613f6e565b612636565b61034b61077f366004613fe6565b61265e565b61034b610792366004613f94565b612682565b61030a600e5481565b61030a6107ae3660046141a3565b61275b565b6105186107c1366004613f6e565b600a6020525f90815260409020546001600160a01b031681565b6105187f0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d81565b61030a610810366004613def565b612f46565b5f6001600160e01b03198216635a05180f60e01b1480610839575061083982612f51565b92915050565b600c602052815f5260405f208181548110610858575f80fd5b905f5260205f20015f91509150505481565b60605f8267ffffffffffffffff81111561088657610886614107565b6040519080825280602002602001820160405280156108bf57816020015b6108ac613d4e565b8152602001906001900390816108a45790505b5090505f5b83811015610912576108ed8585838181106108e1576108e1614236565b90506020020135610b51565b8282815181106108ff576108ff614236565b60209081029190910101526001016108c4565b509392505050565b5f5160206144885f395f51905f5261093181612f85565b60035460ff161561095d5760405162461bcd60e51b81526004016109549061424a565b60405180910390fd5b5f828152600a60205260409020546001600160a01b031633146109b25760405162461bcd60e51b815260206004820152600d60248201526c139bdd081e5bdd5c88109bdb99609a1b6044820152606401610954565b42600683815481106109c6576109c6614236565b905f5260205f2090600b0201600a015f6101000a81548163ffffffff021916908363ffffffff1602179055505f60068381548110610a0657610a06614236565b905f5260205f2090600b02016003015460068481548110610a2957610a29614236565b905f5260205f2090600b020160020154610a43919061428a565b90505f60068481548110610a5957610a59614236565b5f9182526020918290206001600b9092020101546040805163313ce56760e01b815290516001600160a01b039092169263313ce567926004808401938290030181865afa158015610aac573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad0919061429d565b9050610b2133610ae183600a6143a0565b610aeb90856143ae565b60068781548110610afe57610afe614236565b5f91825260209091206001600b9092020101546001600160a01b03169190612f92565b60405184907fc22a1d700260b389bc0ce34ad5cd517ce48733d9f3bf0f188725711b0f53940c905f90a250505050565b610b59613d4e565b5f60068381548110610b6d57610b6d614236565b5f9182526020918290206040805161014081018252600b90930290910180546001600160a01b03908116845260018201541693830193909352919250908101610bb585612ff1565b81526007830154602080830191909152600a80850154600160201b900463ffffffff16604080850191909152600286015460608501525f8881529190925220546001600160a01b0316608082015260a001610c0f85610d12565b1515815260038301546020820152600a9092015463ffffffff1660409092019190915292915050565b6001600160a01b0381165f908152600b6020908152604091829020805483518184028101840190945280845260609392830182828015610c9557602002820191905f5260205f20905b815481526020019060010190808311610c81575b50505050509050919050565b5f61083982612ff1565b6001600160a01b0381165f908152600c6020908152604091829020805483518184028101840190945280845260609392830182828015610c9557602002820191905f5260205f2090815481526020019060010190808311610c815750505050509050919050565b5f60068281548110610d2657610d26614236565b5f9182526020909120600a600b90920201015463ffffffff164211801590610839575060068281548110610d5c57610d5c614236565b905f5260205f2090600b02016006015460068381548110610d7f57610d7f614236565b905f5260205f2090600b0201600301541092915050565b5f82815260208190526040902060010154610db081612f85565b610dba8383612ffb565b50505050565b6001600160a01b0381163314610de95760405163334bd91960e11b815260040160405180910390fd5b610df38282613026565b505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a63610e2281612f85565b6003805460ff1916600117905560405133907f81990fd9a5c552b8e3677917d8a03c07678f0d2cb68f88b634aca2022e9bd19f905f90a250565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e610e8681612f85565b6001600160a01b038216610ed45760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606401610954565b6001600160a01b0382165f9081526009602052604090205460ff1615610f3c5760405162461bcd60e51b815260206004820152601960248201527f546f6b656e20616c72656164792077686974656c6973746564000000000000006044820152606401610954565b816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f96575060408051601f3d908101601f19168201909252610f939181019061429d565b60015b610fd85760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21022a9219918103a37b5b2b760691b6044820152606401610954565b506001600160a01b0382165f818152600960205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b03191690911790555b5050565b5f828152600a60205260409020546001600160a01b0316331461109a5760405162461bcd60e51b815260206004820152601060248201526f2737ba1036b0b935b2ba1037bbb732b960811b6044820152606401610954565b6110b15f5160206144885f395f51905f5282611bf1565b6110ee5760405162461bcd60e51b815260206004820152600e60248201526d2737ba1030bab1ba34b7b732b2b960911b6044820152606401610954565b5f828152600a602090815260409182902080546001600160a01b0319166001600160a01b03851690811790915582518581523392810192909252918101919091527f2ce31ebb7c731534ab7267f7655a662e4a2bce5ffbf2c5ac9c197c0f5c554e79906060015b60405180910390a15050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061118d5761118d614236565b5f9182526020918290206040805160c081018252600590930290910180546001600160a01b031683526001810154938301939093526002830154908201526003820154606082015260049091015463ffffffff8082166080840152600160201b9091041660a090910181905242101591505092915050565b5f61120e613051565b6001600160a01b0382165f908152600d6020526040812054600680549192918291908790811061124057611240614236565b5f9182526020918290206001600b9092020101546040805163313ce56760e01b815290516001600160a01b039092169263313ce567926004808401938290030181865afa158015611293573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b7919061429d565b9050825b801561153257806112cb816143c5565b6001600160a01b0388165f908152600d60205260408120805492945090925090839081106112fb576112fb614236565b905f5260205f20906005020190508781600301540361152c575f61131f8884612345565b9050801561152a5780826001015f82825461133a919061428a565b9091555061134a905081866143da565b94506113788861135b86600a6143a0565b61136590846143ae565b60068c81548110610afe57610afe614236565b81600101545f0361152a576001600160a01b0388165f908152600d60205260409020546113a79060019061428a565b83146114b8576001600160a01b0388165f908152600d6020526040902080546113d29060019061428a565b815481106113e2576113e2614236565b905f5260205f209060050201600d5f8a6001600160a01b03166001600160a01b031681526020019081526020015f20848154811061142257611422614236565b5f9182526020909120825460059092020180546001600160a01b0319166001600160a01b039092169190911781556001808301549082015560028083015490820155600380830154908201556004918201805492909101805463ffffffff19811663ffffffff94851690811783559254600160201b9081900490941690930267ffffffffffffffff199093169091179190911790555b6001600160a01b0388165f908152600d602052604090208054806114de576114de6143ed565b5f8281526020812060055f199093019283020180546001600160a01b031916815560018101829055600281018290556003810191909155600401805467ffffffffffffffff1916905590555b505b506112bb565b5090925050506108396001600255565b600d602052815f5260405f20818154811061155b575f80fd5b5f918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b039093169550909350919063ffffffff80821691600160201b90041686565b6115af613051565b6001600160a01b0381166115fc5760405162461bcd60e51b8152602060048201526014602482015273496e76616c69642075736572206164647265737360601b6044820152606401610954565b60065483106116415760405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081b585c9ad95d081251607a1b6044820152606401610954565b5f6006848154811061165557611655614236565b5f9182526020909120600b90910201600a81015490915063ffffffff164211156116b25760405162461bcd60e51b815260206004820152600e60248201526d109bdb99081a185cc8195b99195960921b6044820152606401610954565b80600601548160030154106117095760405162461bcd60e51b815260206004820152601d60248201527f4d6178696d756d20626f6e6420636170616369747920726561636865640000006044820152606401610954565b80546040805163313ce56760e01b815290515f926001600160a01b03169163313ce5679160048083019260209291908290030181865afa15801561174f573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611773919061429d565b90505f61177f826130a8565b9050808510156117d15760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742062656c6f77206d696e696d756d207468726573686f6c64006044820152606401610954565b82600701548511156118255760405162461bcd60e51b815260206004820152601f60248201527f4465706f7369742065786365656473206d6178696d756d20616c6c6f776564006044820152606401610954565b61182e866130d3565b61183786613215565b82546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa158015611880573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118a49190614401565b90506118bb6001600160a01b03831633308a6132d6565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa1580156118ff573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119239190614401565b905087611930838361428a565b1461197d5760405162461bcd60e51b815260206004820152601960248201527f496e636f7272656374207472616e7366657220616d6f756e74000000000000006044820152606401610954565b8760068a8154811061199157611991614236565b905f5260205f2090600b02016008015f8282546119ae91906143da565b909155505f90506119be8a61330f565b90505f6119cb8a83613573565b600189015460068a015460038b01549293506001600160a01b03909116916119f49084906143da565b1115611a425760405162461bcd60e51b815260206004820152601960248201527f45786365656473206d6178696d756d20626f6e642064656274000000000000006044820152606401610954565b600d5f8b6001600160a01b03166001600160a01b031681526020019081526020015f206040518060c00160405280836001600160a01b031681526020018481526020018581526020018e81526020014263ffffffff168152602001428c600a0160049054906101000a900463ffffffff1663ffffffff16611ac391906143da565b63ffffffff9081169091528254600181810185555f9485526020808620855160059094020180546001600160a01b039094166001600160a01b03199094169390931783558401519082015560408301516002820155606083015160038083019190915560808401516004909201805460a0909501518416600160201b0267ffffffffffffffff1990951692909316919091179290921790558a018054849290611b6d9084906143da565b9091555050604080518c8152602081018490529081018490528c906001600160a01b038c16907f105066e10d7040f371761942e4dcb5b97c51daf3acfe0295b7d4c42d32af86f29060600160405180910390a3505050505050505050610df36001600255565b5f828152600160205260408120611bea908361357e565b9392505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6001600160a01b0381165f908152600b6020908152604080832080548251818502810185019093528083528493830182828015611c7357602002820191905f5260205f20905b815481526020019060010190808311611c5f575b509394505f93505050505b8151811015611d0b57846001600160a01b0316600a5f848481518110611ca657611ca6614236565b60209081029190910181015182528101919091526040015f20546001600160a01b0316148015611cf35750611cf3828281518110611ce657611ce6614236565b6020026020010151610d12565b15611d0357600192505050610839565b600101611c7e565b505f949350505050565b5f611d1f81612f85565b6001600160a01b038216611d755760405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642061756374696f6e65657220616464726573730000000000006044820152606401610954565b611d8c5f5160206144885f395f51905f5283611bf1565b15611dd15760405162461bcd60e51b815260206004820152601560248201527420b63932b0b23c9030b71030bab1ba34b7b732b2b960591b6044820152606401610954565b611de85f5160206144885f395f51905f5283612ffb565b506001600160a01b0382165f81815260086020526040808220805460ff19166001179055513392915f5160206144885f395f51905f52917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b5f6108395f5160206144885f395f51905f5283611bf1565b5f81815260016020526040902060609061083990613589565b5f5160206144885f395f51905f52611e8f81612f85565b60035460ff1615611eb25760405162461bcd60e51b81526004016109549061424a565b5f828152600a60205260409020546001600160a01b03163314611f175760405162461bcd60e51b815260206004820152601760248201527f4e6f74206d61726b657427732061756374696f6e6565720000000000000000006044820152606401610954565b60068281548110611f2a57611f2a614236565b5f9182526020909120600a600b90920201015463ffffffff164211611f8a5760405162461bcd60e51b8152602060048201526016602482015275109bdb99081b9bdd081e595d0818dbdb98db1d59195960521b6044820152606401610954565b5f60068381548110611f9e57611f9e614236565b5f91825260208220600b9091020154600680546001600160a01b0390921693509085908110611fcf57611fcf614236565b905f5260205f2090600b02016008015490505f826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561201e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612042919061429d565b600e549091505f901561207957612710600e548461206091906143ae565b61206a9190614418565b9050612076818461428a565b92505b6120a33361208884600a6143a0565b61209290866143ae565b6001600160a01b0387169190612f92565b80156120e2576120e27f0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d6120d884600a6143a0565b61209290846143ae565b6040805184815260208101839052339188917f6cdd4eeaadbfd702bff31856ddd6a8ac93f3e7683aed304c11ac132081146a1f910160405180910390a3505050505050565b7f5358bcfd81d1ef3da152b1755e1c3c6739686fa7e83dbcad0071568cc4b73a6361215181612f85565b6003805460ff1916905560405133907f5b65b0c1363b3003db9bcc5e1fd8805a6d6bf5bf6dc9d3431ee4494cd7d11766905f90a250565b5f61219281612f85565b6121a95f5160206144885f395f51905f5283613026565b506001600160a01b0382165f81815260086020526040808220805460ff19169055513392915f5160206144885f395f51905f52917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600b602052815f5260405f208181548110610858575f80fd5b6006818154811061222d575f80fd5b5f9182526020909120600b9091020180546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a909a01546001600160a01b03998a169b5097909816989597949693959294919390929063ffffffff80821691600160201b9004168c565b5f6122ae81612f85565b6103e88263ffffffff1611156122f55760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b6044820152606401610954565b600e805463ffffffff84169182905560408051828152602081019390935290917f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df61302910160405180910390a1505050565b6001600160a01b0382165f908152600d6020526040812080548291908490811061237157612371614236565b5f91825260208083206040805160c081018252600590940290910180546001600160a01b0316845260018101549284019290925260028201549083015260038101546060830181905260049091015463ffffffff8082166080850152600160201b9091041660a0830152600680549294509181106123f1576123f1614236565b5f9182526020918290206040805161018081018252600b90930290910180546001600160a01b03908116845260018201541693830193909352600283015490820152600382015460608201526004820154608080830191909152600583015460a0830152600683015460c0830152600783015460e083015260088301546101008301526009830154610120830152600a9092015463ffffffff808216610140840152600160201b909104811661016083015291840151909250164210156124bc575f92505050610839565b5f81610160015163ffffffff1690505f8360a0015163ffffffff1642116124f75760808401516124f29063ffffffff164261428a565b6124f9565b815b90505f82856020015161250c9190614418565b90505f61251983836143ae565b9050856020015181111561252e575060208501515b98975050505050505050565b5f81815260016020526040812061083990613595565b6001600160a01b0381165f908152600d60205260408120546060919067ffffffffffffffff81111561258457612584614107565b6040519080825280602002602001820160405280156125ad578160200160208202803683370190505b5090505f5b6001600160a01b0384165f908152600d602052604090205481101561262f576001600160a01b0384165f908152600d602052604090208054829081106125fa576125fa614236565b905f5260205f2090600502016003015482828151811061261c5761261c614236565b60209081029190910101526001016125b2565b5092915050565b60058181548110612645575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f8281526020819052604090206001015461267881612f85565b610dba8383613026565b7fd5b31c46cc75555bed852936261f4e95cbe813f3d32342d2d830a8fb4561ff8e6126ac81612f85565b6001600160a01b0382165f9081526009602052604090205460ff1661270b5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610954565b6001600160a01b0382165f81815260096020908152604091829020805460ff1916905590519182527f108cc7e243d7eb6c2052789466e0961bb24cd62395e2c99e704001b48107a0619101611155565b5f5f5160206144885f395f51905f5261277381612f85565b60035460ff16156127965760405162461bcd60e51b81526004016109549061424a565b6001600160a01b0386166127e35760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b2103830bcb7baba103a37b5b2b760611b6044820152606401610954565b6001600160a01b03851661282f5760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21038bab7ba32903a37b5b2b760691b6044820152606401610954565b856001600160a01b0316856001600160a01b0316036128905760405162461bcd60e51b815260206004820152601860248201527f546f6b656e73206d75737420626520646966666572656e7400000000000000006044820152606401610954565b6001600160a01b0386165f9081526009602052604090205460ff166128ef5760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881b9bdd081dda1a5d195b1a5cdd1959605a1b6044820152606401610954565b6128f93386611c19565b156129515760405162461bcd60e51b815260206004820152602260248201527f416c726561647920686173206d61726b657420666f722071756f746520746f6b60448201526132b760f11b6064820152608401610954565b82514263ffffffff9091161161299e5760405162461bcd60e51b8152602060048201526012602482015271426f6e6420656e6420746f6f206561726c7960701b6044820152606401610954565b83516129e15760405162461bcd60e51b81526020600482015260126024820152710416d6f756e74206d757374206265203e20360741b6044820152606401610954565b6020840151612a325760405162461bcd60e51b815260206004820152601c60248201527f436f6e74726f6c207661726961626c65206d757374206265203e2030000000006044820152606401610954565b6040840151612a835760405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d207072696365206d757374206265203e2030000000000000006044820152606401610954565b6060840151612acb5760405162461bcd60e51b815260206004820152601460248201527304d61782064656274206d757374206265203e20360641b6044820152606401610954565b82515f90612ae090429063ffffffff1661428a565b90505f8111612b2a5760405162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081d995cdd1a5b99c81c195c9a5bd960521b6044820152606401610954565b5f6127108660036020020151612b42906107086143ae565b612b4c9190614418565b905081612b6182670de0b6b3a76400006143ae565b612b6b9190614418565b90505f886001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612baa573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bce919061429d565b9050612bfe3330612be084600a6143a0565b8a51612bec91906143ae565b6001600160a01b038d169291906132d6565b60408051610180810182526001600160a01b03808b1682528b1660208201526006918101612c2d84600a6143a0565b8a51612c3991906143ae565b81525f6020808301919091528a015160408201526060016103e88a60026020020151612c6d90670de0b6b3a76400006143ae565b612c779190614418565b8152602001612c8784600a6143a0565b60608b0151612c9691906143ae565b81526020018481526020015f8152602001428152602001885f60028110612cbf57612cbf614236565b602002015163ffffffff16815260200188600160028110612ce257612ce2614236565b602002015163ffffffff16815250908060018154018082558091505060019003905f5260205f2090600b02015f909190919091505f820151815f015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080155610120820151816009015561014082015181600a015f6101000a81548163ffffffff021916908363ffffffff16021790555061016082015181600a0160046101000a81548163ffffffff021916908363ffffffff16021790555050505f6004549050600c5f8b6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600b5f8a6001600160a01b03166001600160a01b031681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f909190919091505533600a5f8381526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060045f8154612ee690614437565b909155506001600160a01b03808a16908b16827fe2cf7d92fe44fee405e71ceedac936dbc3b0d18e7d9582e31f2f2a2a3db75c978b60016020020151604051612f3191815260200190565b60405180910390a49998505050505050505050565b5f611bea8383612345565b5f6001600160e01b03198216637965db0b60e01b148061083957506301ffc9a760e01b6001600160e01b0319831614610839565b612f8f813361359e565b50565b6040516001600160a01b03838116602483015260448201839052610df391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506135d7565b5f6108398261330f565b5f5f6130078484613643565b90508015611bea575f84815260016020526040902061091290846136d2565b5f5f61303284846136e6565b90508015611bea575f848152600160205260409020610912908461374f565b60028054036130a25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610954565b60028055565b5f60028260ff1611156130cb576130c060028361444f565b61083990600a6143a0565b506001919050565b5f81815260076020526040902060038101546004909101546130f591906143da565b421115612f8f575f6006828154811061311057613110614236565b5f91825260208083208584526007909152604090922054600b909102909101915060ff161561319b575f828152600760205260408120600101546004830180549192909161315f9084906143da565b90915550505f82815260076020526040902060020154600482015410613196575f8281526007602052604090206002015460048201555b6131f8565b5f82815260076020526040812060010154600483018054919290916131c190849061428a565b90915550505f828152600760205260409020600201546004820154116131f8575f8281526007602052604090206002015460048201555b505f9081526007602052604090204263ffffffff16600490910155565b5f6006828154811061322957613229614236565b905f5260205f2090600b020190505f81600301549050805f0361324b57505050565b5f82600901544261325c919061428a565b9050805f0361326b5750505050565b600a8301545f9061328a90600160201b900463ffffffff166064614468565b63ffffffff1661329a83856143ae565b6132a49190614418565b90508281116132bc576132b7818461428a565b6132be565b5f5b600385015550505063ffffffff421660099091015550565b6040516001600160a01b038481166024830152838116604483015260648201839052610dba9186918216906323b872dd90608401612fbf565b5f5f6006838154811061332457613324614236565b5f91825260208083206040805161018081018252600b90940290910180546001600160a01b039081168552600182015416848401819052600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e087015260088301546101008701526009830154610120870152600a9092015463ffffffff808216610140880152600160201b90910416610160860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613406573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061342a919061429d565b90505f825f01516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561346c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613490919061429d565b90505f61349c86613763565b90505f6134a88761399a565b90505f836134b786602461444f565b6134c1919061444f565b6134cc90600a6143a0565b6134d683856143ae565b6134e091906143ae565b9050670de0b6b3a76400006134f58183614418565b6134ff9190614418565b96508560a00151871015613515578560a0015196505b613528670de0b6b3a76400005f19614418565b8711156135685760405162461bcd60e51b815260206004820152600e60248201526d5072696365206f766572666c6f7760901b6044820152606401610954565b505050505050919050565b5f611bea82846143ae565b5f611bea8383613ba9565b60605f611bea83613bcf565b5f610839825490565b6135a88282611bf1565b61103e5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610954565b5f5f60205f8451602086015f885af1806135f6576040513d5f823e3d81fd5b50505f513d9150811561360d57806001141561361a565b6001600160a01b0384163b155b15610dba57604051635274afe760e01b81526001600160a01b0385166004820152602401610954565b5f61364e8383611bf1565b6136cb575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556136833390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610839565b505f610839565b5f611bea836001600160a01b038416613c26565b5f6136f18383611bf1565b156136cb575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610839565b5f611bea836001600160a01b038416613c6b565b5f5f6006838154811061377857613778614236565b5f91825260208083206040805161018081018252600b90940290910180546001600160a01b03908116855260018083015490911685850152600280830154868501526003808401546060808901919091526004808601546080808b01918252600588015460a0808d0191909152600689015460c08d01526007808a015460e08e015260088a01546101008e015260098a01546101208e0152600a9099015463ffffffff8082166101408f0152600160201b909104166101608d01528f8d52978a52888c2089519889018a52805460ff16151589529687015499880199909952938501549686019690965290830154908401529201549281019290925251919350916138828661399a565b90505f84610140015163ffffffff16421161389d575f6138b3565b6101408501516138b39063ffffffff164261428a565b90505f8560c0015183670de0b6b3a76400006138cf91906143ae565b6138d99190614418565b90505f6138e78360016143da565b6138f183876143ae565b6138fb9190614418565b90508560600151866080015161391191906143da565b421161396d5785511561394857602086015161392d90866143da565b9450856040015185111561394357856040015194505b61396d565b6020860151613957908661428a565b9450856040015185101561396d57856040015194505b8085111561398c5761397f818661428a565b9998505050505050505050565b505f98975050505050505050565b5f5f600683815481106139af576139af614236565b5f91825260208083206040805161018081018252600b90940290910180546001600160a01b03908116808652600183015490911685850152600282015485840152600382015460608601526004808301546080870152600583015460a0870152600683015460c0870152600783015460e087015260088301546101008701526009830154610120870152600a9092015463ffffffff808216610140880152600160201b90910416610160860152825163313ce56760e01b815292519496509363313ce56793838301939092908290030181865afa158015613a92573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ab6919061429d565b90505f82602001516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015613af9573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b1d919061429d565b90505f613b2b82601261444f565b613b3690600a6143a0565b8460600151613b4591906143ae565b90505f613b5384601261444f565b613b5e90600a6143a0565b856101000151613b6e91906143ae565b9050805f03613b8b5750670de0b6b3a76400009695505050505050565b5f81613b9f84670de0b6b3a76400006143ae565b61252e9190614418565b5f825f018281548110613bbe57613bbe614236565b905f5260205f200154905092915050565b6060815f01805480602002602001604051908101604052809291908181526020018280548015610c9557602002820191905f5260205f2090815481526020019060010190808311610c815750505050509050919050565b5f8181526001830160205260408120546136cb57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610839565b5f8181526001830160205260408120548015613d45575f613c8d60018361428a565b85549091505f90613ca09060019061428a565b9050808214613cff575f865f018281548110613cbe57613cbe614236565b905f5260205f200154905080875f018481548110613cde57613cde614236565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613d1057613d106143ed565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610839565b5f915050610839565b6040518061014001604052805f6001600160a01b031681526020015f6001600160a01b031681526020015f81526020015f81526020015f81526020015f81526020015f6001600160a01b031681526020015f151581526020015f81526020015f81525090565b5f60208284031215613dc4575f5ffd5b81356001600160e01b031981168114611bea575f5ffd5b6001600160a01b0381168114612f8f575f5ffd5b5f5f60408385031215613e00575f5ffd5b8235613e0b81613ddb565b946020939093013593505050565b5f5f60208385031215613e2a575f5ffd5b823567ffffffffffffffff811115613e40575f5ffd5b8301601f81018513613e50575f5ffd5b803567ffffffffffffffff811115613e66575f5ffd5b8560208260051b8401011115613e7a575f5ffd5b6020919091019590945092505050565b80516001600160a01b031682526020810151613eb160208401826001600160a01b03169052565b5060408101516040830152606081015160608301526080810151608083015260a081015160a083015260c0810151613ef460c08401826001600160a01b03169052565b5060e0810151613f0860e084018215159052565b50610100818101519083015261012090810151910152565b602080825282518282018190525f918401906040840190835b81811015613f6357613f4c838551613e8a565b602093909301926101409290920191600101613f39565b509095945050505050565b5f60208284031215613f7e575f5ffd5b5035919050565b61014081016108398284613e8a565b5f60208284031215613fa4575f5ffd5b8135611bea81613ddb565b602080825282518282018190525f918401906040840190835b81811015613f63578351835260209384019390920191600101613fc8565b5f5f60408385031215613ff7575f5ffd5b82359150602083013561400981613ddb565b809150509250929050565b5f5f5f60608486031215614026575f5ffd5b8335925060208401359150604084013561403f81613ddb565b809150509250925092565b5f5f6040838503121561405b575f5ffd5b50508035926020909101359150565b5f5f6040838503121561407b575f5ffd5b823561408681613ddb565b9150602083013561400981613ddb565b602080825282518282018190525f918401906040840190835b81811015613f635783516001600160a01b03168352602093840193909201916001016140af565b803563ffffffff811681146140e9575f5ffd5b919050565b5f602082840312156140fe575f5ffd5b611bea826140d6565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561415057634e487b7160e01b5f52604160045260245ffd5b604052919050565b5f82601f830112614167575f5ffd5b614171604061411b565b806040840185811115614182575f5ffd5b845b81811015613f6357614195816140d6565b845260209384019301614184565b5f5f5f5f61010085870312156141b7575f5ffd5b84356141c281613ddb565b935060208501356141d281613ddb565b9250605f850186136141e2575f5ffd5b6141ec608061411b565b8060c08701888111156141fd575f5ffd5b604088015b8181101561421a578035845260209384019301614202565b508194506142288982614158565b935050505092959194509250565b634e487b7160e01b5f52603260045260245ffd5b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561083957610839614276565b5f602082840312156142ad575f5ffd5b815160ff81168114611bea575f5ffd5b6001815b60018411156142f8578085048111156142dc576142dc614276565b60018416156142ea57908102905b60019390931c9280026142c1565b935093915050565b5f8261430e57506001610839565b8161431a57505f610839565b8160018114614330576002811461433a57614356565b6001915050610839565b60ff84111561434b5761434b614276565b50506001821b610839565b5060208310610133831016604e8410600b8410161715614379575081810a610839565b6143855f1984846142bd565b805f190482111561439857614398614276565b029392505050565b5f611bea60ff841683614300565b808202811582820484141761083957610839614276565b5f816143d3576143d3614276565b505f190190565b8082018082111561083957610839614276565b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215614411575f5ffd5b5051919050565b5f8261443257634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001820161444857614448614276565b5060010190565b60ff828116828216039081111561083957610839614276565b63ffffffff818116838216029081169081811461262f5761262f61427656fec1df76f4e50bdb95676f782d4b88b23904c5346d8bc7c986ae26f7e10e601891a26469706673582212204fdaa3d017ab4562926bae6e2910dd27e5e6bf03649a7b95d434a6fa701adc4c64736f6c634300081b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d
-----Decoded View---------------
Arg [0] : _mSig (address): 0x5e4D8755c0cBD26E8670b27Bc0bD21EF84cD881d
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005e4d8755c0cbd26e8670b27bc0bd21ef84cd881d
Deployed Bytecode Sourcemap
50507:24486:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44039:214;;;;;;:::i;:::-;;:::i;:::-;;;566:14:1;;559:22;541:41;;529:2;514:18;44039:214:0;;;;;;;;52171:53;;;;;;:::i;:::-;;:::i;:::-;;;1247:25:1;;;1235:2;1220:18;52171:53:0;1101:177:1;67812:342:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57262:493::-;;;;;;:::i;:::-;;:::i;:::-;;67168:636;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65139:142::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65945:107::-;;;;;;:::i;:::-;;:::i;65289:138::-;;;;;;:::i;:::-;;:::i;51793:28::-;;;;;;27112:122;;;;;;:::i;:::-;27177:7;27204:12;;;;;;;;;;:22;;;;27112:122;65764:162;;;;;;:::i;:::-;;:::i;27544:138::-;;;;;;:::i;:::-;;:::i;28681:251::-;;;;;;:::i;:::-;;:::i;64426:165::-;;;:::i;50872:18::-;;;;;;;;;63646:525;;;;;;:::i;:::-;;:::i;50783:80::-;;50830:33;50783:80;;58589:350;;;;;;:::i;:::-;;:::i;68308:174::-;;;;;;:::i;:::-;;:::i;61529:1173::-;;;;;;:::i;:::-;;:::i;52231:43::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6339:32:1;;;6321:51;;6403:2;6388:18;;6381:34;;;;6431:18;;;6424:34;;;;6489:2;6474:18;;6467:34;6550:10;6538:23;;;6532:3;6517:19;;6510:52;6599:23;6359:3;6578:19;;6571:52;6308:3;6293:19;52231:43:0;6038:591:1;59064:2459:0;;;;;;:::i;:::-;;:::i;44852:144::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7641:32:1;;;7623:51;;7611:2;7596:18;44852:144:0;7477:203:1;50692:84:0;;50741:35;50692:84;;26128:138;;;;;;:::i;:::-;;:::i;74504:375::-;;;;;;:::i;:::-;;:::i;62842:489::-;;;;;;:::i;:::-;;:::i;66064:127::-;;;;;;:::i;:::-;;:::i;25440:49::-;;25485:4;25440:49;;45856:138;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57761:816::-;;;;;;:::i;:::-;;:::i;64599:170::-;;;:::i;52348:38::-;;52382:4;52348:38;;51893:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8998:14:1;;8991:22;8973:41;;9045:2;9030:18;;9023:34;;;;9073:18;;;9066:34;;;;9131:2;9116:18;;9109:34;9174:3;9159:19;;9152:35;8960:3;8945:19;51893:45:0;8720:473:1;63339:298:0;;;;;;:::i;:::-;;:::i;52112:52::-;;;;;;:::i;:::-;;:::i;51866:20::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9669:32:1;;;9651:51;;9738:32;;;;9733:2;9718:18;;9711:60;9787:18;;;9780:34;;;;9845:2;9830:18;;9823:34;;;;9888:3;9873:19;;9866:35;;;;9689:3;9917:19;;9910:35;;;;9976:3;9961:19;;9954:35;10020:3;10005:19;;9998:35;10064:3;10049:19;;10042:35;10108:3;10093:19;;10086:35;10171:10;10158:24;;;10152:3;10137:19;;10130:53;10220:24;10214:3;10199:19;;10192:53;9638:3;9623:19;51866:20:0;9198:1053:1;64776:237:0;;;;;;:::i;:::-;;:::i;66199:959::-;;;;;;:::i;:::-;;:::i;45170:133::-;;;;;;:::i;:::-;;:::i;50615:70::-;;-1:-1:-1;;;;;;;;;;;50615:70:0;;65435:316;;;;;;:::i;:::-;;:::i;51828:31::-;;;;;;:::i;:::-;;:::i;27975:140::-;;;;;;:::i;:::-;;:::i;64179:232::-;;;;;;:::i;:::-;;:::i;52318:23::-;;;;;;54650:2603;;;;;;:::i;:::-;;:::i;52050:55::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;52050:55:0;;;52282:29;;;;;68160:141;;;;;;:::i;:::-;;:::i;44039:214::-;44124:4;-1:-1:-1;;;;;;44148:57:0;;-1:-1:-1;;;44148:57:0;;:97;;;44209:36;44233:11;44209:23;:36::i;:::-;44141:104;44039:214;-1:-1:-1;;44039:214:0:o;52171:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67812:342::-;67897:23;67929:31;67984:9;67963:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;67929:72:0;-1:-1:-1;68019:9:0;68014:110;68034:20;;;68014:110;;;68085:31;68103:9;;68113:1;68103:12;;;;;;;:::i;:::-;;;;;;;68085:17;:31::i;:::-;68072:7;68080:1;68072:10;;;;;;;;:::i;:::-;;;;;;;;;;:44;68056:3;;68014:110;;;-1:-1:-1;68143:7:0;67812:342;-1:-1:-1;;;67812:342:0:o;57262:493::-;-1:-1:-1;;;;;;;;;;;25724:16:0;25735:4;25724:10;:16::i;:::-;74938:6:::1;::::0;::::1;;74937:7;74929:38;;;;-1:-1:-1::0;;;74929:38:0::1;;;;;;;:::i;:::-;;;;;;;;;57354:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57354:25:0::2;57383:10;57354:39;57350:69;;57395:24;::::0;-1:-1:-1;;;57395:24:0;;13494:2:1;57395:24:0::2;::::0;::::2;13476:21:1::0;13533:2;13513:18;;;13506:30;-1:-1:-1;;;13552:18:1;;;13545:43;13605:18;;57395:24:0::2;13292:337:1::0;57350:69:0::2;57455:15;57426:5;57432:3;57426:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;:45;;;;;;;;;;;;;;;;;;57480:18;57527:5;57533:3;57527:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;57501:5;57507:3;57501:10;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:46;;;;:::i;:::-;57480:67;;57554:20;57592:5;57598:3;57592:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;:22:::2;:10;::::0;;::::2;;:22;::::0;57577:49:::2;::::0;;-1:-1:-1;;;57577:49:0;;;;-1:-1:-1;;;;;57592:22:0;;::::2;::::0;57577:47:::2;::::0;:49:::2;::::0;;::::2;::::0;;;;;;57592:22;57577:49:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57554:72:::0;-1:-1:-1;57635:88:0::2;57679:10;57704:18;57554:72:::0;57704:2:::2;:18;:::i;:::-;57691:31;::::0;:10;:31:::2;:::i;:::-;57642:5;57648:3;57642:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:22:::2;:10;::::0;;::::2;;:22;::::0;-1:-1:-1;;;;;57642:22:0::2;::::0;57635:88;:43:::2;:88::i;:::-;57737:14;::::0;57747:3;;57737:14:::2;::::0;;;::::2;57343:412;;57262:493:::0;;:::o;67168:636::-;67234:21;;:::i;:::-;67268:18;67289:5;67295:8;67289:15;;;;;;;;:::i;:::-;;;;;;;;;;67332:464;;;;;;;;67289:15;;;;;;;67374;;-1:-1:-1;;;;;67374:15:0;;;67332:464;;67374:15;67417:16;;;;67332:464;;;;;;;67289:15;;-1:-1:-1;67332:464:0;;;67455:24;67470:8;67455:14;:24::i;:::-;67332:464;;67505:14;;;;67332:464;;;;;;;;67547:16;;;;;-1:-1:-1;;;67547:16:0;;;;67332:464;;;;;;;;67593:17;;;;67332:464;;;;-1:-1:-1;67637:30:0;;;;;;;;;-1:-1:-1;;;;;67637:30:0;67332:464;;;;;;67690:16;67637:30;67690:6;:16::i;:::-;67332:464;;;;67732:14;;;;67332:464;;;;67771:13;;;;;;;67332:464;;;;;;;;67325:471;67168:636;-1:-1:-1;;67168:636:0:o;65139:142::-;-1:-1:-1;;;;;65246:27:0;;;;;;:15;:27;;;;;;;;;65239:34;;;;;;;;;;;;;;;;;65209:16;;65239:34;;;65246:27;65239:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65139:142;;;:::o;65945:107::-;65997:7;66025:19;66040:3;66025:14;:19::i;65289:138::-;-1:-1:-1;;;;;65395:24:0;;;;;;:16;:24;;;;;;;;;65388:31;;;;;;;;;;;;;;;;;65356:16;;65388:31;;;65395:24;65388:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65289:138;;;:::o;65764:162::-;65814:4;65858:5;65864:3;65858:10;;;;;;;;:::i;:::-;;;;;;;;;:19;:10;;;;;:19;;;;65839:15;:38;;;;:83;;;65904:5;65910:3;65904:10;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;65881:5;65887:3;65881:10;;;;;;;;:::i;:::-;;;;;;;;;;;:20;;;:41;65832:90;65764:162;-1:-1:-1;;65764:162:0:o;27544:138::-;27177:7;27204:12;;;;;;;;;;:22;;;25724:16;25735:4;25724:10;:16::i;:::-;27649:25:::1;27660:4;27666:7;27649:10;:25::i;:::-;;27544:138:::0;;;:::o;28681:251::-;-1:-1:-1;;;;;28775:34:0;;22429:10;28775:34;28771:104;;28833:30;;-1:-1:-1;;;28833:30:0;;;;;;;;;;;28771:104;28887:37;28899:4;28905:18;28887:11;:37::i;:::-;;28681:251;;:::o;64426:165::-;50830:33;25724:16;25735:4;25724:10;:16::i;:::-;64528:6:::1;:13:::0;;-1:-1:-1;;64528:13:0::1;64537:4;64528:13;::::0;;64557:26:::1;::::0;64572:10:::1;::::0;64557:26:::1;::::0;64528:6:::1;::::0;64557:26:::1;64426:165:::0;:::o;63646:525::-;50741:35;25724:16;25735:4;25724:10;:16::i;:::-;-1:-1:-1;;;;;63773:20:0;::::1;63765:54;;;::::0;-1:-1:-1;;;63765:54:0;;15984:2:1;63765:54:0::1;::::0;::::1;15966:21:1::0;16023:2;16003:18;;;15996:30;-1:-1:-1;;;16042:18:1;;;16035:51;16103:18;;63765:54:0::1;15782:345:1::0;63765:54:0::1;-1:-1:-1::0;;;;;63839:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;63838:26;63830:64;;;::::0;-1:-1:-1;;;63830:64:0;;16334:2:1;63830:64:0::1;::::0;::::1;16316:21:1::0;16373:2;16353:18;;;16346:30;16412:27;16392:18;;;16385:55;16457:18;;63830:64:0::1;16132:349:1::0;63830:64:0::1;63966:6;-1:-1:-1::0;;;;;63951:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;63951:33:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;63951:33:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;63947:217;;64123:29;::::0;-1:-1:-1;;;64123:29:0;;16688:2:1;64123:29:0::1;::::0;::::1;16670:21:1::0;16727:2;16707:18;;;16700:30;-1:-1:-1;;;16746:18:1;;;16739:49;16805:18;;64123:29:0::1;16486:343:1::0;63947:217:0::1;-1:-1:-1::0;;;;;;64016:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;:32;;-1:-1:-1;;64016:32:0::1;64044:4;64016:32:::0;;::::1;::::0;;;64063:13:::1;:26:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;64063:26:0::1;::::0;;::::1;::::0;;63947:217:::1;63646:525:::0;;:::o;58589:350::-;58678:30;;;;:20;:30;;;;;;-1:-1:-1;;;;;58678:30:0;58712:10;58678:44;58670:73;;;;-1:-1:-1;;;58670:73:0;;17036:2:1;58670:73:0;;;17018:21:1;17075:2;17055:18;;;17048:30;-1:-1:-1;;;17094:18:1;;;17087:46;17150:18;;58670:73:0;16834:340:1;58670:73:0;58758:39;-1:-1:-1;;;;;;;;;;;58783:13:0;58758:7;:39::i;:::-;58750:66;;;;-1:-1:-1;;;58750:66:0;;17381:2:1;58750:66:0;;;17363:21:1;17420:2;17400:18;;;17393:30;-1:-1:-1;;;17439:18:1;;;17432:44;17493:18;;58750:66:0;17179:338:1;58750:66:0;58823:30;;;;:20;:30;;;;;;;;;:46;;-1:-1:-1;;;;;;58823:46:0;-1:-1:-1;;;;;58823:46:0;;;;;;;;58881:54;;17724:25:1;;;58909:10:0;17765:18:1;;;17758:60;;;;17834:18;;;17827:60;;;;58881:54:0;;17712:2:1;17697:18;58881:54:0;;;;;;;;58589:350;;:::o;68308:174::-;-1:-1:-1;;;;;68410:14:0;;68378:4;68410:14;;;:8;:14;;;;;:23;;68378:4;;68410:14;68425:7;;68410:23;;;;;;:::i;:::-;;;;;;;;;;68391:42;;;;;;;;68410:23;;;;;;;68391:42;;-1:-1:-1;;;;;68391:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68391:42:0;;;;;;;;;;;68447:15;:31;;;-1:-1:-1;;68308:174:0;;;;:::o;61529:1173::-;61603:22;48947:21;:19;:21::i;:::-;-1:-1:-1;;;;;61651:14:0;::::1;61634;61651::::0;;;:8:::1;:14;::::0;;;;:21;61750:5:::1;:10:::0;;61651:21;;61634:14;;;61750:5;61756:3;;61750:10;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;:22:::1;:10;::::0;;::::1;;:22;::::0;61735:49:::1;::::0;;-1:-1:-1;;;61735:49:0;;;;-1:-1:-1;;;;;61750:22:0;;::::1;::::0;61735:47:::1;::::0;:49:::1;::::0;;::::1;::::0;;;;;;61750:22;61735:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61712:72:::0;-1:-1:-1;61810:6:0;61793:873:::1;61818:5:::0;;61793:873:::1;;61837:3:::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;;;;61890:14:0;::::1;61863:24;61890:14:::0;;;:8:::1;:14;::::0;;;;:17;;61837:3;;-1:-1:-1;61863:24:0;;-1:-1:-1;61890:14:0;61837:3;;61890:17;::::1;;;;;:::i;:::-;;;;;;;;;;;61863:44;;61946:3;61922:11;:20;;;:27:::0;61918:741:::1;;61966:14;61983:30;62005:4;62011:1;61983:21;:30::i;:::-;61966:47:::0;-1:-1:-1;62046:10:0;;62042:606:::1;;62103:6;62077:11;:22;;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;62128:23:0::1;::::0;-1:-1:-1;62145:6:0;62128:23;::::1;:::i;:::-;::::0;-1:-1:-1;62252:78:0::1;62296:4:::0;62311:18:::1;62315:14:::0;62311:2:::1;:18;:::i;:::-;62302:27;::::0;:6;:27:::1;:::i;:::-;62259:5;62265:3;62259:10;;;;;;;;:::i;62252:78::-;62371:11;:22;;;62397:1;62371:27:::0;62367:266:::1;;-1:-1:-1::0;;;;;62432:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:21;:25:::1;::::0;62456:1:::1;::::0;62432:25:::1;:::i;:::-;62427:1;:30;62423:148;;-1:-1:-1::0;;;;;62506:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;62521:21;;:25:::1;::::0;62545:1:::1;::::0;62521:25:::1;:::i;:::-;62506:41;;;;;;;;:::i;:::-;;;;;;;;;;;62486:8;:14;62495:4;-1:-1:-1::0;;;;;62486:14:0::1;-1:-1:-1::0;;;;;62486:14:0::1;;;;;;;;;;;;62501:1;62486:17;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:61;;:17:::1;::::0;;::::1;;:61:::0;;-1:-1:-1;;;;;;62486:61:0::1;-1:-1:-1::0;;;;;62486:61:0;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;62486:61:0;::::1;;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;62486:61:0;;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;62486:61:0;;;;;;;;;::::1;::::0;;62423:148:::1;-1:-1:-1::0;;;;;62593:14:0;::::1;;::::0;;;:8:::1;:14;::::0;;;;:20;;;::::1;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;62593:20:0;;;;;::::1;;::::0;;-1:-1:-1;;;;;;62593:20:0::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;62593:20:0;;;;;62367:266:::1;61951:708;61918:741;61826:840;61793:873;;;-1:-1:-1::0;62685:13:0;;-1:-1:-1;;;48991:20:0;48385:1;49511:7;:22;49328:213;52231:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52231:43:0;;;;-1:-1:-1;52231:43:0;;-1:-1:-1;52231:43:0;;;;;;;-1:-1:-1;;;52231:43:0;;;;:::o;59064:2459::-;48947:21;:19;:21::i;:::-;-1:-1:-1;;;;;59199:18:0;::::1;59191:51;;;::::0;-1:-1:-1;;;59191:51:0;;18503:2:1;59191:51:0::1;::::0;::::1;18485:21:1::0;18542:2;18522:18;;;18515:30;-1:-1:-1;;;18561:18:1;;;18554:50;18621:18;;59191:51:0::1;18301:344:1::0;59191:51:0::1;59267:5;:12:::0;59261:18;::::1;59253:48;;;::::0;-1:-1:-1;;;59253:48:0;;18852:2:1;59253:48:0::1;::::0;::::1;18834:21:1::0;18891:2;18871:18;;;18864:30;-1:-1:-1;;;18910:18:1;;;18903:47;18967:18;;59253:48:0::1;18650:341:1::0;59253:48:0::1;59363:18;59384:5;59390:3;59384:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;59485:13;::::0;::::1;::::0;59384:10;;-1:-1:-1;59485:13:0::1;;59466:15;:32;;59458:59;;;::::0;-1:-1:-1;;;59458:59:0;;19198:2:1;59458:59:0::1;::::0;::::1;19180:21:1::0;19237:2;19217:18;;;19210:30;-1:-1:-1;;;19256:18:1;;;19249:44;19310:18;;59458:59:0::1;18996:338:1::0;59458:59:0::1;59553:4;:12;;;59536:4;:14;;;:29;59528:71;;;::::0;-1:-1:-1;;;59528:71:0;;19541:2:1;59528:71:0::1;::::0;::::1;19523:21:1::0;19580:2;19560:18;;;19553:30;19619:31;19599:18;;;19592:59;19668:18;;59528:71:0::1;19339:353:1::0;59528:71:0::1;59711:15:::0;;59688:51:::1;::::0;;-1:-1:-1;;;59688:51:0;;;;59666:19:::1;::::0;-1:-1:-1;;;;;59711:15:0::1;::::0;59688:49:::1;::::0;:51:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;59711:15;59688:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59666:73;;59750:22;59775:38;59799:13;59775:23;:38::i;:::-;59750:63;;59883:14;59873:6;:24;;59865:68;;;::::0;-1:-1:-1;;;59865:68:0;;19899:2:1;59865:68:0::1;::::0;::::1;19881:21:1::0;19938:2;19918:18;;;19911:30;19977:33;19957:18;;;19950:61;20028:18;;59865:68:0::1;19697:355:1::0;59865:68:0::1;59962:4;:14;;;59952:6;:24;;59944:68;;;::::0;-1:-1:-1;;;59944:68:0;;20259:2:1;59944:68:0::1;::::0;::::1;20241:21:1::0;20298:2;20278:18;;;20271:30;20337:33;20317:18;;;20310:61;20388:18;;59944:68:0::1;20057:355:1::0;59944:68:0::1;60115:10;60121:3;60115:5;:10::i;:::-;60136:15;60147:3;60136:10;:15::i;:::-;60238::::0;;60289:35:::1;::::0;-1:-1:-1;;;60289:35:0;;60318:4:::1;60289:35;::::0;::::1;7623:51:1::0;-1:-1:-1;;;;;60238:15:0;;::::1;::::0;60211:17:::1;::::0;60238:15;;60289:20:::1;::::0;7596:18:1;;60289:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60265:59:::0;-1:-1:-1;60335:62:0::1;-1:-1:-1::0;;;;;60335:27:0;::::1;60363:10;60383:4;60390:6:::0;60335:27:::1;:62::i;:::-;60432:35;::::0;-1:-1:-1;;;60432:35:0;;60461:4:::1;60432:35;::::0;::::1;7623:51:1::0;60409:20:0::1;::::0;-1:-1:-1;;;;;60432:20:0;::::1;::::0;::::1;::::0;7596:18:1;;60432:35:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60409:58:::0;-1:-1:-1;60518:6:0;60486:28:::1;60501:13:::0;60409:58;60486:28:::1;:::i;:::-;:38;60478:76;;;::::0;-1:-1:-1;;;60478:76:0;;20808:2:1;60478:76:0::1;::::0;::::1;20790:21:1::0;20847:2;20827:18;;;20820:30;20886:27;20866:18;;;20859:55;20931:18;;60478:76:0::1;20606:349:1::0;60478:76:0::1;60597:6;60565:5;60571:3;60565:10;;;;;;;;:::i;:::-;;;;;;;;;;;:28;;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;60670:13:0::1;::::0;-1:-1:-1;60686:17:0::1;60699:3:::0;60686:12:::1;:17::i;:::-;60670:33;;60759:17;60779:33;60798:6;60806:5;60779:18;:33::i;:::-;60845:16;::::0;::::1;::::0;60976:12:::1;::::0;::::1;::::0;60946:14:::1;::::0;::::1;::::0;60759:53;;-1:-1:-1;;;;;;60845:16:0;;::::1;::::0;60946:26:::1;::::0;60759:53;;60946:26:::1;:::i;:::-;:42;;60938:80;;;::::0;-1:-1:-1;;;60938:80:0;;21162:2:1;60938:80:0::1;::::0;::::1;21144:21:1::0;21201:2;21181:18;;;21174:30;21240:27;21220:18;;;21213:55;21285:18;;60938:80:0::1;20960:349:1::0;60938:80:0::1;61089:8;:14;61098:4;-1:-1:-1::0;;;;;61089:14:0::1;-1:-1:-1::0;;;;;61089:14:0::1;;;;;;;;;;;;61109:267;;;;;;;;61142:11;-1:-1:-1::0;;;;;61109:267:0::1;;;;;61180:9;61109:267;;;;61216:5;61109:267;;;;61246:3;61109:267;;;;61282:15;61109:267;;;;;;61348:15;61329:4;:16;;;;;;;;;;;;:34;;;;;;:::i;:::-;61109:267;::::0;;::::1;::::0;;;61089:288;;::::1;::::0;;::::1;::::0;;-1:-1:-1;61089:288:0;;;::::1;::::0;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;61089:288:0;;::::1;-1:-1:-1::0;;;;;;61089:288:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;61089:288:0::1;-1:-1:-1::0;;61089:288:0;;;;;;::::1;::::0;;;;;;;::::1;::::0;;61420:14;::::1;:27:::0;;61438:9;;-1:-1:-1;61420:27:0::1;::::0;61438:9;;61420:27:::1;:::i;:::-;::::0;;;-1:-1:-1;;61465:50:0::1;::::0;;21516:25:1;;;21572:2;21557:18;;21550:34;;;21600:18;;;21593:34;;;61485:3:0;;-1:-1:-1;;;;;61465:50:0;::::1;::::0;::::1;::::0;21504:2:1;21489:18;61465:50:0::1;;;;;;;59144:2379;;;;;;;;;48991:20:::0;48385:1;49511:7;:22;49328:213;44852:144;44933:7;44960:18;;;:12;:18;;;;;:28;;44982:5;44960:21;:28::i;:::-;44953:35;44852:144;-1:-1:-1;;;44852:144:0:o;26128:138::-;26205:4;26229:12;;;;;;;;;;;-1:-1:-1;;;;;26229:29:0;;;;;;;;;;;;;;;26128:138::o;74504:375::-;-1:-1:-1;;;;;74642:27:0;;74602:4;74642:27;;;:15;:27;;;;;;;;74615:54;;;;;;;;;;;;;;;;;74602:4;;74615:54;;74642:27;74615:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74615:54:0;;-1:-1:-1;74680:9:0;;-1:-1:-1;;;;74676:181:0;74699:7;:14;74695:1;:18;74676:181;;;74769:10;-1:-1:-1;;;;;74733:46:0;:20;:32;74754:7;74762:1;74754:10;;;;;;;;:::i;:::-;;;;;;;;;;;;74733:32;;;;;;;;;;-1:-1:-1;74733:32:0;;-1:-1:-1;;;;;74733:32:0;:46;:68;;;;;74783:18;74790:7;74798:1;74790:10;;;;;;;;:::i;:::-;;;;;;;74783:6;:18::i;:::-;74730:120;;;74834:4;74827:11;;;;;;74730:120;74715:3;;74676:181;;;-1:-1:-1;74870:5:0;;74504:375;-1:-1:-1;;;;74504:375:0:o;62842:489::-;25485:4;25724:16;25485:4;25724:10;:16::i;:::-;-1:-1:-1;;;;;63009:25:0;::::1;63001:64;;;::::0;-1:-1:-1;;;63001:64:0;;21840:2:1;63001:64:0::1;::::0;::::1;21822:21:1::0;21879:2;21859:18;;;21852:30;21918:28;21898:18;;;21891:56;21964:18;;63001:64:0::1;21638:350:1::0;63001:64:0::1;63085:37;-1:-1:-1::0;;;;;;;;;;;63110:11:0::1;63085:7;:37::i;:::-;63084:38;63076:72;;;::::0;-1:-1:-1;;;63076:72:0;;22195:2:1;63076:72:0::1;::::0;::::1;22177:21:1::0;22234:2;22214:18;;;22207:30;-1:-1:-1;;;22253:18:1;;;22246:51;22314:18;;63076:72:0::1;21993:345:1::0;63076:72:0::1;63161:40;-1:-1:-1::0;;;;;;;;;;;63189:11:0::1;63161:10;:40::i;:::-;-1:-1:-1::0;;;;;;63212:35:0;::::1;;::::0;;;:22:::1;:35;::::0;;;;;:42;;-1:-1:-1;;63212:42:0::1;63250:4;63212:42;::::0;;63270:53;63312:10:::1;::::0;63212:35;-1:-1:-1;;;;;;;;;;;50657:28:0;63270:53:::1;::::0;63212:35;63270:53:::1;62842:489:::0;;:::o;66064:127::-;66126:4;66150:33;-1:-1:-1;;;;;;;;;;;66175:7:0;66150;:33::i;45856:138::-;45959:18;;;;:12;:18;;;;;45923:16;;45959:27;;:25;:27::i;57761:816::-;-1:-1:-1;;;;;;;;;;;25724:16:0;25735:4;25724:10;:16::i;:::-;74938:6:::1;::::0;::::1;;74937:7;74929:38;;;;-1:-1:-1::0;;;74929:38:0::1;;;;;;;:::i;:::-;57867:25:::2;::::0;;;:20:::2;:25;::::0;;;;;-1:-1:-1;;;;;57867:25:0::2;57896:10;57867:39;57859:75;;;::::0;-1:-1:-1;;;57859:75:0;;22545:2:1;57859:75:0::2;::::0;::::2;22527:21:1::0;22584:2;22564:18;;;22557:30;22623:25;22603:18;;;22596:53;22666:18;;57859:75:0::2;22343:347:1::0;57859:75:0::2;57967:5;57973:3;57967:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;:19:::2;:10;::::0;;::::2;;:19;::::0;::::2;;57949:15;:37;57941:72;;;::::0;-1:-1:-1;;;57941:72:0;;22897:2:1;57941:72:0::2;::::0;::::2;22879:21:1::0;22936:2;22916:18;;;22909:30;-1:-1:-1;;;22955:18:1;;;22948:52;23017:18;;57941:72:0::2;22695:346:1::0;57941:72:0::2;58022:18;58043:5;58049:3;58043:10;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;;:21:::0;58089:5:::2;:10:::0;;-1:-1:-1;;;;;58043:21:0;;::::2;::::0;-1:-1:-1;58089:5:0;58095:3;;58089:10;::::2;;;;;:::i;:::-;;;;;;;;;;;:28;;;58071:46;;58124:19;58161:10;-1:-1:-1::0;;;;;58146:35:0::2;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58221:8;::::0;58124:59;;-1:-1:-1;58192:14:0::2;::::0;58221:12;58217:102:::2;;58278:5;58266:8;;58256:7;:18;;;;:::i;:::-;58255:28;;;;:::i;:::-;58246:37:::0;-1:-1:-1;58294:17:0::2;58246:37:::0;58294:17;::::2;:::i;:::-;;;58217:102;58327:72;58359:10;58381:17;58385:13:::0;58381:2:::2;:17;:::i;:::-;58371:27;::::0;:7;:27:::2;:::i;:::-;-1:-1:-1::0;;;;;58327:31:0;::::2;::::0;:72;:31:::2;:72::i;:::-;58410:10:::0;;58406:100:::2;;58433:65;58465:4;58480:17;58484:13:::0;58480:2:::2;:17;:::i;:::-;58471:26;::::0;:6;:26:::2;:::i;58433:65::-;58519:54;::::0;;23442:25:1;;;23498:2;23483:18;;23476:34;;;58545:10:0::2;::::0;58540:3;;58519:54:::2;::::0;23415:18:1;58519:54:0::2;;;;;;;57852:725;;;;57761:816:::0;;:::o;64599:170::-;50830:33;25724:16;25735:4;25724:10;:16::i;:::-;64703:6:::1;:14:::0;;-1:-1:-1;;64703:14:0::1;::::0;;64733:28:::1;::::0;64750:10:::1;::::0;64733:28:::1;::::0;64712:5:::1;::::0;64733:28:::1;64599:170:::0;:::o;63339:298::-;25485:4;25724:16;25485:4;25724:10;:16::i;:::-;63465:41:::1;-1:-1:-1::0;;;;;;;;;;;63494:11:0::1;63465;:41::i;:::-;-1:-1:-1::0;;;;;;63517:35:0;::::1;63555:5;63517:35:::0;;;:22:::1;:35;::::0;;;;;:43;;-1:-1:-1;;63517:43:0::1;::::0;;63576:53;63618:10:::1;::::0;63517:35;-1:-1:-1;;;;;;;;;;;50657:28:0;63576:53:::1;::::0;63555:5;63576:53:::1;63339:298:::0;;:::o;52112:52::-;;;;;;;;;;;;;;;;;;;;51866:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51866:20:0;;;;-1:-1:-1;51866:20:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51866:20:0;;;;:::o;64776:237::-;25485:4;25724:16;25485:4;25724:10;:16::i;:::-;52382:4:::1;64869:10;:21;;;;64861:46;;;::::0;-1:-1:-1;;;64861:46:0;;23723:2:1;64861:46:0::1;::::0;::::1;23705:21:1::0;23762:2;23742:18;;;23735:30;-1:-1:-1;;;23781:18:1;;;23774:42;23833:18;;64861:46:0::1;23521:336:1::0;64861:46:0::1;64931:8;::::0;;64946:21:::1;::::0;::::1;::::0;;;;64979:30:::1;::::0;;24035:25:1;;;24091:2;24076:18;;24069:51;;;;64931:8:0;;64979:30:::1;::::0;24008:18:1;64979:30:0::1;;;;;;;64854:159;64776:237:::0;;:::o;66199:959::-;-1:-1:-1;;;;;66317:14:0;;66282:7;66317:14;;;:8;:14;;;;;:23;;66282:7;;66317:14;66332:7;;66317:23;;;;;;:::i;:::-;;;;;;;;;66298:42;;;;;;;;66317:23;;;;;;;66298:42;;-1:-1:-1;;;;;66298:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66298:42:0;;;;;;;;66367:5;:20;;66298:42;;-1:-1:-1;66367:5:0;:20;;;;;;:::i;:::-;;;;;;;;;;66347:40;;;;;;;;66367:20;;;;;;;66347:40;;-1:-1:-1;;;;;66347:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66347:40:0;;;;;;;;;66450:14;;;;66347:40;;-1:-1:-1;66432:32:0;:15;:32;66428:65;;;66484:1;66477:8;;;;;;66428:65;66542:19;66564:4;:16;;;66542:38;;;;66637:19;66677:4;:12;;;66659:30;;:15;:30;:99;;66744:14;;;;66726:32;;;;:15;:32;:::i;:::-;66659:99;;;66702:11;66659:99;66637:121;;66803:23;66847:11;66829:4;:15;;;:29;;;;:::i;:::-;66803:55;-1:-1:-1;66910:24:0;66937:29;66955:11;66803:55;66937:29;:::i;:::-;66910:56;;67053:4;:15;;;67034:16;:34;67030:93;;;-1:-1:-1;67100:15:0;;;;67030:93;67138:16;66199:959;-1:-1:-1;;;;;;;;66199:959:0:o;45170:133::-;45241:7;45268:18;;;:12;:18;;;;;:27;;:25;:27::i;65435:316::-;-1:-1:-1;;;;;65576:14:0;;65531:28;65576:14;;;:8;:14;;;;;:21;65498:16;;65531:28;65562:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65562:36:0;-1:-1:-1;65531:67:0;-1:-1:-1;65610:9:0;65605:114;-1:-1:-1;;;;;65629:14:0;;;;;;:8;:14;;;;;:21;65625:25;;65605:114;;;-1:-1:-1;;;;;65685:14:0;;;;;;:8;:14;;;;;:17;;65700:1;;65685:17;;;;;;:::i;:::-;;;;;;;;;;;:26;;;65668:11;65680:1;65668:14;;;;;;;;:::i;:::-;;;;;;;;;;:43;65652:3;;65605:114;;;-1:-1:-1;65732:11:0;65435:316;-1:-1:-1;;65435:316:0:o;51828:31::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51828:31:0;;-1:-1:-1;51828:31:0;:::o;27975:140::-;27177:7;27204:12;;;;;;;;;;:22;;;25724:16;25735:4;25724:10;:16::i;:::-;28081:26:::1;28093:4;28099:7;28081:11;:26::i;64179:232::-:0;50741:35;25724:16;25735:4;25724:10;:16::i;:::-;-1:-1:-1;;;;;64278:25:0;::::1;;::::0;;;:17:::1;:25;::::0;;;;;::::1;;64270:59;;;::::0;-1:-1:-1;;;64270:59:0;;24333:2:1;64270:59:0::1;::::0;::::1;24315:21:1::0;24372:2;24352:18;;;24345:30;-1:-1:-1;;;24391:18:1;;;24384:51;24452:18;;64270:59:0::1;24131:345:1::0;64270:59:0::1;-1:-1:-1::0;;;;;64336:25:0;::::1;64364:5;64336:25:::0;;;:17:::1;:25;::::0;;;;;;;;:33;;-1:-1:-1;;64336:33:0::1;::::0;;64381:26;;7623:51:1;;;64381:26:0::1;::::0;7596:18:1;64381:26:0::1;7477:203:1::0;54650:2603:0;54939:16;-1:-1:-1;;;;;;;;;;;25724:16:0;25735:4;25724:10;:16::i;:::-;74938:6:::1;::::0;::::1;;74937:7;74929:38;;;;-1:-1:-1::0;;;74929:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;55000:26:0;::::2;54992:59;;;::::0;-1:-1:-1;;;54992:59:0;;24683:2:1;54992:59:0::2;::::0;::::2;24665:21:1::0;24722:2;24702:18;;;24695:30;-1:-1:-1;;;24741:18:1;;;24734:50;24801:18;;54992:59:0::2;24481:344:1::0;54992:59:0::2;-1:-1:-1::0;;;;;55066:34:0;::::2;55058:66;;;::::0;-1:-1:-1;;;55058:66:0;;25032:2:1;55058:66:0::2;::::0;::::2;25014:21:1::0;25071:2;25051:18;;;25044:30;-1:-1:-1;;;25090:18:1;;;25083:49;25149:18;;55058:66:0::2;24830:343:1::0;55058:66:0::2;55163:12;-1:-1:-1::0;;;;;55139:36:0::2;55147:11;-1:-1:-1::0;;;;;55139:36:0::2;::::0;55131:73:::2;;;::::0;-1:-1:-1;;;55131:73:0;;25380:2:1;55131:73:0::2;::::0;::::2;25362:21:1::0;25419:2;25399:18;;;25392:30;25458:26;25438:18;;;25431:54;25502:18;;55131:73:0::2;25178:348:1::0;55131:73:0::2;-1:-1:-1::0;;;;;55219:31:0;::::2;;::::0;;;:17:::2;:31;::::0;;;;;::::2;;55211:65;;;::::0;-1:-1:-1;;;55211:65:0;;24333:2:1;55211:65:0::2;::::0;::::2;24315:21:1::0;24372:2;24352:18;;;24345:30;-1:-1:-1;;;24391:18:1;;;24384:51;24452:18;;55211:65:0::2;24131:345:1::0;55211:65:0::2;55292:61;55320:10;55340:11;55292:27;:61::i;:::-;55291:62;55283:109;;;::::0;-1:-1:-1;;;55283:109:0;;25733:2:1;55283:109:0::2;::::0;::::2;25715:21:1::0;25772:2;25752:18;;;25745:30;25811:34;25791:18;;;25784:62;-1:-1:-1;;;25862:18:1;;;25855:32;25904:19;;55283:109:0::2;25531:398:1::0;55283:109:0::2;55438:16:::0;;55457:15:::2;55438:34;::::0;;::::2;;55430:65;;;::::0;-1:-1:-1;;;55430:65:0;;26136:2:1;55430:65:0::2;::::0;::::2;26118:21:1::0;26175:2;26155:18;;;26148:30;-1:-1:-1;;;26194:18:1;;;26187:48;26252:18;;55430:65:0::2;25934:342:1::0;55430:65:0::2;55541:9:::0;;55533:44:::2;;;::::0;-1:-1:-1;;;55533:44:0;;26483:2:1;55533:44:0::2;::::0;::::2;26465:21:1::0;26522:2;26502:18;;;26495:30;-1:-1:-1;;;26541:18:1;;;26534:48;26599:18;;55533:44:0::2;26281:342:1::0;55533:44:0::2;55592:9;::::0;::::2;::::0;55584:54:::2;;;::::0;-1:-1:-1;;;55584:54:0;;26830:2:1;55584:54:0::2;::::0;::::2;26812:21:1::0;26869:2;26849:18;;;26842:30;26908;26888:18;;;26881:58;26956:18;;55584:54:0::2;26628:352:1::0;55584:54:0::2;55653:9:::0;;::::2;::::0;55645:51:::2;;;::::0;-1:-1:-1;;;55645:51:0;;27187:2:1;55645:51:0::2;::::0;::::2;27169:21:1::0;27226:2;27206:18;;;27199:30;27265:27;27245:18;;;27238:55;27310:18;;55645:51:0::2;26985:349:1::0;55645:51:0::2;55711:9:::0;;::::2;::::0;55703:46:::2;;;::::0;-1:-1:-1;;;55703:46:0;;27541:2:1;55703:46:0::2;::::0;::::2;27523:21:1::0;27580:2;27560:18;;;27553:30;-1:-1:-1;;;27599:18:1;;;27592:50;27659:18;;55703:46:0::2;27339:344:1::0;55703:46:0::2;55792:16:::0;;55762:27:::2;::::0;55792:34:::2;::::0;55811:15:::2;::::0;55792:34:::2;;;:::i;:::-;55762:64;;55863:1;55841:19;:23;55833:58;;;::::0;-1:-1:-1;;;55833:58:0;;27890:2:1;55833:58:0::2;::::0;::::2;27872:21:1::0;27929:2;27909:18;;;27902:30;-1:-1:-1;;;27948:18:1;;;27941:52;28010:18;;55833:58:0::2;27688:346:1::0;55833:58:0::2;55955:18;55997:5;55977:6:::0;55984:1:::2;55977:9;;;::::0;:16:::2;::::0;55989:4:::2;55977:16;:::i;:::-;55976:26;;;;:::i;:::-;55955:47:::0;-1:-1:-1;56064:19:0;56043:17:::2;55955:47:::0;56056:4:::2;56043:17;:::i;:::-;56042:41;;;;:::i;:::-;56029:54;;56185:20;56223:12;-1:-1:-1::0;;;;;56208:37:0::2;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56185:62:::0;-1:-1:-1;56255:96:0::2;56293:10;56313:4;56332:18;56185:62:::0;56332:2:::2;:18;:::i;:::-;56320:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;-1:-1:-1::0;;;;;56255:37:0;::::2;::::0;:96;;:37:::2;:96::i;:::-;56398:481;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;56398:481:0;;::::2;::::0;;;::::2;;::::0;::::2;::::0;56387:5:::2;::::0;56398:481;;56517:18:::2;56521:14:::0;56517:2:::2;:18;:::i;:::-;56505:9:::0;;:30:::2;::::0;;::::2;:::i;:::-;56398:481:::0;;56870:1:::2;56398:481;::::0;;::::2;::::0;;;;56564:9;::::2;::::0;56398:481;;;;;;56622:4:::2;56564:6:::0;56605:1:::2;56598:9;;;::::0;:20:::2;::::0;56610:8:::2;56598:20;:::i;:::-;56597:29;;;;:::i;:::-;56398:481:::0;;::::2;;56657:18;56661:14:::0;56657:2:::2;:18;:::i;:::-;56645:9:::0;;::::2;::::0;:30:::2;::::0;;::::2;:::i;:::-;56398:481;;;;56698:10;56398:481;;;;56737:1;56398:481;;;;56759:15;56398:481;;;;56794:13;56808:1;56794:16;;;;;;;:::i;:::-;;;;;56398:481;;;;;;56833:13;56847:1;56833:16;;;;;;;:::i;:::-;;;;;56398:481;;;;::::0;56387:493:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56387:493:0::2;;;;;-1:-1:-1::0;;;;;56387:493:0::2;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;56387:493:0::2;;;;;-1:-1:-1::0;;;;;56387:493:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56917:16;56936:13;;56917:32;;56956:16;:30;56973:12;-1:-1:-1::0;;;;;56956:30:0::2;-1:-1:-1::0;;;;;56956:30:0::2;;;;;;;;;;;;56992:8;56956:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57008:15;:37;57032:11;-1:-1:-1::0;;;;;57008:37:0::2;-1:-1:-1::0;;;;;57008:37:0::2;;;;;;;;;;;;57051:8;57008:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57100:10;57067:20;:30;57088:8;57067:30;;;;;;;;;;;;:43;;;;;-1:-1:-1::0;;;;;57067:43:0::2;;;;;-1:-1:-1::0;;;;;57067:43:0::2;;;;;;57125:13;;57123:15;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;57150:71:0;;::::2;::::0;;::::2;57165:8:::0;57150:71:::2;57211:6:::0;57218:1:::2;57211:9;;;;57150:71;;;;1247:25:1::0;;1235:2;1220:18;;1101:177;57150:71:0::2;;;;;;;;57241:8:::0;54650:2603;-1:-1:-1;;;;;;;;;54650:2603:0:o;68160:141::-;68231:14;68261:36;68283:4;68289:7;68261:21;:36::i;25832:204::-;25917:4;-1:-1:-1;;;;;;25941:47:0;;-1:-1:-1;;;25941:47:0;;:87;;-1:-1:-1;;;;;;;;;;23405:40:0;;;25992:36;23305:148;26481:105;26548:30;26559:4;22429:10;26548;:30::i;:::-;26481:105;:::o;8974:162::-;9084:43;;-1:-1:-1;;;;;28371:32:1;;;9084:43:0;;;28353:51:1;28420:18;;;28413:34;;;9057:71:0;;9077:5;;9099:14;;;;;28326:18:1;;9084:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9084:43:0;;;;;;;;;;;9057:19;:71::i;71249:139::-;71308:13;71359:17;71372:3;71359:12;:17::i;46101:263::-;46187:4;46204:12;46219:31;46236:4;46242:7;46219:16;:31::i;:::-;46204:46;;46265:7;46261:71;;;46289:18;;;;:12;:18;;;;;:31;;46312:7;46289:22;:31::i;46472:268::-;46559:4;46576:12;46591:32;46609:4;46615:7;46591:17;:32::i;:::-;46576:47;;46638:7;46634:74;;;46662:18;;;;:12;:18;;;;;:34;;46688:7;46662:25;:34::i;49027:293::-;48429:1;49161:7;;:19;49153:63;;;;-1:-1:-1;;;49153:63:0;;28660:2:1;49153:63:0;;;28642:21:1;28699:2;28679:18;;;28672:30;28738:33;28718:18;;;28711:61;28789:18;;49153:63:0;28458:355:1;49153:63:0;48429:1;49294:18;;49027:293::o;73956:340::-;74028:7;74146:1;74135:8;:12;;;74131:96;;;74176:12;74187:1;74176:8;:12;:::i;:::-;74169:20;;:2;:20;:::i;74131:96::-;-1:-1:-1;74244:1:0;;73956:340;-1:-1:-1;73956:340:0:o;69121:783::-;69223:16;;;;:11;:16;;;;;:23;;;;69194:26;;;;;:52;;69223:23;69194:52;:::i;:::-;69176:15;:70;69172:719;;;69259:18;69280:5;69286:3;69280:10;;;;;;;;:::i;:::-;;;;;;;;;69315:16;;;:11;:16;;;;;;;:20;69280:10;;;;;;;;-1:-1:-1;69315:20:0;;69311:500;;;69376:16;;;;:11;:16;;;;;:21;;;69352:20;;;:45;;69376:21;;69352:20;;:45;;69376:21;;69352:45;:::i;:::-;;;;-1:-1:-1;;69454:16:0;;;;:11;:16;;;;;:23;;;69430:20;;;;:47;69426:134;;69521:16;;;;:11;:16;;;;;:23;;;69498:20;;;:46;69426:134;69311:500;;;69616:16;;;;:11;:16;;;;;:21;;;69592:20;;;:45;;69616:21;;69592:20;;:45;;69616:21;;69592:45;:::i;:::-;;;;-1:-1:-1;;69694:16:0;;;;:11;:16;;;;;:23;;;69670:20;;;;:47;69666:134;;69761:16;;;;:11;:16;;;;;:23;;;69738:20;;;:46;69666:134;-1:-1:-1;69831:16:0;;;;:11;:16;;;;;69867:15;69831:52;;:26;;;;:52;69121:783::o;68612:495::-;68661:18;68682:5;68688:3;68682:10;;;;;;;;:::i;:::-;;;;;;;;;;;68661:31;;68705:19;68727:4;:14;;;68705:36;;68752:11;68767:1;68752:16;68748:29;;68770:7;;68612:495;:::o;68748:29::-;68785:26;68832:4;:14;;;68814:15;:32;;;;:::i;:::-;68785:61;;68857:18;68879:1;68857:23;68853:36;;68882:7;;;68612:495;:::o;68853:36::-;68957:16;;;;68903:13;;68957:22;;-1:-1:-1;;;68957:16:0;;;;68976:3;68957:22;:::i;:::-;68919:61;;68920:32;68934:18;68920:11;:32;:::i;:::-;68919:61;;;;:::i;:::-;68903:77;;69019:11;69011:5;:19;:45;;69037:19;69051:5;69037:11;:19;:::i;:::-;69011:45;;;69033:1;69011:45;68994:14;;;:62;-1:-1:-1;;;69063:40:0;69087:15;69063:40;:14;;;;:40;-1:-1:-1;68612:495:0:o;9381:190::-;9509:53;;-1:-1:-1;;;;;29443:32:1;;;9509:53:0;;;29425:51:1;29512:32;;;29492:18;;;29485:60;29561:18;;;29554:34;;;9482:81:0;;9502:5;;9524:18;;;;;29398::1;;9509:53:0;29223:371:1;69912:1315:0;69970:13;69992:17;70012:5;70018:3;70012:10;;;;;;;;:::i;:::-;;;;;;;;;69992:30;;;;;;;;70012:10;;;;;;;69992:30;;-1:-1:-1;;;;;69992:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;69992:30:0;;;;;;;;70120:52;;-1:-1:-1;;;70120:52:0;;;;69992:30;;-1:-1:-1;69992:30:0;70120:50;;:52;;;;70012:10;;70120:52;;;;;;69992:30;70120:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70097:75;;70179:19;70224:4;:15;;;-1:-1:-1;;;;;70201:49:0;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70179:73;;70317:17;70337:28;70361:3;70337:23;:28::i;:::-;70317:48;;70372:17;70392:15;70403:3;70392:10;:15::i;:::-;70372:35;-1:-1:-1;70568:19:0;70646:13;70624:19;70629:14;70624:2;:19;:::i;:::-;:35;;;;:::i;:::-;70617:43;;:2;:43;:::i;:::-;70591:21;70603:9;70591;:21;:::i;:::-;70590:71;;;;:::i;:::-;70568:93;-1:-1:-1;70861:4:0;70840:18;70861:4;70568:93;70840:18;:::i;:::-;:25;;;;:::i;:::-;70832:33;;70947:4;:17;;;70939:5;:25;70935:75;;;70985:4;:17;;;70977:25;;70935:75;71180:24;71200:4;-1:-1:-1;;71180:24:0;:::i;:::-;71171:5;:33;;71163:60;;;;-1:-1:-1;;;71163:60:0;;29801:2:1;71163:60:0;;;29783:21:1;29840:2;29820:18;;;29813:30;-1:-1:-1;;;29859:18:1;;;29852:44;29913:18;;71163:60:0;29599:338:1;71163:60:0;69985:1242;;;;;;69912:1315;;;:::o;74365:131::-;74447:7;74477:14;74486:5;74477:6;:14;:::i;40170:158::-;40244:7;40295:22;40299:3;40311:5;40295:3;:22::i;40878:282::-;40941:16;40970:22;40995:19;41003:3;40995:7;:19::i;39699:117::-;39762:7;39789:19;39797:3;35027:18;;34944:109;26722:201;26811:22;26819:4;26825:7;26811;:22::i;:::-;26806:110;;26857:47;;-1:-1:-1;;;26857:47:0;;-1:-1:-1;;;;;28371:32:1;;26857:47:0;;;28353:51:1;28420:18;;;28413:34;;;28326:18;;26857:47:0;28179:274:1;15567:738:0;15648:18;15677:19;15817:4;15814:1;15807:4;15801:11;15794:4;15788;15784:15;15781:1;15774:5;15767;15762:60;15876:7;15866:180;;15921:4;15915:11;15967:16;15964:1;15959:3;15944:40;16014:16;16009:3;16002:29;15866:180;-1:-1:-1;;16125:1:0;16119:8;16074:16;;-1:-1:-1;16154:15:0;;:68;;16206:11;16221:1;16206:16;;16154:68;;;-1:-1:-1;;;;;16172:26:0;;;:31;16154:68;16150:148;;;16246:40;;-1:-1:-1;;;16246:40:0;;-1:-1:-1;;;;;7641:32:1;;16246:40:0;;;7623:51:1;7596:18;;16246:40:0;7477:203:1;29558:324:0;29635:4;29657:22;29665:4;29671:7;29657;:22::i;:::-;29652:223;;29696:6;:12;;;;;;;;;;;-1:-1:-1;;;;;29696:29:0;;;;;;;;;:36;;-1:-1:-1;;29696:36:0;29728:4;29696:36;;;29779:12;22429:10;;22349:98;29779:12;-1:-1:-1;;;;;29752:40:0;29770:7;-1:-1:-1;;;;;29752:40:0;29764:4;29752:40;;;;;;;;;;-1:-1:-1;29814:4:0;29807:11;;29652:223;-1:-1:-1;29858:5:0;29851:12;;38874:152;38944:4;38968:50;38973:3;-1:-1:-1;;;;;38993:23:0;;38968:4;:50::i;30126:325::-;30204:4;30225:22;30233:4;30239:7;30225;:22::i;:::-;30221:223;;;30296:5;30264:12;;;;;;;;;;;-1:-1:-1;;;;;30264:29:0;;;;;;;;;;:37;;-1:-1:-1;;30264:37:0;;;30321:40;22429:10;;30264:12;;30321:40;;30296:5;30321:40;-1:-1:-1;30383:4:0;30376:11;;39202:158;39275:4;39299:53;39307:3;-1:-1:-1;;;;;39327:23:0;;39299:7;:53::i;72308:1580::-;72377:7;72393:17;72413:5;72419:3;72413:10;;;;;;;;:::i;:::-;;;;;;;;;72393:30;;;;;;;;72413:10;;;;;;;72393:30;;-1:-1:-1;;;;;72393:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;72393:30:0;;;;;;;;72457:16;;;;;;;;;72430:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72529:20;72393:30;;-1:-1:-1;72430:43:0;72627:15;72469:3;72627:10;:15::i;:::-;72600:42;;72649:26;72696:4;:13;;;72678:31;;:15;:31;:89;;72766:1;72678:89;;;72740:13;;;;72722:31;;;;:15;:31;:::i;:::-;72649:118;;72872:25;72928:4;:12;;;72901:16;72920:4;72901:23;;;;:::i;:::-;72900:40;;;;:::i;:::-;72872:68;-1:-1:-1;72984:19:0;73038:22;:18;73059:1;73038:22;:::i;:::-;73007:26;73016:17;73007:6;:26;:::i;:::-;73006:55;;;;:::i;:::-;72984:77;;73177:10;:17;;;73154:10;:20;;;:40;;;;:::i;:::-;73135:15;:59;73131:633;;73211:14;;73207:550;;;73296:15;;;;73286:25;;;;:::i;:::-;;;73395:10;:17;;;73386:6;:26;73382:93;;;73442:10;:17;;;73433:26;;73382:93;73207:550;;;73561:15;;;;73551:25;;;;:::i;:::-;;;73666:10;:17;;;73657:6;:26;73653:93;;;73713:10;:17;;;73704:26;;73653:93;73805:11;73796:6;:20;73792:72;;;73836:20;73845:11;73836:6;:20;:::i;:::-;73829:27;72308:1580;-1:-1:-1;;;;;;;;;72308:1580:0:o;73792:72::-;-1:-1:-1;73883:1:0;;72308:1580;-1:-1:-1;;;;;;;;72308:1580:0:o;71397:898::-;71453:7;71473:17;71493:5;71499:3;71493:10;;;;;;;;:::i;:::-;;;;;;;;;71473:30;;;;;;;;71493:10;;;;;;;71473:30;;-1:-1:-1;;;;;71473:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;71473:30:0;;;;;;;;71589:51;;-1:-1:-1;;;71589:51:0;;;;71473:30;;-1:-1:-1;71473:30:0;71589:49;;:51;;;;71493:10;;71589:51;;;;;;71473:30;71589:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71561:80;;71648:20;71700:4;:16;;;-1:-1:-1;;;;;71677:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;71648:82;-1:-1:-1;71812:17:0;71855:19;71648:82;71855:2;:19;:::i;:::-;71850:25;;:2;:25;:::i;:::-;71832:4;:14;;;:44;;;;:::i;:::-;71812:64;-1:-1:-1;71942:20:0;71998:18;72003:13;71998:2;:18;:::i;:::-;71991:26;;:2;:26;:::i;:::-;71965:4;:22;;;:53;;;;:::i;:::-;71942:76;;72068:12;72084:1;72068:17;72064:55;;-1:-1:-1;72106:4:0;;71397:898;-1:-1:-1;;;;;;71397:898:0:o;72064:55::-;72209:17;72250:12;72230:16;:9;72242:4;72230:16;:::i;:::-;72229:33;;;;:::i;35407:120::-;35474:7;35501:3;:11;;35513:5;35501:18;;;;;;;;:::i;:::-;;;;;;;;;35494:25;;35407:120;;;;:::o;36077:111::-;36133:16;36169:3;:11;;36162:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36077:111;;;:::o;32649:416::-;32712:4;34824:21;;;:14;;;:21;;;;;;32729:329;;-1:-1:-1;32772:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;32957:18;;32933:21;;;:14;;;:21;;;;;;:42;;;;32990:11;;33241:1400;33307:4;33438:21;;;:14;;;:21;;;;;;33476:13;;33472:1162;;33849:18;33870:12;33881:1;33870:8;:12;:::i;:::-;33917:18;;33849:33;;-1:-1:-1;33897:17:0;;33917:22;;33938:1;;33917:22;:::i;:::-;33897:42;;33974:9;33960:10;:23;33956:385;;34004:17;34024:3;:11;;34036:9;34024:22;;;;;;;;:::i;:::-;;;;;;;;;34004:42;;34174:9;34148:3;:11;;34160:10;34148:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;;;;34289:25;;;:14;;;:25;;;;;:36;;;33956:385;34422:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34528:3;:14;;:21;34543:5;34528:21;;;;;;;;;;;34521:28;;;34573:4;34566:11;;;;;;;33472:1162;34617:5;34610:12;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:286:1:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;593:131;-1:-1:-1;;;;;668:31:1;;658:42;;648:70;;714:1;711;704:12;729:367;797:6;805;858:2;846:9;837:7;833:23;829:32;826:52;;;874:1;871;864:12;826:52;913:9;900:23;932:31;957:5;932:31;:::i;:::-;982:5;1060:2;1045:18;;;;1032:32;;-1:-1:-1;;;729:367:1:o;1283:610::-;1369:6;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1486:9;1473:23;1519:18;1511:6;1508:30;1505:50;;;1551:1;1548;1541:12;1505:50;1574:22;;1627:4;1619:13;;1615:27;-1:-1:-1;1605:55:1;;1656:1;1653;1646:12;1605:55;1696:2;1683:16;1722:18;1714:6;1711:30;1708:50;;;1754:1;1751;1744:12;1708:50;1807:7;1802:2;1792:6;1789:1;1785:14;1781:2;1777:23;1773:32;1770:45;1767:65;;;1828:1;1825;1818:12;1767:65;1859:2;1851:11;;;;;1881:6;;-1:-1:-1;1283:610:1;-1:-1:-1;;;1283:610:1:o;2007:787::-;2094:12;;-1:-1:-1;;;;;1964:31:1;1952:44;;2158:4;2151:5;2147:16;2141:23;2173:48;2215:4;2210:3;2206:14;2192:12;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2173:48;;2270:4;2263:5;2259:16;2253:23;2246:4;2241:3;2237:14;2230:47;2326:4;2319:5;2315:16;2309:23;2302:4;2297:3;2293:14;2286:47;2382:4;2375:5;2371:16;2365:23;2358:4;2353:3;2349:14;2342:47;2438:4;2431:5;2427:16;2421:23;2414:4;2409:3;2405:14;2398:47;2493:4;2486:5;2482:16;2476:23;2508:50;2552:4;2547:3;2543:14;2527;-1:-1:-1;;;;;1964:31:1;1952:44;;1898:104;2508:50;;2606:4;2599:5;2595:16;2589:23;2621:47;2662:4;2657:3;2653:14;2637;375:13;368:21;356:34;;305:91;2621:47;-1:-1:-1;2719:6:1;2708:18;;;2702:25;2684:16;;;2677:51;2779:6;2768:18;;;2762:25;2744:16;;2737:51;2007:787::o;2799:705::-;3053:2;3065:21;;;3135:13;;3038:18;;;3157:22;;;3005:4;;3236:15;;;3210:2;3195:18;;;3005:4;3279:199;3293:6;3290:1;3287:13;3279:199;;;3342:52;3390:3;3381:6;3375:13;3342:52;:::i;:::-;3465:2;3453:15;;;;;3423:6;3414:16;;;;;3315:1;3308:9;3279:199;;;-1:-1:-1;3495:3:1;;2799:705;-1:-1:-1;;;;;2799:705:1:o;3509:226::-;3568:6;3621:2;3609:9;3600:7;3596:23;3592:32;3589:52;;;3637:1;3634;3627:12;3589:52;-1:-1:-1;3682:23:1;;3509:226;-1:-1:-1;3509:226:1:o;3740:268::-;3938:3;3923:19;;3951:51;3927:9;3984:6;3951:51;:::i;4013:247::-;4072:6;4125:2;4113:9;4104:7;4100:23;4096:32;4093:52;;;4141:1;4138;4131:12;4093:52;4180:9;4167:23;4199:31;4224:5;4199:31;:::i;4265:611::-;4455:2;4467:21;;;4537:13;;4440:18;;;4559:22;;;4407:4;;4638:15;;;4612:2;4597:18;;;4407:4;4681:169;4695:6;4692:1;4689:13;4681:169;;;4756:13;;4744:26;;4799:2;4825:15;;;;4790:12;;;;4717:1;4710:9;4681:169;;5294:367;5362:6;5370;5423:2;5411:9;5402:7;5398:23;5394:32;5391:52;;;5439:1;5436;5429:12;5391:52;5484:23;;;-1:-1:-1;5583:2:1;5568:18;;5555:32;5596:33;5555:32;5596:33;:::i;:::-;5648:7;5638:17;;;5294:367;;;;;:::o;6634:487::-;6711:6;6719;6727;6780:2;6768:9;6759:7;6755:23;6751:32;6748:52;;;6796:1;6793;6786:12;6748:52;6841:23;;;-1:-1:-1;6961:2:1;6946:18;;6933:32;;-1:-1:-1;7043:2:1;7028:18;;7015:32;7056:33;7015:32;7056:33;:::i;:::-;7108:7;7098:17;;;6634:487;;;;;:::o;7126:346::-;7194:6;7202;7255:2;7243:9;7234:7;7230:23;7226:32;7223:52;;;7271:1;7268;7261:12;7223:52;-1:-1:-1;;7316:23:1;;;7436:2;7421:18;;;7408:32;;-1:-1:-1;7126:346:1:o;7685:388::-;7753:6;7761;7814:2;7802:9;7793:7;7789:23;7785:32;7782:52;;;7830:1;7827;7820:12;7782:52;7869:9;7856:23;7888:31;7913:5;7888:31;:::i;:::-;7938:5;-1:-1:-1;7995:2:1;7980:18;;7967:32;8008:33;7967:32;8008:33;:::i;8078:637::-;8268:2;8280:21;;;8350:13;;8253:18;;;8372:22;;;8220:4;;8451:15;;;8425:2;8410:18;;;8220:4;8494:195;8508:6;8505:1;8502:13;8494:195;;;8573:13;;-1:-1:-1;;;;;8569:39:1;8557:52;;8638:2;8664:15;;;;8629:12;;;;8605:1;8523:9;8494:195;;10256:163;10323:20;;10383:10;10372:22;;10362:33;;10352:61;;10409:1;10406;10399:12;10352:61;10256:163;;;:::o;10424:184::-;10482:6;10535:2;10523:9;10514:7;10510:23;10506:32;10503:52;;;10551:1;10548;10541:12;10503:52;10574:28;10592:9;10574:28;:::i;10613:127::-;10674:10;10669:3;10665:20;10662:1;10655:31;10705:4;10702:1;10695:15;10729:4;10726:1;10719:15;10745:372;10816:2;10810:9;10881:2;10862:13;;-1:-1:-1;;10858:27:1;10846:40;;10916:18;10901:34;;10937:22;;;10898:62;10895:185;;;11002:10;10997:3;10993:20;10990:1;10983:31;11037:4;11034:1;11027:15;11065:4;11062:1;11055:15;10895:185;11096:2;11089:22;10745:372;;-1:-1:-1;10745:372:1:o;11122:566::-;11171:5;11224:3;11217:4;11209:6;11205:17;11201:27;11191:55;;11242:1;11239;11232:12;11191:55;11343:19;11321:2;11343:19;:::i;:::-;11386:3;11424:2;11416:6;11412:15;11450:3;11442:6;11439:15;11436:35;;;11467:1;11464;11457:12;11436:35;11491:6;11506:151;11522:6;11517:3;11514:15;11506:151;;;11590:22;11608:3;11590:22;:::i;:::-;11578:35;;11642:4;11633:14;;;;11539;11506:151;;11693:1115;11837:6;11845;11853;11861;11914:3;11902:9;11893:7;11889:23;11885:33;11882:53;;;11931:1;11928;11921:12;11882:53;11970:9;11957:23;11989:31;12014:5;11989:31;:::i;:::-;12039:5;-1:-1:-1;12096:2:1;12081:18;;12068:32;12109:33;12068:32;12109:33;:::i;:::-;12161:7;-1:-1:-1;12206:2:1;12191:18;;12187:32;-1:-1:-1;12177:60:1;;12233:1;12230;12223:12;12177:60;12335:20;12312:3;12335:20;:::i;:::-;12377:3;12418;12407:9;12403:19;12445:7;12437:6;12434:19;12431:39;;;12466:1;12463;12456:12;12431:39;12505:2;12494:9;12490:18;12517:202;12533:6;12528:3;12525:15;12517:202;;;12627:17;;12657:20;;12706:2;12697:12;;;;12550;12517:202;;;12521:3;12738:5;12728:15;;12762:40;12794:7;12786:6;12762:40;:::i;:::-;12752:50;;;;;11693:1115;;;;;;;:::o;12813:127::-;12874:10;12869:3;12865:20;12862:1;12855:31;12905:4;12902:1;12895:15;12929:4;12926:1;12919:15;12945:342;13147:2;13129:21;;;13186:2;13166:18;;;13159:30;-1:-1:-1;;;13220:2:1;13205:18;;13198:48;13278:2;13263:18;;12945:342::o;13634:127::-;13695:10;13690:3;13686:20;13683:1;13676:31;13726:4;13723:1;13716:15;13750:4;13747:1;13740:15;13766:128;13833:9;;;13854:11;;;13851:37;;;13868:18;;:::i;13899:273::-;13967:6;14020:2;14008:9;13999:7;13995:23;13991:32;13988:52;;;14036:1;14033;14026:12;13988:52;14068:9;14062:16;14118:4;14111:5;14107:16;14100:5;14097:27;14087:55;;14138:1;14135;14128:12;14177:375;14265:1;14283:5;14297:249;14318:1;14308:8;14305:15;14297:249;;;14368:4;14363:3;14359:14;14353:4;14350:24;14347:50;;;14377:18;;:::i;:::-;14427:1;14417:8;14413:16;14410:49;;;14441:16;;;;14410:49;14524:1;14520:16;;;;;14480:15;;14297:249;;;14177:375;;;;;;:::o;14557:902::-;14606:5;14636:8;14626:80;;-1:-1:-1;14677:1:1;14691:5;;14626:80;14725:4;14715:76;;-1:-1:-1;14762:1:1;14776:5;;14715:76;14807:4;14825:1;14820:59;;;;14893:1;14888:174;;;;14800:262;;14820:59;14850:1;14841:10;;14864:5;;;14888:174;14925:3;14915:8;14912:17;14909:43;;;14932:18;;:::i;:::-;-1:-1:-1;;14988:1:1;14974:16;;15047:5;;14800:262;;15146:2;15136:8;15133:16;15127:3;15121:4;15118:13;15114:36;15108:2;15098:8;15095:16;15090:2;15084:4;15081:12;15077:35;15074:77;15071:203;;;-1:-1:-1;15183:19:1;;;15259:5;;15071:203;15306:42;-1:-1:-1;;15331:8:1;15325:4;15306:42;:::i;:::-;15384:6;15380:1;15376:6;15372:19;15363:7;15360:32;15357:58;;;15395:18;;:::i;:::-;15433:20;;14557:902;-1:-1:-1;;;14557:902:1:o;15464:140::-;15522:5;15551:47;15592:4;15582:8;15578:19;15572:4;15551:47;:::i;15609:168::-;15682:9;;;15713;;15730:15;;;15724:22;;15710:37;15700:71;;15751:18;;:::i;17898:136::-;17937:3;17965:5;17955:39;;17974:18;;:::i;:::-;-1:-1:-1;;;18010:18:1;;17898:136::o;18039:125::-;18104:9;;;18125:10;;;18122:36;;;18138:18;;:::i;18169:127::-;18230:10;18225:3;18221:20;18218:1;18211:31;18261:4;18258:1;18251:15;18285:4;18282:1;18275:15;20417:184;20487:6;20540:2;20528:9;20519:7;20515:23;20511:32;20508:52;;;20556:1;20553;20546:12;20508:52;-1:-1:-1;20579:16:1;;20417:184;-1:-1:-1;20417:184:1:o;23046:217::-;23086:1;23112;23102:132;;23156:10;23151:3;23147:20;23144:1;23137:31;23191:4;23188:1;23181:15;23219:4;23216:1;23209:15;23102:132;-1:-1:-1;23248:9:1;;23046:217::o;28039:135::-;28078:3;28099:17;;;28096:43;;28119:18;;:::i;:::-;-1:-1:-1;28166:1:1;28155:13;;28039:135::o;28818:151::-;28908:4;28901:12;;;28887;;;28883:31;;28926:14;;28923:40;;;28943:18;;:::i;28974:244::-;29085:10;29058:18;;;29078;;;29054:43;29117:28;;;;29164:24;;;29154:58;;29192:18;;:::i
Swarm Source
ipfs://4fdaa3d017ab4562926bae6e2910dd27e5e6bf03649a7b95d434a6fa701adc4c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.