More Info
Private Name Tags
ContractCreator
Multichain Info
4 addresses found via
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
2306682 | 370 days ago | 0.0006 ETH | ||||
2306568 | 370 days ago | 0.001 ETH | ||||
2306391 | 370 days ago | 0.0522 ETH | ||||
2306350 | 370 days ago | 0.0005 ETH | ||||
2306035 | 370 days ago | 0.01 ETH | ||||
2305977 | 370 days ago | 0.0003 ETH | ||||
2305895 | 370 days ago | 0.49 ETH | ||||
2305658 | 370 days ago | 0.005 ETH | ||||
2305239 | 370 days ago | 0.00075 ETH | ||||
2304610 | 370 days ago | 0.158 ETH | ||||
2296672 | 370 days ago | 0.03330626 ETH | ||||
2295484 | 370 days ago | 0.171 ETH | ||||
2293842 | 370 days ago | 0.002 ETH | ||||
2293821 | 370 days ago | 0.0005 ETH | ||||
2293210 | 370 days ago | 0.01 ETH | ||||
2292580 | 370 days ago | 0.0074 ETH | ||||
2291228 | 370 days ago | 0.00036094 ETH | ||||
2290456 | 370 days ago | 0.000303 ETH | ||||
2290427 | 370 days ago | 0.00055 ETH | ||||
2290255 | 370 days ago | 0.0002 ETH | ||||
2290154 | 370 days ago | 0.0110334 ETH | ||||
2290152 | 370 days ago | 0.025 ETH | ||||
2290115 | 370 days ago | 0.01142 ETH | ||||
2290007 | 370 days ago | 0.0116 ETH | ||||
2289551 | 370 days ago | 0.0111 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
AssetForwarder
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at blastscan.io on 2024-03-01 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.18; // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev 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 `whenNotPaused` and `whenPaused`, 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 { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol) // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } /** * @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; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } /** * @title A contract that provides modifiers to prevent reentrancy to state-changing and view-only methods. This contract * is inspired by https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/ReentrancyGuard.sol * and https://github.com/balancer-labs/balancer-core/blob/master/contracts/BPool.sol. * @dev The reason why we use this local contract instead of importing from uma/contracts is because of the addition * of the internal method `functionCallStackOriginatesFromOutsideThisContract` which doesn't exist in the one exported * by uma/contracts. */ contract ReentrancyGuard { bool internal _notEntered; constructor() { // Storing an initial non-zero value makes deployment a bit more expensive, but in exchange the refund on every // call to nonReentrant will be lower in amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to increase the likelihood of the full // refund coming into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a nonReentrant function from another nonReentrant function is not supported. It is possible to * prevent this from happening by making the nonReentrant function external, and making it call a private * function that does the actual state modification. */ modifier nonReentrant() { _preEntranceCheck(); _preEntranceSet(); _; _postEntranceReset(); } /** * @dev Designed to prevent a view-only method from being re-entered during a call to a nonReentrant() state-changing method. */ modifier nonReentrantView() { _preEntranceCheck(); _; } /** * @dev Returns true if the contract is currently in a non-entered state, meaning that the origination of the call * came from outside the contract. This is relevant with fallback/receive methods to see if the call came from ETH * being dropped onto the contract externally or due to ETH dropped on the the contract from within a method in this * contract, such as unwrapping WETH to ETH within the contract. */ function functionCallStackOriginatesFromOutsideThisContract() internal view returns (bool) { return _notEntered; } // Internal methods are used to avoid copying the require statement's bytecode to every nonReentrant() method. // On entry into a function, _preEntranceCheck() should always be called to check if the function is being // re-entered. Then, if the function modifies state, it should call _postEntranceSet(), perform its logic, and // then call _postEntranceReset(). // View-only methods can simply call _preEntranceCheck() to make sure that it is not being re-entered. function _preEntranceCheck() internal view { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); } function _preEntranceSet() internal { // Any calls to nonReentrant after this point will fail _notEntered = false; } function _postEntranceReset() internal { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } } /// @title Interface for handler contracts that support deposits and deposit executions. /// @author Router Protocol. interface IAssetForwarder { event FundsDeposited( uint256 partnerId, uint256 amount, bytes32 destChainIdBytes, uint256 destAmount, uint256 depositId, address srcToken, address depositor, bytes recipient, bytes destToken ); event iUSDCDeposited( uint256 partnerId, uint256 amount, bytes32 destChainIdBytes, uint256 usdcNonce, address srcToken, bytes32 recipient, address depositor ); event FundsDepositedWithMessage( uint256 partnerId, uint256 amount, bytes32 destChainIdBytes, uint256 destAmount, uint256 depositId, address srcToken, bytes recipient, address depositor, bytes destToken, bytes message ); event FundsPaid(bytes32 messageHash, address forwarder, uint256 nonce); event DepositInfoUpdate( address srcToken, uint256 feeAmount, uint256 depositId, uint256 eventNonce, bool initiatewithdrawal, address depositor ); event FundsPaidWithMessage( bytes32 messageHash, address forwarder, uint256 nonce, bool execFlag, bytes execData ); struct DestDetails { uint32 domainId; uint256 fee; bool isSet; } struct RelayData { uint256 amount; bytes32 srcChainId; uint256 depositId; address destToken; address recipient; } struct RelayDataMessage { uint256 amount; bytes32 srcChainId; uint256 depositId; address destToken; address recipient; bytes message; } struct DepositData { uint256 partnerId; uint256 amount; uint256 destAmount; address srcToken; address refundRecipient; bytes32 destChainIdBytes; } function iDepositUSDC( uint256 partnerId, bytes32 destChainIdBytes, bytes32 recipient, uint256 amount ) external payable; function iDeposit( DepositData memory depositData, bytes memory destToken, bytes memory recipient ) external payable; function iDepositInfoUpdate( address srcToken, uint256 feeAmount, uint256 depositId, bool initiatewithdrawal ) external payable; function iDepositMessage( DepositData memory depositData, bytes memory destToken, bytes memory recipient, bytes memory message ) external payable; function iRelay(RelayData memory relayData) external payable; function iRelayMessage(RelayDataMessage memory relayData) external payable; } interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; function transferFrom( address src, address dst, uint256 wad ) external returns (bool); function approve(address guy, uint256 wad) external returns (bool); } interface ITokenMessenger { function depositForBurn( uint256 _amount, uint32 _destinationDomain, bytes32 _mintRecipient, address _burnToken ) external returns (uint64); function depositForBurnWithCaller( uint256 _amount, uint32 _destinationDomain, bytes32 _mintRecipient, address _burnToken, bytes32 _destinationCaller ) external returns (uint64); function replaceDepositForBurn( bytes memory originalMessage, bytes calldata originalAttestation, bytes32 _destCaller, bytes32 _mintRecipient ) external; } /// @title Handles ERC20 deposits and deposit executions. /// @author Router Protocol. /// @notice This contract is intended to be used with the Bridge contract. interface IMessageHandler { function handleMessage( address tokenSent, uint256 amount, bytes memory message ) external; } /** * @title MultiCaller * @notice Logic is 100% copied from "https://github.com/Uniswap/v3-periphery/blob/main/contracts/base/Multicall.sol" just version upgraded * please check if this can create conflict with handling msg.value */ contract MultiCaller { function multicall(bytes[] calldata data) external returns (bytes[] memory results) { results = new bytes[](data.length); for (uint256 i = 0; i < data.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); if (!success) { // Next 5 lines from https://ethereum.stackexchange.com/a/83577 if (result.length < 68) revert(); assembly { result := add(result, 0x04) } revert(abi.decode(result, (string))); } results[i] = result; } } } contract AssetForwarder is AccessControl, ReentrancyGuard, Pausable, IAssetForwarder, MultiCaller { using SafeERC20 for IERC20; IWETH public immutable wrappedNativeToken; bytes32 public routerMiddlewareBase; address public gatewayContract; // address of USDC address public usdc; // USDC token messenger ITokenMessenger public tokenMessenger; uint256 public depositNonce; mapping(bytes32 => DestDetails) public destDetails; uint256 public constant MAX_TRANSFER_SIZE = 1e36; bytes32 public constant RESOURCE_SETTER = keccak256("RESOURCE_SETTER"); bytes32 public constant PAUSER = keccak256("PAUSER"); mapping(bytes32 => bool) public executeRecord; uint256 public MIN_GAS_THRESHHOLD; uint256 public pauseStakeAmountMin; uint256 public pauseStakeAmountMax; uint256 public totalStakedAmount; bool public isCommunityPauseEnabled = true; address private constant NATIVE_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; event CommunityPaused(address indexed pauser, uint256 stakedAmount); error MessageAlreadyExecuted(); error InvalidGateway(); error InvalidRequestSender(); error InvalidRefundData(); error InvalidAmount(); error AmountTooLarge(); error MessageExcecutionFailedWithLowGas(); error InvalidFee(); constructor( address _wrappedNativeTokenAddress, address _gatewayContract, address _usdcAddress, address _tokenMessenger, bytes memory _routerMiddlewareBase, uint _minGasThreshhold ) { wrappedNativeToken = IWETH(_wrappedNativeTokenAddress); tokenMessenger = ITokenMessenger(_tokenMessenger); gatewayContract = _gatewayContract; usdc = _usdcAddress; routerMiddlewareBase = keccak256(_routerMiddlewareBase); MIN_GAS_THRESHHOLD = _minGasThreshhold; _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(RESOURCE_SETTER, msg.sender); _grantRole(PAUSER, msg.sender); } function update( uint index, address _gatewayContract, bytes calldata _routerMiddlewareBase, uint256 minPauseStakeAmount, uint256 maxPauseStakeAmount ) public onlyRole(RESOURCE_SETTER) { if (index == 1) { gatewayContract = _gatewayContract; } else if (index == 2) { routerMiddlewareBase = keccak256(_routerMiddlewareBase); } else if (index == 3) { require( minPauseStakeAmount <= maxPauseStakeAmount, "minPauseStakeAmount must be less than or equal to maxPauseStakeAmount" ); pauseStakeAmountMin = minPauseStakeAmount; pauseStakeAmountMax = maxPauseStakeAmount; } } /// @notice Function used to set usdc token messenger address /// @notice Only RESOURCE_SETTER can call this function /// @param _tokenMessenger address of token messenger function updateTokenMessenger( address _tokenMessenger ) external onlyRole(RESOURCE_SETTER) { tokenMessenger = ITokenMessenger(_tokenMessenger); } function pause() external onlyRole(PAUSER) whenNotPaused { _pause(); } /// @notice Unpauses deposits on the handler. /// @notice Only callable by an address that currently has the PAUSER role. function unpause() external onlyRole(PAUSER) whenPaused { _unpause(); } function isNative(address token) internal pure returns (bool) { return token == NATIVE_ADDRESS; } function setDestDetails( bytes32[] memory _destChainIdBytes, DestDetails[] memory _destDetails ) public onlyRole(RESOURCE_SETTER) { require( _destChainIdBytes.length == _destDetails.length, "invalid length" ); for (uint256 idx = 0; idx < _destDetails.length; idx++) { destDetails[_destChainIdBytes[idx]] = _destDetails[idx]; } } function iDepositUSDC( uint256 partnerId, bytes32 destChainIdBytes, bytes32 recipient, uint256 amount ) external payable nonReentrant whenNotPaused { require( destDetails[destChainIdBytes].isSet && usdc != address(0), "usdc not supported either on src on dst chain" ); if (msg.value != destDetails[destChainIdBytes].fee) revert InvalidFee(); if (amount > MAX_TRANSFER_SIZE) revert AmountTooLarge(); IERC20(usdc).safeTransferFrom(msg.sender, address(this), amount); IERC20(usdc).safeIncreaseAllowance(address(tokenMessenger), amount); uint64 nonce = tokenMessenger.depositForBurn( amount, destDetails[destChainIdBytes].domainId, recipient, usdc ); // it will emit event DepositForBurn, returns nonce emit iUSDCDeposited( partnerId, amount, destChainIdBytes, nonce, usdc, recipient, msg.sender ); } // TODO: Docs Update function iDeposit( DepositData memory depositData, bytes memory destToken, bytes memory recipient ) external payable nonReentrant whenNotPaused { if (depositData.amount > MAX_TRANSFER_SIZE) revert AmountTooLarge(); if (isNative(depositData.srcToken)) { if (depositData.amount != msg.value) revert InvalidAmount(); wrappedNativeToken.deposit{value: msg.value}(); // only amount should be deposited depositData.srcToken = address(wrappedNativeToken); } else { IERC20(depositData.srcToken).safeTransferFrom( msg.sender, address(this), depositData.amount ); } emit FundsDeposited( depositData.partnerId, depositData.amount, depositData.destChainIdBytes, depositData.destAmount, ++depositNonce, depositData.srcToken, depositData.refundRecipient, recipient, destToken ); } function iDepositInfoUpdate( address srcToken, uint256 feeAmount, uint256 depositId, bool initiatewithdrawal ) external payable nonReentrant whenNotPaused { if (initiatewithdrawal) { require(msg.value == 0); emit DepositInfoUpdate( srcToken, 0, depositId, ++depositNonce, true, msg.sender ); return; } if (feeAmount > MAX_TRANSFER_SIZE) revert AmountTooLarge(); if (isNative(srcToken)) { if (feeAmount != msg.value) revert InvalidAmount(); wrappedNativeToken.deposit{value: msg.value}(); // only amount should be deposited srcToken = address(wrappedNativeToken); } else { IERC20(srcToken).safeTransferFrom( msg.sender, address(this), feeAmount ); } emit DepositInfoUpdate( srcToken, feeAmount, depositId, ++depositNonce, false, msg.sender ); } function iDepositMessage( DepositData memory depositData, bytes memory destToken, bytes memory recipient, bytes memory message ) external payable nonReentrant whenNotPaused { if (depositData.amount > MAX_TRANSFER_SIZE) revert AmountTooLarge(); if (isNative(depositData.srcToken)) { if (depositData.amount != msg.value) revert InvalidAmount(); wrappedNativeToken.deposit{value: msg.value}(); // only amount should be deposited depositData.srcToken = address(wrappedNativeToken); } else { IERC20(depositData.srcToken).safeTransferFrom( msg.sender, address(this), depositData.amount ); } emit FundsDepositedWithMessage( depositData.partnerId, depositData.amount, depositData.destChainIdBytes, depositData.destAmount, ++depositNonce, depositData.srcToken, recipient, depositData.refundRecipient, destToken, message ); } function iRelay( RelayData memory relayData ) external payable nonReentrant whenNotPaused { // Check is message is already executed if (relayData.amount > MAX_TRANSFER_SIZE) revert AmountTooLarge(); bytes32 messageHash = keccak256( abi.encode( relayData.amount, relayData.srcChainId, relayData.depositId, relayData.destToken, relayData.recipient, address(this) ) ); if (executeRecord[messageHash]) revert MessageAlreadyExecuted(); executeRecord[messageHash] = true; if (isNative(relayData.destToken)) { if (relayData.amount != msg.value) revert InvalidAmount(); //slither-disable-next-line arbitrary-send-eth (bool success, ) = payable(relayData.recipient).call{value: relayData.amount}(""); require(success == true); } else { IERC20(relayData.destToken).safeTransferFrom( msg.sender, relayData.recipient, relayData.amount ); } emit FundsPaid(messageHash, msg.sender, ++depositNonce); } function iRelayMessage( RelayDataMessage memory relayData ) external payable nonReentrant whenNotPaused { if (relayData.amount > MAX_TRANSFER_SIZE) revert AmountTooLarge(); // Check is message is already executed bytes32 messageHash = keccak256( abi.encode( relayData.amount, relayData.srcChainId, relayData.depositId, relayData.destToken, relayData.recipient, address(this), relayData.message ) ); if (executeRecord[messageHash]) revert MessageAlreadyExecuted(); executeRecord[messageHash] = true; if (isNative(relayData.destToken)) { if (relayData.amount != msg.value) revert InvalidAmount(); (bool success, ) = payable(relayData.recipient).call{value: relayData.amount}(""); require(success == true); } else { IERC20(relayData.destToken).safeTransferFrom( msg.sender, relayData.recipient, relayData.amount ); } bytes memory execData; bool execFlag; if (isContract(relayData.recipient) && relayData.message.length > 0) { (execFlag, execData) = relayData.recipient.call( abi.encodeWithSelector( IMessageHandler.handleMessage.selector, relayData.destToken, relayData.amount, relayData.message ) ); if (!execFlag && gasleft() < MIN_GAS_THRESHHOLD) revert MessageExcecutionFailedWithLowGas(); } emit FundsPaidWithMessage( messageHash, msg.sender, ++depositNonce, execFlag, execData ); } function iReceive( string calldata requestSender, bytes memory packet, string calldata ) external { if (msg.sender != address(gatewayContract)) revert InvalidGateway(); if (routerMiddlewareBase != keccak256(bytes(requestSender))) revert InvalidRequestSender(); ( address recipient, address[] memory tokens, uint256[] memory amounts ) = abi.decode(packet, (address, address[], uint256[])); uint256 count = tokens.length; if (count != amounts.length) revert InvalidRefundData(); for (uint256 i = 0; i < count; i++) { if (!isNative(tokens[i])) IERC20(tokens[i]).safeTransfer(recipient, amounts[i]); //slither-disable-next-line arbitrary-send-eth else { (bool success, ) = payable(recipient).call{value: amounts[i]}(""); require(success == true); } } } function isContract(address addr) internal view returns (bool) { uint256 size; assembly { size := extcodesize(addr) } return size > 0; } // TODO: do we need this? We should not have it like this as this will // not be decentralized. We should have withdraw fees instead. function rescue( address token, uint256 amount ) external onlyRole(DEFAULT_ADMIN_ROLE) nonReentrant { if (isNative(token)) { (bool success, ) = payable(msg.sender).call{value: amount}(""); require(success == true); } else { token.call(abi.encodeWithSignature("transfer(address,uint256)", msg.sender, amount)); } } function toggleCommunityPause() external onlyRole(DEFAULT_ADMIN_ROLE) { isCommunityPauseEnabled = !isCommunityPauseEnabled; } function communityPause() external payable whenNotPaused { // Check if msg.value is within the allowed range require(isCommunityPauseEnabled, "Community pause is disabled"); require( pauseStakeAmountMin != 0 && pauseStakeAmountMax != 0, "Set Stake Amount Range" ); require( msg.value >= pauseStakeAmountMin && msg.value <= pauseStakeAmountMax, "Stake amount out of range" ); uint256 newTotalStakedAmount = totalStakedAmount + msg.value; totalStakedAmount = newTotalStakedAmount; _pause(); emit CommunityPaused(msg.sender, msg.value); } function withdrawStakeAmount() external onlyRole(DEFAULT_ADMIN_ROLE) { require( address(this).balance >= totalStakedAmount, "Insufficient funds" ); uint256 withdrawalAmount = totalStakedAmount; totalStakedAmount = 0; (bool success, ) = payable(msg.sender).call{value: withdrawalAmount}(""); require(success == true); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_wrappedNativeTokenAddress","type":"address"},{"internalType":"address","name":"_gatewayContract","type":"address"},{"internalType":"address","name":"_usdcAddress","type":"address"},{"internalType":"address","name":"_tokenMessenger","type":"address"},{"internalType":"bytes","name":"_routerMiddlewareBase","type":"bytes"},{"internalType":"uint256","name":"_minGasThreshhold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AmountTooLarge","type":"error"},{"inputs":[],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"InvalidFee","type":"error"},{"inputs":[],"name":"InvalidGateway","type":"error"},{"inputs":[],"name":"InvalidRefundData","type":"error"},{"inputs":[],"name":"InvalidRequestSender","type":"error"},{"inputs":[],"name":"MessageAlreadyExecuted","type":"error"},{"inputs":[],"name":"MessageExcecutionFailedWithLowGas","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pauser","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakedAmount","type":"uint256"}],"name":"CommunityPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"srcToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eventNonce","type":"uint256"},{"indexed":false,"internalType":"bool","name":"initiatewithdrawal","type":"bool"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"}],"name":"DepositInfoUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"partnerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"destChainIdBytes","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"destAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"address","name":"srcToken","type":"address"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"bytes","name":"recipient","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"destToken","type":"bytes"}],"name":"FundsDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"partnerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"destChainIdBytes","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"destAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"address","name":"srcToken","type":"address"},{"indexed":false,"internalType":"bytes","name":"recipient","type":"bytes"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"},{"indexed":false,"internalType":"bytes","name":"destToken","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"FundsDepositedWithMessage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"messageHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"forwarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"}],"name":"FundsPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"messageHash","type":"bytes32"},{"indexed":false,"internalType":"address","name":"forwarder","type":"address"},{"indexed":false,"internalType":"uint256","name":"nonce","type":"uint256"},{"indexed":false,"internalType":"bool","name":"execFlag","type":"bool"},{"indexed":false,"internalType":"bytes","name":"execData","type":"bytes"}],"name":"FundsPaidWithMessage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"partnerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"destChainIdBytes","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"usdcNonce","type":"uint256"},{"indexed":false,"internalType":"address","name":"srcToken","type":"address"},{"indexed":false,"internalType":"bytes32","name":"recipient","type":"bytes32"},{"indexed":false,"internalType":"address","name":"depositor","type":"address"}],"name":"iUSDCDeposited","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TRANSFER_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_GAS_THRESHHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESOURCE_SETTER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"communityPause","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"depositNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"destDetails","outputs":[{"internalType":"uint32","name":"domainId","type":"uint32"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bool","name":"isSet","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"executeRecord","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gatewayContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"partnerId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"refundRecipient","type":"address"},{"internalType":"bytes32","name":"destChainIdBytes","type":"bytes32"}],"internalType":"struct IAssetForwarder.DepositData","name":"depositData","type":"tuple"},{"internalType":"bytes","name":"destToken","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"}],"name":"iDeposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"bool","name":"initiatewithdrawal","type":"bool"}],"name":"iDepositInfoUpdate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"partnerId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"address","name":"srcToken","type":"address"},{"internalType":"address","name":"refundRecipient","type":"address"},{"internalType":"bytes32","name":"destChainIdBytes","type":"bytes32"}],"internalType":"struct IAssetForwarder.DepositData","name":"depositData","type":"tuple"},{"internalType":"bytes","name":"destToken","type":"bytes"},{"internalType":"bytes","name":"recipient","type":"bytes"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"iDepositMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"partnerId","type":"uint256"},{"internalType":"bytes32","name":"destChainIdBytes","type":"bytes32"},{"internalType":"bytes32","name":"recipient","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"iDepositUSDC","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"requestSender","type":"string"},{"internalType":"bytes","name":"packet","type":"bytes"},{"internalType":"string","name":"","type":"string"}],"name":"iReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"srcChainId","type":"bytes32"},{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"destToken","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"internalType":"struct IAssetForwarder.RelayData","name":"relayData","type":"tuple"}],"name":"iRelay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"srcChainId","type":"bytes32"},{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"address","name":"destToken","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"bytes","name":"message","type":"bytes"}],"internalType":"struct IAssetForwarder.RelayDataMessage","name":"relayData","type":"tuple"}],"name":"iRelayMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"isCommunityPauseEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseStakeAmountMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseStakeAmountMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"routerMiddlewareBase","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_destChainIdBytes","type":"bytes32[]"},{"components":[{"internalType":"uint32","name":"domainId","type":"uint32"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bool","name":"isSet","type":"bool"}],"internalType":"struct IAssetForwarder.DestDetails[]","name":"_destDetails","type":"tuple[]"}],"name":"setDestDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleCommunityPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenMessenger","outputs":[{"internalType":"contract ITokenMessenger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"_gatewayContract","type":"address"},{"internalType":"bytes","name":"_routerMiddlewareBase","type":"bytes"},{"internalType":"uint256","name":"minPauseStakeAmount","type":"uint256"},{"internalType":"uint256","name":"maxPauseStakeAmount","type":"uint256"}],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenMessenger","type":"address"}],"name":"updateTokenMessenger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawStakeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrappedNativeToken","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a0604052600d805460ff191660011790553480156200001e57600080fd5b50604051620049a3380380620049a38339810160408190526200004191620001e3565b6001805461ffff1916811790556001600160a01b03868116608052600580546001600160a01b03199081168684161790915560038054821688841617905560048054909116918616919091179055815160208301206002556009819055620000ab6000336200010f565b620000d77f8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb078336200010f565b620001037f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c336200010f565b5050505050506200030b565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620001ac576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556200016b3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b80516001600160a01b0381168114620001c857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c08789031215620001fd57600080fd5b6200020887620001b0565b9550602062000219818901620001b0565b95506200022960408901620001b0565b94506200023960608901620001b0565b60808901519094506001600160401b03808211156200025757600080fd5b818a0191508a601f8301126200026c57600080fd5b815181811115620002815762000281620001cd565b604051601f8201601f19908116603f01168101908382118183101715620002ac57620002ac620001cd565b816040528281528d86848701011115620002c557600080fd5b600093505b82841015620002e95784840186015181850187015292850192620002ca565b600086848301015280975050505050505060a087015190509295509295509295565b608051614652620003516000396000818161034701528181610b7b01528181610c0f01528181612587015281816126080152818161282501526128b901526146526000f3fe6080604052600436106102c65760003560e01c806378e0f9bd11610179578063c44e947e116100d6578063de35f5cb1161008a578063f452ed4d11610064578063f452ed4d14610809578063f627df941461081c578063fd5ad37c1461083157600080fd5b8063de35f5cb146107b0578063eb0cde1d146107c6578063f215f148146107f357600080fd5b8063d9dc8694116100bb578063d9dc869414610725578063db618e2a14610759578063ddd224f11461078d57600080fd5b8063c44e947e146106ef578063d547741f1461070557600080fd5b8063981a8a021161012d578063ac9650d811610112578063ac9650d814610699578063ad7c17ee146106c6578063b19941a9146106d957600080fd5b8063981a8a021461061a578063a217fddf1461068457600080fd5b80638456cb591161015e5780638456cb591461059f5780638a27fecb146105b457806391d14854146105c957600080fd5b806378e0f9bd1461055f5780637a4e4ecf1461057f57600080fd5b80633f4ba83a116102275780635ac62700116101db57806364778c1f116101c057806364778c1f146105315780636696821b146105445780636fb003da1461054c57600080fd5b80635ac62700146104f45780635c975abb1461051457600080fd5b8063461178301161020c578063461178301461049b5780634b7b9476146104c8578063567e98f9146104de57600080fd5b80633f4ba83a1461046c5780634463182f1461048157600080fd5b8063248a9ca31161027e57806336568abe1161026357806336568abe1461040c5780633e28c7d21461042c5780633e413bee1461043f57600080fd5b8063248a9ca3146103ae5780632f2ff15d146103ec57600080fd5b80630421caf0116102af5780630421caf01461032257806317fcb39b146103355780631aa6485a1461038e57600080fd5b80630171958a146102cb57806301ffc9a7146102ed575b600080fd5b3480156102d757600080fd5b506102eb6102e63660046137f0565b610861565b005b3480156102f957600080fd5b5061030d6103083660046138a9565b6109dd565b60405190151581526020015b60405180910390f35b6102eb610330366004613a10565b610a76565b34801561034157600080fd5b506103697f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610319565b34801561039a57600080fd5b506102eb6103a9366004613af5565b610d13565b3480156103ba57600080fd5b506103de6103c9366004613b8a565b60009081526020819052604090206001015490565b604051908152602001610319565b3480156103f857600080fd5b506102eb610407366004613ba3565b610f7e565b34801561041857600080fd5b506102eb610427366004613ba3565b610fa8565b6102eb61043a366004613bd3565b61105b565b34801561044b57600080fd5b506004546103699073ffffffffffffffffffffffffffffffffffffffff1681565b34801561047857600080fd5b506102eb6113b2565b34801561048d57600080fd5b50600d5461030d9060ff1681565b3480156104a757600080fd5b506005546103699073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104d457600080fd5b506103de60095481565b3480156104ea57600080fd5b506103de600c5481565b34801561050057600080fd5b506102eb61050f366004613c05565b6113ef565b34801561052057600080fd5b50600154610100900460ff1661030d565b6102eb61053f366004613c73565b611561565b6102eb6118ba565b6102eb61055a366004613cf2565b611a77565b34801561056b57600080fd5b506102eb61057a366004613da3565b611f12565b34801561058b57600080fd5b506102eb61059a366004613dc0565b611f84565b3480156105ab57600080fd5b506102eb612177565b3480156105c057600080fd5b506102eb6121b1565b3480156105d557600080fd5b5061030d6105e4366004613ba3565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561062657600080fd5b50610660610635366004613b8a565b60076020526000908152604090208054600182015460029092015463ffffffff909116919060ff1683565b6040805163ffffffff90941684526020840192909252151590820152606001610319565b34801561069057600080fd5b506103de600081565b3480156106a557600080fd5b506106b96106b4366004613dec565b61228d565b6040516103199190613ecf565b6102eb6106d4366004613f4f565b6123ff565b3480156106e557600080fd5b506103de600a5481565b3480156106fb57600080fd5b506103de60025481565b34801561071157600080fd5b506102eb610720366004613ba3565b6126fb565b34801561073157600080fd5b506103de7f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c81565b34801561076557600080fd5b506103de7f8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb07881565b34801561079957600080fd5b506103de6ec097ce7bc90715b34b9f100000000081565b3480156107bc57600080fd5b506103de60065481565b3480156107d257600080fd5b506003546103699073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107ff57600080fd5b506103de600b5481565b6102eb610817366004613f99565b612720565b34801561082857600080fd5b506102eb6129bc565b34801561083d57600080fd5b5061030d61084c366004613b8a565b60086020526000908152604090205460ff1681565b7f8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb07861088b816129fa565b81518351146108fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964206c656e67746800000000000000000000000000000000000060448201526064015b60405180910390fd5b60005b82518110156109d7578281815181106109195761091961400f565b6020026020010151600760008684815181106109375761093761400f565b6020908102919091018101518252818101929092526040908101600020835181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9091161781559183015160018301559190910151600290910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806109cf8161406d565b9150506108fe565b50505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610a7057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610a7e612a04565b610aab600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610ab3612a72565b6ec097ce7bc90715b34b9f100000000084602001511115610b00576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b37846060015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1490565b15610c3c5734846020015114610b79576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610be157600080fd5b505af1158015610bf5573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016606087015250610c719050565b610c7133308660200151876060015173ffffffffffffffffffffffffffffffffffffffff16612ae4909392919063ffffffff16565b7f3dbc28a2fa93575c89d951d683c45ddb951a2ecf6bc9b9704a61589fa0fcb70f846000015185602001518660a001518760400151600660008154610cb59061406d565b918290555060608a015160808b0151604051610cdc979695949392918b918d908c906140a5565b60405180910390a16109d7600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b60035473ffffffffffffffffffffffffffffffffffffffff163314610d64576040517ffc9dfe8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484604051610d74929190614137565b604051809103902060025414610db6576040517f23dfe1fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600085806020019051810190610dcf91906141ad565b92509250925060008251905081518114610e15576040517f94809d2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610f7257610e6c848281518110610e3557610e3561400f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1490565b610ed257610ecd85848381518110610e8657610e8661400f565b6020026020010151868481518110610ea057610ea061400f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16612bc09092919063ffffffff16565b610f60565b60008573ffffffffffffffffffffffffffffffffffffffff16848381518110610efd57610efd61400f565b602002602001015160405160006040518083038185875af1925050503d8060008114610f45576040519150601f19603f3d011682016040523d82523d6000602084013e610f4a565b606091505b5090915050600181151514610f5e57600080fd5b505b80610f6a8161406d565b915050610e18565b50505050505050505050565b600082815260208190526040902060010154610f99816129fa565b610fa38383612c16565b505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084016108f2565b6110578282612d06565b5050565b611063612a04565b611090600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b611098612a72565b60008381526007602052604090206002015460ff1680156110d0575060045473ffffffffffffffffffffffffffffffffffffffff1615155b61115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f75736463206e6f7420737570706f7274656420656974686572206f6e2073726360448201527f206f6e2064737420636861696e0000000000000000000000000000000000000060648201526084016108f2565b60008381526007602052604090206001015434146111a6576040517f58d620b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6ec097ce7bc90715b34b9f10000000008111156111ef576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004546112149073ffffffffffffffffffffffffffffffffffffffff16333084612ae4565b60055460045461123e9173ffffffffffffffffffffffffffffffffffffffff918216911683612dbd565b600554600084815260076020526040808220546004805492517f6fd3504e00000000000000000000000000000000000000000000000000000000815290810186905263ffffffff90911660248201526044810186905273ffffffffffffffffffffffffffffffffffffffff918216606482015291921690636fd3504e906084016020604051808303816000875af11580156112dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611301919061427c565b600454604080518881526020810186905290810187905267ffffffffffffffff8316606082015273ffffffffffffffffffffffffffffffffffffffff909116608082015260a081018590523360c08201529091507f297a8bc8b87367a63661d6429dbab51be5cefd71ce6a3050fa900a8f276d66d99060e00160405180910390a1506109d7600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c6113dc816129fa565b6113e4612eb6565b6113ec612f27565b50565b7f8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb078611419816129fa565b8660010361146657600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055611558565b8660020361148f57848460405161147e929190614137565b604051908190039020600255611558565b86600303611558578183111561154d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f6d696e50617573655374616b65416d6f756e74206d757374206265206c65737360448201527f207468616e206f7220657175616c20746f206d617850617573655374616b654160648201527f6d6f756e74000000000000000000000000000000000000000000000000000000608482015260a4016108f2565b600a839055600b8290555b50505050505050565b611569612a04565b611596600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b61159e612a72565b80516ec097ce7bc90715b34b9f100000000010156115e8576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516020808301516040808501516060808701516080808901518551978801989098529386019490945284015273ffffffffffffffffffffffffffffffffffffffff9182169083015290911660a08201523060c082015260009060e001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600890935291205490915060ff16156116c5576040517f7448c64c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560608201516117349073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1490565b156117ef5781513414611773576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6080820151825160405160009273ffffffffffffffffffffffffffffffffffffffff1691908381818185875af1925050503d80600081146117d0576040519150601f19603f3d011682016040523d82523d6000602084013e6117d5565b606091505b50909150506001811515146117e957600080fd5b50611820565b6080820151825160608401516118209273ffffffffffffffffffffffffffffffffffffffff90911691339190612ae4565b7f0f3ca0b27903ec13ef88a7ea8be837cc19b0d7f71a735f2083215739a800446481336006600081546118529061406d565b91829055506040805193845273ffffffffffffffffffffffffffffffffffffffff90921660208401529082015260600160405180910390a1506113ec600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b6118c2612a72565b600d5460ff1661192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f436f6d6d756e6974792070617573652069732064697361626c6564000000000060448201526064016108f2565b600a54158015906119405750600b5415155b6119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f536574205374616b6520416d6f756e742052616e67650000000000000000000060448201526064016108f2565b600a5434101580156119ba5750600b543411155b611a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5374616b6520616d6f756e74206f7574206f662072616e67650000000000000060448201526064016108f2565b600034600c54611a3091906142a6565b600c8190559050611a3f612fa4565b60405134815233907f9593b43c20e09177a4170170ac564123ad8138e040e21eec96d1ae9db9ee5d6d9060200160405180910390a250565b611a7f612a04565b611aac600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b611ab4612a72565b80516ec097ce7bc90715b34b9f10000000001015611afe576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516020808301516040808501516060860151608087015160a08801519351600097611b319790969530929091016142b9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600890935291205490915060ff1615611bb1576040517f7448c64c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556060820151611c209073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1490565b15611cdb5781513414611c5f576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6080820151825160405160009273ffffffffffffffffffffffffffffffffffffffff1691908381818185875af1925050503d8060008114611cbc576040519150601f19603f3d011682016040523d82523d6000602084013e611cc1565b606091505b5090915050600181151514611cd557600080fd5b50611d0c565b608082015182516060840151611d0c9273ffffffffffffffffffffffffffffffffffffffff90911691339190612ae4565b60606000611d1e84608001513b151590565b8015611d2f575060008460a0015151115b15611e8e57836080015173ffffffffffffffffffffffffffffffffffffffff1663d00a2d5f60e01b856060015186600001518760a00151604051602401611d7893929190614319565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611e019190614357565b6000604051808303816000865af19150503d8060008114611e3e576040519150601f19603f3d011682016040523d82523d6000602084013e611e43565b606091505b509250905080158015611e5757506009545a105b15611e8e576040517f9e82ca7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f21937deaa62558dad619c8d730a7d1d7ef41731fc194c32973511e1455cb37ad8333600660008154611ec09061406d565b9182905550604051611ed89392919086908890614373565b60405180910390a15050506113ec600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7f8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb078611f3c816129fa565b50600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000611f8f816129fa565b611f97612a04565b611fc4600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff84160361205657604051600090339084908381818185875af1925050503d8060008114612037576040519150601f19603f3d011682016040523d82523d6000602084013e61203c565b606091505b509091505060018115151461205057600080fd5b50612148565b6040513360248201526044810183905273ffffffffffffffffffffffffffffffffffffffff841690606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052516121029190614357565b6000604051808303816000865af19150503d806000811461213f576040519150601f19603f3d011682016040523d82523d6000602084013e612144565b606091505b5050505b610fa3600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c6121a1816129fa565b6121a9612a72565b6113ec612fa4565b60006121bc816129fa565b600c54471015612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742066756e6473000000000000000000000000000060448201526064016108f2565b600c8054600091829055604051909190339083908381818185875af1925050503d8060008114612274576040519150601f19603f3d011682016040523d82523d6000602084013e612279565b606091505b5090915050600181151514610fa357600080fd5b60608167ffffffffffffffff8111156122a8576122a861363f565b6040519080825280602002602001820160405280156122db57816020015b60608152602001906001900390816122c65790505b50905060005b828110156123f857600080308686858181106122ff576122ff61400f565b905060200281019061231191906143b6565b60405161231f929190614137565b600060405180830381855af49150503d806000811461235a576040519150601f19603f3d011682016040523d82523d6000602084013e61235f565b606091505b5091509150816123c55760448151101561237857600080fd5b60048101905080806020019051810190612392919061441b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f29190614489565b808484815181106123d8576123d861400f565b6020026020010181905250505080806123f09061406d565b9150506122e1565b5092915050565b612407612a04565b612434600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b61243c612a72565b80156124d257341561244d57600080fd5b7f86896302632bf6dc8a3ac0ae7ddf17d5a5d5c1ca1aad37b4b920a587c51135b1846000846006600081546124819061406d565b91829055506040805173ffffffffffffffffffffffffffffffffffffffff90951685526020850193909352918301526060820152600160808201523360a082015260c00160405180910390a16126cc565b6ec097ce7bc90715b34b9f100000000083111561251b576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff85160361262e57348314612585576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125ed57600080fd5b505af1158015612601573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000009350612650565b61265073ffffffffffffffffffffffffffffffffffffffff8516333086612ae4565b7f86896302632bf6dc8a3ac0ae7ddf17d5a5d5c1ca1aad37b4b920a587c51135b18484846006600081546126839061406d565b91829055506040805173ffffffffffffffffffffffffffffffffffffffff90951685526020850193909352918301526060820152600060808201523360a082015260c001610cdc565b6109d7600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b600082815260208190526040902060010154612716816129fa565b610fa38383612d06565b612728612a04565b612755600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b61275d612a72565b6ec097ce7bc90715b34b9f1000000000836020015111156127aa576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127e1836060015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1490565b156128e65734836020015114612823576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561288b57600080fd5b505af115801561289f573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660608601525061291b9050565b61291b33308560200151866060015173ffffffffffffffffffffffffffffffffffffffff16612ae4909392919063ffffffff16565b7f6f223106c8e3df857d691613d18d1478cc7c629a1fdf16c7b461d36729fcc7ad836000015184602001518560a00151866040015160066000815461295f9061406d565b9182905550606089015160808a015160405161298597969594939291908a908c9061449c565b60405180910390a1610fa3600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b60006129c7816129fa565b50600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6113ec8133613000565b60015460ff16612a70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108f2565b565b600154610100900460ff1615612a70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016108f2565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109d79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526130b8565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610fa39084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612b3e565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166110575760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612ca83390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156110575760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e579190614519565b90506109d7847f095ea7b30000000000000000000000000000000000000000000000000000000085612e8986866142a6565b60405173ffffffffffffffffffffffffffffffffffffffff90921660248301526044820152606401612b3e565b600154610100900460ff16612a70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016108f2565b612f2f612eb6565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b612fac612a72565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f7a3390565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166110575761303e816131c7565b6130498360206131e6565b60405160200161305a929190614532565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526108f291600401614489565b600061311a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134309092919063ffffffff16565b905080516000148061313b57508080602001905181019061313b91906145b3565b610fa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108f2565b6060610a7073ffffffffffffffffffffffffffffffffffffffff831660145b606060006131f58360026145d0565b6132009060026142a6565b67ffffffffffffffff8111156132185761321861363f565b6040519080825280601f01601f191660200182016040528015613242576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106132795761327961400f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106132dc576132dc61400f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006133188460026145d0565b6133239060016142a6565b90505b60018111156133c0577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106133645761336461400f565b1a60f81b82828151811061337a5761337a61400f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936133b9816145e7565b9050613326565b508315613429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108f2565b9392505050565b606061343f8484600085613447565b949350505050565b6060824710156134d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108f2565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135029190614357565b60006040518083038185875af1925050503d806000811461353f576040519150601f19603f3d011682016040523d82523d6000602084013e613544565b606091505b509150915061355587838387613560565b979650505050505050565b606083156135f65782516000036135ef5773ffffffffffffffffffffffffffffffffffffffff85163b6135ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108f2565b508161343f565b61343f838381511561360b5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f29190614489565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156136915761369161363f565b60405290565b60405160c0810167ffffffffffffffff811182821017156136915761369161363f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156137015761370161363f565b604052919050565b600067ffffffffffffffff8211156137235761372361363f565b5060051b60200190565b80151581146113ec57600080fd5b600082601f83011261374c57600080fd5b8135602061376161375c83613709565b6136ba565b8281526060928302850182019282820191908785111561378057600080fd5b8387015b858110156137e35781818a03121561379c5760008081fd5b6137a461366e565b813563ffffffff811681146137b95760008081fd5b815281860135868201526040808301356137d28161372d565b908201528452928401928101613784565b5090979650505050505050565b6000806040838503121561380357600080fd5b823567ffffffffffffffff8082111561381b57600080fd5b818501915085601f83011261382f57600080fd5b8135602061383f61375c83613709565b82815260059290921b8401810191818101908984111561385e57600080fd5b948201945b8386101561387c57853582529482019490820190613863565b9650508601359250508082111561389257600080fd5b5061389f8582860161373b565b9150509250929050565b6000602082840312156138bb57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461342957600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146113ec57600080fd5b600060c0828403121561391f57600080fd5b613927613697565b9050813581526020820135602082015260408201356040820152606082013561394f816138eb565b60608201526080820135613962816138eb565b8060808301525060a082013560a082015292915050565b600067ffffffffffffffff8211156139935761399361363f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126139d057600080fd5b81356139de61375c82613979565b8181528460208386010111156139f357600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806101208587031215613a2757600080fd5b613a31868661390d565b935060c085013567ffffffffffffffff80821115613a4e57600080fd5b613a5a888389016139bf565b945060e0870135915080821115613a7057600080fd5b613a7c888389016139bf565b9350610100870135915080821115613a9357600080fd5b50613aa0878288016139bf565b91505092959194509250565b60008083601f840112613abe57600080fd5b50813567ffffffffffffffff811115613ad657600080fd5b602083019150836020828501011115613aee57600080fd5b9250929050565b600080600080600060608688031215613b0d57600080fd5b853567ffffffffffffffff80821115613b2557600080fd5b613b3189838a01613aac565b90975095506020880135915080821115613b4a57600080fd5b613b5689838a016139bf565b94506040880135915080821115613b6c57600080fd5b50613b7988828901613aac565b969995985093965092949392505050565b600060208284031215613b9c57600080fd5b5035919050565b60008060408385031215613bb657600080fd5b823591506020830135613bc8816138eb565b809150509250929050565b60008060008060808587031215613be957600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060008060a08789031215613c1e57600080fd5b863595506020870135613c30816138eb565b9450604087013567ffffffffffffffff811115613c4c57600080fd5b613c5889828a01613aac565b979a9699509760608101359660809091013595509350505050565b600060a08284031215613c8557600080fd5b60405160a0810181811067ffffffffffffffff82111715613ca857613ca861363f565b80604052508235815260208301356020820152604083013560408201526060830135613cd3816138eb565b60608201526080830135613ce6816138eb565b60808201529392505050565b600060208284031215613d0457600080fd5b813567ffffffffffffffff80821115613d1c57600080fd5b9083019060c08286031215613d3057600080fd5b613d38613697565b8235815260208301356020820152604083013560408201526060830135613d5e816138eb565b60608201526080830135613d71816138eb565b608082015260a083013582811115613d8857600080fd5b613d94878286016139bf565b60a08301525095945050505050565b600060208284031215613db557600080fd5b8135613429816138eb565b60008060408385031215613dd357600080fd5b8235613dde816138eb565b946020939093013593505050565b60008060208385031215613dff57600080fd5b823567ffffffffffffffff80821115613e1757600080fd5b818501915085601f830112613e2b57600080fd5b813581811115613e3a57600080fd5b8660208260051b8501011115613e4f57600080fd5b60209290920196919550909350505050565b60005b83811015613e7c578181015183820152602001613e64565b50506000910152565b60008151808452613e9d816020860160208601613e61565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613f42577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613f30858351613e85565b94509285019290850190600101613ef6565b5092979650505050505050565b60008060008060808587031215613f6557600080fd5b8435613f70816138eb565b935060208501359250604085013591506060850135613f8e8161372d565b939692955090935050565b60008060006101008486031215613faf57600080fd5b613fb9858561390d565b925060c084013567ffffffffffffffff80821115613fd657600080fd5b613fe2878388016139bf565b935060e0860135915080821115613ff857600080fd5b50614005868287016139bf565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361409e5761409e61403e565b5060010190565b60006101408c83528b60208401528a604084015289606084015288608084015273ffffffffffffffffffffffffffffffffffffffff80891660a08501528160c08501526140f482850189613e85565b90871660e085015283810361010085015290506141118186613e85565b90508281036101208401526141268185613e85565b9d9c50505050505050505050505050565b8183823760009101908152919050565b600082601f83011261415857600080fd5b8151602061416861375c83613709565b82815260059290921b8401810191818101908684111561418757600080fd5b8286015b848110156141a2578051835291830191830161418b565b509695505050505050565b6000806000606084860312156141c257600080fd5b83516141cd816138eb565b8093505060208085015167ffffffffffffffff808211156141ed57600080fd5b818701915087601f83011261420157600080fd5b815161420f61375c82613709565b81815260059190911b8301840190848101908a83111561422e57600080fd5b938501935b82851015614255578451614246816138eb565b82529385019390850190614233565b60408a0151909750945050508083111561426e57600080fd5b505061400586828701614147565b60006020828403121561428e57600080fd5b815167ffffffffffffffff8116811461342957600080fd5b80820180821115610a7057610a7061403e565b878152866020820152856040820152600073ffffffffffffffffffffffffffffffffffffffff8087166060840152808616608084015280851660a08401525060e060c083015261430c60e0830184613e85565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260606040820152600061434e6060830184613e85565b95945050505050565b60008251614369818460208701613e61565b9190910192915050565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260a06080820152600061355560a0830184613e85565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126143eb57600080fd5b83018035915067ffffffffffffffff82111561440657600080fd5b602001915036819003821315613aee57600080fd5b60006020828403121561442d57600080fd5b815167ffffffffffffffff81111561444457600080fd5b8201601f8101841361445557600080fd5b805161446361375c82613979565b81815285602083850101111561447857600080fd5b61434e826020830160208601613e61565b6020815260006134296020830184613e85565b60006101208b83528a602084015289604084015288606084015287608084015273ffffffffffffffffffffffffffffffffffffffff80881660a085015280871660c0850152508060e08401526144f481840186613e85565b90508281036101008401526145098185613e85565b9c9b505050505050505050505050565b60006020828403121561452b57600080fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161456a816017850160208801613e61565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516145a7816028840160208801613e61565b01602801949350505050565b6000602082840312156145c557600080fd5b81516134298161372d565b8082028115828204841417610a7057610a7061403e565b6000816145f6576145f661403e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122019c3db2d84027c397e87bd60394685793eaf26d211d3f384ceadc8837375c3ae64736f6c634300081200330000000000000000000000004300000000000000000000000000000000000004000000000000000000000000c21e4ebd1d92036cb467b53fe3258f219d909eb90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000c3500000000000000000000000000000000000000000000000000000000000000041726f757465723134686a32746176713866706573647778786375343472747933686839307668756a7276636d73746c347a723374786d667677397330307a74766b00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102c65760003560e01c806378e0f9bd11610179578063c44e947e116100d6578063de35f5cb1161008a578063f452ed4d11610064578063f452ed4d14610809578063f627df941461081c578063fd5ad37c1461083157600080fd5b8063de35f5cb146107b0578063eb0cde1d146107c6578063f215f148146107f357600080fd5b8063d9dc8694116100bb578063d9dc869414610725578063db618e2a14610759578063ddd224f11461078d57600080fd5b8063c44e947e146106ef578063d547741f1461070557600080fd5b8063981a8a021161012d578063ac9650d811610112578063ac9650d814610699578063ad7c17ee146106c6578063b19941a9146106d957600080fd5b8063981a8a021461061a578063a217fddf1461068457600080fd5b80638456cb591161015e5780638456cb591461059f5780638a27fecb146105b457806391d14854146105c957600080fd5b806378e0f9bd1461055f5780637a4e4ecf1461057f57600080fd5b80633f4ba83a116102275780635ac62700116101db57806364778c1f116101c057806364778c1f146105315780636696821b146105445780636fb003da1461054c57600080fd5b80635ac62700146104f45780635c975abb1461051457600080fd5b8063461178301161020c578063461178301461049b5780634b7b9476146104c8578063567e98f9146104de57600080fd5b80633f4ba83a1461046c5780634463182f1461048157600080fd5b8063248a9ca31161027e57806336568abe1161026357806336568abe1461040c5780633e28c7d21461042c5780633e413bee1461043f57600080fd5b8063248a9ca3146103ae5780632f2ff15d146103ec57600080fd5b80630421caf0116102af5780630421caf01461032257806317fcb39b146103355780631aa6485a1461038e57600080fd5b80630171958a146102cb57806301ffc9a7146102ed575b600080fd5b3480156102d757600080fd5b506102eb6102e63660046137f0565b610861565b005b3480156102f957600080fd5b5061030d6103083660046138a9565b6109dd565b60405190151581526020015b60405180910390f35b6102eb610330366004613a10565b610a76565b34801561034157600080fd5b506103697f000000000000000000000000430000000000000000000000000000000000000481565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610319565b34801561039a57600080fd5b506102eb6103a9366004613af5565b610d13565b3480156103ba57600080fd5b506103de6103c9366004613b8a565b60009081526020819052604090206001015490565b604051908152602001610319565b3480156103f857600080fd5b506102eb610407366004613ba3565b610f7e565b34801561041857600080fd5b506102eb610427366004613ba3565b610fa8565b6102eb61043a366004613bd3565b61105b565b34801561044b57600080fd5b506004546103699073ffffffffffffffffffffffffffffffffffffffff1681565b34801561047857600080fd5b506102eb6113b2565b34801561048d57600080fd5b50600d5461030d9060ff1681565b3480156104a757600080fd5b506005546103699073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104d457600080fd5b506103de60095481565b3480156104ea57600080fd5b506103de600c5481565b34801561050057600080fd5b506102eb61050f366004613c05565b6113ef565b34801561052057600080fd5b50600154610100900460ff1661030d565b6102eb61053f366004613c73565b611561565b6102eb6118ba565b6102eb61055a366004613cf2565b611a77565b34801561056b57600080fd5b506102eb61057a366004613da3565b611f12565b34801561058b57600080fd5b506102eb61059a366004613dc0565b611f84565b3480156105ab57600080fd5b506102eb612177565b3480156105c057600080fd5b506102eb6121b1565b3480156105d557600080fd5b5061030d6105e4366004613ba3565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561062657600080fd5b50610660610635366004613b8a565b60076020526000908152604090208054600182015460029092015463ffffffff909116919060ff1683565b6040805163ffffffff90941684526020840192909252151590820152606001610319565b34801561069057600080fd5b506103de600081565b3480156106a557600080fd5b506106b96106b4366004613dec565b61228d565b6040516103199190613ecf565b6102eb6106d4366004613f4f565b6123ff565b3480156106e557600080fd5b506103de600a5481565b3480156106fb57600080fd5b506103de60025481565b34801561071157600080fd5b506102eb610720366004613ba3565b6126fb565b34801561073157600080fd5b506103de7f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c81565b34801561076557600080fd5b506103de7f8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb07881565b34801561079957600080fd5b506103de6ec097ce7bc90715b34b9f100000000081565b3480156107bc57600080fd5b506103de60065481565b3480156107d257600080fd5b506003546103699073ffffffffffffffffffffffffffffffffffffffff1681565b3480156107ff57600080fd5b506103de600b5481565b6102eb610817366004613f99565b612720565b34801561082857600080fd5b506102eb6129bc565b34801561083d57600080fd5b5061030d61084c366004613b8a565b60086020526000908152604090205460ff1681565b7f8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb07861088b816129fa565b81518351146108fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964206c656e67746800000000000000000000000000000000000060448201526064015b60405180910390fd5b60005b82518110156109d7578281815181106109195761091961400f565b6020026020010151600760008684815181106109375761093761400f565b6020908102919091018101518252818101929092526040908101600020835181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff9091161781559183015160018301559190910151600290910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806109cf8161406d565b9150506108fe565b50505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610a7057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b610a7e612a04565b610aab600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b610ab3612a72565b6ec097ce7bc90715b34b9f100000000084602001511115610b00576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b37846060015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1490565b15610c3c5734846020015114610b79576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015610be157600080fd5b505af1158015610bf5573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000430000000000000000000000000000000000000416606087015250610c719050565b610c7133308660200151876060015173ffffffffffffffffffffffffffffffffffffffff16612ae4909392919063ffffffff16565b7f3dbc28a2fa93575c89d951d683c45ddb951a2ecf6bc9b9704a61589fa0fcb70f846000015185602001518660a001518760400151600660008154610cb59061406d565b918290555060608a015160808b0151604051610cdc979695949392918b918d908c906140a5565b60405180910390a16109d7600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b60035473ffffffffffffffffffffffffffffffffffffffff163314610d64576040517ffc9dfe8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8484604051610d74929190614137565b604051809103902060025414610db6576040517f23dfe1fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600085806020019051810190610dcf91906141ad565b92509250925060008251905081518114610e15576040517f94809d2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610f7257610e6c848281518110610e3557610e3561400f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1490565b610ed257610ecd85848381518110610e8657610e8661400f565b6020026020010151868481518110610ea057610ea061400f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16612bc09092919063ffffffff16565b610f60565b60008573ffffffffffffffffffffffffffffffffffffffff16848381518110610efd57610efd61400f565b602002602001015160405160006040518083038185875af1925050503d8060008114610f45576040519150601f19603f3d011682016040523d82523d6000602084013e610f4a565b606091505b5090915050600181151514610f5e57600080fd5b505b80610f6a8161406d565b915050610e18565b50505050505050505050565b600082815260208190526040902060010154610f99816129fa565b610fa38383612c16565b505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461104d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084016108f2565b6110578282612d06565b5050565b611063612a04565b611090600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b611098612a72565b60008381526007602052604090206002015460ff1680156110d0575060045473ffffffffffffffffffffffffffffffffffffffff1615155b61115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f75736463206e6f7420737570706f7274656420656974686572206f6e2073726360448201527f206f6e2064737420636861696e0000000000000000000000000000000000000060648201526084016108f2565b60008381526007602052604090206001015434146111a6576040517f58d620b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6ec097ce7bc90715b34b9f10000000008111156111ef576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004546112149073ffffffffffffffffffffffffffffffffffffffff16333084612ae4565b60055460045461123e9173ffffffffffffffffffffffffffffffffffffffff918216911683612dbd565b600554600084815260076020526040808220546004805492517f6fd3504e00000000000000000000000000000000000000000000000000000000815290810186905263ffffffff90911660248201526044810186905273ffffffffffffffffffffffffffffffffffffffff918216606482015291921690636fd3504e906084016020604051808303816000875af11580156112dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611301919061427c565b600454604080518881526020810186905290810187905267ffffffffffffffff8316606082015273ffffffffffffffffffffffffffffffffffffffff909116608082015260a081018590523360c08201529091507f297a8bc8b87367a63661d6429dbab51be5cefd71ce6a3050fa900a8f276d66d99060e00160405180910390a1506109d7600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c6113dc816129fa565b6113e4612eb6565b6113ec612f27565b50565b7f8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb078611419816129fa565b8660010361146657600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816179055611558565b8660020361148f57848460405161147e929190614137565b604051908190039020600255611558565b86600303611558578183111561154d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f6d696e50617573655374616b65416d6f756e74206d757374206265206c65737360448201527f207468616e206f7220657175616c20746f206d617850617573655374616b654160648201527f6d6f756e74000000000000000000000000000000000000000000000000000000608482015260a4016108f2565b600a839055600b8290555b50505050505050565b611569612a04565b611596600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b61159e612a72565b80516ec097ce7bc90715b34b9f100000000010156115e8576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516020808301516040808501516060808701516080808901518551978801989098529386019490945284015273ffffffffffffffffffffffffffffffffffffffff9182169083015290911660a08201523060c082015260009060e001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600890935291205490915060ff16156116c5576040517f7448c64c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560608201516117349073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1490565b156117ef5781513414611773576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6080820151825160405160009273ffffffffffffffffffffffffffffffffffffffff1691908381818185875af1925050503d80600081146117d0576040519150601f19603f3d011682016040523d82523d6000602084013e6117d5565b606091505b50909150506001811515146117e957600080fd5b50611820565b6080820151825160608401516118209273ffffffffffffffffffffffffffffffffffffffff90911691339190612ae4565b7f0f3ca0b27903ec13ef88a7ea8be837cc19b0d7f71a735f2083215739a800446481336006600081546118529061406d565b91829055506040805193845273ffffffffffffffffffffffffffffffffffffffff90921660208401529082015260600160405180910390a1506113ec600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b6118c2612a72565b600d5460ff1661192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f436f6d6d756e6974792070617573652069732064697361626c6564000000000060448201526064016108f2565b600a54158015906119405750600b5415155b6119a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f536574205374616b6520416d6f756e742052616e67650000000000000000000060448201526064016108f2565b600a5434101580156119ba5750600b543411155b611a20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f5374616b6520616d6f756e74206f7574206f662072616e67650000000000000060448201526064016108f2565b600034600c54611a3091906142a6565b600c8190559050611a3f612fa4565b60405134815233907f9593b43c20e09177a4170170ac564123ad8138e040e21eec96d1ae9db9ee5d6d9060200160405180910390a250565b611a7f612a04565b611aac600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b611ab4612a72565b80516ec097ce7bc90715b34b9f10000000001015611afe576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516020808301516040808501516060860151608087015160a08801519351600097611b319790969530929091016142b9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600890935291205490915060ff1615611bb1576040517f7448c64c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556060820151611c209073ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1490565b15611cdb5781513414611c5f576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6080820151825160405160009273ffffffffffffffffffffffffffffffffffffffff1691908381818185875af1925050503d8060008114611cbc576040519150601f19603f3d011682016040523d82523d6000602084013e611cc1565b606091505b5090915050600181151514611cd557600080fd5b50611d0c565b608082015182516060840151611d0c9273ffffffffffffffffffffffffffffffffffffffff90911691339190612ae4565b60606000611d1e84608001513b151590565b8015611d2f575060008460a0015151115b15611e8e57836080015173ffffffffffffffffffffffffffffffffffffffff1663d00a2d5f60e01b856060015186600001518760a00151604051602401611d7893929190614319565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611e019190614357565b6000604051808303816000865af19150503d8060008114611e3e576040519150601f19603f3d011682016040523d82523d6000602084013e611e43565b606091505b509250905080158015611e5757506009545a105b15611e8e576040517f9e82ca7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f21937deaa62558dad619c8d730a7d1d7ef41731fc194c32973511e1455cb37ad8333600660008154611ec09061406d565b9182905550604051611ed89392919086908890614373565b60405180910390a15050506113ec600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7f8b9e7a9f25b0aca3f51c01b8fee30790fb16f4d4deded8385ae6643d054bb078611f3c816129fa565b50600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000611f8f816129fa565b611f97612a04565b611fc4600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff84160361205657604051600090339084908381818185875af1925050503d8060008114612037576040519150601f19603f3d011682016040523d82523d6000602084013e61203c565b606091505b509091505060018115151461205057600080fd5b50612148565b6040513360248201526044810183905273ffffffffffffffffffffffffffffffffffffffff841690606401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052516121029190614357565b6000604051808303816000865af19150503d806000811461213f576040519150601f19603f3d011682016040523d82523d6000602084013e612144565b606091505b5050505b610fa3600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b7f539440820030c4994db4e31b6b800deafd503688728f932addfe7a410515c14c6121a1816129fa565b6121a9612a72565b6113ec612fa4565b60006121bc816129fa565b600c54471015612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e742066756e6473000000000000000000000000000060448201526064016108f2565b600c8054600091829055604051909190339083908381818185875af1925050503d8060008114612274576040519150601f19603f3d011682016040523d82523d6000602084013e612279565b606091505b5090915050600181151514610fa357600080fd5b60608167ffffffffffffffff8111156122a8576122a861363f565b6040519080825280602002602001820160405280156122db57816020015b60608152602001906001900390816122c65790505b50905060005b828110156123f857600080308686858181106122ff576122ff61400f565b905060200281019061231191906143b6565b60405161231f929190614137565b600060405180830381855af49150503d806000811461235a576040519150601f19603f3d011682016040523d82523d6000602084013e61235f565b606091505b5091509150816123c55760448151101561237857600080fd5b60048101905080806020019051810190612392919061441b565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f29190614489565b808484815181106123d8576123d861400f565b6020026020010181905250505080806123f09061406d565b9150506122e1565b5092915050565b612407612a04565b612434600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b61243c612a72565b80156124d257341561244d57600080fd5b7f86896302632bf6dc8a3ac0ae7ddf17d5a5d5c1ca1aad37b4b920a587c51135b1846000846006600081546124819061406d565b91829055506040805173ffffffffffffffffffffffffffffffffffffffff90951685526020850193909352918301526060820152600160808201523360a082015260c00160405180910390a16126cc565b6ec097ce7bc90715b34b9f100000000083111561251b576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff85160361262e57348314612585576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156125ed57600080fd5b505af1158015612601573d6000803e3d6000fd5b50505050507f00000000000000000000000043000000000000000000000000000000000000049350612650565b61265073ffffffffffffffffffffffffffffffffffffffff8516333086612ae4565b7f86896302632bf6dc8a3ac0ae7ddf17d5a5d5c1ca1aad37b4b920a587c51135b18484846006600081546126839061406d565b91829055506040805173ffffffffffffffffffffffffffffffffffffffff90951685526020850193909352918301526060820152600060808201523360a082015260c001610cdc565b6109d7600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b600082815260208190526040902060010154612716816129fa565b610fa38383612d06565b612728612a04565b612755600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b61275d612a72565b6ec097ce7bc90715b34b9f1000000000836020015111156127aa576040517f0625040100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127e1836060015173ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1490565b156128e65734836020015114612823576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000430000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561288b57600080fd5b505af115801561289f573d6000803e3d6000fd5b50505073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000043000000000000000000000000000000000000041660608601525061291b9050565b61291b33308560200151866060015173ffffffffffffffffffffffffffffffffffffffff16612ae4909392919063ffffffff16565b7f6f223106c8e3df857d691613d18d1478cc7c629a1fdf16c7b461d36729fcc7ad836000015184602001518560a00151866040015160066000815461295f9061406d565b9182905550606089015160808a015160405161298597969594939291908a908c9061449c565b60405180910390a1610fa3600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681179055565b60006129c7816129fa565b50600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6113ec8133613000565b60015460ff16612a70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108f2565b565b600154610100900460ff1615612a70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016108f2565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109d79085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526130b8565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052610fa39084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612b3e565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166110575760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055612ca83390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156110575760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff83811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612e33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e579190614519565b90506109d7847f095ea7b30000000000000000000000000000000000000000000000000000000085612e8986866142a6565b60405173ffffffffffffffffffffffffffffffffffffffff90921660248301526044820152606401612b3e565b600154610100900460ff16612a70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016108f2565b612f2f612eb6565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b612fac612a72565b600180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f7a3390565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166110575761303e816131c7565b6130498360206131e6565b60405160200161305a929190614532565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a00000000000000000000000000000000000000000000000000000000082526108f291600401614489565b600061311a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134309092919063ffffffff16565b905080516000148061313b57508080602001905181019061313b91906145b3565b610fa3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108f2565b6060610a7073ffffffffffffffffffffffffffffffffffffffff831660145b606060006131f58360026145d0565b6132009060026142a6565b67ffffffffffffffff8111156132185761321861363f565b6040519080825280601f01601f191660200182016040528015613242576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106132795761327961400f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106132dc576132dc61400f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006133188460026145d0565b6133239060016142a6565b90505b60018111156133c0577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106133645761336461400f565b1a60f81b82828151811061337a5761337a61400f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c936133b9816145e7565b9050613326565b508315613429576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016108f2565b9392505050565b606061343f8484600085613447565b949350505050565b6060824710156134d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016108f2565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135029190614357565b60006040518083038185875af1925050503d806000811461353f576040519150601f19603f3d011682016040523d82523d6000602084013e613544565b606091505b509150915061355587838387613560565b979650505050505050565b606083156135f65782516000036135ef5773ffffffffffffffffffffffffffffffffffffffff85163b6135ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108f2565b508161343f565b61343f838381511561360b5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f29190614489565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156136915761369161363f565b60405290565b60405160c0810167ffffffffffffffff811182821017156136915761369161363f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156137015761370161363f565b604052919050565b600067ffffffffffffffff8211156137235761372361363f565b5060051b60200190565b80151581146113ec57600080fd5b600082601f83011261374c57600080fd5b8135602061376161375c83613709565b6136ba565b8281526060928302850182019282820191908785111561378057600080fd5b8387015b858110156137e35781818a03121561379c5760008081fd5b6137a461366e565b813563ffffffff811681146137b95760008081fd5b815281860135868201526040808301356137d28161372d565b908201528452928401928101613784565b5090979650505050505050565b6000806040838503121561380357600080fd5b823567ffffffffffffffff8082111561381b57600080fd5b818501915085601f83011261382f57600080fd5b8135602061383f61375c83613709565b82815260059290921b8401810191818101908984111561385e57600080fd5b948201945b8386101561387c57853582529482019490820190613863565b9650508601359250508082111561389257600080fd5b5061389f8582860161373b565b9150509250929050565b6000602082840312156138bb57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461342957600080fd5b73ffffffffffffffffffffffffffffffffffffffff811681146113ec57600080fd5b600060c0828403121561391f57600080fd5b613927613697565b9050813581526020820135602082015260408201356040820152606082013561394f816138eb565b60608201526080820135613962816138eb565b8060808301525060a082013560a082015292915050565b600067ffffffffffffffff8211156139935761399361363f565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126139d057600080fd5b81356139de61375c82613979565b8181528460208386010111156139f357600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806101208587031215613a2757600080fd5b613a31868661390d565b935060c085013567ffffffffffffffff80821115613a4e57600080fd5b613a5a888389016139bf565b945060e0870135915080821115613a7057600080fd5b613a7c888389016139bf565b9350610100870135915080821115613a9357600080fd5b50613aa0878288016139bf565b91505092959194509250565b60008083601f840112613abe57600080fd5b50813567ffffffffffffffff811115613ad657600080fd5b602083019150836020828501011115613aee57600080fd5b9250929050565b600080600080600060608688031215613b0d57600080fd5b853567ffffffffffffffff80821115613b2557600080fd5b613b3189838a01613aac565b90975095506020880135915080821115613b4a57600080fd5b613b5689838a016139bf565b94506040880135915080821115613b6c57600080fd5b50613b7988828901613aac565b969995985093965092949392505050565b600060208284031215613b9c57600080fd5b5035919050565b60008060408385031215613bb657600080fd5b823591506020830135613bc8816138eb565b809150509250929050565b60008060008060808587031215613be957600080fd5b5050823594602084013594506040840135936060013592509050565b60008060008060008060a08789031215613c1e57600080fd5b863595506020870135613c30816138eb565b9450604087013567ffffffffffffffff811115613c4c57600080fd5b613c5889828a01613aac565b979a9699509760608101359660809091013595509350505050565b600060a08284031215613c8557600080fd5b60405160a0810181811067ffffffffffffffff82111715613ca857613ca861363f565b80604052508235815260208301356020820152604083013560408201526060830135613cd3816138eb565b60608201526080830135613ce6816138eb565b60808201529392505050565b600060208284031215613d0457600080fd5b813567ffffffffffffffff80821115613d1c57600080fd5b9083019060c08286031215613d3057600080fd5b613d38613697565b8235815260208301356020820152604083013560408201526060830135613d5e816138eb565b60608201526080830135613d71816138eb565b608082015260a083013582811115613d8857600080fd5b613d94878286016139bf565b60a08301525095945050505050565b600060208284031215613db557600080fd5b8135613429816138eb565b60008060408385031215613dd357600080fd5b8235613dde816138eb565b946020939093013593505050565b60008060208385031215613dff57600080fd5b823567ffffffffffffffff80821115613e1757600080fd5b818501915085601f830112613e2b57600080fd5b813581811115613e3a57600080fd5b8660208260051b8501011115613e4f57600080fd5b60209290920196919550909350505050565b60005b83811015613e7c578181015183820152602001613e64565b50506000910152565b60008151808452613e9d816020860160208601613e61565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613f42577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613f30858351613e85565b94509285019290850190600101613ef6565b5092979650505050505050565b60008060008060808587031215613f6557600080fd5b8435613f70816138eb565b935060208501359250604085013591506060850135613f8e8161372d565b939692955090935050565b60008060006101008486031215613faf57600080fd5b613fb9858561390d565b925060c084013567ffffffffffffffff80821115613fd657600080fd5b613fe2878388016139bf565b935060e0860135915080821115613ff857600080fd5b50614005868287016139bf565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361409e5761409e61403e565b5060010190565b60006101408c83528b60208401528a604084015289606084015288608084015273ffffffffffffffffffffffffffffffffffffffff80891660a08501528160c08501526140f482850189613e85565b90871660e085015283810361010085015290506141118186613e85565b90508281036101208401526141268185613e85565b9d9c50505050505050505050505050565b8183823760009101908152919050565b600082601f83011261415857600080fd5b8151602061416861375c83613709565b82815260059290921b8401810191818101908684111561418757600080fd5b8286015b848110156141a2578051835291830191830161418b565b509695505050505050565b6000806000606084860312156141c257600080fd5b83516141cd816138eb565b8093505060208085015167ffffffffffffffff808211156141ed57600080fd5b818701915087601f83011261420157600080fd5b815161420f61375c82613709565b81815260059190911b8301840190848101908a83111561422e57600080fd5b938501935b82851015614255578451614246816138eb565b82529385019390850190614233565b60408a0151909750945050508083111561426e57600080fd5b505061400586828701614147565b60006020828403121561428e57600080fd5b815167ffffffffffffffff8116811461342957600080fd5b80820180821115610a7057610a7061403e565b878152866020820152856040820152600073ffffffffffffffffffffffffffffffffffffffff8087166060840152808616608084015280851660a08401525060e060c083015261430c60e0830184613e85565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416815282602082015260606040820152600061434e6060830184613e85565b95945050505050565b60008251614369818460208701613e61565b9190910192915050565b85815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152821515606082015260a06080820152600061355560a0830184613e85565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126143eb57600080fd5b83018035915067ffffffffffffffff82111561440657600080fd5b602001915036819003821315613aee57600080fd5b60006020828403121561442d57600080fd5b815167ffffffffffffffff81111561444457600080fd5b8201601f8101841361445557600080fd5b805161446361375c82613979565b81815285602083850101111561447857600080fd5b61434e826020830160208601613e61565b6020815260006134296020830184613e85565b60006101208b83528a602084015289604084015288606084015287608084015273ffffffffffffffffffffffffffffffffffffffff80881660a085015280871660c0850152508060e08401526144f481840186613e85565b90508281036101008401526145098185613e85565b9c9b505050505050505050505050565b60006020828403121561452b57600080fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161456a816017850160208801613e61565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516145a7816028840160208801613e61565b01602801949350505050565b6000602082840312156145c557600080fd5b81516134298161372d565b8082028115828204841417610a7057610a7061403e565b6000816145f6576145f661403e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea264697066735822122019c3db2d84027c397e87bd60394685793eaf26d211d3f384ceadc8837375c3ae64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004300000000000000000000000000000000000004000000000000000000000000c21e4ebd1d92036cb467b53fe3258f219d909eb90000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000c3500000000000000000000000000000000000000000000000000000000000000041726f757465723134686a32746176713866706573647778786375343472747933686839307668756a7276636d73746c347a723374786d667677397330307a74766b00000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _wrappedNativeTokenAddress (address): 0x4300000000000000000000000000000000000004
Arg [1] : _gatewayContract (address): 0xC21e4ebD1d92036Cb467b53fE3258F219d909Eb9
Arg [2] : _usdcAddress (address): 0x0000000000000000000000000000000000000000
Arg [3] : _tokenMessenger (address): 0x0000000000000000000000000000000000000000
Arg [4] : _routerMiddlewareBase (bytes): 0x726f757465723134686a32746176713866706573647778786375343472747933686839307668756a7276636d73746c347a723374786d667677397330307a74766b
Arg [5] : _minGasThreshhold (uint256): 50000
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000004300000000000000000000000000000000000004
Arg [1] : 000000000000000000000000c21e4ebd1d92036cb467b53fe3258f219d909eb9
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [5] : 000000000000000000000000000000000000000000000000000000000000c350
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [7] : 726f757465723134686a32746176713866706573647778786375343472747933
Arg [8] : 686839307668756a7276636d73746c347a723374786d667677397330307a7476
Arg [9] : 6b00000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
63812:15051:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67518:431;;;;;;;;;;-1:-1:-1;67518:431:0;;;;;:::i;:::-;;:::i;:::-;;27803:204;;;;;;;;;;-1:-1:-1;27803:204:0;;;;;:::i;:::-;;:::i;:::-;;;4376:14:1;;4369:22;4351:41;;4339:2;4324:18;27803:204:0;;;;;;;;71417:1165;;;;;;:::i;:::-;;:::i;63978:41::-;;;;;;;;;;;;;;;;;;7039:42:1;7027:55;;;7009:74;;6997:2;6982:18;63978:41:0;6849:240:1;75808:1022:0;;;;;;;;;;-1:-1:-1;75808:1022:0;;;;;:::i;:::-;;:::i;29626:131::-;;;;;;;;;;-1:-1:-1;29626:131:0;;;;;:::i;:::-;29700:7;29727:12;;;;;;;;;;:22;;;;29626:131;;;;8702:25:1;;;8690:2;8675:18;29626:131:0;8556:177:1;30067:147:0;;;;;;;;;;-1:-1:-1;30067:147:0;;;;;:::i;:::-;;:::i;31211:218::-;;;;;;;;;;-1:-1:-1;31211:218:0;;;;;:::i;:::-;;:::i;67957:1107::-;;;;;;:::i;:::-;;:::i;64129:19::-;;;;;;;;;;-1:-1:-1;64129:19:0;;;;;;;;67306:85;;;;;;;;;;;;;:::i;64725:42::-;;;;;;;;;;-1:-1:-1;64725:42:0;;;;;;;;64184:37;;;;;;;;;;-1:-1:-1;64184:37:0;;;;;;;;64564:33;;;;;;;;;;;;;;;;64686:32;;;;;;;;;;;;;;;;65936:768;;;;;;;;;;-1:-1:-1;65936:768:0;;;;;:::i;:::-;;:::i;2455:86::-;;;;;;;;;;-1:-1:-1;2526:7:0;;;;;;;2455:86;;72590:1258;;;;;;:::i;:::-;;:::i;77742:703::-;;;:::i;73856:1944::-;;;;;;:::i;:::-;;:::i;66900:174::-;;;;;;;;;;-1:-1:-1;66900:174:0;;;;;:::i;:::-;;:::i;77180:407::-;;;;;;;;;;-1:-1:-1;77180:407:0;;;;;:::i;:::-;;:::i;67082:84::-;;;;;;;;;;;;;:::i;78453:407::-;;;;;;;;;;;;;:::i;28099:147::-;;;;;;;;;;-1:-1:-1;28099:147:0;;;;;:::i;:::-;28185:4;28209:12;;;;;;;;;;;:29;;;;;;;;;;;;;;;;28099:147;64264:50;;;;;;;;;;-1:-1:-1;64264:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13583:10:1;13571:23;;;13553:42;;13626:2;13611:18;;13604:34;;;;13681:14;13674:22;13654:18;;;13647:50;13541:2;13526:18;64264:50:0;13359:344:1;27204:49:0;;;;;;;;;;-1:-1:-1;27204:49:0;27249:4;27204:49;;63151:654;;;;;;;;;;-1:-1:-1;63151:654:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;70200:1209::-;;;;;;:::i;:::-;;:::i;64604:34::-;;;;;;;;;;;;;;;;64026:35;;;;;;;;;;;;;;;;30507:149;;;;;;;;;;-1:-1:-1;30507:149:0;;;;;:::i;:::-;;:::i;64453:52::-;;;;;;;;;;;;64486:19;64453:52;;64376:70;;;;;;;;;;;;64418:28;64376:70;;64321:48;;;;;;;;;;;;64365:4;64321:48;;64230:27;;;;;;;;;;;;;;;;64068:30;;;;;;;;;;-1:-1:-1;64068:30:0;;;;;;;;64645:34;;;;;;;;;;;;;;;;69098:1094;;;;;;:::i;:::-;;:::i;77595:139::-;;;;;;;;;;;;;:::i;64512:45::-;;;;;;;;;;-1:-1:-1;64512:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;67518:431;64418:28;27695:16;27706:4;27695:10;:16::i;:::-;67732:12:::1;:19;67704:17;:24;:47;67682:111;;;::::0;::::1;::::0;;17188:2:1;67682:111:0::1;::::0;::::1;17170:21:1::0;17227:2;17207:18;;;17200:30;17266:16;17246:18;;;17239:44;17300:18;;67682:111:0::1;;;;;;;;;67809:11;67804:138;67832:12;:19;67826:3;:25;67804:138;;;67913:12;67926:3;67913:17;;;;;;;;:::i;:::-;;;;;;;67875:11;:35;67887:17;67905:3;67887:22;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;67875:35;;;;::::1;::::0;;;;;;;;-1:-1:-1;67875:35:0;:55;;;;;::::1;;::::0;;::::1;;::::0;;;;::::1;::::0;-1:-1:-1;67875:55:0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;67853:5;::::1;::::0;::::1;:::i;:::-;;;;67804:138;;;;67518:431:::0;;;:::o;27803:204::-;27888:4;27912:47;;;27927:32;27912:47;;:87;;-1:-1:-1;25235:25:0;25220:40;;;;27963:36;27905:94;27803:204;-1:-1:-1;;27803:204:0:o;71417:1165::-;56489:19;:17;:19::i;:::-;56519:17;58249:11;:19;;;;;;58137:139;56519:17;2060:19:::1;:17;:19::i;:::-;64365:4:::2;71646:11;:18;;;:38;71642:67;;;71693:16;;;;;;;;;;;;;;71642:67;71726:30;71735:11;:20;;;67479:23:::0;;64827:42;67479:23;;67399:111;71726:30:::2;71722:474;;;71799:9;71777:11;:18;;;:31;71773:59;;71817:15;;;;;;;;;;;;;;71773:59;71847:18;:26;;;71881:9;71847:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;71943:50:0::2;71974:18;71943:50;:20;::::0;::::2;:50:::0;-1:-1:-1;71722:474:0::2;::::0;-1:-1:-1;71722:474:0::2;;72026:158;72090:10;72127:4;72151:11;:18;;;72033:11;:20;;;72026:45;;;;:158;;;;;;:::i;:::-;72213:361;72253:11;:21;;;72289:11;:18;;;72322:11;:28;;;72365:11;:22;;;72404:12;;72402:14;;;;;:::i;:::-;::::0;;;;-1:-1:-1;72431:20:0::2;::::0;::::2;::::0;72490:27:::2;::::0;::::2;::::0;72213:361:::2;::::0;::::2;::::0;;;;;72402:14;72431:20;72466:9;;72532;;72556:7;;72213:361:::2;:::i;:::-;;;;;;;;56559:20:::0;58482:4;58468:18;;;;;;;;58284:210;75808:1022;75975:15;;;;75953:10;:38;75949:67;;76000:16;;;;;;;;;;;;;;75949:67;76071:13;;76055:31;;;;;;;:::i;:::-;;;;;;;;76031:20;;:55;76027:103;;76108:22;;;;;;;;;;;;;;76027:103;76158:17;76190:23;76228:24;76277:6;76266:51;;;;;;;;;;;;:::i;:::-;76143:174;;;;;;76328:13;76344:6;:13;76328:29;;76383:7;:14;76374:5;:23;76370:55;;76406:19;;;;;;;;;;;;;;76370:55;76443:9;76438:385;76462:5;76458:1;:9;76438:385;;;76494:19;76503:6;76510:1;76503:9;;;;;;;;:::i;:::-;;;;;;;67479:23;;64827:42;67479:23;;67399:111;76494:19;76489:323;;76532:53;76563:9;76574:7;76582:1;76574:10;;;;;;;;:::i;:::-;;;;;;;76539:6;76546:1;76539:9;;;;;;;;:::i;:::-;;;;;;;76532:30;;;;:53;;;;;:::i;:::-;76489:323;;;76689:12;76715:9;76707:23;;76738:7;76746:1;76738:10;;;;;;;;:::i;:::-;;;;;;;76707:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76688:65:0;;-1:-1:-1;;76791:4:0;76780:15;;;;76772:24;;;;;;76669:143;76489:323;76469:3;;;;:::i;:::-;;;;76438:385;;;;75938:892;;;;75808:1022;;;;;:::o;30067:147::-;29700:7;29727:12;;;;;;;;;;:22;;;27695:16;27706:4;27695:10;:16::i;:::-;30181:25:::1;30192:4;30198:7;30181:10;:25::i;:::-;30067:147:::0;;;:::o;31211:218::-;31307:23;;;812:10;31307:23;31299:83;;;;;;;21759:2:1;31299:83:0;;;21741:21:1;21798:2;21778:18;;;21771:30;21837:34;21817:18;;;21810:62;21908:17;21888:18;;;21881:45;21943:19;;31299:83:0;21557:411:1;31299:83:0;31395:26;31407:4;31413:7;31395:11;:26::i;:::-;31211:218;;:::o;67957:1107::-;56489:19;:17;:19::i;:::-;56519:17;58249:11;:19;;;;;;58137:139;56519:17;2060:19:::1;:17;:19::i;:::-;68179:29:::2;::::0;;;:11:::2;:29;::::0;;;;:35:::2;;::::0;::::2;;:57:::0;::::2;;;-1:-1:-1::0;68218:4:0::2;::::0;:18:::2;:4;:18:::0;::::2;68179:57;68157:152;;;::::0;::::2;::::0;;22175:2:1;68157:152:0::2;::::0;::::2;22157:21:1::0;22214:2;22194:18;;;22187:30;22253:34;22233:18;;;22226:62;22324:15;22304:18;;;22297:43;22357:19;;68157:152:0::2;21973:409:1::0;68157:152:0::2;68337:29;::::0;;;:11:::2;:29;::::0;;;;:33:::2;;::::0;68324:9:::2;:46;68320:71;;68379:12;;;;;;;;;;;;;;68320:71;64365:4;68406:6;:26;68402:55;;;68441:16;;;;;;;;;;;;;;68402:55;68477:4;::::0;68470:64:::2;::::0;68477:4:::2;;68500:10;68520:4;68527:6:::0;68470:29:::2;:64::i;:::-;68588:14;::::0;68552:4:::2;::::0;68545:67:::2;::::0;68588:14:::2;68552:4:::0;;::::2;::::0;68588:14:::2;68605:6:::0;68545:34:::2;:67::i;:::-;68640:14;::::0;68625:12:::2;68705:29:::0;;;:11:::2;:29;::::0;;;;;:38;68782:4:::2;::::0;;68640:157;;;;;;;::::2;22616:25:1::0;;;68705:38:0::2;::::0;;::::2;22657:18:1::0;;;22650:51;22717:18;;;22710:34;;;68640:14:0::2;68782:4:::0;;::::2;22760:18:1::0;;;22753:83;68625:12:0;;68640:14:::2;::::0;:29:::2;::::0;22588:19:1;;68640:157:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68992:4;::::0;68867:189:::2;::::0;;23454:25:1;;;23510:2;23495:18;;23488:34;;;23538:18;;;23531:34;;;23613:18;23601:31;;23596:2;23581:18;;23574:59;68992:4:0::2;::::0;;::::2;23725:3:1::0;23710:19;;23703:44;23778:3;23763:19;;23756:35;;;69035:10:0::2;23822:3:1::0;23807:19;;23800:44;68625:172:0;;-1:-1:-1;68867:189:0::2;::::0;23441:3:1;23426:19;68867:189:0::2;;;;;;;68146:918;56559:20:::0;58482:4;58468:18;;;;;;;;58284:210;67306:85;64486:19;27695:16;27706:4;27695:10;:16::i;:::-;2319::::1;:14;:16::i;:::-;67373:10:::2;:8;:10::i;:::-;67306:85:::0;:::o;65936:768::-;64418:28;27695:16;27706:4;27695:10;:16::i;:::-;66186:5:::1;66195:1;66186:10:::0;66182:515:::1;;66213:15;:34:::0;;;::::1;;::::0;::::1;;::::0;;66182:515:::1;;;66269:5;66278:1;66269:10:::0;66265:432:::1;;66329:21;;66319:32;;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;66296:20:::1;:55:::0;66265:432:::1;;;66373:5;66382:1;66373:10:::0;66369:328:::1;;66449:19;66426;:42;;66400:173;;;::::0;::::1;::::0;;24057:2:1;66400:173:0::1;::::0;::::1;24039:21:1::0;24096:2;24076:18;;;24069:30;24135:34;24115:18;;;24108:62;24206:34;24186:18;;;24179:62;24278:7;24257:19;;;24250:36;24303:19;;66400:173:0::1;23855:473:1::0;66400:173:0::1;66588:19;:41:::0;;;66644:19:::1;:41:::0;;;66369:328:::1;65936:768:::0;;;;;;;:::o;72590:1258::-;56489:19;:17;:19::i;:::-;56519:17;58249:11;:19;;;;;;58137:139;56519:17;2060:19:::1;:17;:19::i;:::-;72758:16:::0;;64365:4:::2;-1:-1:-1::0;72754:65:0::2;;;72803:16;;;;;;;;;;;;;;72754:65;72905:16:::0;;72940:20:::2;::::0;;::::2;::::0;72979:19:::2;::::0;;::::2;::::0;73017::::2;::::0;;::::2;::::0;73055::::2;::::0;;::::2;::::0;72876:245;;;;::::2;24620:25:1::0;;;;24661:18;;;24654:34;;;;24704:18;;24697:34;24750:42;24828:15;;;24808:18;;;24801:43;24881:15;;;24860:19;;;24853:44;73101:4:0::2;24913:19:1::0;;;24906:44;72830:19:0::2;::::0;24592::1;;72876:245:0::2;::::0;;;;;::::2;::::0;;;;;;72852:280;;72876:245:::2;72852:280:::0;;::::2;::::0;73147:26:::2;::::0;;;:13:::2;:26:::0;;;;;;72852:280;;-1:-1:-1;73147:26:0::2;;73143:63;;;73182:24;;;;;;;;;;;;;;73143:63;73217:26;::::0;;;:13:::2;:26;::::0;;;;:33;;;::::2;73246:4;73217:33;::::0;;73276:19:::2;::::0;::::2;::::0;73267:29:::2;::::0;67479:23;;64827:42;67479:23;;67399:111;73267:29:::2;73263:510;;;73317:16:::0;;73337:9:::2;73317:29;73313:57;;73355:15;;;;;;;;;;;;;;73313:57;73474:19;::::0;::::2;::::0;73507:16;;73466:62:::2;::::0;73448:12:::2;::::0;73466:33:::2;;::::0;73507:16;73448:12;73466:62;73448:12;73466:62;73507:16;73466:33;:62:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;73447:81:0;;-1:-1:-1;;73562:4:0::2;73551:15:::0;::::2;;;73543:24;;;::::0;::::2;;73298:281;73263:510;;;73692:19;::::0;::::2;::::0;73730:16;;73607:19:::2;::::0;::::2;::::0;73600:161:::2;::::0;:44:::2;::::0;;::::2;::::0;73663:10:::2;::::0;73692:19;73600:44:::2;:161::i;:::-;73790:50;73800:11;73813:10;73827:12;;73825:14;;;;;:::i;:::-;::::0;;;;-1:-1:-1;73790:50:0::2;::::0;;25163:25:1;;;25236:42;25224:55;;;25219:2;25204:18;;25197:83;25296:18;;;25289:34;25151:2;25136:18;73790:50:0::2;;;;;;;72694:1154;56559:20:::0;58482:4;58468:18;;;;;;;;58284:210;77742:703;2060:19;:17;:19::i;:::-;77877:23:::1;::::0;::::1;;77869:63;;;::::0;::::1;::::0;;25536:2:1;77869:63:0::1;::::0;::::1;25518:21:1::0;25575:2;25555:18;;;25548:30;25614:29;25594:18;;;25587:57;25661:18;;77869:63:0::1;25334:351:1::0;77869:63:0::1;77965:19;::::0;:24;;::::1;::::0;:52:::1;;-1:-1:-1::0;77993:19:0::1;::::0;:24;::::1;77965:52;77943:124;;;::::0;::::1;::::0;;25892:2:1;77943:124:0::1;::::0;::::1;25874:21:1::0;25931:2;25911:18;;;25904:30;25970:24;25950:18;;;25943:52;26012:18;;77943:124:0::1;25690:346:1::0;77943:124:0::1;78113:19;;78100:9;:32;;:85;;;;;78166:19;;78153:9;:32;;78100:85;78078:160;;;::::0;::::1;::::0;;26243:2:1;78078:160:0::1;::::0;::::1;26225:21:1::0;26282:2;26262:18;;;26255:30;26321:27;26301:18;;;26294:55;26366:18;;78078:160:0::1;26041:349:1::0;78078:160:0::1;78249:28;78300:9;78280:17;;:29;;;;:::i;:::-;78320:17;:40:::0;;;78249:60;-1:-1:-1;78373:8:0::1;:6;:8::i;:::-;78399:38;::::0;78427:9:::1;8702:25:1::0;;78415:10:0::1;::::0;78399:38:::1;::::0;8690:2:1;8675:18;78399:38:0::1;;;;;;;77799:646;77742:703::o:0;73856:1944::-;56489:19;:17;:19::i;:::-;56519:17;58249:11;:19;;;;;;58137:139;56519:17;2060:19:::1;:17;:19::i;:::-;73989:16:::0;;64365:4:::2;-1:-1:-1::0;73985:65:0::2;;;74034:16;;;;;;;;;;;;;;73985:65;74187:16:::0;;74222:20:::2;::::0;;::::2;::::0;74261:19:::2;::::0;;::::2;::::0;74299::::2;::::0;::::2;::::0;74337::::2;::::0;::::2;::::0;74407:17:::2;::::0;::::2;::::0;74158:281;;74112:19:::2;::::0;74158:281:::2;::::0;74187:16;;74222:20;74383:4:::2;::::0;74407:17;;74158:281:::2;;:::i;:::-;;::::0;;;;;::::2;::::0;;;;;;74134:316;;74158:281:::2;74134:316:::0;;::::2;::::0;74465:26:::2;::::0;;;:13:::2;:26:::0;;;;;;74134:316;;-1:-1:-1;74465:26:0::2;;74461:63;;;74500:24;;;;;;;;;;;;;;74461:63;74535:26;::::0;;;:13:::2;:26;::::0;;;;:33;;;::::2;74564:4;74535:33;::::0;;74594:19:::2;::::0;::::2;::::0;74585:29:::2;::::0;67479:23;;64827:42;67479:23;;67399:111;74585:29:::2;74581:448;;;74635:16:::0;;74655:9:::2;74635:29;74631:57;;74673:15;;;;;;;;;;;;;;74631:57;74730:19;::::0;::::2;::::0;74763:16;;74722:62:::2;::::0;74704:12:::2;::::0;74722:33:::2;;::::0;74763:16;74704:12;74722:62;74704:12;74722:62;74763:16;74722:33;:62:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;74703:81:0;;-1:-1:-1;;74818:4:0::2;74807:15:::0;::::2;;;74799:24;;;::::0;::::2;;74616:219;74581:448;;;74948:19;::::0;::::2;::::0;74986:16;;74863:19:::2;::::0;::::2;::::0;74856:161:::2;::::0;:44:::2;::::0;;::::2;::::0;74919:10:::2;::::0;74948:19;74856:44:::2;:161::i;:::-;75041:21;75073:13;75101:31;75112:9;:19;;;76967:17:::0;77012:8;;;76838:190;75101:31:::2;:63;;;;;75163:1;75136:9;:17;;;:24;:28;75101:63;75097:523;;;75204:9;:19;;;:24;;75292:38;;;75353:9;:19;;;75395:9;:16;;;75434:9;:17;;;75247:223;;;;;;;;;;:::i;:::-;;::::0;;;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;::::2;;::::0;;;::::2;::::0;;;::::2;::::0;;;75204:281;;::::2;::::0;75247:223;75204:281:::2;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;75181:304:0;-1:-1:-1;75181:304:0;-1:-1:-1;75504:9:0;::::2;:43:::0;::::2;;;;75529:18;;75517:9;:30;75504:43;75500:108;;;75573:35;;;;;;;;;;;;;;75500:108;75635:157;75670:11;75696:10;75723:12;;75721:14;;;;;:::i;:::-;::::0;;;;-1:-1:-1;75635:157:0::2;::::0;::::2;::::0;;;75721:14;75750:8;;75773;;75635:157:::2;:::i;:::-;;;;;;;;73974:1826;;;56559:20:::0;58482:4;58468:18;;;;;;;;58284:210;66900:174;64418:28;27695:16;27706:4;27695:10;:16::i;:::-;-1:-1:-1;67017:14:0::1;:49:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;66900:174::o;77180:407::-;27249:4;27695:16;27249:4;27695:10;:16::i;:::-;56489:19:::1;:17;:19::i;:::-;56519:17;58249:11:::0;:19;;;;;;58137:139;56519:17:::1;64827:42:::0;67479:23;;;;77314:266:::2;;77369:43;::::0;77351:12:::2;::::0;77377:10:::2;::::0;77401:6;;77351:12;77369:43;77351:12;77369:43;77401:6;77377:10;77369:43:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;77350:62:0;;-1:-1:-1;;77446:4:0::2;77435:15:::0;::::2;;;77427:24;;;::::0;::::2;;77335:128;77314:266;;;77495:72;::::0;77548:10:::2;77495:72;::::0;::::2;28713:74:1::0;28803:18;;;28796:34;;;77484:10:0::2;::::0;::::2;::::0;28686:18:1;;77495:72:0::2;::::0;;;;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;::::2;;;;::::0;;77484:84;::::2;::::0;77495:72;77484:84:::2;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77314:266;56559:20:::1;58482:4:::0;58468:18;;;;;;;;58284:210;67082:84;64486:19;27695:16;27706:4;27695:10;:16::i;:::-;2060:19:::1;:17;:19::i;:::-;67150:8:::2;:6;:8::i;78453:407::-:0;27249:4;27695:16;27249:4;27695:10;:16::i;:::-;78580:17:::1;;78555:21;:42;;78533:110;;;::::0;::::1;::::0;;29043:2:1;78533:110:0::1;::::0;::::1;29025:21:1::0;29082:2;29062:18;;;29055:30;29121:20;29101:18;;;29094:48;29159:18;;78533:110:0::1;28841:342:1::0;78533:110:0::1;78681:17;::::0;;78654:24:::1;78709:21:::0;;;;78760:53:::1;::::0;78681:17;;78654:24;78768:10:::1;::::0;78681:17;;78654:24;78760:53;78654:24;78760:53;78681:17;78768:10;78760:53:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;78741:72:0;;-1:-1:-1;;78847:4:0::1;78836:15:::0;::::1;;;78828:24;;;::::0;::::1;63151:654:::0;63211:22;63268:4;63256:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63246:34;;63296:9;63291:507;63311:15;;;63291:507;;;63349:12;;63394:4;63413;;63418:1;63413:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;63386:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63348:73;;;;63443:7;63438:313;;63572:2;63556:6;:13;:18;63552:32;;;63576:8;;;63552:32;63657:4;63649:6;63645:17;63635:27;;63717:6;63706:28;;;;;;;;;;;;:::i;:::-;63699:36;;;;;;;;;;;:::i;63438:313::-;63780:6;63767:7;63775:1;63767:10;;;;;;;;:::i;:::-;;;;;;:19;;;;63333:465;;63328:3;;;;;:::i;:::-;;;;63291:507;;;;63151:654;;;;:::o;70200:1209::-;56489:19;:17;:19::i;:::-;56519:17;58249:11;:19;;;;;;58137:139;56519:17;2060:19:::1;:17;:19::i;:::-;70411:18:::2;70407:307;;;70454:9;:14:::0;70446:23:::2;;;::::0;::::2;;70489:192;70525:8;70552:1;70572:9;70602:12;;70600:14;;;;;:::i;:::-;::::0;;;;-1:-1:-1;70489:192:0::2;::::0;;30949:42:1;31018:15;;;31000:34;;31065:2;31050:18;;31043:34;;;;31093:18;;;31086:34;31151:2;31136:18;;31129:34;70633:4:0::2;31194:3:1::0;31179:19;;31172:51;70656:10:0::2;31254:3:1::0;31239:19;;31232:44;30926:3;30911:19;70489:192:0::2;;;;;;;70696:7;;70407:307;64365:4;70728:9;:29;70724:58;;;70766:16;;;;;;;;;;;;;;70724:58;64827:42:::0;67479:23;;;;70793:420:::2;;70849:9;70836;:22;70832:50;;70867:15;;;;;;;;;;;;;;70832:50;70897:18;:26;;;70931:9;70897:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;71012:18;70993:38;;70793:420;;;71064:137;:33;::::0;::::2;71116:10;71153:4;71177:9:::0;71064:33:::2;:137::i;:::-;71228:173;71260:8;71283:9;71307;71333:12;;71331:14;;;;;:::i;:::-;::::0;;;;-1:-1:-1;71228:173:0::2;::::0;;30949:42:1;31018:15;;;31000:34;;31065:2;31050:18;;31043:34;;;;31093:18;;;31086:34;31151:2;31136:18;;31129:34;71360:5:0::2;31194:3:1::0;31179:19;;31172:51;71380:10:0::2;31254:3:1::0;31239:19;;31232:44;30926:3;30911:19;71228:173:0::2;30650:632:1::0;2090:1:0::2;56559:20:::0;58482:4;58468:18;;;;;;;;58284:210;30507:149;29700:7;29727:12;;;;;;;;;;:22;;;27695:16;27706:4;27695:10;:16::i;:::-;30622:26:::1;30634:4;30640:7;30622:11;:26::i;69098:1094::-:0;56489:19;:17;:19::i;:::-;56519:17;58249:11;:19;;;;;;58137:139;56519:17;2060:19:::1;:17;:19::i;:::-;64365:4:::2;69289:11;:18;;;:38;69285:67;;;69336:16;;;;;;;;;;;;;;69285:67;69369:30;69378:11;:20;;;67479:23:::0;;64827:42;67479:23;;67399:111;69369:30:::2;69365:474;;;69442:9;69420:11;:18;;;:31;69416:59;;69460:15;;;;;;;;;;;;;;69416:59;69490:18;:26;;;69524:9;69490:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;69586:50:0::2;69617:18;69586:50;:20;::::0;::::2;:50:::0;-1:-1:-1;69365:474:0::2;::::0;-1:-1:-1;69365:474:0::2;;69669:158;69733:10;69770:4;69794:11;:18;;;69676:11;:20;;;69669:45;;;;:158;;;;;;:::i;:::-;69856:328;69885:11;:21;;;69921:11;:18;;;69954:11;:28;;;69997:11;:22;;;70036:12;;70034:14;;;;;:::i;:::-;::::0;;;;-1:-1:-1;70063:20:0::2;::::0;::::2;::::0;70098:27:::2;::::0;::::2;::::0;69856:328:::2;::::0;::::2;::::0;;;;;70034:14;70063:20;70098:27;70140:9;;70164;;69856:328:::2;:::i;:::-;;;;;;;;56559:20:::0;58482:4;58468:18;;;;;;;;58284:210;77595:139;27249:4;27695:16;27249:4;27695:10;:16::i;:::-;-1:-1:-1;77703:23:0::1;::::0;;77676:50;;::::1;77703:23;::::0;;::::1;77702:24;77676:50;::::0;;77595:139::o;28550:105::-;28617:30;28628:4;812:10;28617;:30::i;57940:189::-;58074:11;;;;58066:55;;;;;;;33103:2:1;58066:55:0;;;33085:21:1;33142:2;33122:18;;;33115:30;33181:33;33161:18;;;33154:61;33232:18;;58066:55:0;32901:355:1;58066:55:0;57940:189::o;2614:108::-;2526:7;;;;;;;2684:9;2676:38;;;;;;;33463:2:1;2676:38:0;;;33445:21:1;33502:2;33482:18;;;33475:30;33541:18;33521;;;33514:46;33577:18;;2676:38:0;33261:340:1;49263:205:0;49391:68;;33818:42:1;33887:15;;;49391:68:0;;;33869:34:1;33939:15;;33919:18;;;33912:43;33971:18;;;33964:34;;;49364:96:0;;49384:5;;49414:27;;33781:18:1;;49391:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49364:19;:96::i;48841:177::-;48951:58;;28743:42:1;28731:55;;48951:58:0;;;28713:74:1;28803:18;;;28796:34;;;48924:86:0;;48944:5;;48974:23;;28686:18:1;;48951:58:0;28539:297:1;32808:238:0;28185:4;28209:12;;;;;;;;;;;:29;;;;;;;;;;;;;32887:152;;32931:6;:12;;;;;;;;;;;:29;;;;;;;;;;:36;;;;32963:4;32931:36;;;33014:12;812:10;;732:98;33014:12;32987:40;;33005:7;32987:40;;32999:4;32987:40;;;;;;;;;;32808:238;;:::o;33226:239::-;28185:4;28209:12;;;;;;;;;;;:29;;;;;;;;;;;;;33306:152;;;33381:5;33349:12;;;;;;;;;;;:29;;;;;;;;;;;:37;;;;;;33406:40;812:10;;33349:12;;33406:40;;33381:5;33406:40;33226:239;;:::o;50516:283::-;50636:39;;;;;50660:4;50636:39;;;34244:34:1;50636:15:0;34314::1;;;34294:18;;;34287:43;50613:20:0;;50636:15;;;;;;34156:18:1;;50636:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50613:62;-1:-1:-1;50686:105:0;50706:5;50736:22;50760:7;50769:20;50784:5;50613:62;50769:20;:::i;:::-;50713:77;;28743:42:1;28731:55;;;50713:77:0;;;28713:74:1;28803:18;;;28796:34;28686:18;;50713:77:0;28539:297:1;2799:108:0;2526:7;;;;;;;2858:41;;;;;;;34732:2:1;2858:41:0;;;34714:21:1;34771:2;34751:18;;;34744:30;34810:22;34790:18;;;34783:50;34850:18;;2858:41:0;34530:344:1;3310:120:0;2319:16;:14;:16::i;:::-;3369:7:::1;:15:::0;;;::::1;::::0;;3400:22:::1;812:10:::0;3409:12:::1;3400:22;::::0;7039:42:1;7027:55;;;7009:74;;6997:2;6982:18;3400:22:0::1;;;;;;;3310:120::o:0;3051:118::-;2060:19;:17;:19::i;:::-;3121:4:::1;3111:14:::0;;;::::1;;;::::0;;3141:20:::1;3148:12;812:10:::0;;732:98;28945:492;28185:4;28209:12;;;;;;;;;;;:29;;;;;;;;;;;;;29029:401;;29222:28;29242:7;29222:19;:28::i;:::-;29323:38;29351:4;29358:2;29323:19;:38::i;:::-;29127:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;29073:345;;;;;;;;:::i;53187:649::-;53611:23;53637:69;53665:4;53637:69;;;;;;;;;;;;;;;;;53645:5;53637:27;;;;:69;;;;;:::i;:::-;53611:95;;53725:10;:17;53746:1;53725:22;:56;;;;53762:10;53751:30;;;;;;;;;;;;:::i;:::-;53717:111;;;;;;;36148:2:1;53717:111:0;;;36130:21:1;36187:2;36167:18;;;36160:30;36226:34;36206:18;;;36199:62;36297:12;36277:18;;;36270:40;36327:19;;53717:111:0;35946:406:1;23138:151:0;23196:13;23229:52;23241:22;;;21013:2;22534:447;22609:13;22635:19;22667:10;22671:6;22667:1;:10;:::i;:::-;:14;;22680:1;22667:14;:::i;:::-;22657:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22657:25:0;;22635:47;;22693:15;:6;22700:1;22693:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;;22719;:6;22726:1;22719:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;-1:-1:-1;22750:9:0;22762:10;22766:6;22762:1;:10;:::i;:::-;:14;;22775:1;22762:14;:::i;:::-;22750:26;;22745:131;22782:1;22778;:5;22745:131;;;22817:8;22826:5;22834:3;22826:11;22817:21;;;;;;;:::i;:::-;;;;22805:6;22812:1;22805:9;;;;;;;;:::i;:::-;;;;:33;;;;;;;;;;-1:-1:-1;22863:1:0;22853:11;;;;;22785:3;;;:::i;:::-;;;22745:131;;;-1:-1:-1;22894:10:0;;22886:55;;;;;;;36933:2:1;22886:55:0;;;36915:21:1;;;36952:18;;;36945:30;37011:34;36991:18;;;36984:62;37063:18;;22886:55:0;36731:356:1;22886:55:0;22966:6;22534:447;-1:-1:-1;;;22534:447:0:o;42723:229::-;42860:12;42892:52;42914:6;42922:4;42928:1;42931:12;42892:21;:52::i;:::-;42885:59;42723:229;-1:-1:-1;;;;42723:229:0:o;43809:455::-;43979:12;44037:5;44012:21;:30;;44004:81;;;;;;;37294:2:1;44004:81:0;;;37276:21:1;37333:2;37313:18;;;37306:30;37372:34;37352:18;;;37345:62;37443:8;37423:18;;;37416:36;37469:19;;44004:81:0;37092:402:1;44004:81:0;44097:12;44111:23;44138:6;:11;;44157:5;44164:4;44138:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44096:73;;;;44187:69;44214:6;44222:7;44231:10;44243:12;44187:26;:69::i;:::-;44180:76;43809:455;-1:-1:-1;;;;;;;43809:455:0:o;46382:644::-;46567:12;46596:7;46592:427;;;46624:10;:17;46645:1;46624:22;46620:290;;40263:19;;;;46834:60;;;;;;;37701:2:1;46834:60:0;;;37683:21:1;37740:2;37720:18;;;37713:30;37779:31;37759:18;;;37752:59;37828:18;;46834:60:0;37499:353:1;46834:60:0;-1:-1:-1;46931:10:0;46924:17;;46592:427;46974:33;46982:10;46994:12;47729:17;;:21;47725:388;;47961:10;47955:17;48018:15;48005:10;48001:2;47997:19;47990:44;47725:388;48088:12;48081:20;;;;;;;;;;;:::i;14:184:1:-;66:77;63:1;56:88;163:4;160:1;153:15;187:4;184:1;177:15;203:253;275:2;269:9;317:4;305:17;;352:18;337:34;;373:22;;;334:62;331:88;;;399:18;;:::i;:::-;435:2;428:22;203:253;:::o;461:::-;533:2;527:9;575:4;563:17;;610:18;595:34;;631:22;;;592:62;589:88;;;657:18;;:::i;719:334::-;790:2;784:9;846:2;836:13;;851:66;832:86;820:99;;949:18;934:34;;970:22;;;931:62;928:88;;;996:18;;:::i;:::-;1032:2;1025:22;719:334;;-1:-1:-1;719:334:1:o;1058:183::-;1118:4;1151:18;1143:6;1140:30;1137:56;;;1173:18;;:::i;:::-;-1:-1:-1;1218:1:1;1214:14;1230:4;1210:25;;1058:183::o;1246:118::-;1332:5;1325:13;1318:21;1311:5;1308:32;1298:60;;1354:1;1351;1344:12;1369:1315;1434:5;1487:3;1480:4;1472:6;1468:17;1464:27;1454:55;;1505:1;1502;1495:12;1454:55;1541:6;1528:20;1567:4;1591:60;1607:43;1647:2;1607:43;:::i;:::-;1591:60;:::i;:::-;1685:15;;;1747:4;1790:11;;;1778:24;;1774:33;;;1716:12;;;;1673:3;1819:15;;;1816:35;;;1847:1;1844;1837:12;1816:35;1883:2;1875:6;1871:15;1895:760;1911:6;1906:3;1903:15;1895:760;;;1987:2;1981:3;1976;1972:13;1968:22;1965:112;;;2031:1;2060:2;2056;2049:14;1965:112;2103:22;;:::i;:::-;2166:3;2153:17;2218:10;2209:7;2205:24;2196:7;2193:37;2183:135;;2272:1;2301:2;2297;2290:14;2183:135;2331:22;;2402:12;;;2389:26;2373:14;;;2366:50;2439:2;2482:12;;;2469:26;2508:30;2469:26;2508:30;:::i;:::-;2558:14;;;2551:31;2595:18;;2633:12;;;;1928;;1895:760;;;-1:-1:-1;2673:5:1;;1369:1315;-1:-1:-1;;;;;;;1369:1315:1:o;2689:1180::-;2836:6;2844;2897:2;2885:9;2876:7;2872:23;2868:32;2865:52;;;2913:1;2910;2903:12;2865:52;2953:9;2940:23;2982:18;3023:2;3015:6;3012:14;3009:34;;;3039:1;3036;3029:12;3009:34;3077:6;3066:9;3062:22;3052:32;;3122:7;3115:4;3111:2;3107:13;3103:27;3093:55;;3144:1;3141;3134:12;3093:55;3180:2;3167:16;3202:4;3226:60;3242:43;3282:2;3242:43;:::i;3226:60::-;3320:15;;;3402:1;3398:10;;;;3390:19;;3386:28;;;3351:12;;;;3426:19;;;3423:39;;;3458:1;3455;3448:12;3423:39;3482:11;;;;3502:142;3518:6;3513:3;3510:15;3502:142;;;3584:17;;3572:30;;3535:12;;;;3622;;;;3502:142;;;3663:5;-1:-1:-1;;3706:18:1;;3693:32;;-1:-1:-1;;3737:16:1;;;3734:36;;;3766:1;3763;3756:12;3734:36;;3789:74;3855:7;3844:8;3833:9;3829:24;3789:74;:::i;:::-;3779:84;;;2689:1180;;;;;:::o;3874:332::-;3932:6;3985:2;3973:9;3964:7;3960:23;3956:32;3953:52;;;4001:1;3998;3991:12;3953:52;4040:9;4027:23;4090:66;4083:5;4079:78;4072:5;4069:89;4059:117;;4172:1;4169;4162:12;4403:154;4489:42;4482:5;4478:54;4471:5;4468:65;4458:93;;4547:1;4544;4537:12;4562:696;4620:5;4668:4;4656:9;4651:3;4647:19;4643:30;4640:50;;;4686:1;4683;4676:12;4640:50;4708:22;;:::i;:::-;4699:31;;4766:9;4753:23;4746:5;4739:38;4837:2;4826:9;4822:18;4809:32;4804:2;4797:5;4793:14;4786:56;4902:2;4891:9;4887:18;4874:32;4869:2;4862:5;4858:14;4851:56;4959:2;4948:9;4944:18;4931:32;4972:33;4997:7;4972:33;:::i;:::-;5032:2;5021:14;;5014:31;5097:3;5082:19;;5069:33;5111;5069;5111;:::i;:::-;5177:7;5171:3;5164:5;5160:15;5153:32;;5246:3;5235:9;5231:19;5218:33;5212:3;5205:5;5201:15;5194:58;4562:696;;;;:::o;5263:245::-;5311:4;5344:18;5336:6;5333:30;5330:56;;;5366:18;;:::i;:::-;-1:-1:-1;5423:2:1;5411:15;5428:66;5407:88;5497:4;5403:99;;5263:245::o;5513:462::-;5555:5;5608:3;5601:4;5593:6;5589:17;5585:27;5575:55;;5626:1;5623;5616:12;5575:55;5662:6;5649:20;5693:48;5709:31;5737:2;5709:31;:::i;5693:48::-;5766:2;5757:7;5750:19;5812:3;5805:4;5800:2;5792:6;5788:15;5784:26;5781:35;5778:55;;;5829:1;5826;5819:12;5778:55;5894:2;5887:4;5879:6;5875:17;5868:4;5859:7;5855:18;5842:55;5942:1;5917:16;;;5935:4;5913:27;5906:38;;;;5921:7;5513:462;-1:-1:-1;;;5513:462:1:o;5980:864::-;6122:6;6130;6138;6146;6199:3;6187:9;6178:7;6174:23;6170:33;6167:53;;;6216:1;6213;6206:12;6167:53;6239:49;6280:7;6269:9;6239:49;:::i;:::-;6229:59;;6339:3;6328:9;6324:19;6311:33;6363:18;6404:2;6396:6;6393:14;6390:34;;;6420:1;6417;6410:12;6390:34;6443:49;6484:7;6475:6;6464:9;6460:22;6443:49;:::i;:::-;6433:59;;6545:3;6534:9;6530:19;6517:33;6501:49;;6575:2;6565:8;6562:16;6559:36;;;6591:1;6588;6581:12;6559:36;6614:51;6657:7;6646:8;6635:9;6631:24;6614:51;:::i;:::-;6604:61;;6718:3;6707:9;6703:19;6690:33;6674:49;;6748:2;6738:8;6735:16;6732:36;;;6764:1;6761;6754:12;6732:36;;6787:51;6830:7;6819:8;6808:9;6804:24;6787:51;:::i;:::-;6777:61;;;5980:864;;;;;;;:::o;7094:348::-;7146:8;7156:6;7210:3;7203:4;7195:6;7191:17;7187:27;7177:55;;7228:1;7225;7218:12;7177:55;-1:-1:-1;7251:20:1;;7294:18;7283:30;;7280:50;;;7326:1;7323;7316:12;7280:50;7363:4;7355:6;7351:17;7339:29;;7415:3;7408:4;7399:6;7391;7387:19;7383:30;7380:39;7377:59;;;7432:1;7429;7422:12;7377:59;7094:348;;;;;:::o;7447:919::-;7557:6;7565;7573;7581;7589;7642:2;7630:9;7621:7;7617:23;7613:32;7610:52;;;7658:1;7655;7648:12;7610:52;7698:9;7685:23;7727:18;7768:2;7760:6;7757:14;7754:34;;;7784:1;7781;7774:12;7754:34;7823:59;7874:7;7865:6;7854:9;7850:22;7823:59;:::i;:::-;7901:8;;-1:-1:-1;7797:85:1;-1:-1:-1;7989:2:1;7974:18;;7961:32;;-1:-1:-1;8005:16:1;;;8002:36;;;8034:1;8031;8024:12;8002:36;8057:51;8100:7;8089:8;8078:9;8074:24;8057:51;:::i;:::-;8047:61;;8161:2;8150:9;8146:18;8133:32;8117:48;;8190:2;8180:8;8177:16;8174:36;;;8206:1;8203;8196:12;8174:36;;8245:61;8298:7;8287:8;8276:9;8272:24;8245:61;:::i;:::-;7447:919;;;;-1:-1:-1;7447:919:1;;-1:-1:-1;8325:8:1;;8219:87;7447:919;-1:-1:-1;;;7447:919:1:o;8371:180::-;8430:6;8483:2;8471:9;8462:7;8458:23;8454:32;8451:52;;;8499:1;8496;8489:12;8451:52;-1:-1:-1;8522:23:1;;8371:180;-1:-1:-1;8371:180:1:o;8738:315::-;8806:6;8814;8867:2;8855:9;8846:7;8842:23;8838:32;8835:52;;;8883:1;8880;8873:12;8835:52;8919:9;8906:23;8896:33;;8979:2;8968:9;8964:18;8951:32;8992:31;9017:5;8992:31;:::i;:::-;9042:5;9032:15;;;8738:315;;;;;:::o;9058:385::-;9144:6;9152;9160;9168;9221:3;9209:9;9200:7;9196:23;9192:33;9189:53;;;9238:1;9235;9228:12;9189:53;-1:-1:-1;;9261:23:1;;;9331:2;9316:18;;9303:32;;-1:-1:-1;9382:2:1;9367:18;;9354:32;;9433:2;9418:18;9405:32;;-1:-1:-1;9058:385:1;-1:-1:-1;9058:385:1:o;10116:751::-;10222:6;10230;10238;10246;10254;10262;10315:3;10303:9;10294:7;10290:23;10286:33;10283:53;;;10332:1;10329;10322:12;10283:53;10368:9;10355:23;10345:33;;10428:2;10417:9;10413:18;10400:32;10441:31;10466:5;10441:31;:::i;:::-;10491:5;-1:-1:-1;10547:2:1;10532:18;;10519:32;10574:18;10563:30;;10560:50;;;10606:1;10603;10596:12;10560:50;10645:59;10696:7;10687:6;10676:9;10672:22;10645:59;:::i;:::-;10116:751;;;;-1:-1:-1;10723:8:1;10805:2;10790:18;;10777:32;;10856:3;10841:19;;;10828:33;;-1:-1:-1;10116:751:1;-1:-1:-1;;;;10116:751:1:o;10872:848::-;10958:6;11011:3;10999:9;10990:7;10986:23;10982:33;10979:53;;;11028:1;11025;11018:12;10979:53;11061:2;11055:9;11103:3;11095:6;11091:16;11173:6;11161:10;11158:22;11137:18;11125:10;11122:34;11119:62;11116:88;;;11184:18;;:::i;:::-;11224:10;11220:2;11213:22;;11272:9;11259:23;11251:6;11244:39;11344:2;11333:9;11329:18;11316:32;11311:2;11303:6;11299:15;11292:57;11410:2;11399:9;11395:18;11382:32;11377:2;11369:6;11365:15;11358:57;11465:2;11454:9;11450:18;11437:32;11478:31;11503:5;11478:31;:::i;:::-;11537:2;11525:15;;11518:30;11600:3;11585:19;;11572:33;11614;11572;11614;:::i;:::-;11675:3;11663:16;;11656:33;11667:6;10872:848;-1:-1:-1;;;10872:848:1:o;11725:1057::-;11818:6;11871:2;11859:9;11850:7;11846:23;11842:32;11839:52;;;11887:1;11884;11877:12;11839:52;11927:9;11914:23;11956:18;11997:2;11989:6;11986:14;11983:34;;;12013:1;12010;12003:12;11983:34;12036:22;;;;12092:4;12074:16;;;12070:27;12067:47;;;12110:1;12107;12100:12;12067:47;12136:22;;:::i;:::-;12194:2;12181:16;12174:5;12167:31;12251:2;12247;12243:11;12230:25;12225:2;12218:5;12214:14;12207:49;12309:2;12305;12301:11;12288:25;12283:2;12276:5;12272:14;12265:49;12359:2;12355;12351:11;12338:25;12372:33;12397:7;12372:33;:::i;:::-;12432:2;12421:14;;12414:31;12490:3;12482:12;;12469:26;12504:33;12469:26;12504:33;:::i;:::-;12564:3;12553:15;;12546:32;12624:3;12616:12;;12603:26;12641:16;;;12638:36;;;12670:1;12667;12660:12;12638:36;12707:44;12743:7;12732:8;12728:2;12724:17;12707:44;:::i;:::-;12701:3;12690:15;;12683:69;-1:-1:-1;12694:5:1;11725:1057;-1:-1:-1;;;;;11725:1057:1:o;12787:247::-;12846:6;12899:2;12887:9;12878:7;12874:23;12870:32;12867:52;;;12915:1;12912;12905:12;12867:52;12954:9;12941:23;12973:31;12998:5;12973:31;:::i;13039:315::-;13107:6;13115;13168:2;13156:9;13147:7;13143:23;13139:32;13136:52;;;13184:1;13181;13174:12;13136:52;13223:9;13210:23;13242:31;13267:5;13242:31;:::i;:::-;13292:5;13344:2;13329:18;;;;13316:32;;-1:-1:-1;;;13039:315:1:o;13708:626::-;13805:6;13813;13866:2;13854:9;13845:7;13841:23;13837:32;13834:52;;;13882:1;13879;13872:12;13834:52;13922:9;13909:23;13951:18;13992:2;13984:6;13981:14;13978:34;;;14008:1;14005;13998:12;13978:34;14046:6;14035:9;14031:22;14021:32;;14091:7;14084:4;14080:2;14076:13;14072:27;14062:55;;14113:1;14110;14103:12;14062:55;14153:2;14140:16;14179:2;14171:6;14168:14;14165:34;;;14195:1;14192;14185:12;14165:34;14248:7;14243:2;14233:6;14230:1;14226:14;14222:2;14218:23;14214:32;14211:45;14208:65;;;14269:1;14266;14259:12;14208:65;14300:2;14292:11;;;;;14322:6;;-1:-1:-1;13708:626:1;;-1:-1:-1;;;;13708:626:1:o;14339:250::-;14424:1;14434:113;14448:6;14445:1;14442:13;14434:113;;;14524:11;;;14518:18;14505:11;;;14498:39;14470:2;14463:10;14434:113;;;-1:-1:-1;;14581:1:1;14563:16;;14556:27;14339:250::o;14594:329::-;14635:3;14673:5;14667:12;14700:6;14695:3;14688:19;14716:76;14785:6;14778:4;14773:3;14769:14;14762:4;14755:5;14751:16;14716:76;:::i;:::-;14837:2;14825:15;14842:66;14821:88;14812:98;;;;14912:4;14808:109;;14594:329;-1:-1:-1;;14594:329:1:o;14928:859::-;15088:4;15117:2;15157;15146:9;15142:18;15187:2;15176:9;15169:21;15210:6;15245;15239:13;15276:6;15268;15261:22;15314:2;15303:9;15299:18;15292:25;;15376:2;15366:6;15363:1;15359:14;15348:9;15344:30;15340:39;15326:53;;15414:2;15406:6;15402:15;15435:1;15445:313;15459:6;15456:1;15453:13;15445:313;;;15548:66;15536:9;15528:6;15524:22;15520:95;15515:3;15508:108;15639:39;15671:6;15662;15656:13;15639:39;:::i;:::-;15629:49;-1:-1:-1;15736:12:1;;;;15701:15;;;;15481:1;15474:9;15445:313;;;-1:-1:-1;15775:6:1;;14928:859;-1:-1:-1;;;;;;;14928:859:1:o;15792:519::-;15875:6;15883;15891;15899;15952:3;15940:9;15931:7;15927:23;15923:33;15920:53;;;15969:1;15966;15959:12;15920:53;16008:9;15995:23;16027:31;16052:5;16027:31;:::i;:::-;16077:5;-1:-1:-1;16129:2:1;16114:18;;16101:32;;-1:-1:-1;16180:2:1;16165:18;;16152:32;;-1:-1:-1;16236:2:1;16221:18;;16208:32;16249:30;16208:32;16249:30;:::i;:::-;15792:519;;;;-1:-1:-1;15792:519:1;;-1:-1:-1;;15792:519:1:o;16316:665::-;16440:6;16448;16456;16509:3;16497:9;16488:7;16484:23;16480:33;16477:53;;;16526:1;16523;16516:12;16477:53;16549:49;16590:7;16579:9;16549:49;:::i;:::-;16539:59;;16649:3;16638:9;16634:19;16621:33;16673:18;16714:2;16706:6;16703:14;16700:34;;;16730:1;16727;16720:12;16700:34;16753:49;16794:7;16785:6;16774:9;16770:22;16753:49;:::i;:::-;16743:59;;16855:3;16844:9;16840:19;16827:33;16811:49;;16885:2;16875:8;16872:16;16869:36;;;16901:1;16898;16891:12;16869:36;;16924:51;16967:7;16956:8;16945:9;16941:24;16924:51;:::i;:::-;16914:61;;;16316:665;;;;;:::o;17329:184::-;17381:77;17378:1;17371:88;17478:4;17475:1;17468:15;17502:4;17499:1;17492:15;17518:184;17570:77;17567:1;17560:88;17667:4;17664:1;17657:15;17691:4;17688:1;17681:15;17707:195;17746:3;17777:66;17770:5;17767:77;17764:103;;17847:18;;:::i;:::-;-1:-1:-1;17894:1:1;17883:13;;17707:195::o;17907:1141::-;18305:4;18334:3;18364:6;18353:9;18346:25;18407:6;18402:2;18391:9;18387:18;18380:34;18450:6;18445:2;18434:9;18430:18;18423:34;18493:6;18488:2;18477:9;18473:18;18466:34;18537:6;18531:3;18520:9;18516:19;18509:35;18563:42;18654:2;18646:6;18642:15;18636:3;18625:9;18621:19;18614:44;18695:2;18689:3;18678:9;18674:19;18667:31;18721:44;18761:2;18750:9;18746:18;18738:6;18721:44;:::i;:::-;18802:15;;;18796:3;18781:19;;18774:44;18855:22;;;18849:3;18834:19;;18827:51;18707:58;-1:-1:-1;18901:32:1;18707:58;18918:6;18901:32;:::i;:::-;18887:46;;18982:9;18974:6;18970:22;18964:3;18953:9;18949:19;18942:51;19010:32;19035:6;19027;19010:32;:::i;:::-;19002:40;17907:1141;-1:-1:-1;;;;;;;;;;;;;17907:1141:1:o;19053:271::-;19236:6;19228;19223:3;19210:33;19192:3;19262:16;;19287:13;;;19262:16;19053:271;-1:-1:-1;19053:271:1:o;19329:659::-;19394:5;19447:3;19440:4;19432:6;19428:17;19424:27;19414:55;;19465:1;19462;19455:12;19414:55;19494:6;19488:13;19520:4;19544:60;19560:43;19600:2;19560:43;:::i;19544:60::-;19638:15;;;19724:1;19720:10;;;;19708:23;;19704:32;;;19669:12;;;;19748:15;;;19745:35;;;19776:1;19773;19766:12;19745:35;19812:2;19804:6;19800:15;19824:135;19840:6;19835:3;19832:15;19824:135;;;19906:10;;19894:23;;19937:12;;;;19857;;19824:135;;;-1:-1:-1;19977:5:1;19329:659;-1:-1:-1;;;;;;19329:659:1:o;19993:1349::-;20139:6;20147;20155;20208:2;20196:9;20187:7;20183:23;20179:32;20176:52;;;20224:1;20221;20214:12;20176:52;20256:9;20250:16;20275:31;20300:5;20275:31;:::i;:::-;20325:5;20315:15;;;20349:2;20395;20384:9;20380:18;20374:25;20418:18;20459:2;20451:6;20448:14;20445:34;;;20475:1;20472;20465:12;20445:34;20513:6;20502:9;20498:22;20488:32;;20558:7;20551:4;20547:2;20543:13;20539:27;20529:55;;20580:1;20577;20570:12;20529:55;20609:2;20603:9;20632:60;20648:43;20688:2;20648:43;:::i;20632:60::-;20726:15;;;20808:1;20804:10;;;;20796:19;;20792:28;;;20757:12;;;;20832:19;;;20829:39;;;20864:1;20861;20854:12;20829:39;20888:11;;;;20908:216;20924:6;20919:3;20916:15;20908:216;;;20999:3;20993:10;21016:33;21041:7;21016:33;:::i;:::-;21062:20;;20941:12;;;;21102;;;;20908:216;;;21194:2;21179:18;;21173:25;21143:5;;-1:-1:-1;21173:25:1;-1:-1:-1;;;21210:16:1;;;21207:36;;;21239:1;21236;21229:12;21207:36;;;21262:74;21328:7;21317:8;21306:9;21302:24;21262:74;:::i;22847:288::-;22916:6;22969:2;22957:9;22948:7;22944:23;22940:32;22937:52;;;22985:1;22982;22975:12;22937:52;23017:9;23011:16;23067:18;23060:5;23056:30;23049:5;23046:41;23036:69;;23101:1;23098;23091:12;26395:125;26460:9;;;26481:10;;;26478:36;;;26494:18;;:::i;26525:736::-;26840:6;26829:9;26822:25;26883:6;26878:2;26867:9;26863:18;26856:34;26926:6;26921:2;26910:9;26906:18;26899:34;26803:4;26952:42;27042:2;27034:6;27030:15;27025:2;27014:9;27010:18;27003:43;27095:2;27087:6;27083:15;27077:3;27066:9;27062:19;27055:44;27148:2;27140:6;27136:15;27130:3;27119:9;27115:19;27108:44;;27189:3;27183;27172:9;27168:19;27161:32;27210:45;27250:3;27239:9;27235:19;27227:6;27210:45;:::i;:::-;27202:53;26525:736;-1:-1:-1;;;;;;;;;26525:736:1:o;27266:408::-;27481:42;27473:6;27469:55;27458:9;27451:74;27561:6;27556:2;27545:9;27541:18;27534:34;27604:2;27599;27588:9;27584:18;27577:30;27432:4;27624:44;27664:2;27653:9;27649:18;27641:6;27624:44;:::i;:::-;27616:52;27266:408;-1:-1:-1;;;;;27266:408:1:o;27679:287::-;27808:3;27846:6;27840:13;27862:66;27921:6;27916:3;27909:4;27901:6;27897:17;27862:66;:::i;:::-;27944:16;;;;;27679:287;-1:-1:-1;;27679:287:1:o;27971:563::-;28224:6;28213:9;28206:25;28279:42;28271:6;28267:55;28262:2;28251:9;28247:18;28240:83;28359:6;28354:2;28343:9;28339:18;28332:34;28416:6;28409:14;28402:22;28397:2;28386:9;28382:18;28375:50;28462:3;28456;28445:9;28441:19;28434:32;28187:4;28483:45;28523:3;28512:9;28508:19;28500:6;28483:45;:::i;29188:580::-;29265:4;29271:6;29331:11;29318:25;29421:66;29410:8;29394:14;29390:29;29386:102;29366:18;29362:127;29352:155;;29503:1;29500;29493:12;29352:155;29530:33;;29582:20;;;-1:-1:-1;29625:18:1;29614:30;;29611:50;;;29657:1;29654;29647:12;29611:50;29690:4;29678:17;;-1:-1:-1;29721:14:1;29717:27;;;29707:38;;29704:58;;;29758:1;29755;29748:12;29773:648;29853:6;29906:2;29894:9;29885:7;29881:23;29877:32;29874:52;;;29922:1;29919;29912:12;29874:52;29955:9;29949:16;29988:18;29980:6;29977:30;29974:50;;;30020:1;30017;30010:12;29974:50;30043:22;;30096:4;30088:13;;30084:27;-1:-1:-1;30074:55:1;;30125:1;30122;30115:12;30074:55;30154:2;30148:9;30179:48;30195:31;30223:2;30195:31;:::i;30179:48::-;30250:2;30243:5;30236:17;30290:7;30285:2;30280;30276;30272:11;30268:20;30265:33;30262:53;;;30311:1;30308;30301:12;30262:53;30324:67;30388:2;30383;30376:5;30372:14;30367:2;30363;30359:11;30324:67;:::i;30426:219::-;30575:2;30564:9;30557:21;30538:4;30595:44;30635:2;30624:9;30620:18;30612:6;30595:44;:::i;31916:980::-;32268:4;32297:3;32327:6;32316:9;32309:25;32370:6;32365:2;32354:9;32350:18;32343:34;32413:6;32408:2;32397:9;32393:18;32386:34;32456:6;32451:2;32440:9;32436:18;32429:34;32500:6;32494:3;32483:9;32479:19;32472:35;32526:42;32617:2;32609:6;32605:15;32599:3;32588:9;32584:19;32577:44;32670:2;32662:6;32658:15;32652:3;32641:9;32637:19;32630:44;;32711:2;32705:3;32694:9;32690:19;32683:31;32737:44;32777:2;32766:9;32762:18;32754:6;32737:44;:::i;:::-;32723:58;;32830:9;32822:6;32818:22;32812:3;32801:9;32797:19;32790:51;32858:32;32883:6;32875;32858:32;:::i;:::-;32850:40;31916:980;-1:-1:-1;;;;;;;;;;;;31916:980:1:o;34341:184::-;34411:6;34464:2;34452:9;34443:7;34439:23;34435:32;34432:52;;;34480:1;34477;34470:12;34432:52;-1:-1:-1;34503:16:1;;34341:184;-1:-1:-1;34341:184:1:o;34879:812::-;35290:25;35285:3;35278:38;35260:3;35345:6;35339:13;35361:75;35429:6;35424:2;35419:3;35415:12;35408:4;35400:6;35396:17;35361:75;:::i;:::-;35500:19;35495:2;35455:16;;;35487:11;;;35480:40;35545:13;;35567:76;35545:13;35629:2;35621:11;;35614:4;35602:17;;35567:76;:::i;:::-;35663:17;35682:2;35659:26;;34879:812;-1:-1:-1;;;;34879:812:1:o;35696:245::-;35763:6;35816:2;35804:9;35795:7;35791:23;35787:32;35784:52;;;35832:1;35829;35822:12;35784:52;35864:9;35858:16;35883:28;35905:5;35883:28;:::i;36357:168::-;36430:9;;;36461;;36478:15;;;36472:22;;36458:37;36448:71;;36499:18;;:::i;36530:196::-;36569:3;36597:5;36587:39;;36606:18;;:::i;:::-;-1:-1:-1;36653:66:1;36642:78;;36530:196::o
Swarm Source
ipfs://19c3db2d84027c397e87bd60394685793eaf26d211d3f384ceadc8837375c3ae
Loading...
Loading
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.