Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 171 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 21950593 | 47 days ago | IN | 0 ETH | 0.0000295 | ||||
Approve | 21950592 | 47 days ago | IN | 0 ETH | 0.00002655 | ||||
Approve | 21949300 | 48 days ago | IN | 0 ETH | 0.0000354 | ||||
Approve | 21555388 | 103 days ago | IN | 0 ETH | 0.00015959 | ||||
Approve | 21555386 | 103 days ago | IN | 0 ETH | 0.00016743 | ||||
Approve | 20434681 | 259 days ago | IN | 0 ETH | 0.00058029 | ||||
Approve | 20434641 | 259 days ago | IN | 0 ETH | 0.00059433 | ||||
Transfer | 19874152 | 337 days ago | IN | 0 ETH | 0.00052356 | ||||
Approve | 19845052 | 341 days ago | IN | 0 ETH | 0.00026982 | ||||
Approve | 19841986 | 342 days ago | IN | 0 ETH | 0.00020447 | ||||
Transfer | 19837231 | 343 days ago | IN | 0 ETH | 0.00038053 | ||||
Approve | 18886680 | 476 days ago | IN | 0 ETH | 0.00107327 | ||||
Transfer | 18334247 | 553 days ago | IN | 0 ETH | 0.0002496 | ||||
Transfer | 18311459 | 556 days ago | IN | 0 ETH | 0.00036438 | ||||
Transfer | 18306789 | 557 days ago | IN | 0 ETH | 0.00054598 | ||||
Transfer | 18293590 | 559 days ago | IN | 0 ETH | 0.00038153 | ||||
Approve | 18293559 | 559 days ago | IN | 0 ETH | 0.00053279 | ||||
Transfer | 18293557 | 559 days ago | IN | 0 ETH | 0.00055313 | ||||
Transfer | 18270396 | 562 days ago | IN | 0 ETH | 0.00059974 | ||||
Transfer | 18270284 | 562 days ago | IN | 0 ETH | 0.00062271 | ||||
Transfer | 18270251 | 562 days ago | IN | 0 ETH | 0.00088792 | ||||
Approve | 18269990 | 562 days ago | IN | 0 ETH | 0.00060025 | ||||
Transfer | 18269983 | 562 days ago | IN | 0 ETH | 0.00045445 | ||||
Transfer | 18265140 | 563 days ago | IN | 0 ETH | 0.00108749 | ||||
Transfer | 18229333 | 568 days ago | IN | 0 ETH | 0.00068284 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
CUSD
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-16 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 { /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 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 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @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). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /* * @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 GSN 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 returns (address payable) { return payable(msg.sender); } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; address private _newOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Accept the ownership transfer. This is to make sure that the contract is * transferred to a working address * * Can only be called by the newly transfered owner. */ function acceptOwnership() public { require(_msgSender() == _newOwner, "Ownable: only new owner can accept ownership"); address oldOwner = _owner; _owner = _newOwner; _newOwner = address(0); emit OwnershipTransferred(oldOwner, _owner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _newOwner = newOwner; } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotFrozen` and `whenFrozen`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context, Ownable { /** * @dev Emitted when the freeze is triggered by `account`. */ event Frozen(address account); /** * @dev Emitted when the freeze is lifted by `account`. */ event Unfrozen(address account); bool private _frozen; /** * @dev Initializes the contract in unfrozen state. */ constructor () { _frozen = false; } /** * @dev Returns true if the contract is frozen, and false otherwise. */ function frozen() public view returns (bool) { return _frozen; } /** * @dev Modifier to make a function callable only when the contract is not frozen. * * Requirements: * * - The contract must not be frozen. */ modifier whenNotFrozen() { require(!frozen(), "Freezable: frozen"); _; } /** * @dev Modifier to make a function callable only when the contract is frozen. * * Requirements: * * - The contract must be frozen. */ modifier whenFrozen() { require(frozen(), "Freezable: frozen"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be frozen. */ function _freeze() internal whenNotFrozen { _frozen = true; emit Frozen(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - Can only be called by the current owner. * - The contract must be frozen. */ function _unfreeze() internal whenFrozen { _frozen = false; emit Unfrozen(_msgSender()); } } /** * @title Blacklistable Token * @dev Allows accounts to be blacklisted by a "blacklister" role */ contract Blacklistable is Context, Ownable { mapping(address => bool) internal _blacklisted; event Blacklisted(address indexed account_); event UnBlacklisted(address indexed account_); event BlacklisterChanged(address indexed newBlacklister_); /** * @dev Throws if argument account is blacklisted * @param account_ The address to check */ modifier notBlacklisted(address account_) { require(!_blacklisted[account_], "Blacklistable: account is blacklisted"); _; } /** * @dev Checks if account is blacklisted * @param account_ The address to check */ function isBlacklisted(address account_) external view returns (bool) { return _blacklisted[account_]; } /** * @dev Adds account to blacklist * @param account_ The address to blacklist */ function blacklist(address account_) external onlyOwner { _blacklisted[account_] = true; emit Blacklisted(account_); } /** * @dev Removes account from blacklist * @param account_ The address to remove from the blacklist */ function unBlacklist(address account_) external onlyOwner { _blacklisted[account_] = false; emit UnBlacklisted(account_); } } /** * @dev Enable owner to withdraw tokens that wrongly sent to the contract */ contract Withdrawable is Ownable { using SafeERC20 for IERC20; /// @dev Emit `Withdrawn` when owner withdraw fund from the contract event Withdrawn(address indexed owner, address indexed recipient, address indexed token, uint256 value); /// @dev withdraw token from contract /// @param token_ address of the token, use address(0) to withdraw gas token /// @param destination_ recipient address to receive the fund /// @param amount_ amount of fund to withdaw function withdraw(address token_, address destination_, uint256 amount_) external onlyOwner { require(destination_ != address(0), "Withdrawable: Destination is zero address"); uint256 availableAmount; if(token_ == address(0)) { availableAmount = address(this).balance; } else { availableAmount = IERC20(token_).balanceOf(address(this)); } require(amount_ <= availableAmount, "Withdrawable: Not enough balance"); if(token_ == address(0)) { destination_.call{value:amount_}(""); } else { IERC20(token_).safeTransfer(destination_, amount_); } emit Withdrawn(_msgSender(), destination_, token_, amount_); } /// @dev withdraw NFT from contract /// @param token_ address of the token, use address(0) to withdraw gas token /// @param destination_ recipient address to receive the fund /// @param tokenId_ ID of NFT to withdraw function withdrawNft(address token_, address destination_, uint256 tokenId_) external onlyOwner { require(destination_ != address(0), "Withdrawable: destination is zero address"); IERC721(token_).transferFrom(address(this), destination_, tokenId_); emit Withdrawn(_msgSender(), destination_, token_, 1); } } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract CUSD is Context, Ownable, Pausable, Blacklistable, Withdrawable, IERC20 { using SafeMath for uint256; uint256 private _totalSupply; string private constant _name = "Coin98 Dollar"; string private constant _symbol = "CUSD"; uint8 private constant _decimals = 18; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; address private _minter; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor() { _minter = _msgSender(); } /** @dev Emit when new minter is assigned */ event MinterUpdated(address indexed previousMinter, address indexed newMinter); /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** @dev Extra address which has priviledge to mint more token */ function minter() public view returns (address) { return _minter; } /** * @dev Throws if called by any account other than the owner or minter. */ modifier onlyMinter() { require(owner() == _msgSender() || _minter == _msgSender(), "ERC20: caller is not minter"); _; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public override notBlacklisted(_msgSender()) notBlacklisted(recipient) returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public override notBlacklisted(_msgSender()) notBlacklisted(spender) returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public override notBlacklisted(_msgSender()) notBlacklisted(sender) notBlacklisted(recipient) returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public notBlacklisted(_msgSender()) notBlacklisted(spender) returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public notBlacklisted(_msgSender()) notBlacklisted(spender) returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Issues `amount` tokens to the designated `address`. * * Can only be called by the current owner. * See {ERC20-_mint}. */ function mint(address account, uint256 amount) public onlyMinter notBlacklisted(_msgSender()) notBlacklisted(account) { _mint(account, amount); } /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public notBlacklisted(_msgSender()) { _burn(_msgSender(), amount); } /** * @dev Disable the {transfer}, {mint} and {burn} functions of contract. * * Can only be called by the current owner. * The contract must not be frozen. */ function freeze() public onlyOwner { _freeze(); } /** * @dev Enable the {transfer}, {mint} and {burn} functions of contract. * * Can only be called by the current owner. * The contract must be frozen. */ function unfreeze() public onlyOwner { _unfreeze(); } /** * @dev Set new minter */ function setMinter(address newMinter) public onlyOwner { address oldMinter = _minter; _minter = newMinter; emit MinterUpdated(oldMinter, newMinter); } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal { require(!frozen(), "ERC20: token transfer while frozen"); } function _afterTokenTransfer( address from, address to, uint256 amount ) internal {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account_","type":"address"}],"name":"Blacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newBlacklister_","type":"address"}],"name":"BlacklisterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Frozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousMinter","type":"address"},{"indexed":true,"internalType":"address","name":"newMinter","type":"address"}],"name":"MinterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account_","type":"address"}],"name":"UnBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unfrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"frozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newMinter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"unBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unfreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"destination_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"address","name":"destination_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"withdrawNft","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506000620000246200013360201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000600160146101000a81548160ff021916908315150217905550620000ed6200013360201b60201c565b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200013b565b600033905090565b613d23806200014b6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063d6b7277211610097578063f2fde38b11610071578063f2fde38b1461045f578063f9f92be41461047b578063fca3b5aa14610497578063fe575a87146104b35761018e565b8063d6b72772146103f7578063d9caed1214610413578063dd62ed3e1461042f5761018e565b806370a082311461032157806379ba5097146103515780638da5cb5b1461035b57806395d89b4114610379578063a457c2d714610397578063a9059cbb146103c75761018e565b806323b872dd1161014b57806340c10f191161012557806340c10f19146102d557806342966c68146102f157806362a5af3b1461030d5780636a28f000146103175761018e565b806323b872dd14610257578063313ce5671461028757806339509351146102a55761018e565b8063054f7d9c1461019357806306fdde03146101b157806307546172146101cf578063095ea7b3146101ed57806318160ddd1461021d5780631a8952661461023b575b600080fd5b61019b6104e3565b6040516101a89190612c22565b60405180910390f35b6101b96104fa565b6040516101c69190612cd6565b60405180910390f35b6101d7610537565b6040516101e49190612d39565b60405180910390f35b61020760048036038101906102029190612dbb565b610561565b6040516102149190612c22565b60405180910390f35b6102256106a4565b6040516102329190612e0a565b60405180910390f35b61025560048036038101906102509190612e25565b6106ae565b005b610271600480360381019061026c9190612e52565b6107c8565b60405161027e9190612c22565b60405180910390f35b61028f610a55565b60405161029c9190612ec1565b60405180910390f35b6102bf60048036038101906102ba9190612dbb565b610a5e565b6040516102cc9190612c22565b60405180910390f35b6102ef60048036038101906102ea9190612dbb565b610c36565b005b61030b60048036038101906103069190612edc565b610e44565b005b610315610eee565b005b61031f610f74565b005b61033b60048036038101906103369190612e25565b610ffa565b6040516103489190612e0a565b60405180910390f35b610359611043565b005b610363611221565b6040516103709190612d39565b60405180910390f35b61038161124a565b60405161038e9190612cd6565b60405180910390f35b6103b160048036038101906103ac9190612dbb565b611287565b6040516103be9190612c22565b60405180910390f35b6103e160048036038101906103dc9190612dbb565b611479565b6040516103ee9190612c22565b60405180910390f35b610411600480360381019061040c9190612e52565b6115bc565b005b61042d60048036038101906104289190612e52565b61179f565b005b61044960048036038101906104449190612f09565b611ade565b6040516104569190612e0a565b60405180910390f35b61047960048036038101906104749190612e25565b611b65565b005b61049560048036038101906104909190612e25565b611c94565b005b6104b160048036038101906104ac9190612e25565b611dae565b005b6104cd60048036038101906104c89190612e25565b611ef0565b6040516104da9190612c22565b60405180910390f35b6000600160149054906101000a900460ff16905090565b60606040518060400160405280600d81526020017f436f696e393820446f6c6c617200000000000000000000000000000000000000815250905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061056b611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156105f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ef90612fbb565b60405180910390fd5b83600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067d90612fbb565b60405180910390fd5b610698610691611f46565b8686611f4e565b60019250505092915050565b6000600354905090565b6106b6611f46565b73ffffffffffffffffffffffffffffffffffffffff166106d4611221565b73ffffffffffffffffffffffffffffffffffffffff161461072a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072190613027565b60405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e60405160405180910390a250565b60006107d2611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085690612fbb565b60405180910390fd5b84600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490612fbb565b60405180910390fd5b84600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097290612fbb565b60405180910390fd5b610986878787612117565b610a4787610992611f46565b610a4288604051806060016040528060288152602001613ca160289139600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109f8611f46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123ae9092919063ffffffff16565b611f4e565b600193505050509392505050565b60006012905090565b6000610a68611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aec90612fbb565b60405180910390fd5b83600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90612fbb565b60405180910390fd5b610c2a610b8e611f46565b86610c258760056000610b9f611f46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461240390919063ffffffff16565b611f4e565b60019250505092915050565b610c3e611f46565b73ffffffffffffffffffffffffffffffffffffffff16610c5c611221565b73ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c81611f46565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890613093565b60405180910390fd5b610d19611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d90612fbb565b60405180910390fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90612fbb565b60405180910390fd5b610e3e8484612419565b50505050565b610e4c611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090612fbb565b60405180910390fd5b610eea610ee4611f46565b836125ae565b5050565b610ef6611f46565b73ffffffffffffffffffffffffffffffffffffffff16610f14611221565b73ffffffffffffffffffffffffffffffffffffffff1614610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6190613027565b60405180910390fd5b610f7261275d565b565b610f7c611f46565b73ffffffffffffffffffffffffffffffffffffffff16610f9a611221565b73ffffffffffffffffffffffffffffffffffffffff1614610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe790613027565b60405180910390fd5b610ff86127ff565b565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611084611f46565b73ffffffffffffffffffffffffffffffffffffffff16146110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190613125565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f4355534400000000000000000000000000000000000000000000000000000000815250905090565b6000611291611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590612fbb565b60405180910390fd5b83600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390612fbb565b60405180910390fd5b61146d6113b7611f46565b8661146887604051806060016040528060258152602001613cc960259139600560006113e1611f46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123ae9092919063ffffffff16565b611f4e565b60019250505092915050565b6000611483611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150790612fbb565b60405180910390fd5b83600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561159e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159590612fbb565b60405180910390fd5b6115b06115a9611f46565b8686612117565b60019250505092915050565b6115c4611f46565b73ffffffffffffffffffffffffffffffffffffffff166115e2611221565b73ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90613027565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e906131b7565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3084846040518463ffffffff1660e01b81526004016116e4939291906131d7565b600060405180830381600087803b1580156116fe57600080fd5b505af1158015611712573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1661174c611f46565b73ffffffffffffffffffffffffffffffffffffffff167fa4195c37c2947bbe89165f03e320b6903116f0b10d8cfdb522330f7ce6f9fa2460016040516117929190613253565b60405180910390a4505050565b6117a7611f46565b73ffffffffffffffffffffffffffffffffffffffff166117c5611221565b73ffffffffffffffffffffffffffffffffffffffff161461181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290613027565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361188a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611881906132e0565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036118c757479050611944565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119009190612d39565b602060405180830381865afa15801561191d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119419190613315565b90505b80821115611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e9061338e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a29578273ffffffffffffffffffffffffffffffffffffffff16826040516119df906133df565b60006040518083038185875af1925050503d8060008114611a1c576040519150601f19603f3d011682016040523d82523d6000602084013e611a21565b606091505b505050611a55565b611a5483838673ffffffffffffffffffffffffffffffffffffffff166128a19092919063ffffffff16565b5b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16611a8b611f46565b73ffffffffffffffffffffffffffffffffffffffff167fa4195c37c2947bbe89165f03e320b6903116f0b10d8cfdb522330f7ce6f9fa2485604051611ad09190612e0a565b60405180910390a450505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b6d611f46565b73ffffffffffffffffffffffffffffffffffffffff16611b8b611221565b73ffffffffffffffffffffffffffffffffffffffff1614611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd890613027565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4790613466565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c9c611f46565b73ffffffffffffffffffffffffffffffffffffffff16611cba611221565b73ffffffffffffffffffffffffffffffffffffffff1614611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790613027565b60405180910390fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b85560405160405180910390a250565b611db6611f46565b73ffffffffffffffffffffffffffffffffffffffff16611dd4611221565b73ffffffffffffffffffffffffffffffffffffffff1614611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2190613027565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f1cf2de25c5bf439ac0287061c3a0fa69b3b02867d0ccfd2ded34e42577050b7360405160405180910390a35050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb4906134f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361202c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120239061358a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161210a9190612e0a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217d9061361c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ec906136ae565b60405180910390fd5b612200838383612927565b61226c81604051806060016040528060268152602001613c7b60269139600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123ae9092919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061230181600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461240390919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516123a19190612e0a565b60405180910390a3505050565b60008383111582906123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed9190612cd6565b60405180910390fd5b5082840390509392505050565b6000818361241191906136fd565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247f9061379f565b60405180910390fd5b61249460008383612927565b6124a98160035461240390919063ffffffff16565b60038190555061250181600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461240390919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516125a29190612e0a565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361261d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261490613831565b60405180910390fd5b61262982600083612927565b61269581604051806060016040528060228152602001613c5960229139600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123ae9092919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506126ed8160035461297490919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516127519190612e0a565b60405180910390a35050565b6127656104e3565b156127a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279c9061389d565b60405180910390fd5b60018060146101000a81548160ff0219169083151502179055507f8a5c4736a33c7b7f29a2c34ea9ff9608afc5718d56f6fd6dcbd2d3711a1a49136127e8611f46565b6040516127f59190613912565b60405180910390a1565b6128076104e3565b612846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283d9061389d565b60405180910390fd5b6000600160146101000a81548160ff0219169083151502179055507f4feb53e305297ab8fb8f3420c95ea04737addc254a7270d8fc4605d2b9c61dba61288a611f46565b6040516128979190613912565b60405180910390a1565b6129228363a9059cbb60e01b84846040516024016128c092919061392d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061298a565b505050565b61292f6104e3565b1561296f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612966906139c8565b60405180910390fd5b505050565b6000818361298291906139e8565b905092915050565b60006129ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a519092919063ffffffff16565b9050600081511115612a4c5780806020019051810190612a0c9190613a48565b612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4290613ae7565b60405180910390fd5b5b505050565b6060612a608484600085612a69565b90509392505050565b606082471015612aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa590613b79565b60405180910390fd5b612ab785612b7d565b612af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aed90613be5565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b1f9190613c41565b60006040518083038185875af1925050503d8060008114612b5c576040519150601f19603f3d011682016040523d82523d6000602084013e612b61565b606091505b5091509150612b71828286612ba0565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612bb057829050612c00565b600083511115612bc35782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf79190612cd6565b60405180910390fd5b9392505050565b60008115159050919050565b612c1c81612c07565b82525050565b6000602082019050612c376000830184612c13565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c77578082015181840152602081019050612c5c565b83811115612c86576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ca882612c3d565b612cb28185612c48565b9350612cc2818560208601612c59565b612ccb81612c8c565b840191505092915050565b60006020820190508181036000830152612cf08184612c9d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d2382612cf8565b9050919050565b612d3381612d18565b82525050565b6000602082019050612d4e6000830184612d2a565b92915050565b600080fd5b612d6281612d18565b8114612d6d57600080fd5b50565b600081359050612d7f81612d59565b92915050565b6000819050919050565b612d9881612d85565b8114612da357600080fd5b50565b600081359050612db581612d8f565b92915050565b60008060408385031215612dd257612dd1612d54565b5b6000612de085828601612d70565b9250506020612df185828601612da6565b9150509250929050565b612e0481612d85565b82525050565b6000602082019050612e1f6000830184612dfb565b92915050565b600060208284031215612e3b57612e3a612d54565b5b6000612e4984828501612d70565b91505092915050565b600080600060608486031215612e6b57612e6a612d54565b5b6000612e7986828701612d70565b9350506020612e8a86828701612d70565b9250506040612e9b86828701612da6565b9150509250925092565b600060ff82169050919050565b612ebb81612ea5565b82525050565b6000602082019050612ed66000830184612eb2565b92915050565b600060208284031215612ef257612ef1612d54565b5b6000612f0084828501612da6565b91505092915050565b60008060408385031215612f2057612f1f612d54565b5b6000612f2e85828601612d70565b9250506020612f3f85828601612d70565b9150509250929050565b7f426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c60008201527f6973746564000000000000000000000000000000000000000000000000000000602082015250565b6000612fa5602583612c48565b9150612fb082612f49565b604082019050919050565b60006020820190508181036000830152612fd481612f98565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613011602083612c48565b915061301c82612fdb565b602082019050919050565b6000602082019050818103600083015261304081613004565b9050919050565b7f45524332303a2063616c6c6572206973206e6f74206d696e7465720000000000600082015250565b600061307d601b83612c48565b915061308882613047565b602082019050919050565b600060208201905081810360008301526130ac81613070565b9050919050565b7f4f776e61626c653a206f6e6c79206e6577206f776e65722063616e206163636560008201527f7074206f776e6572736869700000000000000000000000000000000000000000602082015250565b600061310f602c83612c48565b915061311a826130b3565b604082019050919050565b6000602082019050818103600083015261313e81613102565b9050919050565b7f576974686472617761626c653a2064657374696e6174696f6e206973207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b60006131a1602983612c48565b91506131ac82613145565b604082019050919050565b600060208201905081810360008301526131d081613194565b9050919050565b60006060820190506131ec6000830186612d2a565b6131f96020830185612d2a565b6132066040830184612dfb565b949350505050565b6000819050919050565b6000819050919050565b600061323d6132386132338461320e565b613218565b612d85565b9050919050565b61324d81613222565b82525050565b60006020820190506132686000830184613244565b92915050565b7f576974686472617761626c653a2044657374696e6174696f6e206973207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b60006132ca602983612c48565b91506132d58261326e565b604082019050919050565b600060208201905081810360008301526132f9816132bd565b9050919050565b60008151905061330f81612d8f565b92915050565b60006020828403121561332b5761332a612d54565b5b600061333984828501613300565b91505092915050565b7f576974686472617761626c653a204e6f7420656e6f7567682062616c616e6365600082015250565b6000613378602083612c48565b915061338382613342565b602082019050919050565b600060208201905081810360008301526133a78161336b565b9050919050565b600081905092915050565b50565b60006133c96000836133ae565b91506133d4826133b9565b600082019050919050565b60006133ea826133bc565b9150819050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613450602683612c48565b915061345b826133f4565b604082019050919050565b6000602082019050818103600083015261347f81613443565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006134e2602483612c48565b91506134ed82613486565b604082019050919050565b60006020820190508181036000830152613511816134d5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613574602283612c48565b915061357f82613518565b604082019050919050565b600060208201905081810360008301526135a381613567565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613606602583612c48565b9150613611826135aa565b604082019050919050565b60006020820190508181036000830152613635816135f9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613698602383612c48565b91506136a38261363c565b604082019050919050565b600060208201905081810360008301526136c78161368b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061370882612d85565b915061371383612d85565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613748576137476136ce565b5b828201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613789601f83612c48565b915061379482613753565b602082019050919050565b600060208201905081810360008301526137b88161377c565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061381b602183612c48565b9150613826826137bf565b604082019050919050565b6000602082019050818103600083015261384a8161380e565b9050919050565b7f467265657a61626c653a2066726f7a656e000000000000000000000000000000600082015250565b6000613887601183612c48565b915061389282613851565b602082019050919050565b600060208201905081810360008301526138b68161387a565b9050919050565b60006138d86138d36138ce84612cf8565b613218565b612cf8565b9050919050565b60006138ea826138bd565b9050919050565b60006138fc826138df565b9050919050565b61390c816138f1565b82525050565b60006020820190506139276000830184613903565b92915050565b60006040820190506139426000830185612d2a565b61394f6020830184612dfb565b9392505050565b7f45524332303a20746f6b656e207472616e73666572207768696c652066726f7a60008201527f656e000000000000000000000000000000000000000000000000000000000000602082015250565b60006139b2602283612c48565b91506139bd82613956565b604082019050919050565b600060208201905081810360008301526139e1816139a5565b9050919050565b60006139f382612d85565b91506139fe83612d85565b925082821015613a1157613a106136ce565b5b828203905092915050565b613a2581612c07565b8114613a3057600080fd5b50565b600081519050613a4281613a1c565b92915050565b600060208284031215613a5e57613a5d612d54565b5b6000613a6c84828501613a33565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613ad1602a83612c48565b9150613adc82613a75565b604082019050919050565b60006020820190508181036000830152613b0081613ac4565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613b63602683612c48565b9150613b6e82613b07565b604082019050919050565b60006020820190508181036000830152613b9281613b56565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613bcf601d83612c48565b9150613bda82613b99565b602082019050919050565b60006020820190508181036000830152613bfe81613bc2565b9050919050565b600081519050919050565b6000613c1b82613c05565b613c2581856133ae565b9350613c35818560208601612c59565b80840191505092915050565b6000613c4d8284613c10565b91508190509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200cd04b2ed5523e397184ea5834995159423ad7af54b6bbc05d1b781761bfb12764736f6c634300080d0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063d6b7277211610097578063f2fde38b11610071578063f2fde38b1461045f578063f9f92be41461047b578063fca3b5aa14610497578063fe575a87146104b35761018e565b8063d6b72772146103f7578063d9caed1214610413578063dd62ed3e1461042f5761018e565b806370a082311461032157806379ba5097146103515780638da5cb5b1461035b57806395d89b4114610379578063a457c2d714610397578063a9059cbb146103c75761018e565b806323b872dd1161014b57806340c10f191161012557806340c10f19146102d557806342966c68146102f157806362a5af3b1461030d5780636a28f000146103175761018e565b806323b872dd14610257578063313ce5671461028757806339509351146102a55761018e565b8063054f7d9c1461019357806306fdde03146101b157806307546172146101cf578063095ea7b3146101ed57806318160ddd1461021d5780631a8952661461023b575b600080fd5b61019b6104e3565b6040516101a89190612c22565b60405180910390f35b6101b96104fa565b6040516101c69190612cd6565b60405180910390f35b6101d7610537565b6040516101e49190612d39565b60405180910390f35b61020760048036038101906102029190612dbb565b610561565b6040516102149190612c22565b60405180910390f35b6102256106a4565b6040516102329190612e0a565b60405180910390f35b61025560048036038101906102509190612e25565b6106ae565b005b610271600480360381019061026c9190612e52565b6107c8565b60405161027e9190612c22565b60405180910390f35b61028f610a55565b60405161029c9190612ec1565b60405180910390f35b6102bf60048036038101906102ba9190612dbb565b610a5e565b6040516102cc9190612c22565b60405180910390f35b6102ef60048036038101906102ea9190612dbb565b610c36565b005b61030b60048036038101906103069190612edc565b610e44565b005b610315610eee565b005b61031f610f74565b005b61033b60048036038101906103369190612e25565b610ffa565b6040516103489190612e0a565b60405180910390f35b610359611043565b005b610363611221565b6040516103709190612d39565b60405180910390f35b61038161124a565b60405161038e9190612cd6565b60405180910390f35b6103b160048036038101906103ac9190612dbb565b611287565b6040516103be9190612c22565b60405180910390f35b6103e160048036038101906103dc9190612dbb565b611479565b6040516103ee9190612c22565b60405180910390f35b610411600480360381019061040c9190612e52565b6115bc565b005b61042d60048036038101906104289190612e52565b61179f565b005b61044960048036038101906104449190612f09565b611ade565b6040516104569190612e0a565b60405180910390f35b61047960048036038101906104749190612e25565b611b65565b005b61049560048036038101906104909190612e25565b611c94565b005b6104b160048036038101906104ac9190612e25565b611dae565b005b6104cd60048036038101906104c89190612e25565b611ef0565b6040516104da9190612c22565b60405180910390f35b6000600160149054906101000a900460ff16905090565b60606040518060400160405280600d81526020017f436f696e393820446f6c6c617200000000000000000000000000000000000000815250905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600061056b611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156105f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ef90612fbb565b60405180910390fd5b83600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067d90612fbb565b60405180910390fd5b610698610691611f46565b8686611f4e565b60019250505092915050565b6000600354905090565b6106b6611f46565b73ffffffffffffffffffffffffffffffffffffffff166106d4611221565b73ffffffffffffffffffffffffffffffffffffffff161461072a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072190613027565b60405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f117e3210bb9aa7d9baff172026820255c6f6c30ba8999d1c2fd88e2848137c4e60405160405180910390a250565b60006107d2611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085690612fbb565b60405180910390fd5b84600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490612fbb565b60405180910390fd5b84600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561097b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097290612fbb565b60405180910390fd5b610986878787612117565b610a4787610992611f46565b610a4288604051806060016040528060288152602001613ca160289139600560008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109f8611f46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123ae9092919063ffffffff16565b611f4e565b600193505050509392505050565b60006012905090565b6000610a68611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aec90612fbb565b60405180910390fd5b83600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90612fbb565b60405180910390fd5b610c2a610b8e611f46565b86610c258760056000610b9f611f46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461240390919063ffffffff16565b611f4e565b60019250505092915050565b610c3e611f46565b73ffffffffffffffffffffffffffffffffffffffff16610c5c611221565b73ffffffffffffffffffffffffffffffffffffffff161480610cd25750610c81611f46565b73ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0890613093565b60405180910390fd5b610d19611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d90612fbb565b60405180910390fd5b82600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90612fbb565b60405180910390fd5b610e3e8484612419565b50505050565b610e4c611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed090612fbb565b60405180910390fd5b610eea610ee4611f46565b836125ae565b5050565b610ef6611f46565b73ffffffffffffffffffffffffffffffffffffffff16610f14611221565b73ffffffffffffffffffffffffffffffffffffffff1614610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6190613027565b60405180910390fd5b610f7261275d565b565b610f7c611f46565b73ffffffffffffffffffffffffffffffffffffffff16610f9a611221565b73ffffffffffffffffffffffffffffffffffffffff1614610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe790613027565b60405180910390fd5b610ff86127ff565b565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611084611f46565b73ffffffffffffffffffffffffffffffffffffffff16146110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190613125565b60405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606040518060400160405280600481526020017f4355534400000000000000000000000000000000000000000000000000000000815250905090565b6000611291611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561131e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131590612fbb565b60405180910390fd5b83600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390612fbb565b60405180910390fd5b61146d6113b7611f46565b8661146887604051806060016040528060258152602001613cc960259139600560006113e1611f46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123ae9092919063ffffffff16565b611f4e565b60019250505092915050565b6000611483611f46565b600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150790612fbb565b60405180910390fd5b83600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561159e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159590612fbb565b60405180910390fd5b6115b06115a9611f46565b8686612117565b60019250505092915050565b6115c4611f46565b73ffffffffffffffffffffffffffffffffffffffff166115e2611221565b73ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f90613027565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e906131b7565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3084846040518463ffffffff1660e01b81526004016116e4939291906131d7565b600060405180830381600087803b1580156116fe57600080fd5b505af1158015611712573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1661174c611f46565b73ffffffffffffffffffffffffffffffffffffffff167fa4195c37c2947bbe89165f03e320b6903116f0b10d8cfdb522330f7ce6f9fa2460016040516117929190613253565b60405180910390a4505050565b6117a7611f46565b73ffffffffffffffffffffffffffffffffffffffff166117c5611221565b73ffffffffffffffffffffffffffffffffffffffff161461181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290613027565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361188a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611881906132e0565b60405180910390fd5b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036118c757479050611944565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119009190612d39565b602060405180830381865afa15801561191d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119419190613315565b90505b80821115611987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197e9061338e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611a29578273ffffffffffffffffffffffffffffffffffffffff16826040516119df906133df565b60006040518083038185875af1925050503d8060008114611a1c576040519150601f19603f3d011682016040523d82523d6000602084013e611a21565b606091505b505050611a55565b611a5483838673ffffffffffffffffffffffffffffffffffffffff166128a19092919063ffffffff16565b5b8373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16611a8b611f46565b73ffffffffffffffffffffffffffffffffffffffff167fa4195c37c2947bbe89165f03e320b6903116f0b10d8cfdb522330f7ce6f9fa2485604051611ad09190612e0a565b60405180910390a450505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611b6d611f46565b73ffffffffffffffffffffffffffffffffffffffff16611b8b611221565b73ffffffffffffffffffffffffffffffffffffffff1614611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd890613027565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4790613466565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c9c611f46565b73ffffffffffffffffffffffffffffffffffffffff16611cba611221565b73ffffffffffffffffffffffffffffffffffffffff1614611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790613027565b60405180910390fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b85560405160405180910390a250565b611db6611f46565b73ffffffffffffffffffffffffffffffffffffffff16611dd4611221565b73ffffffffffffffffffffffffffffffffffffffff1614611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2190613027565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f1cf2de25c5bf439ac0287061c3a0fa69b3b02867d0ccfd2ded34e42577050b7360405160405180910390a35050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb4906134f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361202c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120239061358a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161210a9190612e0a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217d9061361c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ec906136ae565b60405180910390fd5b612200838383612927565b61226c81604051806060016040528060268152602001613c7b60269139600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123ae9092919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061230181600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461240390919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516123a19190612e0a565b60405180910390a3505050565b60008383111582906123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed9190612cd6565b60405180910390fd5b5082840390509392505050565b6000818361241191906136fd565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247f9061379f565b60405180910390fd5b61249460008383612927565b6124a98160035461240390919063ffffffff16565b60038190555061250181600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461240390919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516125a29190612e0a565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361261d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261490613831565b60405180910390fd5b61262982600083612927565b61269581604051806060016040528060228152602001613c5960229139600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546123ae9092919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506126ed8160035461297490919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516127519190612e0a565b60405180910390a35050565b6127656104e3565b156127a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279c9061389d565b60405180910390fd5b60018060146101000a81548160ff0219169083151502179055507f8a5c4736a33c7b7f29a2c34ea9ff9608afc5718d56f6fd6dcbd2d3711a1a49136127e8611f46565b6040516127f59190613912565b60405180910390a1565b6128076104e3565b612846576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283d9061389d565b60405180910390fd5b6000600160146101000a81548160ff0219169083151502179055507f4feb53e305297ab8fb8f3420c95ea04737addc254a7270d8fc4605d2b9c61dba61288a611f46565b6040516128979190613912565b60405180910390a1565b6129228363a9059cbb60e01b84846040516024016128c092919061392d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061298a565b505050565b61292f6104e3565b1561296f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612966906139c8565b60405180910390fd5b505050565b6000818361298291906139e8565b905092915050565b60006129ec826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612a519092919063ffffffff16565b9050600081511115612a4c5780806020019051810190612a0c9190613a48565b612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4290613ae7565b60405180910390fd5b5b505050565b6060612a608484600085612a69565b90509392505050565b606082471015612aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa590613b79565b60405180910390fd5b612ab785612b7d565b612af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aed90613be5565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612b1f9190613c41565b60006040518083038185875af1925050503d8060008114612b5c576040519150601f19603f3d011682016040523d82523d6000602084013e612b61565b606091505b5091509150612b71828286612ba0565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612bb057829050612c00565b600083511115612bc35782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf79190612cd6565b60405180910390fd5b9392505050565b60008115159050919050565b612c1c81612c07565b82525050565b6000602082019050612c376000830184612c13565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c77578082015181840152602081019050612c5c565b83811115612c86576000848401525b50505050565b6000601f19601f8301169050919050565b6000612ca882612c3d565b612cb28185612c48565b9350612cc2818560208601612c59565b612ccb81612c8c565b840191505092915050565b60006020820190508181036000830152612cf08184612c9d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d2382612cf8565b9050919050565b612d3381612d18565b82525050565b6000602082019050612d4e6000830184612d2a565b92915050565b600080fd5b612d6281612d18565b8114612d6d57600080fd5b50565b600081359050612d7f81612d59565b92915050565b6000819050919050565b612d9881612d85565b8114612da357600080fd5b50565b600081359050612db581612d8f565b92915050565b60008060408385031215612dd257612dd1612d54565b5b6000612de085828601612d70565b9250506020612df185828601612da6565b9150509250929050565b612e0481612d85565b82525050565b6000602082019050612e1f6000830184612dfb565b92915050565b600060208284031215612e3b57612e3a612d54565b5b6000612e4984828501612d70565b91505092915050565b600080600060608486031215612e6b57612e6a612d54565b5b6000612e7986828701612d70565b9350506020612e8a86828701612d70565b9250506040612e9b86828701612da6565b9150509250925092565b600060ff82169050919050565b612ebb81612ea5565b82525050565b6000602082019050612ed66000830184612eb2565b92915050565b600060208284031215612ef257612ef1612d54565b5b6000612f0084828501612da6565b91505092915050565b60008060408385031215612f2057612f1f612d54565b5b6000612f2e85828601612d70565b9250506020612f3f85828601612d70565b9150509250929050565b7f426c61636b6c69737461626c653a206163636f756e7420697320626c61636b6c60008201527f6973746564000000000000000000000000000000000000000000000000000000602082015250565b6000612fa5602583612c48565b9150612fb082612f49565b604082019050919050565b60006020820190508181036000830152612fd481612f98565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613011602083612c48565b915061301c82612fdb565b602082019050919050565b6000602082019050818103600083015261304081613004565b9050919050565b7f45524332303a2063616c6c6572206973206e6f74206d696e7465720000000000600082015250565b600061307d601b83612c48565b915061308882613047565b602082019050919050565b600060208201905081810360008301526130ac81613070565b9050919050565b7f4f776e61626c653a206f6e6c79206e6577206f776e65722063616e206163636560008201527f7074206f776e6572736869700000000000000000000000000000000000000000602082015250565b600061310f602c83612c48565b915061311a826130b3565b604082019050919050565b6000602082019050818103600083015261313e81613102565b9050919050565b7f576974686472617761626c653a2064657374696e6174696f6e206973207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b60006131a1602983612c48565b91506131ac82613145565b604082019050919050565b600060208201905081810360008301526131d081613194565b9050919050565b60006060820190506131ec6000830186612d2a565b6131f96020830185612d2a565b6132066040830184612dfb565b949350505050565b6000819050919050565b6000819050919050565b600061323d6132386132338461320e565b613218565b612d85565b9050919050565b61324d81613222565b82525050565b60006020820190506132686000830184613244565b92915050565b7f576974686472617761626c653a2044657374696e6174696f6e206973207a657260008201527f6f20616464726573730000000000000000000000000000000000000000000000602082015250565b60006132ca602983612c48565b91506132d58261326e565b604082019050919050565b600060208201905081810360008301526132f9816132bd565b9050919050565b60008151905061330f81612d8f565b92915050565b60006020828403121561332b5761332a612d54565b5b600061333984828501613300565b91505092915050565b7f576974686472617761626c653a204e6f7420656e6f7567682062616c616e6365600082015250565b6000613378602083612c48565b915061338382613342565b602082019050919050565b600060208201905081810360008301526133a78161336b565b9050919050565b600081905092915050565b50565b60006133c96000836133ae565b91506133d4826133b9565b600082019050919050565b60006133ea826133bc565b9150819050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613450602683612c48565b915061345b826133f4565b604082019050919050565b6000602082019050818103600083015261347f81613443565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006134e2602483612c48565b91506134ed82613486565b604082019050919050565b60006020820190508181036000830152613511816134d5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000613574602283612c48565b915061357f82613518565b604082019050919050565b600060208201905081810360008301526135a381613567565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613606602583612c48565b9150613611826135aa565b604082019050919050565b60006020820190508181036000830152613635816135f9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613698602383612c48565b91506136a38261363c565b604082019050919050565b600060208201905081810360008301526136c78161368b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061370882612d85565b915061371383612d85565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613748576137476136ce565b5b828201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613789601f83612c48565b915061379482613753565b602082019050919050565b600060208201905081810360008301526137b88161377c565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061381b602183612c48565b9150613826826137bf565b604082019050919050565b6000602082019050818103600083015261384a8161380e565b9050919050565b7f467265657a61626c653a2066726f7a656e000000000000000000000000000000600082015250565b6000613887601183612c48565b915061389282613851565b602082019050919050565b600060208201905081810360008301526138b68161387a565b9050919050565b60006138d86138d36138ce84612cf8565b613218565b612cf8565b9050919050565b60006138ea826138bd565b9050919050565b60006138fc826138df565b9050919050565b61390c816138f1565b82525050565b60006020820190506139276000830184613903565b92915050565b60006040820190506139426000830185612d2a565b61394f6020830184612dfb565b9392505050565b7f45524332303a20746f6b656e207472616e73666572207768696c652066726f7a60008201527f656e000000000000000000000000000000000000000000000000000000000000602082015250565b60006139b2602283612c48565b91506139bd82613956565b604082019050919050565b600060208201905081810360008301526139e1816139a5565b9050919050565b60006139f382612d85565b91506139fe83612d85565b925082821015613a1157613a106136ce565b5b828203905092915050565b613a2581612c07565b8114613a3057600080fd5b50565b600081519050613a4281613a1c565b92915050565b600060208284031215613a5e57613a5d612d54565b5b6000613a6c84828501613a33565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000613ad1602a83612c48565b9150613adc82613a75565b604082019050919050565b60006020820190508181036000830152613b0081613ac4565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000613b63602683612c48565b9150613b6e82613b07565b604082019050919050565b60006020820190508181036000830152613b9281613b56565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000613bcf601d83612c48565b9150613bda82613b99565b602082019050919050565b60006020820190508181036000830152613bfe81613bc2565b9050919050565b600081519050919050565b6000613c1b82613c05565b613c2581856133ae565b9350613c35818560208601612c59565b80840191505092915050565b6000613c4d8284613c10565b91508190509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212200cd04b2ed5523e397184ea5834995159423ad7af54b6bbc05d1b781761bfb12764736f6c634300080d0033
Deployed Bytecode Sourcemap
29424:11036:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23951:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30438:77;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31795:75;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32846:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31449:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26262:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33522:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31315:77;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34305:271;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35532:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35807:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36109:57;;;:::i;:::-;;36349:61;;;:::i;:::-;;31598:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22398:265;;;:::i;:::-;;21925:73;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30624:81;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35049:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32293:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27903:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26977:691;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32578:137;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22814:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26003:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36456:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25784:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23951:72;23990:4;24010:7;;;;;;;;;;;24003:14;;23951:72;:::o;30438:77::-;30475:13;30504:5;;;;;;;;;;;;;;;;;30497:12;;30438:77;:::o;31795:75::-;31834:7;31857;;;;;;;;;;;31850:14;;31795:75;:::o;32846:222::-;32989:4;32932:12;:10;:12::i;:::-;25596;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32966:7:::1;25596:12;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33005:39:::2;33014:12;:10;:12::i;:::-;33028:7;33037:6;33005:8;:39::i;:::-;33058:4;33051:11;;25667:1:::1;32846:222:::0;;;;;:::o;31449:94::-;31502:7;31525:12;;31518:19;;31449:94;:::o;26262:136::-;22130:12;:10;:12::i;:::-;22119:23;;:7;:5;:7::i;:::-;:23;;;22111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26352:5:::1;26327:12;:22;26340:8;26327:22;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;26383:8;26369:23;;;;;;;;;;;;26262:136:::0;:::o;33522:400::-;33718:4;33631:12;:10;:12::i;:::-;25596;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33665:6:::1;25596:12;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33693:9:::2;25596:12;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33734:36:::3;33744:6;33752:9;33763:6;33734:9;:36::i;:::-;33777:121;33786:6;33794:12;:10;:12::i;:::-;33808:89;33846:6;33808:89;;;;;;;;;;;;;;;;;:11;:19;33820:6;33808:19;;;;;;;;;;;;;;;:33;33828:12;:10;:12::i;:::-;33808:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;33777:8;:121::i;:::-;33912:4;33905:11;;25667:1:::2;::::1;33522:400:::0;;;;;;:::o;31315:77::-;31356:5;29710:2;31370:16;;31315:77;:::o;34305:271::-;34453:4;34396:12;:10;:12::i;:::-;25596;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34430:7:::1;25596:12;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34469:83:::2;34478:12;:10;:12::i;:::-;34492:7;34501:50;34540:10;34501:11;:25;34513:12;:10;:12::i;:::-;34501:25;;;;;;;;;;;;;;;:34;34527:7;34501:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;34469:8;:83::i;:::-;34566:4;34559:11;;25667:1:::1;34305:271:::0;;;;;:::o;35532:171::-;32013:12;:10;:12::i;:::-;32002:23;;:7;:5;:7::i;:::-;:23;;;:50;;;;32040:12;:10;:12::i;:::-;32029:23;;:7;;;;;;;;;;;:23;;;32002:50;31994:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;35622:12:::1;:10;:12::i;:::-;25596;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35656:7:::2;25596:12;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35675:22:::3;35681:7;35690:6;35675:5;:22::i;:::-;25667:1:::2;32091::::1;35532:171:::0;;:::o;35807:114::-;35864:12;:10;:12::i;:::-;25596;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35888:27:::1;35894:12;:10;:12::i;:::-;35908:6;35888:5;:27::i;:::-;35807:114:::0;;:::o;36109:57::-;22130:12;:10;:12::i;:::-;22119:23;;:7;:5;:7::i;:::-;:23;;;22111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36151:9:::1;:7;:9::i;:::-;36109:57::o:0;36349:61::-;22130:12;:10;:12::i;:::-;22119:23;;:7;:5;:7::i;:::-;:23;;;22111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36393:11:::1;:9;:11::i;:::-;36349:61::o:0;31598:113::-;31664:7;31687:9;:18;31697:7;31687:18;;;;;;;;;;;;;;;;31680:25;;31598:113;;;:::o;22398:265::-;22463:9;;;;;;;;;;;22447:25;;:12;:10;:12::i;:::-;:25;;;22439:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;22528:16;22547:6;;;;;;;;;;;22528:25;;22569:9;;;;;;;;;;;22560:6;;:18;;;;;;;;;;;;;;;;;;22605:1;22585:9;;:22;;;;;;;;;;;;;;;;;;22650:6;;;;;;;;;;22619:38;;22640:8;22619:38;;;;;;;;;;;;22432:231;22398:265::o;21925:73::-;21963:7;21986:6;;;;;;;;;;;21979:13;;21925:73;:::o;30624:81::-;30663:13;30692:7;;;;;;;;;;;;;;;;;30685:14;;30624:81;:::o;35049:322::-;35202:4;35145:12;:10;:12::i;:::-;25596;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35179:7:::1;25596:12;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35218:129:::2;35227:12;:10;:12::i;:::-;35241:7;35250:96;35289:15;35250:96;;;;;;;;;;;;;;;;;:11;:25;35262:12;:10;:12::i;:::-;35250:25;;;;;;;;;;;;;;;:34;35276:7;35250:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;35218:8;:129::i;:::-;35361:4;35354:11;;25667:1:::1;35049:322:::0;;;;;:::o;32293:230::-;32441:4;32382:12;:10;:12::i;:::-;25596;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32416:9:::1;25596:12;:22;25609:8;25596:22;;;;;;;;;;;;;;;;;;;;;;;;;25595:23;25587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32457:42:::2;32467:12;:10;:12::i;:::-;32481:9;32492:6;32457:9;:42::i;:::-;32513:4;32506:11;;25667:1:::1;32293:230:::0;;;;;:::o;27903:327::-;22130:12;:10;:12::i;:::-;22119:23;;:7;:5;:7::i;:::-;:23;;;22111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28038:1:::1;28014:26;;:12;:26;;::::0;28006:80:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;28103:6;28095:28;;;28132:4;28139:12;28153:8;28095:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;28214:6;28176:48;;28200:12;28176:48;;28186:12;:10;:12::i;:::-;28176:48;;;28222:1;28176:48;;;;;;:::i;:::-;;;;;;;;27903:327:::0;;;:::o;26977:691::-;22130:12;:10;:12::i;:::-;22119:23;;:7;:5;:7::i;:::-;:23;;;22111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27108:1:::1;27084:26;;:12;:26;;::::0;27076:80:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;27165:23;27216:1:::0;27198:20:::1;;:6;:20;;::::0;27195:161:::1;;27247:21;27229:39;;27195:161;;;27316:6;27309:24;;;27342:4;27309:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27291:57;;27195:161;27383:15;27372:7;:26;;27364:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;27465:1;27447:20;;:6;:20;;::::0;27444:151:::1;;27478:12;:17;;27502:7;27478:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27444:151;;;27537:50;27565:12;27579:7;27544:6;27537:27;;;;:50;;;;;:::i;:::-;27444:151;27646:6;27608:54;;27632:12;27608:54;;27618:12;:10;:12::i;:::-;27608:54;;;27654:7;27608:54;;;;;;:::i;:::-;;;;;;;;27069:599;26977:691:::0;;;:::o;32578:137::-;32659:7;32682:11;:18;32694:5;32682:18;;;;;;;;;;;;;;;:27;32701:7;32682:27;;;;;;;;;;;;;;;;32675:34;;32578:137;;;;:::o;22814:175::-;22130:12;:10;:12::i;:::-;22119:23;;:7;:5;:7::i;:::-;:23;;;22111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22911:1:::1;22891:22;;:8;:22;;::::0;22883:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22975:8;22963:9;;:20;;;;;;;;;;;;;;;;;;22814:175:::0;:::o;26003:131::-;22130:12;:10;:12::i;:::-;22119:23;;:7;:5;:7::i;:::-;:23;;;22111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;26091:4:::1;26066:12;:22;26079:8;26066:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;26119:8;26107:21;;;;;;;;;;;;26003:131:::0;:::o;36456:168::-;22130:12;:10;:12::i;:::-;22119:23;;:7;:5;:7::i;:::-;:23;;;22111:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36518:17:::1;36538:7;;;;;;;;;;;36518:27;;36562:9;36552:7;;:19;;;;;;;;;;;;;;;;;;36608:9;36583:35;;36597:9;36583:35;;;;;;;;;;;;36511:113;36456:168:::0;:::o;25784:112::-;25848:4;25868:12;:22;25881:8;25868:22;;;;;;;;;;;;;;;;;;;;;;;;;25861:29;;25784:112;;;:::o;20592:101::-;20637:15;20676:10;20661:26;;20592:101;:::o;39306:320::-;39413:1;39396:19;;:5;:19;;;39388:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39490:1;39471:21;;:7;:21;;;39463:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39570:6;39540:11;:18;39552:5;39540:18;;;;;;;;;;;;;;;:27;39559:7;39540:27;;;;;;;;;;;;;;;:36;;;;39604:7;39588:32;;39597:5;39588:32;;;39613:6;39588:32;;;;;;:::i;:::-;;;;;;;;39306:320;;;:::o;37084:505::-;37196:1;37178:20;;:6;:20;;;37170:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;37276:1;37255:23;;:9;:23;;;37247:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;37327:47;37348:6;37356:9;37367:6;37327:20;:47::i;:::-;37403:71;37425:6;37403:71;;;;;;;;;;;;;;;;;:9;:17;37413:6;37403:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;37383:9;:17;37393:6;37383:17;;;;;;;;;;;;;;;:91;;;;37504:32;37529:6;37504:9;:20;37514:9;37504:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;37481:9;:20;37491:9;37481:20;;;;;;;;;;;;;;;:55;;;;37565:9;37548:35;;37557:6;37548:35;;;37576:6;37548:35;;;;;;:::i;:::-;;;;;;;;37084:505;;;:::o;5311:218::-;5423:7;5475:1;5470;:6;;5478:12;5462:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5513:1;5509;:5;5502:12;;5311:218;;;;;:::o;3172:94::-;3230:7;3259:1;3255;:5;;;;:::i;:::-;3248:12;;3172:94;;;;:::o;37851:348::-;37942:1;37923:21;;:7;:21;;;37915:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37989:49;38018:1;38022:7;38031:6;37989:20;:49::i;:::-;38062:24;38079:6;38062:12;;:16;;:24;;;;:::i;:::-;38047:12;:39;;;;38114:30;38137:6;38114:9;:18;38124:7;38114:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;38093:9;:18;38103:7;38093:18;;;;;;;;;;;;;;;:51;;;;38177:7;38156:37;;38173:1;38156:37;;;38186:6;38156:37;;;;;;:::i;:::-;;;;;;;;37851:348;;:::o;38508:388::-;38599:1;38580:21;;:7;:21;;;38572:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38648:49;38669:7;38686:1;38690:6;38648:20;:49::i;:::-;38727:68;38750:6;38727:68;;;;;;;;;;;;;;;;;:9;:18;38737:7;38727:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;38706:9;:18;38716:7;38706:18;;;;;;;;;;;;;;;:89;;;;38817:24;38834:6;38817:12;;:16;;:24;;;;:::i;:::-;38802:12;:39;;;;38879:1;38853:37;;38862:7;38853:37;;;38883:6;38853:37;;;;;;:::i;:::-;;;;;;;;38508:388;;:::o;24667:101::-;24243:8;:6;:8::i;:::-;24242:9;24234:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;24726:4:::1;24716:7:::0;::::1;:14;;;;;;;;;;;;;;;;;;24742:20;24749:12;:10;:12::i;:::-;24742:20;;;;;;:::i;:::-;;;;;;;;24667:101::o:0;24942:103::-;24495:8;:6;:8::i;:::-;24487:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;25000:5:::1;24990:7;;:15;;;;;;;;;;;;;;;;;;25017:22;25026:12;:10;:12::i;:::-;25017:22;;;;;;:::i;:::-;;;;;;;;24942:103::o:0;18810:172::-;18890:86;18910:5;18940:23;;;18965:2;18969:5;18917:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18890:19;:86::i;:::-;18810:172;;;:::o;40199:150::-;40296:8;:6;:8::i;:::-;40295:9;40287:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40199:150;;;:::o;3527:94::-;3585:7;3614:1;3610;:5;;;;:::i;:::-;3603:12;;3527:94;;;;:::o;19366:678::-;19774:23;19800:69;19828:4;19800:69;;;;;;;;;;;;;;;;;19808:5;19800:27;;;;:69;;;;;:::i;:::-;19774:95;;19900:1;19880:10;:17;:21;19876:163;;;19965:10;19954:30;;;;;;;;;;;;:::i;:::-;19946:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;19876:163;19436:608;19366:678;;:::o;14030:215::-;14157:12;14186:52;14208:6;14216:4;14222:1;14225:12;14186:21;:52::i;:::-;14179:59;;14030:215;;;;;:::o;15088:484::-;15245:12;15300:5;15275:21;:30;;15267:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;15364:18;15375:6;15364:10;:18::i;:::-;15356:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;15427:12;15441:23;15468:6;:11;;15487:5;15494:4;15468:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15426:73;;;;15514:51;15531:7;15540:10;15552:12;15514:16;:51::i;:::-;15507:58;;;;15088:484;;;;;;:::o;11392:313::-;11452:4;11697:1;11675:7;:19;;;:23;11668:30;;11392:313;;;:::o;17640:638::-;17780:12;17806:7;17802:470;;;17833:10;17826:17;;;;17802:470;17956:1;17936:10;:17;:21;17932:332;;;18117:10;18111:17;18171:15;18158:10;18154:2;18150:19;18143:44;17932:332;18239:12;18232:20;;;;;;;;;;;:::i;:::-;;;;;;;;17640:638;;;;;;:::o;7:90:1:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:99::-;486:6;520:5;514:12;504:22;;434:99;;;:::o;539:169::-;623:11;657:6;652:3;645:19;697:4;692:3;688:14;673:29;;539:169;;;;:::o;714:307::-;782:1;792:113;806:6;803:1;800:13;792:113;;;891:1;886:3;882:11;876:18;872:1;867:3;863:11;856:39;828:2;825:1;821:10;816:15;;792:113;;;923:6;920:1;917:13;914:101;;;1003:1;994:6;989:3;985:16;978:27;914:101;763:258;714:307;;;:::o;1027:102::-;1068:6;1119:2;1115:7;1110:2;1103:5;1099:14;1095:28;1085:38;;1027:102;;;:::o;1135:364::-;1223:3;1251:39;1284:5;1251:39;:::i;:::-;1306:71;1370:6;1365:3;1306:71;:::i;:::-;1299:78;;1386:52;1431:6;1426:3;1419:4;1412:5;1408:16;1386:52;:::i;:::-;1463:29;1485:6;1463:29;:::i;:::-;1458:3;1454:39;1447:46;;1227:272;1135:364;;;;:::o;1505:313::-;1618:4;1656:2;1645:9;1641:18;1633:26;;1705:9;1699:4;1695:20;1691:1;1680:9;1676:17;1669:47;1733:78;1806:4;1797:6;1733:78;:::i;:::-;1725:86;;1505:313;;;;:::o;1824:126::-;1861:7;1901:42;1894:5;1890:54;1879:65;;1824:126;;;:::o;1956:96::-;1993:7;2022:24;2040:5;2022:24;:::i;:::-;2011:35;;1956:96;;;:::o;2058:118::-;2145:24;2163:5;2145:24;:::i;:::-;2140:3;2133:37;2058:118;;:::o;2182:222::-;2275:4;2313:2;2302:9;2298:18;2290:26;;2326:71;2394:1;2383:9;2379:17;2370:6;2326:71;:::i;:::-;2182:222;;;;:::o;2491:117::-;2600:1;2597;2590:12;2737:122;2810:24;2828:5;2810:24;:::i;:::-;2803:5;2800:35;2790:63;;2849:1;2846;2839:12;2790:63;2737:122;:::o;2865:139::-;2911:5;2949:6;2936:20;2927:29;;2965:33;2992:5;2965:33;:::i;:::-;2865:139;;;;:::o;3010:77::-;3047:7;3076:5;3065:16;;3010:77;;;:::o;3093:122::-;3166:24;3184:5;3166:24;:::i;:::-;3159:5;3156:35;3146:63;;3205:1;3202;3195:12;3146:63;3093:122;:::o;3221:139::-;3267:5;3305:6;3292:20;3283:29;;3321:33;3348:5;3321:33;:::i;:::-;3221:139;;;;:::o;3366:474::-;3434:6;3442;3491:2;3479:9;3470:7;3466:23;3462:32;3459:119;;;3497:79;;:::i;:::-;3459:119;3617:1;3642:53;3687:7;3678:6;3667:9;3663:22;3642:53;:::i;:::-;3632:63;;3588:117;3744:2;3770:53;3815:7;3806:6;3795:9;3791:22;3770:53;:::i;:::-;3760:63;;3715:118;3366:474;;;;;:::o;3846:118::-;3933:24;3951:5;3933:24;:::i;:::-;3928:3;3921:37;3846:118;;:::o;3970:222::-;4063:4;4101:2;4090:9;4086:18;4078:26;;4114:71;4182:1;4171:9;4167:17;4158:6;4114:71;:::i;:::-;3970:222;;;;:::o;4198:329::-;4257:6;4306:2;4294:9;4285:7;4281:23;4277:32;4274:119;;;4312:79;;:::i;:::-;4274:119;4432:1;4457:53;4502:7;4493:6;4482:9;4478:22;4457:53;:::i;:::-;4447:63;;4403:117;4198:329;;;;:::o;4533:619::-;4610:6;4618;4626;4675:2;4663:9;4654:7;4650:23;4646:32;4643:119;;;4681:79;;:::i;:::-;4643:119;4801:1;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4772:117;4928:2;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4899:118;5056:2;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5027:118;4533:619;;;;;:::o;5158:86::-;5193:7;5233:4;5226:5;5222:16;5211:27;;5158:86;;;:::o;5250:112::-;5333:22;5349:5;5333:22;:::i;:::-;5328:3;5321:35;5250:112;;:::o;5368:214::-;5457:4;5495:2;5484:9;5480:18;5472:26;;5508:67;5572:1;5561:9;5557:17;5548:6;5508:67;:::i;:::-;5368:214;;;;:::o;5588:329::-;5647:6;5696:2;5684:9;5675:7;5671:23;5667:32;5664:119;;;5702:79;;:::i;:::-;5664:119;5822:1;5847:53;5892:7;5883:6;5872:9;5868:22;5847:53;:::i;:::-;5837:63;;5793:117;5588:329;;;;:::o;5923:474::-;5991:6;5999;6048:2;6036:9;6027:7;6023:23;6019:32;6016:119;;;6054:79;;:::i;:::-;6016:119;6174:1;6199:53;6244:7;6235:6;6224:9;6220:22;6199:53;:::i;:::-;6189:63;;6145:117;6301:2;6327:53;6372:7;6363:6;6352:9;6348:22;6327:53;:::i;:::-;6317:63;;6272:118;5923:474;;;;;:::o;6403:224::-;6543:34;6539:1;6531:6;6527:14;6520:58;6612:7;6607:2;6599:6;6595:15;6588:32;6403:224;:::o;6633:366::-;6775:3;6796:67;6860:2;6855:3;6796:67;:::i;:::-;6789:74;;6872:93;6961:3;6872:93;:::i;:::-;6990:2;6985:3;6981:12;6974:19;;6633:366;;;:::o;7005:419::-;7171:4;7209:2;7198:9;7194:18;7186:26;;7258:9;7252:4;7248:20;7244:1;7233:9;7229:17;7222:47;7286:131;7412:4;7286:131;:::i;:::-;7278:139;;7005:419;;;:::o;7430:182::-;7570:34;7566:1;7558:6;7554:14;7547:58;7430:182;:::o;7618:366::-;7760:3;7781:67;7845:2;7840:3;7781:67;:::i;:::-;7774:74;;7857:93;7946:3;7857:93;:::i;:::-;7975:2;7970:3;7966:12;7959:19;;7618:366;;;:::o;7990:419::-;8156:4;8194:2;8183:9;8179:18;8171:26;;8243:9;8237:4;8233:20;8229:1;8218:9;8214:17;8207:47;8271:131;8397:4;8271:131;:::i;:::-;8263:139;;7990:419;;;:::o;8415:177::-;8555:29;8551:1;8543:6;8539:14;8532:53;8415:177;:::o;8598:366::-;8740:3;8761:67;8825:2;8820:3;8761:67;:::i;:::-;8754:74;;8837:93;8926:3;8837:93;:::i;:::-;8955:2;8950:3;8946:12;8939:19;;8598:366;;;:::o;8970:419::-;9136:4;9174:2;9163:9;9159:18;9151:26;;9223:9;9217:4;9213:20;9209:1;9198:9;9194:17;9187:47;9251:131;9377:4;9251:131;:::i;:::-;9243:139;;8970:419;;;:::o;9395:231::-;9535:34;9531:1;9523:6;9519:14;9512:58;9604:14;9599:2;9591:6;9587:15;9580:39;9395:231;:::o;9632:366::-;9774:3;9795:67;9859:2;9854:3;9795:67;:::i;:::-;9788:74;;9871:93;9960:3;9871:93;:::i;:::-;9989:2;9984:3;9980:12;9973:19;;9632:366;;;:::o;10004:419::-;10170:4;10208:2;10197:9;10193:18;10185:26;;10257:9;10251:4;10247:20;10243:1;10232:9;10228:17;10221:47;10285:131;10411:4;10285:131;:::i;:::-;10277:139;;10004:419;;;:::o;10429:228::-;10569:34;10565:1;10557:6;10553:14;10546:58;10638:11;10633:2;10625:6;10621:15;10614:36;10429:228;:::o;10663:366::-;10805:3;10826:67;10890:2;10885:3;10826:67;:::i;:::-;10819:74;;10902:93;10991:3;10902:93;:::i;:::-;11020:2;11015:3;11011:12;11004:19;;10663:366;;;:::o;11035:419::-;11201:4;11239:2;11228:9;11224:18;11216:26;;11288:9;11282:4;11278:20;11274:1;11263:9;11259:17;11252:47;11316:131;11442:4;11316:131;:::i;:::-;11308:139;;11035:419;;;:::o;11460:442::-;11609:4;11647:2;11636:9;11632:18;11624:26;;11660:71;11728:1;11717:9;11713:17;11704:6;11660:71;:::i;:::-;11741:72;11809:2;11798:9;11794:18;11785:6;11741:72;:::i;:::-;11823;11891:2;11880:9;11876:18;11867:6;11823:72;:::i;:::-;11460:442;;;;;;:::o;11908:85::-;11953:7;11982:5;11971:16;;11908:85;;;:::o;11999:60::-;12027:3;12048:5;12041:12;;11999:60;;;:::o;12065:158::-;12123:9;12156:61;12174:42;12183:32;12209:5;12183:32;:::i;:::-;12174:42;:::i;:::-;12156:61;:::i;:::-;12143:74;;12065:158;;;:::o;12229:147::-;12324:45;12363:5;12324:45;:::i;:::-;12319:3;12312:58;12229:147;;:::o;12382:238::-;12483:4;12521:2;12510:9;12506:18;12498:26;;12534:79;12610:1;12599:9;12595:17;12586:6;12534:79;:::i;:::-;12382:238;;;;:::o;12626:228::-;12766:34;12762:1;12754:6;12750:14;12743:58;12835:11;12830:2;12822:6;12818:15;12811:36;12626:228;:::o;12860:366::-;13002:3;13023:67;13087:2;13082:3;13023:67;:::i;:::-;13016:74;;13099:93;13188:3;13099:93;:::i;:::-;13217:2;13212:3;13208:12;13201:19;;12860:366;;;:::o;13232:419::-;13398:4;13436:2;13425:9;13421:18;13413:26;;13485:9;13479:4;13475:20;13471:1;13460:9;13456:17;13449:47;13513:131;13639:4;13513:131;:::i;:::-;13505:139;;13232:419;;;:::o;13657:143::-;13714:5;13745:6;13739:13;13730:22;;13761:33;13788:5;13761:33;:::i;:::-;13657:143;;;;:::o;13806:351::-;13876:6;13925:2;13913:9;13904:7;13900:23;13896:32;13893:119;;;13931:79;;:::i;:::-;13893:119;14051:1;14076:64;14132:7;14123:6;14112:9;14108:22;14076:64;:::i;:::-;14066:74;;14022:128;13806:351;;;;:::o;14163:182::-;14303:34;14299:1;14291:6;14287:14;14280:58;14163:182;:::o;14351:366::-;14493:3;14514:67;14578:2;14573:3;14514:67;:::i;:::-;14507:74;;14590:93;14679:3;14590:93;:::i;:::-;14708:2;14703:3;14699:12;14692:19;;14351:366;;;:::o;14723:419::-;14889:4;14927:2;14916:9;14912:18;14904:26;;14976:9;14970:4;14966:20;14962:1;14951:9;14947:17;14940:47;15004:131;15130:4;15004:131;:::i;:::-;14996:139;;14723:419;;;:::o;15148:147::-;15249:11;15286:3;15271:18;;15148:147;;;;:::o;15301:114::-;;:::o;15421:398::-;15580:3;15601:83;15682:1;15677:3;15601:83;:::i;:::-;15594:90;;15693:93;15782:3;15693:93;:::i;:::-;15811:1;15806:3;15802:11;15795:18;;15421:398;;;:::o;15825:379::-;16009:3;16031:147;16174:3;16031:147;:::i;:::-;16024:154;;16195:3;16188:10;;15825:379;;;:::o;16210:225::-;16350:34;16346:1;16338:6;16334:14;16327:58;16419:8;16414:2;16406:6;16402:15;16395:33;16210:225;:::o;16441:366::-;16583:3;16604:67;16668:2;16663:3;16604:67;:::i;:::-;16597:74;;16680:93;16769:3;16680:93;:::i;:::-;16798:2;16793:3;16789:12;16782:19;;16441:366;;;:::o;16813:419::-;16979:4;17017:2;17006:9;17002:18;16994:26;;17066:9;17060:4;17056:20;17052:1;17041:9;17037:17;17030:47;17094:131;17220:4;17094:131;:::i;:::-;17086:139;;16813:419;;;:::o;17238:223::-;17378:34;17374:1;17366:6;17362:14;17355:58;17447:6;17442:2;17434:6;17430:15;17423:31;17238:223;:::o;17467:366::-;17609:3;17630:67;17694:2;17689:3;17630:67;:::i;:::-;17623:74;;17706:93;17795:3;17706:93;:::i;:::-;17824:2;17819:3;17815:12;17808:19;;17467:366;;;:::o;17839:419::-;18005:4;18043:2;18032:9;18028:18;18020:26;;18092:9;18086:4;18082:20;18078:1;18067:9;18063:17;18056:47;18120:131;18246:4;18120:131;:::i;:::-;18112:139;;17839:419;;;:::o;18264:221::-;18404:34;18400:1;18392:6;18388:14;18381:58;18473:4;18468:2;18460:6;18456:15;18449:29;18264:221;:::o;18491:366::-;18633:3;18654:67;18718:2;18713:3;18654:67;:::i;:::-;18647:74;;18730:93;18819:3;18730:93;:::i;:::-;18848:2;18843:3;18839:12;18832:19;;18491:366;;;:::o;18863:419::-;19029:4;19067:2;19056:9;19052:18;19044:26;;19116:9;19110:4;19106:20;19102:1;19091:9;19087:17;19080:47;19144:131;19270:4;19144:131;:::i;:::-;19136:139;;18863:419;;;:::o;19288:224::-;19428:34;19424:1;19416:6;19412:14;19405:58;19497:7;19492:2;19484:6;19480:15;19473:32;19288:224;:::o;19518:366::-;19660:3;19681:67;19745:2;19740:3;19681:67;:::i;:::-;19674:74;;19757:93;19846:3;19757:93;:::i;:::-;19875:2;19870:3;19866:12;19859:19;;19518:366;;;:::o;19890:419::-;20056:4;20094:2;20083:9;20079:18;20071:26;;20143:9;20137:4;20133:20;20129:1;20118:9;20114:17;20107:47;20171:131;20297:4;20171:131;:::i;:::-;20163:139;;19890:419;;;:::o;20315:222::-;20455:34;20451:1;20443:6;20439:14;20432:58;20524:5;20519:2;20511:6;20507:15;20500:30;20315:222;:::o;20543:366::-;20685:3;20706:67;20770:2;20765:3;20706:67;:::i;:::-;20699:74;;20782:93;20871:3;20782:93;:::i;:::-;20900:2;20895:3;20891:12;20884:19;;20543:366;;;:::o;20915:419::-;21081:4;21119:2;21108:9;21104:18;21096:26;;21168:9;21162:4;21158:20;21154:1;21143:9;21139:17;21132:47;21196:131;21322:4;21196:131;:::i;:::-;21188:139;;20915:419;;;:::o;21340:180::-;21388:77;21385:1;21378:88;21485:4;21482:1;21475:15;21509:4;21506:1;21499:15;21526:305;21566:3;21585:20;21603:1;21585:20;:::i;:::-;21580:25;;21619:20;21637:1;21619:20;:::i;:::-;21614:25;;21773:1;21705:66;21701:74;21698:1;21695:81;21692:107;;;21779:18;;:::i;:::-;21692:107;21823:1;21820;21816:9;21809:16;;21526:305;;;;:::o;21837:181::-;21977:33;21973:1;21965:6;21961:14;21954:57;21837:181;:::o;22024:366::-;22166:3;22187:67;22251:2;22246:3;22187:67;:::i;:::-;22180:74;;22263:93;22352:3;22263:93;:::i;:::-;22381:2;22376:3;22372:12;22365:19;;22024:366;;;:::o;22396:419::-;22562:4;22600:2;22589:9;22585:18;22577:26;;22649:9;22643:4;22639:20;22635:1;22624:9;22620:17;22613:47;22677:131;22803:4;22677:131;:::i;:::-;22669:139;;22396:419;;;:::o;22821:220::-;22961:34;22957:1;22949:6;22945:14;22938:58;23030:3;23025:2;23017:6;23013:15;23006:28;22821:220;:::o;23047:366::-;23189:3;23210:67;23274:2;23269:3;23210:67;:::i;:::-;23203:74;;23286:93;23375:3;23286:93;:::i;:::-;23404:2;23399:3;23395:12;23388:19;;23047:366;;;:::o;23419:419::-;23585:4;23623:2;23612:9;23608:18;23600:26;;23672:9;23666:4;23662:20;23658:1;23647:9;23643:17;23636:47;23700:131;23826:4;23700:131;:::i;:::-;23692:139;;23419:419;;;:::o;23844:167::-;23984:19;23980:1;23972:6;23968:14;23961:43;23844:167;:::o;24017:366::-;24159:3;24180:67;24244:2;24239:3;24180:67;:::i;:::-;24173:74;;24256:93;24345:3;24256:93;:::i;:::-;24374:2;24369:3;24365:12;24358:19;;24017:366;;;:::o;24389:419::-;24555:4;24593:2;24582:9;24578:18;24570:26;;24642:9;24636:4;24632:20;24628:1;24617:9;24613:17;24606:47;24670:131;24796:4;24670:131;:::i;:::-;24662:139;;24389:419;;;:::o;24814:142::-;24864:9;24897:53;24915:34;24924:24;24942:5;24924:24;:::i;:::-;24915:34;:::i;:::-;24897:53;:::i;:::-;24884:66;;24814:142;;;:::o;24962:126::-;25012:9;25045:37;25076:5;25045:37;:::i;:::-;25032:50;;24962:126;;;:::o;25094:134::-;25152:9;25185:37;25216:5;25185:37;:::i;:::-;25172:50;;25094:134;;;:::o;25234:147::-;25329:45;25368:5;25329:45;:::i;:::-;25324:3;25317:58;25234:147;;:::o;25387:238::-;25488:4;25526:2;25515:9;25511:18;25503:26;;25539:79;25615:1;25604:9;25600:17;25591:6;25539:79;:::i;:::-;25387:238;;;;:::o;25631:332::-;25752:4;25790:2;25779:9;25775:18;25767:26;;25803:71;25871:1;25860:9;25856:17;25847:6;25803:71;:::i;:::-;25884:72;25952:2;25941:9;25937:18;25928:6;25884:72;:::i;:::-;25631:332;;;;;:::o;25969:221::-;26109:34;26105:1;26097:6;26093:14;26086:58;26178:4;26173:2;26165:6;26161:15;26154:29;25969:221;:::o;26196:366::-;26338:3;26359:67;26423:2;26418:3;26359:67;:::i;:::-;26352:74;;26435:93;26524:3;26435:93;:::i;:::-;26553:2;26548:3;26544:12;26537:19;;26196:366;;;:::o;26568:419::-;26734:4;26772:2;26761:9;26757:18;26749:26;;26821:9;26815:4;26811:20;26807:1;26796:9;26792:17;26785:47;26849:131;26975:4;26849:131;:::i;:::-;26841:139;;26568:419;;;:::o;26993:191::-;27033:4;27053:20;27071:1;27053:20;:::i;:::-;27048:25;;27087:20;27105:1;27087:20;:::i;:::-;27082:25;;27126:1;27123;27120:8;27117:34;;;27131:18;;:::i;:::-;27117:34;27176:1;27173;27169:9;27161:17;;26993:191;;;;:::o;27190:116::-;27260:21;27275:5;27260:21;:::i;:::-;27253:5;27250:32;27240:60;;27296:1;27293;27286:12;27240:60;27190:116;:::o;27312:137::-;27366:5;27397:6;27391:13;27382:22;;27413:30;27437:5;27413:30;:::i;:::-;27312:137;;;;:::o;27455:345::-;27522:6;27571:2;27559:9;27550:7;27546:23;27542:32;27539:119;;;27577:79;;:::i;:::-;27539:119;27697:1;27722:61;27775:7;27766:6;27755:9;27751:22;27722:61;:::i;:::-;27712:71;;27668:125;27455:345;;;;:::o;27806:229::-;27946:34;27942:1;27934:6;27930:14;27923:58;28015:12;28010:2;28002:6;27998:15;27991:37;27806:229;:::o;28041:366::-;28183:3;28204:67;28268:2;28263:3;28204:67;:::i;:::-;28197:74;;28280:93;28369:3;28280:93;:::i;:::-;28398:2;28393:3;28389:12;28382:19;;28041:366;;;:::o;28413:419::-;28579:4;28617:2;28606:9;28602:18;28594:26;;28666:9;28660:4;28656:20;28652:1;28641:9;28637:17;28630:47;28694:131;28820:4;28694:131;:::i;:::-;28686:139;;28413:419;;;:::o;28838:225::-;28978:34;28974:1;28966:6;28962:14;28955:58;29047:8;29042:2;29034:6;29030:15;29023:33;28838:225;:::o;29069:366::-;29211:3;29232:67;29296:2;29291:3;29232:67;:::i;:::-;29225:74;;29308:93;29397:3;29308:93;:::i;:::-;29426:2;29421:3;29417:12;29410:19;;29069:366;;;:::o;29441:419::-;29607:4;29645:2;29634:9;29630:18;29622:26;;29694:9;29688:4;29684:20;29680:1;29669:9;29665:17;29658:47;29722:131;29848:4;29722:131;:::i;:::-;29714:139;;29441:419;;;:::o;29866:179::-;30006:31;30002:1;29994:6;29990:14;29983:55;29866:179;:::o;30051:366::-;30193:3;30214:67;30278:2;30273:3;30214:67;:::i;:::-;30207:74;;30290:93;30379:3;30290:93;:::i;:::-;30408:2;30403:3;30399:12;30392:19;;30051:366;;;:::o;30423:419::-;30589:4;30627:2;30616:9;30612:18;30604:26;;30676:9;30670:4;30666:20;30662:1;30651:9;30647:17;30640:47;30704:131;30830:4;30704:131;:::i;:::-;30696:139;;30423:419;;;:::o;30848:98::-;30899:6;30933:5;30927:12;30917:22;;30848:98;;;:::o;30952:373::-;31056:3;31084:38;31116:5;31084:38;:::i;:::-;31138:88;31219:6;31214:3;31138:88;:::i;:::-;31131:95;;31235:52;31280:6;31275:3;31268:4;31261:5;31257:16;31235:52;:::i;:::-;31312:6;31307:3;31303:16;31296:23;;31060:265;30952:373;;;;:::o;31331:271::-;31461:3;31483:93;31572:3;31563:6;31483:93;:::i;:::-;31476:100;;31593:3;31586:10;;31331:271;;;;:::o
Swarm Source
ipfs://0cd04b2ed5523e397184ea5834995159423ad7af54b6bbc05d1b781761bfb127
Loading...
Loading
Loading...
Loading
OVERVIEW
CUSD is a fully-backed stablecoin which aims to become a cross-chain unit of account that fulfills the demand for cross-chain liquidity in DeFi. In order to mint 1 CUSD, a total of $1 worth of the collateralized assets must be deposited into the CUSD Reserve smart contract.Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.