Source Code
Overview
MOVR Balance
MOVR Value
$0.00Latest 25 from a total of 24,009 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Set Crypto Fee O... | 1240643 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240596 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240549 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240504 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240458 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240410 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240363 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240317 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240270 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240222 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240173 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240125 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240078 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1240029 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1239982 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1239935 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1239887 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1239842 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1239795 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1239747 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1239697 | 1480 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1239650 | 1481 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1239603 | 1481 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1239555 | 1481 days ago | IN | 0 MOVR | 0.00033055 | ||||
| Set Crypto Fee O... | 1239506 | 1481 days ago | IN | 0 MOVR | 0.00033055 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 1202217 | 1486 days ago | 0.026848 MOVR | ||||
| 1189885 | 1488 days ago | 0.08500022 MOVR | ||||
| 1189885 | 1488 days ago | 0.08500022 MOVR | ||||
| 1189885 | 1488 days ago | 1.785 MOVR | ||||
| 1182627 | 1489 days ago | 13.81412785 MOVR | ||||
| 1181157 | 1489 days ago | 0.075 MOVR | ||||
| 1181157 | 1489 days ago | 0.075 MOVR | ||||
| 1181157 | 1489 days ago | 1.575 MOVR | ||||
| 1177792 | 1490 days ago | 0.02461184 MOVR | ||||
| 1177792 | 1490 days ago | 0.02461184 MOVR | ||||
| 1177792 | 1490 days ago | 0.5145 MOVR | ||||
| 1173899 | 1490 days ago | 0.12508952 MOVR | ||||
| 1173899 | 1490 days ago | 0.12508952 MOVR | ||||
| 1173899 | 1490 days ago | 2.5592805 MOVR | ||||
| 1170047 | 1491 days ago | 0.115 MOVR | ||||
| 1170047 | 1491 days ago | 0.115 MOVR | ||||
| 1170047 | 1491 days ago | 2.415 MOVR | ||||
| 1168687 | 1491 days ago | 0.2825 MOVR | ||||
| 1168687 | 1491 days ago | 0.2825 MOVR | ||||
| 1168687 | 1491 days ago | 5.9325 MOVR | ||||
| 1166960 | 1491 days ago | 0.145 MOVR | ||||
| 1166960 | 1491 days ago | 0.145 MOVR | ||||
| 1166960 | 1491 days ago | 3.045 MOVR | ||||
| 1150780 | 1494 days ago | 1.10954984 MOVR | ||||
| 1150780 | 1494 days ago | 1.10954984 MOVR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SwapContract
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/**
*Submitted for verification at moonriver.moonscan.io on 2021-11-03
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
/*
* @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 String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @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] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
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));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
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");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
/**
* @dev 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 External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address account) external;
}
/**
* @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:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev 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]{20}) is missing role (0x[0-9a-f]{32})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role, _msgSender());
_;
}
/**
* @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 override returns (bool) {
return _roles[role].members[account];
}
/**
* @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]{20}) is missing role (0x[0-9a-f]{32})$/
*/
function _checkRole(bytes32 role, address account) internal view {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" 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 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.
*/
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.
*/
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 granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
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.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
/**
* @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 Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
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());
}
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
contract ECDSAOffsetRecovery {
function getHashPacked(
address user,
uint256 amountWithFee,
bytes32 originalTxHash
) public pure returns (bytes32) {
return keccak256(abi.encodePacked(user, amountWithFee, originalTxHash));
}
function toEthSignedMessageHash(bytes32 hash)
public
pure
returns (bytes32)
{
// 32 is the length in bytes of hash,
// enforced by the type signature above
return
keccak256(
abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
);
}
function ecOffsetRecover(
bytes32 hash,
bytes memory signature,
uint256 offset
) public pure returns (address) {
bytes32 r;
bytes32 s;
uint8 v;
// Divide the signature in r, s and v variables with inline assembly.
assembly {
r := mload(add(signature, add(offset, 0x20)))
s := mload(add(signature, add(offset, 0x40)))
v := byte(0, mload(add(signature, add(offset, 0x60))))
}
// Version of signature should be 27 or 28, but 0 and 1 are also possible versions
if (v < 27) {
v += 27;
}
// If the version is correct return the signer address
if (v != 27 && v != 28) {
return (address(0));
}
// bytes memory prefix = "\x19Ethereum Signed Message:\n32";
// hash = keccak256(abi.encodePacked(prefix, hash));
// solium-disable-next-line arg-overflow
return ecrecover(toEthSignedMessageHash(hash), v, r, s);
}
}
/// @title Contains 512-bit math functions
/// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision
/// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits
library FullMath {
/// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
/// @param a The multiplicand
/// @param b The multiplier
/// @param denominator The divisor
/// @return result The 256-bit result
/// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv
function mulDiv(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
// 512-bit multiply [prod1 prod0] = a * b
// Compute the product mod 2**256 and mod 2**256 - 1
// then 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(a, b, not(0))
prod0 := mul(a, b)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division
if (prod1 == 0) {
require(denominator > 0);
assembly {
result := div(prod0, denominator)
}
return result;
}
// Make sure the result is less than 2**256.
// Also prevents denominator == 0
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0]
// Compute remainder using mulmod
uint256 remainder;
assembly {
remainder := mulmod(a, b, denominator)
}
// Subtract 256 bit number from 512 bit number
assembly {
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator
// Compute largest power of two divisor of denominator.
// Always >= 1.
uint256 twos = (type(uint256).max - denominator + 1) & denominator;
// Divide denominator by power of two
assembly {
denominator := div(denominator, twos)
}
// Divide [prod1 prod0] by the factors of two
assembly {
prod0 := div(prod0, twos)
}
// Shift in bits from prod1 into prod0. For this we need
// to flip `twos` such that it is 2**256 / twos.
// If twos is zero, then it becomes one
assembly {
twos := add(div(sub(0, twos), twos), 1)
}
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
// correct for four bits. That is, denominator * inv = 1 mod 2**4
uint256 inv = (3 * denominator) ^ 2;
// Now use 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.
inv *= 2 - denominator * inv; // inverse mod 2**8
inv *= 2 - denominator * inv; // inverse mod 2**16
inv *= 2 - denominator * inv; // inverse mod 2**32
inv *= 2 - denominator * inv; // inverse mod 2**64
inv *= 2 - denominator * inv; // inverse mod 2**128
inv *= 2 - denominator * inv; // 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 precoditions 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 * inv;
return result;
}
}
/// @title Swap contract for multisignature bridge
contract SwapContract is AccessControl, Pausable, ECDSAOffsetRecovery {
using SafeERC20 for IERC20;
bytes32 public constant OWNER_ROLE = keccak256("OWNER_ROLE");
bytes32 public constant MANAGER_ROLE = keccak256("MANAGER_ROLE");
bytes32 public constant RELAYER_ROLE = keccak256("RELAYER_ROLE");
bytes32 public constant VALIDATOR_ROLE = keccak256("VALIDATOR_ROLE");
uint128 public immutable numOfThisBlockchain;
IUniswapV2Router02 public blockchainRouter;
address public blockchainPool;
mapping(uint256 => address) public RubicAddresses;
mapping(uint256 => bool) public existingOtherBlockchain;
mapping(uint256 => uint256) public feeAmountOfBlockchain;
mapping(uint256 => uint256) public blockchainCryptoFee;
uint256 public constant SIGNATURE_LENGTH = 65;
struct processedTx {
uint256 statusCode;
bytes32 hashedParams;
}
mapping(bytes32 => processedTx) public processedTransactions;
uint256 public minConfirmationSignatures = 3;
uint256 public minTokenAmount;
uint256 public maxTokenAmount;
uint256 public maxGasPrice;
uint256 public minConfirmationBlocks;
uint256 public refundSlippage;
// emitted every time when user gets crypto or tokens after success crossChainSwap
event TransferFromOtherBlockchain(
address user,
uint256 amount,
uint256 amountWithoutFee,
bytes32 originalTxHash
);
// emitted every time when user get a refund
event userRefunded(
address user,
uint256 amount,
uint256 amountWithoutFee,
bytes32 originalTxHash
);
// emitted if the recipient should receive crypto in the target blockchain
event TransferCryptoToOtherBlockchainUser(
uint256 blockchain,
address sender,
uint256 RBCAmountIn,
uint256 amountSpent,
string newAddress,
uint256 cryptoOutMin,
address[] path
);
// emitted if the recipient should receive tokens in the target blockchain
event TransferTokensToOtherBlockchainUser(
uint256 blockchain,
address sender,
uint256 RBCAmountIn,
uint256 amountSpent,
string newAddress,
uint256 tokenOutMin,
address[] path
);
/**
* @param blockchain Number of blockchain
* @param tokenInAmount Maximum amount of a token being sold
* @param firstPath Path used for swapping tokens to *RBC (tokenIn address,.., *RBC addres)
* @param secondPath Path used for swapping *RBC to tokenOut (*RBC address,.., tokenOut address)
* @param exactRBCtokenOut Exact amount of RBC to get after first swap
* @param tokenOutMin Minimal amount of tokens (or crypto) to get after second swap
* @param newAddress Address in the blockchain to which the user wants to transfer
* @param swapToCrypto This must be _true_ if swapping tokens to desired blockchain's crypto
*/
struct swapToParams {
uint256 blockchain;
uint256 tokenInAmount;
address[] firstPath;
address[] secondPath;
uint256 exactRBCtokenOut;
uint256 tokenOutMin;
string newAddress;
bool swapToCrypto;
}
/**
* @param user User address // "newAddress" from event
* @param amountWithFee Amount of tokens with included fees to transfer from the pool // "RBCAmountIn" from event
* @param amountOutMin Minimal amount of tokens to get after second swap // "tokenOutMin" from event
* @param path Path used for a second swap // "secondPath" from event
* @param originalTxHash Hash of transaction from other network, on which swap was called
* @param concatSignatures Concatenated string of signature bytes for verification of transaction
*/
struct swapFromParams {
address user;
uint256 amountWithFee;
uint256 amountOutMin;
address[] path;
bytes32 originalTxHash;
bytes concatSignatures;
}
/**
* @dev throws if transaction sender is not in owner role
*/
modifier onlyOwner() {
require(
hasRole(OWNER_ROLE, _msgSender()),
"Caller is not in owner role"
);
_;
}
/**
* @dev throws if transaction sender is not in owner or manager role
*/
modifier onlyOwnerAndManager() {
require(
hasRole(OWNER_ROLE, _msgSender()) ||
hasRole(MANAGER_ROLE, _msgSender()),
"Caller is not in owner or manager role"
);
_;
}
/**
* @dev throws if transaction sender is not in relayer role
*/
modifier onlyRelayer() {
require(
hasRole(RELAYER_ROLE, _msgSender()),
"swapContract: Caller is not in relayer role"
);
_;
}
/**
* @dev Performs check before swap*ToOtherBlockchain-functions and emits events
* @param params The swapToParams structure
* @param value The msg.value
*/
modifier TransferTo(swapToParams memory params, uint256 value) {
require(
bytes(params.newAddress).length > 0,
"swapContract: No destination address provided"
);
require(
existingOtherBlockchain[params.blockchain] &&
params.blockchain != numOfThisBlockchain,
"swapContract: Wrong choose of blockchain"
);
require(
params.firstPath.length > 0,
"swapContract: firsPath length must be greater than 1"
);
require(
params.secondPath.length > 0,
"swapContract: secondPath length must be greater than 1"
);
require(
params.firstPath[params.firstPath.length - 1] ==
RubicAddresses[numOfThisBlockchain],
"swapContract: the last address in the firstPath must be Rubic"
);
require(
params.secondPath[0] == RubicAddresses[params.blockchain],
"swapContract: the first address in the secondPath must be Rubic"
);
require(
params.exactRBCtokenOut >= minTokenAmount,
"swapContract: Not enough amount of tokens"
);
require(
params.exactRBCtokenOut < maxTokenAmount,
"swapContract: Too many RBC requested"
);
require(
value >= blockchainCryptoFee[params.blockchain],
"swapContract: Not enough crypto provided"
);
_;
if (params.swapToCrypto) {
emit TransferCryptoToOtherBlockchainUser(
params.blockchain,
_msgSender(),
params.exactRBCtokenOut,
params.tokenInAmount,
params.newAddress,
params.tokenOutMin,
params.secondPath
);
} else {
emit TransferTokensToOtherBlockchainUser(
params.blockchain,
_msgSender(),
params.exactRBCtokenOut,
params.tokenInAmount,
params.newAddress,
params.tokenOutMin,
params.secondPath
);
}
}
/**
* @dev Performs check before swap*ToUser-functions
* @param params The swapFromParams structure
*/
modifier TransferFrom(swapFromParams memory params) {
require(
params.amountWithFee >= minTokenAmount,
"swapContract: Not enough amount of tokens"
);
require(
params.amountWithFee < maxTokenAmount,
"swapContract: Too many RBC requested"
);
require(
params.path.length > 0,
"swapContract: path length must be greater than 1"
);
require(
params.path[0] == RubicAddresses[numOfThisBlockchain],
"swapContract: the first address in the path must be Rubic"
);
require(
params.user != address(0),
"swapContract: Address cannot be zero address"
);
require(
params.concatSignatures.length % SIGNATURE_LENGTH == 0,
"swapContract: Signatures lengths must be divisible by 65"
);
require(
params.concatSignatures.length / SIGNATURE_LENGTH >=
minConfirmationSignatures,
"swapContract: Not enough signatures passed"
);
_processTransaction(
params.user,
params.amountWithFee,
params.originalTxHash,
params.concatSignatures
);
_;
}
/**
* @dev Constructor of contract
* @param _numOfThisBlockchain Number of blockchain where contract is deployed
* @param _numsOfOtherBlockchains List of blockchain number that is supported by bridge
* @param tokenLimits A list where 0 element is minTokenAmount and 1 is maxTokenAmount
* @param _maxGasPrice Maximum gas price on which relayer nodes will operate
* @param _minConfirmationBlocks Minimal amount of blocks for confirmation on validator nodes
* @param _refundSlippage Slippage represented as hundredths of a bip, i.e. 1e-6 that will be used on refund
* @param _RubicAddresses Addresses of Rubic in different blockchains
*/
constructor(
uint128 _numOfThisBlockchain,
uint128[] memory _numsOfOtherBlockchains,
uint256[] memory tokenLimits,
uint256 _maxGasPrice,
uint256 _minConfirmationBlocks,
uint256 _refundSlippage,
IUniswapV2Router02 _blockchainRouter,
address[] memory _RubicAddresses
) {
for (uint256 i = 0; i < _numsOfOtherBlockchains.length; i++) {
require(
_numsOfOtherBlockchains[i] != _numOfThisBlockchain,
"swapContract: Number of this blockchain is in array of other blockchains"
);
existingOtherBlockchain[_numsOfOtherBlockchains[i]] = true;
}
for (uint256 i = 0; i < _RubicAddresses.length; i++) {
RubicAddresses[i + 1] = _RubicAddresses[i];
}
require(_maxGasPrice > 0, "swapContract: Gas price cannot be zero");
numOfThisBlockchain = _numOfThisBlockchain;
minTokenAmount = tokenLimits[0];
maxTokenAmount = tokenLimits[1];
maxGasPrice = _maxGasPrice;
refundSlippage = _refundSlippage;
minConfirmationBlocks = _minConfirmationBlocks;
_setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
_setupRole(OWNER_ROLE, _msgSender());
blockchainRouter = _blockchainRouter;
IERC20(RubicAddresses[_numOfThisBlockchain]).safeApprove(
address(_blockchainRouter),
type(uint256).max
);
}
/**
* @dev Returns true if blockchain of passed id is registered to swap
* @param blockchain number of blockchain
*/
function getOtherBlockchainAvailableByNum(uint256 blockchain)
external
view
returns (bool)
{
return existingOtherBlockchain[blockchain];
}
function _processTransaction(
address user,
uint256 amountWithFee,
bytes32 originalTxHash,
bytes memory concatSignatures
) private {
bytes32 hashedParams = getHashPacked(
user,
amountWithFee,
originalTxHash
);
uint256 statusCode = processedTransactions[originalTxHash].statusCode;
bytes32 savedHash = processedTransactions[originalTxHash].hashedParams;
require(
statusCode == 0 && savedHash != hashedParams,
"swapContract: Transaction already processed"
);
uint256 signaturesCount = concatSignatures.length /
uint256(SIGNATURE_LENGTH);
address[] memory validatorAddresses = new address[](signaturesCount);
for (uint256 i = 0; i < signaturesCount; i++) {
address validatorAddress = ecOffsetRecover(
hashedParams,
concatSignatures,
i * SIGNATURE_LENGTH
);
require(
isValidator(validatorAddress),
"swapContract: Validator address not in whitelist"
);
for (uint256 j = 0; j < i; j++) {
require(
validatorAddress != validatorAddresses[j],
"swapContract: Validator address is duplicated"
);
}
validatorAddresses[i] = validatorAddress;
}
processedTransactions[originalTxHash].hashedParams = hashedParams;
processedTransactions[originalTxHash].statusCode = 1;
}
/**
* @dev Transfers tokens from sender to the contract.
* User calls this function when he wants to transfer tokens to another blockchain.
* @notice User must have approved tokenInAmount of tokenIn
*/
function swapTokensToOtherBlockchain(swapToParams memory params)
external
payable
whenNotPaused
TransferTo(params, msg.value)
{
IERC20 tokenIn = IERC20(params.firstPath[0]);
if (params.firstPath.length > 1) {
tokenIn.safeTransferFrom(
msg.sender,
address(this),
params.tokenInAmount
);
tokenIn.safeApprove(address(blockchainRouter), 0);
tokenIn.safeApprove(
address(blockchainRouter),
params.tokenInAmount
);
uint256[] memory amounts = blockchainRouter
.swapTokensForExactTokens(
params.exactRBCtokenOut,
params.tokenInAmount,
params.firstPath,
blockchainPool,
block.timestamp
);
tokenIn.safeTransfer(
_msgSender(),
params.tokenInAmount - amounts[0]
);
params.tokenInAmount = amounts[0];
} else {
tokenIn.safeTransferFrom(
msg.sender,
blockchainPool,
params.exactRBCtokenOut
);
}
}
/**
* @dev Transfers tokens from sender to the contract.
* User calls this function when he wants to transfer tokens to another blockchain.
* @notice User must have approved tokenInAmount of tokenIn
*/
function swapCryptoToOtherBlockchain(swapToParams memory params)
external
payable
whenNotPaused
TransferTo(params, msg.value)
{
uint256 cryptoWithoutFee = msg.value -
blockchainCryptoFee[params.blockchain];
uint256[] memory amounts = blockchainRouter.swapETHForExactTokens{
value: cryptoWithoutFee
}(
params.exactRBCtokenOut,
params.firstPath,
blockchainPool,
block.timestamp
);
params.tokenInAmount = amounts[0];
bool success = payable(_msgSender()).send(
cryptoWithoutFee - amounts[0]
);
require(success, "swapContract: crypto transfer back to caller failed");
}
/**
* @dev Transfers tokens to end user in current blockchain
*/
function swapTokensToUserWithFee(swapFromParams memory params)
external
onlyRelayer
whenNotPaused
TransferFrom(params)
{
uint256 amountWithoutFee = FullMath.mulDiv(
params.amountWithFee,
1e6 - feeAmountOfBlockchain[numOfThisBlockchain],
1e6
);
IERC20 RBCToken = IERC20(params.path[0]);
if (params.path.length == 1) {
RBCToken.safeTransferFrom(
blockchainPool,
params.user,
amountWithoutFee
);
RBCToken.safeTransferFrom(
blockchainPool,
address(this),
params.amountWithFee - amountWithoutFee
);
} else {
RBCToken.safeTransferFrom(
blockchainPool,
address(this),
params.amountWithFee
);
blockchainRouter.swapExactTokensForTokens(
amountWithoutFee,
params.amountOutMin,
params.path,
params.user,
block.timestamp
);
}
emit TransferFromOtherBlockchain(
params.user,
params.amountWithFee,
amountWithoutFee,
params.originalTxHash
);
}
/**
* @dev Transfers tokens to end user in current blockchain
*/
function swapCryptoToUserWithFee(swapFromParams memory params)
external
onlyRelayer
whenNotPaused
TransferFrom(params)
{
uint256 amountWithoutFee = FullMath.mulDiv(
params.amountWithFee,
1e6 - feeAmountOfBlockchain[numOfThisBlockchain],
1e6
);
IERC20 RBCToken = IERC20(params.path[0]);
RBCToken.safeTransferFrom(
blockchainPool,
address(this),
params.amountWithFee
);
blockchainRouter.swapExactTokensForETH(
amountWithoutFee,
params.amountOutMin,
params.path,
params.user,
block.timestamp
);
emit TransferFromOtherBlockchain(
params.user,
params.amountWithFee,
amountWithoutFee,
params.originalTxHash
);
}
/**
* @dev Swaps RBC from pool to initially spent by user tokens and transfers him
* @notice There is used the same structure as in other similar functions but amountOutMin should be
* equal to the amount of tokens initially spent by user (we are refunding them), AmountWithFee should
* be equal to the amount of RBC tokens that the pool got after the first swap (RBCAmountIn in the event)
* hashedParams of this originalTxHash
*/
function refundTokensToUser(swapFromParams memory params)
external
onlyRelayer
whenNotPaused
TransferFrom(params)
{
IERC20 RBCToken = IERC20(params.path[0]);
if (params.path.length == 1) {
RBCToken.safeTransferFrom(
blockchainPool,
params.user,
params.amountOutMin
);
emit userRefunded(
params.user,
params.amountOutMin,
params.amountOutMin,
params.originalTxHash
);
} else {
uint256 amountIn = FullMath.mulDiv(
params.amountWithFee,
1e6 + refundSlippage,
1e6
);
RBCToken.safeTransferFrom(blockchainPool, address(this), amountIn);
uint256 RBCSpent = blockchainRouter.swapTokensForExactTokens(
params.amountOutMin,
amountIn,
params.path,
params.user,
block.timestamp
)[0];
RBCToken.safeTransfer(blockchainPool, amountIn - RBCSpent);
emit userRefunded(
params.user,
RBCSpent,
RBCSpent,
params.originalTxHash
);
}
}
function refundCryptoToUser(swapFromParams memory params)
external
onlyRelayer
whenNotPaused
TransferFrom(params)
{
IERC20 RBCToken = IERC20(params.path[0]);
uint256 amountIn = FullMath.mulDiv(
params.amountWithFee,
1e6 + refundSlippage,
1e6
);
RBCToken.safeTransferFrom(blockchainPool, address(this), amountIn);
uint256 RBCSpent = blockchainRouter.swapTokensForExactETH(
params.amountOutMin,
amountIn,
params.path,
params.user,
block.timestamp
)[0];
RBCToken.safeTransfer(blockchainPool, amountIn - RBCSpent);
emit userRefunded(
params.user,
RBCSpent,
RBCSpent,
params.originalTxHash
);
}
// OTHER BLOCKCHAIN MANAGEMENT
/**
* @dev Registers another blockchain for availability to swap
* @param numOfOtherBlockchain number of blockchain
*/
function addOtherBlockchain(uint128 numOfOtherBlockchain)
external
onlyOwner
{
require(
numOfOtherBlockchain != numOfThisBlockchain,
"swapContract: Cannot add this blockchain to array of other blockchains"
);
require(
!existingOtherBlockchain[numOfOtherBlockchain],
"swapContract: This blockchain is already added"
);
existingOtherBlockchain[numOfOtherBlockchain] = true;
}
/**
* @dev Unregisters another blockchain for availability to swap
* @param numOfOtherBlockchain number of blockchain
*/
function removeOtherBlockchain(uint128 numOfOtherBlockchain)
external
onlyOwner
{
require(
existingOtherBlockchain[numOfOtherBlockchain],
"swapContract: This blockchain was not added"
);
existingOtherBlockchain[numOfOtherBlockchain] = false;
}
/**
* @dev Change existing blockchain id
* @param oldNumOfOtherBlockchain number of existing blockchain
* @param newNumOfOtherBlockchain number of new blockchain
*/
function changeOtherBlockchain(
uint128 oldNumOfOtherBlockchain,
uint128 newNumOfOtherBlockchain
) external onlyOwner {
require(
oldNumOfOtherBlockchain != newNumOfOtherBlockchain,
"swapContract: Cannot change blockchains with same number"
);
require(
newNumOfOtherBlockchain != numOfThisBlockchain,
"swapContract: Cannot add this blockchain to array of other blockchains"
);
require(
existingOtherBlockchain[oldNumOfOtherBlockchain],
"swapContract: This blockchain was not added"
);
require(
!existingOtherBlockchain[newNumOfOtherBlockchain],
"swapContract: This blockchain is already added"
);
existingOtherBlockchain[oldNumOfOtherBlockchain] = false;
existingOtherBlockchain[newNumOfOtherBlockchain] = true;
}
/**
* @dev Changes/Set Router address
* @param _router the new Router address
*/
function setRouter(IUniswapV2Router02 _router)
external
onlyOwnerAndManager
{
blockchainRouter = _router;
}
/**
* @dev Changes/Set Pool address
* @param _poolAddress the new Pool address
*/
function setPoolAddress(address _poolAddress) external onlyOwnerAndManager {
blockchainPool = _poolAddress;
}
// FEE MANAGEMENT
/**
* @dev Sends collected crypto fee to the owner
*/
function collectCryptoFee() external onlyOwner {
bool success = payable(msg.sender).send(address(this).balance);
require(success, "swapContract: fail collecting fee");
}
/**
* @dev Sends collected token fee to the owner
*/
function collectTokenFee() external onlyOwner {
IERC20(RubicAddresses[numOfThisBlockchain]).safeTransfer(
msg.sender,
IERC20(RubicAddresses[numOfThisBlockchain]).balanceOf(address(this))
);
}
/**
* @dev Changes fee values for blockchains in feeAmountOfBlockchain variables
* @notice fee is represented as hundredths of a bip, i.e. 1e-6
* @param _blockchainNum Existing number of blockchain
* @param feeAmount Fee amount to substruct from transfer amount
*/
function setFeeAmountOfBlockchain(uint128 _blockchainNum, uint256 feeAmount)
external
onlyOwnerAndManager
{
feeAmountOfBlockchain[_blockchainNum] = feeAmount;
}
/**
* @dev Changes crypto fee values for blockchains in blockchainCryptoFee variables
* @param _blockchainNum Existing number of blockchain
* @param feeAmount Fee amount that must be sent calling transferToOtherBlockchain
*/
function setCryptoFeeOfBlockchain(uint128 _blockchainNum, uint256 feeAmount)
external
onlyOwnerAndManager
{
blockchainCryptoFee[_blockchainNum] = feeAmount;
}
/**
* @dev Changes the address of Rubic in the certain blockchain
* @param _blockchainNum Existing number of blockchain
* @param _RubicAddress The Rubic address
*/
function setRubicAddressOfBlockchain(
uint128 _blockchainNum,
address _RubicAddress
) external onlyOwnerAndManager {
RubicAddresses[_blockchainNum] = _RubicAddress;
if (_blockchainNum == numOfThisBlockchain) {
if (
IERC20(_RubicAddress).allowance(
address(this),
address(blockchainRouter)
) != 0
) {
IERC20(_RubicAddress).safeApprove(address(blockchainRouter), 0);
}
IERC20(_RubicAddress).safeApprove(
address(blockchainRouter),
type(uint256).max
);
}
}
// VALIDATOR CONFIRMATIONS MANAGEMENT
/**
* @dev Changes requirement for minimal amount of signatures to validate on transfer
* @param _minConfirmationSignatures Number of signatures to verify
*/
function setMinConfirmationSignatures(uint256 _minConfirmationSignatures)
external
onlyOwner
{
require(
_minConfirmationSignatures > 0,
"swapContract: At least 1 confirmation can be set"
);
minConfirmationSignatures = _minConfirmationSignatures;
}
/**
* @dev Changes requirement for minimal token amount on transfers
* @param _minTokenAmount Amount of tokens
*/
function setMinTokenAmount(uint256 _minTokenAmount)
external
onlyOwnerAndManager
{
minTokenAmount = _minTokenAmount;
}
/**
* @dev Changes requirement for maximum token amount on transfers
* @param _maxTokenAmount Amount of tokens
*/
function setMaxTokenAmount(uint256 _maxTokenAmount)
external
onlyOwnerAndManager
{
maxTokenAmount = _maxTokenAmount;
}
/**
* @dev Changes parameter of maximum gas price on which relayer nodes will operate
* @param _maxGasPrice Price of gas in wei
*/
function setMaxGasPrice(uint256 _maxGasPrice) external onlyOwnerAndManager {
require(_maxGasPrice > 0, "swapContract: Gas price cannot be zero");
maxGasPrice = _maxGasPrice;
}
/**
* @dev Changes requirement for minimal amount of block to consider tx confirmed on validator
* @param _minConfirmationBlocks Amount of blocks
*/
function setMinConfirmationBlocks(uint256 _minConfirmationBlocks)
external
onlyOwnerAndManager
{
minConfirmationBlocks = _minConfirmationBlocks;
}
function setRefundSlippage(uint256 _refundSlippage)
external
onlyOwnerAndManager
{
refundSlippage = _refundSlippage;
}
/**
* @dev Transfers permissions of contract ownership.
* Will setup new owner and one manager on contract.
* Main purpose of this function is to transfer ownership from deployer account ot real owner
* @param newOwner Address of new owner
* @param newManager Address of new manager
*/
function transferOwnerAndSetManager(address newOwner, address newManager)
external
onlyOwner
{
require(
newOwner != _msgSender(),
"swapContract: New owner must be different than current"
);
require(
newOwner != address(0x0),
"swapContract: Owner cannot be zero address"
);
require(
newManager != address(0x0),
"swapContract: Owner cannot be zero address"
);
_setupRole(DEFAULT_ADMIN_ROLE, newOwner);
_setupRole(OWNER_ROLE, newOwner);
_setupRole(MANAGER_ROLE, newManager);
renounceRole(OWNER_ROLE, _msgSender());
renounceRole(DEFAULT_ADMIN_ROLE, _msgSender());
}
/**
* @dev Pauses transfers of tokens on contract
*/
function pauseExecution() external onlyOwner {
_pause();
}
/**
* @dev Resumes transfers of tokens on contract
*/
function continueExecution() external onlyOwner {
_unpause();
}
/**
* @dev Function to check if address is belongs to owner role
* @param account Address to check
*/
function isOwner(address account) public view returns (bool) {
return hasRole(OWNER_ROLE, account);
}
/**
* @dev Function to check if address is belongs to manager role
* @param account Address to check
*/
function isManager(address account) public view returns (bool) {
return hasRole(MANAGER_ROLE, account);
}
/**
* @dev Function to check if address is belongs to relayer role
* @param account Address to check
*/
function isRelayer(address account) public view returns (bool) {
return hasRole(RELAYER_ROLE, account);
}
/**
* @dev Function to check if address is belongs to validator role
* @param account Address to check
*
*/
function isValidator(address account) public view returns (bool) {
return hasRole(VALIDATOR_ROLE, account);
}
/**
* @dev Function changes values associated with certain originalTxHash
* @param originalTxHash Transaction hash to change
* @param statusCode Associated status: 0-Not processed, 1-Processed, 2-Reverted
* @param hashedParams Hashed params with which the initial transaction was executed
*/
function changeTxStatus(
bytes32 originalTxHash,
uint256 statusCode,
bytes32 hashedParams
) external onlyRelayer {
require(
statusCode != 0,
"swapContract: you cannot set the statusCode to 0"
);
require(
processedTransactions[originalTxHash].statusCode != 1,
"swapContract: transaction with this originalTxHash has already been set as succeed"
);
processedTransactions[originalTxHash].statusCode = statusCode;
processedTransactions[originalTxHash].hashedParams = hashedParams;
}
/**
* @dev Plain fallback function to receive crypto
*/
receive() external payable {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint128","name":"_numOfThisBlockchain","type":"uint128"},{"internalType":"uint128[]","name":"_numsOfOtherBlockchains","type":"uint128[]"},{"internalType":"uint256[]","name":"tokenLimits","type":"uint256[]"},{"internalType":"uint256","name":"_maxGasPrice","type":"uint256"},{"internalType":"uint256","name":"_minConfirmationBlocks","type":"uint256"},{"internalType":"uint256","name":"_refundSlippage","type":"uint256"},{"internalType":"contract IUniswapV2Router02","name":"_blockchainRouter","type":"address"},{"internalType":"address[]","name":"_RubicAddresses","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"uint256","name":"blockchain","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"RBCAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountSpent","type":"uint256"},{"indexed":false,"internalType":"string","name":"newAddress","type":"string"},{"indexed":false,"internalType":"uint256","name":"cryptoOutMin","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"TransferCryptoToOtherBlockchainUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountWithoutFee","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"originalTxHash","type":"bytes32"}],"name":"TransferFromOtherBlockchain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"blockchain","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"RBCAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountSpent","type":"uint256"},{"indexed":false,"internalType":"string","name":"newAddress","type":"string"},{"indexed":false,"internalType":"uint256","name":"tokenOutMin","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"}],"name":"TransferTokensToOtherBlockchainUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountWithoutFee","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"originalTxHash","type":"bytes32"}],"name":"userRefunded","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OWNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RELAYER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"RubicAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SIGNATURE_LENGTH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"numOfOtherBlockchain","type":"uint128"}],"name":"addOtherBlockchain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"blockchainCryptoFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockchainPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockchainRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"oldNumOfOtherBlockchain","type":"uint128"},{"internalType":"uint128","name":"newNumOfOtherBlockchain","type":"uint128"}],"name":"changeOtherBlockchain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"originalTxHash","type":"bytes32"},{"internalType":"uint256","name":"statusCode","type":"uint256"},{"internalType":"bytes32","name":"hashedParams","type":"bytes32"}],"name":"changeTxStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectCryptoFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectTokenFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"continueExecution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint256","name":"offset","type":"uint256"}],"name":"ecOffsetRecover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"existingOtherBlockchain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeAmountOfBlockchain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amountWithFee","type":"uint256"},{"internalType":"bytes32","name":"originalTxHash","type":"bytes32"}],"name":"getHashPacked","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockchain","type":"uint256"}],"name":"getOtherBlockchainAvailableByNum","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"isManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isRelayer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minConfirmationBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minConfirmationSignatures","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numOfThisBlockchain","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseExecution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"processedTransactions","outputs":[{"internalType":"uint256","name":"statusCode","type":"uint256"},{"internalType":"bytes32","name":"hashedParams","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amountWithFee","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes32","name":"originalTxHash","type":"bytes32"},{"internalType":"bytes","name":"concatSignatures","type":"bytes"}],"internalType":"struct SwapContract.swapFromParams","name":"params","type":"tuple"}],"name":"refundCryptoToUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amountWithFee","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes32","name":"originalTxHash","type":"bytes32"},{"internalType":"bytes","name":"concatSignatures","type":"bytes"}],"internalType":"struct SwapContract.swapFromParams","name":"params","type":"tuple"}],"name":"refundTokensToUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"numOfOtherBlockchain","type":"uint128"}],"name":"removeOtherBlockchain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_blockchainNum","type":"uint128"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"setCryptoFeeOfBlockchain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_blockchainNum","type":"uint128"},{"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"setFeeAmountOfBlockchain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxGasPrice","type":"uint256"}],"name":"setMaxGasPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTokenAmount","type":"uint256"}],"name":"setMaxTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minConfirmationBlocks","type":"uint256"}],"name":"setMinConfirmationBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minConfirmationSignatures","type":"uint256"}],"name":"setMinConfirmationSignatures","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTokenAmount","type":"uint256"}],"name":"setMinTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_poolAddress","type":"address"}],"name":"setPoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_refundSlippage","type":"uint256"}],"name":"setRefundSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IUniswapV2Router02","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_blockchainNum","type":"uint128"},{"internalType":"address","name":"_RubicAddress","type":"address"}],"name":"setRubicAddressOfBlockchain","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":[{"components":[{"internalType":"uint256","name":"blockchain","type":"uint256"},{"internalType":"uint256","name":"tokenInAmount","type":"uint256"},{"internalType":"address[]","name":"firstPath","type":"address[]"},{"internalType":"address[]","name":"secondPath","type":"address[]"},{"internalType":"uint256","name":"exactRBCtokenOut","type":"uint256"},{"internalType":"uint256","name":"tokenOutMin","type":"uint256"},{"internalType":"string","name":"newAddress","type":"string"},{"internalType":"bool","name":"swapToCrypto","type":"bool"}],"internalType":"struct SwapContract.swapToParams","name":"params","type":"tuple"}],"name":"swapCryptoToOtherBlockchain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amountWithFee","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes32","name":"originalTxHash","type":"bytes32"},{"internalType":"bytes","name":"concatSignatures","type":"bytes"}],"internalType":"struct SwapContract.swapFromParams","name":"params","type":"tuple"}],"name":"swapCryptoToUserWithFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"blockchain","type":"uint256"},{"internalType":"uint256","name":"tokenInAmount","type":"uint256"},{"internalType":"address[]","name":"firstPath","type":"address[]"},{"internalType":"address[]","name":"secondPath","type":"address[]"},{"internalType":"uint256","name":"exactRBCtokenOut","type":"uint256"},{"internalType":"uint256","name":"tokenOutMin","type":"uint256"},{"internalType":"string","name":"newAddress","type":"string"},{"internalType":"bool","name":"swapToCrypto","type":"bool"}],"internalType":"struct SwapContract.swapToParams","name":"params","type":"tuple"}],"name":"swapTokensToOtherBlockchain","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amountWithFee","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes32","name":"originalTxHash","type":"bytes32"},{"internalType":"bytes","name":"concatSignatures","type":"bytes"}],"internalType":"struct SwapContract.swapFromParams","name":"params","type":"tuple"}],"name":"swapTokensToUserWithFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"toEthSignedMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"address","name":"newManager","type":"address"}],"name":"transferOwnerAndSetManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60a060405260036008553480156200001657600080fd5b5060405162006a6d38038062006a6d8339810160408190526200003991620009c3565b6001805460ff1916905560005b87518110156200018a57886001600160801b03168882815181106200007b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160801b03161415620001175760405162461bcd60e51b815260206004820152604860248201527f73776170436f6e74726163743a204e756d626572206f66207468697320626c6f60448201527f636b636861696e20697320696e206172726179206f66206f7468657220626c6f606482015267636b636861696e7360c01b608482015260a4015b60405180910390fd5b6001600460008a84815181106200013e57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160801b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620001819062000ba7565b91505062000046565b5060005b81518110156200021757818181518110620001b957634e487b7160e01b600052603260045260246000fd5b602002602001015160036000836001620001d4919062000b59565b8152602081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055806200020e8162000ba7565b9150506200018e565b5060008511620002795760405162461bcd60e51b815260206004820152602660248201527f73776170436f6e74726163743a204761732070726963652063616e6e6f74206260448201526565207a65726f60d01b60648201526084016200010e565b876001600160801b03166080816001600160801b031660801b8152505085600081518110620002b857634e487b7160e01b600052603260045260246000fd5b602002602001015160098190555085600181518110620002e857634e487b7160e01b600052603260045260246000fd5b6020908102919091010151600a55600b859055600d839055600c84905562000312600033620003ab565b6200033e7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e33620003ab565b600180546001600160a01b0380851661010002610100600160a81b0319909216919091179091556001600160801b0389166000908152600360209081526040909120546200039d921690849060001990620045e5620003bb821b17901c565b505050505050505062000c0a565b620003b782826200051a565b5050565b801580620004495750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156200040c57600080fd5b505afa15801562000421573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000447919062000a94565b155b620004bd5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016200010e565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915262000515918591620005ba16565b505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620003b7576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620005763390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600062000616826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200069860201b62004758179092919060201c565b805190915015620005155780806020019051810190620006379190620009a1565b620005155760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200010e565b6060620006a98484600085620006b3565b90505b9392505050565b606082471015620007165760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016200010e565b843b620007665760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200010e565b600080866001600160a01b0316858760405162000784919062000aad565b60006040518083038185875af1925050503d8060008114620007c3576040519150601f19603f3d011682016040523d82523d6000602084013e620007c8565b606091505b509092509050620007db828286620007e6565b979650505050505050565b60608315620007f7575081620006ac565b825115620008085782518084602001fd5b8160405162461bcd60e51b81526004016200010e919062000acb565b600082601f83011262000835578081fd5b815160206200084e620008488362000b33565b62000b00565b80838252828201915082860187848660051b89010111156200086e578586fd5b855b8581101562000899578151620008868162000bf1565b8452928401929084019060010162000870565b5090979650505050505050565b600082601f830112620008b7578081fd5b81516020620008ca620008488362000b33565b80838252828201915082860187848660051b8901011115620008ea578586fd5b855b858110156200089957620009008262000989565b84529284019290840190600101620008ec565b600082601f83011262000924578081fd5b8151602062000937620008488362000b33565b80838252828201915082860187848660051b890101111562000957578586fd5b855b85811015620008995781518452928401929084019060010162000959565b8051620009848162000bf1565b919050565b80516001600160801b03811681146200098457600080fd5b600060208284031215620009b3578081fd5b81518015158114620006ac578182fd5b600080600080600080600080610100898b031215620009e0578384fd5b620009eb8962000989565b60208a01519098506001600160401b038082111562000a08578586fd5b62000a168c838d01620008a6565b985060408b015191508082111562000a2c578586fd5b62000a3a8c838d0162000913565b975060608b0151965060808b0151955060a08b0151945062000a5f60c08c0162000977565b935060e08b015191508082111562000a75578283fd5b5062000a848b828c0162000824565b9150509295985092959890939650565b60006020828403121562000aa6578081fd5b5051919050565b6000825162000ac181846020870162000b74565b9190910192915050565b602081526000825180602084015262000aec81604085016020870162000b74565b601f01601f19169190910160400192915050565b604051601f8201601f191681016001600160401b038111828210171562000b2b5762000b2b62000bdb565b604052919050565b60006001600160401b0382111562000b4f5762000b4f62000bdb565b5060051b60200190565b6000821982111562000b6f5762000b6f62000bc5565b500190565b60005b8381101562000b9157818101518382015260200162000b77565b8381111562000ba1576000848401525b50505050565b600060001982141562000bbe5762000bbe62000bc5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811462000c0757600080fd5b50565b60805160801c615ddb62000c9260003960008181610a50015281816112db015281816117dc01528181611b5c01528181611dcc015281816121db0152818161250c015281816125cc015281816126de01528181612bd901528181613112015281816133820152818161353d015281816136b401528181613e670152613fde0152615ddb6000f3fe6080604052600436106103a65760003560e01c8063825b5730116101e7578063ac2e49361161010d578063e14ad02d116100a0578063f33096d81161006f578063f33096d814610bc2578063f3ae241514610be7578063f4389a3214610c07578063facd743b14610c2757600080fd5b8063e14ad02d14610b31578063e58378bb14610b5e578063e9e15b4f14610b80578063ec87621c14610ba057600080fd5b8063c49baebe116100dc578063c49baebe14610aaa578063d2fa635e14610ade578063d5062e2e14610afe578063d547741f14610b1157600080fd5b8063ac2e4936146109d5578063b839a80e14610a1e578063bf9cfe0514610a3e578063c0d7865514610a8a57600080fd5b80639294a03011610185578063a39140c511610154578063a39140c51461096c578063a73caff114610982578063a82aba94146109a2578063aa16944a146109b557600080fd5b80639294a030146109015780639f28ba8614610917578063a117e33a14610937578063a217fddf1461095757600080fd5b80638ce74cd0116101c15780638ce74cd014610805578063918a15cf1461081b57806391d1485414610889578063926d7d7f146108cd57600080fd5b8063825b57301461079f57806389affc9c146107bf5780638a926d0f146107ef57600080fd5b80632f54bf6e116102cc578063534ec2b21161026a5780635c975abb116102395780635c975abb146107225780635fdb9ec91461073a578063640429b51461075a5780638124bb0f1461078a57600080fd5b8063534ec2b2146106b8578063540bc5ea146106cd578063541d5548146106e2578063557df6dc1461070257600080fd5b80633db99b36116102a65780633db99b36146106425780633de39c11146106625780634c83377c146106785780634d8327501461069857600080fd5b80632f54bf6e146105ed57806334aa4d961461060d57806336568abe1461062257600080fd5b80631f041ec6116103445780632a3221c6116103135780632a3221c61461053f5780632cb1229f1461055f5780632dd39c551461057f5780632f2ff15d146105cd57600080fd5b80631f041ec6146104ba57806320b337c4146104cf57806321e1249e146104ef578063248a9ca31461050f57600080fd5b806312b57cea1161038057806312b57cea1461043757806314d748581461044d5780631641f1ba1461047a5780631b7f05f81461049a57600080fd5b806301ffc9a7146103b2578063051f6664146103e7578063102a95af1461041557600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506103d26103cd366004615614565b610c47565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b5061040761040236600461547c565b610c7e565b6040519081526020016103de565b34801561042157600080fd5b50610435610430366004615444565b610cce565b005b34801561044357600080fd5b5061040760085481565b34801561045957600080fd5b5061040761046836600461555f565b60056020526000908152604090205481565b34801561048657600080fd5b5061043561049536600461555f565b610ed8565b3480156104a657600080fd5b506104356104b536600461555f565b610f2f565b3480156104c657600080fd5b50610435610ffc565b3480156104db57600080fd5b506104356104ea3660046157e0565b611058565b3480156104fb57600080fd5b5061043561050a36600461563c565b611147565b34801561051b57600080fd5b5061040761052a36600461555f565b60009081526020819052604090206001015490565b34801561054b57600080fd5b5061043561055a366004615815565b611700565b34801561056b57600080fd5b5061043561057a36600461563c565b6119c8565b34801561058b57600080fd5b506105b561059a36600461555f565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103de565b3480156105d957600080fd5b506104356105e8366004615577565b611fc9565b3480156105f957600080fd5b506103d2610608366004615428565b611ff4565b34801561061957600080fd5b50610435612034565b34801561062e57600080fd5b5061043561063d366004615577565b6120ff565b34801561064e57600080fd5b5061043561065d3660046157e0565b612187565b34801561066e57600080fd5b50610407600b5481565b34801561068457600080fd5b50610435610693366004615847565b612334565b3480156106a457600080fd5b506105b56106b336600461559b565b6123a2565b3480156106c457600080fd5b506104356124b8565b3480156106d957600080fd5b50610407604181565b3480156106ee57600080fd5b506103d26106fd366004615428565b61260b565b34801561070e57600080fd5b5061043561071d3660046157fa565b61264b565b34801561072e57600080fd5b5060015460ff166103d2565b34801561074657600080fd5b5061043561075536600461555f565b6127d4565b34801561076657600080fd5b506103d261077536600461555f565b60009081526004602052604090205460ff1690565b34801561079657600080fd5b5061043561282b565b3480156107ab57600080fd5b506104356107ba3660046155e9565b612885565b3480156107cb57600080fd5b506103d26107da36600461555f565b60046020526000908152604090205460ff1681565b3480156107fb57600080fd5b50610407600a5481565b34801561081157600080fd5b50610407600c5481565b34801561082757600080fd5b5061040761083636600461555f565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b34801561089557600080fd5b506103d26108a4366004615577565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156108d957600080fd5b506104077fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc481565b34801561090d57600080fd5b5061040760095481565b34801561092357600080fd5b506002546105b5906001600160a01b031681565b34801561094357600080fd5b5061043561095236600461563c565b612a45565b34801561096357600080fd5b50610407600081565b34801561097857600080fd5b50610407600d5481565b34801561098e57600080fd5b5061043561099d36600461563c565b612f7e565b6104356109b03660046156f7565b613463565b3480156109c157600080fd5b506104356109d036600461555f565b613ba2565b3480156109e157600080fd5b50610a096109f036600461555f565b6007602052600090815260409020805460019091015482565b604080519283526020830191909152016103de565b348015610a2a57600080fd5b50610435610a3936600461555f565b613bf9565b348015610a4a57600080fd5b50610a727f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160801b0390911681526020016103de565b348015610a9657600080fd5b50610435610aa5366004615428565b613c50565b348015610ab657600080fd5b506104077f21702c8af46127c7fa207f89d0b0a8441bb32959a0ac7df790e9ab1a25c9892681565b348015610aea57600080fd5b50610435610af936600461555f565b613cd7565b610435610b0c3660046156f7565b613d8d565b348015610b1d57600080fd5b50610435610b2c366004615577565b614450565b348015610b3d57600080fd5b50610407610b4c36600461555f565b60066020526000908152604090205481565b348015610b6a57600080fd5b50610407600080516020615d4683398151915281565b348015610b8c57600080fd5b50610435610b9b366004615428565b614476565b348015610bac57600080fd5b50610407600080516020615d6683398151915281565b348015610bce57600080fd5b506001546105b59061010090046001600160a01b031681565b348015610bf357600080fd5b506103d2610c02366004615428565b6144f7565b348015610c1357600080fd5b50610435610c22366004615847565b614537565b348015610c3357600080fd5b506103d2610c42366004615428565b6145a5565b60006001600160e01b03198216637965db0b60e01b1480610c7857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6040516bffffffffffffffffffffffff19606085901b16602082015260348101839052605481018290526000906074016040516020818303038152906040528051906020012090505b9392505050565b610ce6600080516020615d46833981519152336108a4565b610d255760405162461bcd60e51b815260206004820152601b6024820152600080516020615d8683398151915260448201526064015b60405180910390fd5b6001600160a01b038216331415610da45760405162461bcd60e51b815260206004820152603660248201527f73776170436f6e74726163743a204e6577206f776e6572206d7573742062652060448201527f646966666572656e74207468616e2063757272656e74000000000000000000006064820152608401610d1c565b6001600160a01b038216610e0d5760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204f776e65722063616e6e6f74206265207a65604482015269726f206164647265737360b01b6064820152608401610d1c565b6001600160a01b038116610e765760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204f776e65722063616e6e6f74206265207a65604482015269726f206164647265737360b01b6064820152608401610d1c565b610e8160008361476f565b610e99600080516020615d468339815191528361476f565b610eb1600080516020615d668339815191528261476f565b610ec9600080516020615d46833981519152336120ff565b610ed46000336120ff565b5050565b610ef0600080516020615d46833981519152336108a4565b80610f0e5750610f0e600080516020615d66833981519152336108a4565b610f2a5760405162461bcd60e51b8152600401610d1c906159a7565b600955565b610f47600080516020615d46833981519152336108a4565b610f815760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b60008111610ff75760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a204174206c65617374203120636f6e6669726d60448201527f6174696f6e2063616e20626520736574000000000000000000000000000000006064820152608401610d1c565b600855565b611014600080516020615d46833981519152336108a4565b61104e5760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b611056614779565b565b611070600080516020615d46833981519152336108a4565b6110aa5760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b6001600160801b03811660009081526004602052604090205460ff166111265760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20776160448201526a1cc81b9bdd08185919195960aa1b6064820152608401610d1c565b6001600160801b03166000908152600460205260409020805460ff19169055565b6111717fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4336108a4565b6111d15760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a2043616c6c6572206973206e6f7420696e207260448201526a656c6179657220726f6c6560a81b6064820152608401610d1c565b60015460ff16156112175760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b806009548160200151101561123e5760405162461bcd60e51b8152600401610d1c906159ed565b600a548160200151106112635760405162461bcd60e51b8152600401610d1c90615a36565b6000816060015151116112d15760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a2070617468206c656e677468206d757374206260448201526f652067726561746572207468616e203160801b6064820152608401610d1c565b6001600160801b037f000000000000000000000000000000000000000000000000000000000000000016600090815260036020526040812054606083015180516001600160a01b0390921692909161133957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146113bd5760405162461bcd60e51b815260206004820152603960248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e207468652070617468206d757374206265205275626963000000000000006064820152608401610d1c565b80516001600160a01b03166114295760405162461bcd60e51b815260206004820152602c60248201527f73776170436f6e74726163743a20416464726573732063616e6e6f742062652060448201526b7a65726f206164647265737360a01b6064820152608401610d1c565b60418160a001515161143b9190615ccc565b156114a95760405162461bcd60e51b815260206004820152603860248201527f73776170436f6e74726163743a205369676e617475726573206c656e67746873604482015277206d75737420626520646976697369626c6520627920363560401b6064820152608401610d1c565b60085460418260a00151516114be9190615c24565b101561151f5760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204e6f7420656e6f756768207369676e6174756044820152691c995cc81c185cdcd95960b21b6064820152608401610d1c565b61153b8160000151826020015183608001518460a0015161480b565b6000826060015160008151811061156257634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006115908460200151600d54620f42406115879190615be7565b620f4240614ae0565b6002549091506115ae906001600160a01b0384811691163084614c65565b600154604085810151606087015187519251632512eca560e11b815260009461010090046001600160a01b031693634a25d94a936115f59390928892904290600401615b09565b600060405180830381600087803b15801561160f57600080fd5b505af1158015611623573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261164b91908101906154b0565b60008151811061166b57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516002549091506116a4906001600160a01b03166116938385615c57565b6001600160a01b0386169190614ca3565b8451608080870151604080516001600160a01b03909416845260208401859052830184905260608301527f3cbabe7e0d754f3fa3bcb3f94369eb72d8f501d6420796a293b83da381c99e70910160405180910390a15050505050565b611718600080516020615d46833981519152336108a4565b6117525760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b806001600160801b0316826001600160801b031614156117da5760405162461bcd60e51b815260206004820152603860248201527f73776170436f6e74726163743a2043616e6e6f74206368616e676520626c6f6360448201527f6b636861696e7320776974682073616d65206e756d62657200000000000000006064820152608401610d1c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160801b0316816001600160801b031614156118915760405162461bcd60e51b815260206004820152604660248201527f73776170436f6e74726163743a2043616e6e6f7420616464207468697320626c60448201527f6f636b636861696e20746f206172726179206f66206f7468657220626c6f636b606482015265636861696e7360d01b608482015260a401610d1c565b6001600160801b03821660009081526004602052604090205460ff1661190d5760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20776160448201526a1cc81b9bdd08185919195960aa1b6064820152608401610d1c565b6001600160801b03811660009081526004602052604090205460ff161561198d5760405162461bcd60e51b815260206004820152602e60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20697360448201526d08185b1c9958591e48185919195960921b6064820152608401610d1c565b6001600160801b03918216600090815260046020526040808220805460ff199081169091559290931681529190912080549091166001179055565b6119f27fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4336108a4565b611a525760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a2043616c6c6572206973206e6f7420696e207260448201526a656c6179657220726f6c6560a81b6064820152608401610d1c565b60015460ff1615611a985760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b8060095481602001511015611abf5760405162461bcd60e51b8152600401610d1c906159ed565b600a54816020015110611ae45760405162461bcd60e51b8152600401610d1c90615a36565b600081606001515111611b525760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a2070617468206c656e677468206d757374206260448201526f652067726561746572207468616e203160801b6064820152608401610d1c565b6001600160801b037f000000000000000000000000000000000000000000000000000000000000000016600090815260036020526040812054606083015180516001600160a01b03909216929091611bba57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614611c3e5760405162461bcd60e51b815260206004820152603960248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e207468652070617468206d757374206265205275626963000000000000006064820152608401610d1c565b80516001600160a01b0316611caa5760405162461bcd60e51b815260206004820152602c60248201527f73776170436f6e74726163743a20416464726573732063616e6e6f742062652060448201526b7a65726f206164647265737360a01b6064820152608401610d1c565b60418160a0015151611cbc9190615ccc565b15611d2a5760405162461bcd60e51b815260206004820152603860248201527f73776170436f6e74726163743a205369676e617475726573206c656e67746873604482015277206d75737420626520646976697369626c6520627920363560401b6064820152608401610d1c565b60085460418260a0015151611d3f9190615c24565b1015611da05760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204e6f7420656e6f756768207369676e6174756044820152691c995cc81c185cdcd95960b21b6064820152608401610d1c565b611dbc8160000151826020015183608001518460a0015161480b565b6020808301516001600160801b037f000000000000000000000000000000000000000000000000000000000000000016600090815260059092526040822054611e0d919061158790620f4240615c57565b905060008360600151600081518110611e3657634e487b7160e01b600052603260045260246000fd5b6020026020010151905083606001515160011415611ea6576002548451611e6c916001600160a01b038481169291169085614c65565b6002546020850151611ea1916001600160a01b0316903090611e8f908690615c57565b6001600160a01b038516929190614c65565b611f67565b6002546020850151611ec8916001600160a01b03848116929116903090614c65565b6001546040858101516060870151875192516338ed173960e01b81526101009094046001600160a01b0316936338ed173993611f0f93889390929091904290600401615b09565b600060405180830381600087803b158015611f2957600080fd5b505af1158015611f3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f6591908101906154b0565b505b8351602080860151608080880151604080516001600160a01b0390961686529385019290925291830185905260608301527f8157b9086cfdda00012a3010e96c58ca2bf54627629af408db9302736af9e065910160405180910390a150505050565b600082815260208190526040902060010154611fe58133614cd3565b611fef8383614d51565b505050565b6001600160a01b03811660009081527fd329ff8a035c3ce5df2b0dae604d660c0d8783bf7e64be00c1d10db96c0b87b4602052604081205460ff16610c78565b61204c600080516020615d46833981519152336108a4565b6120865760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b60405160009033904780156108fc029184818181858888f193505050509050806120fc5760405162461bcd60e51b815260206004820152602160248201527f73776170436f6e74726163743a206661696c20636f6c6c656374696e672066656044820152606560f81b6064820152608401610d1c565b50565b6001600160a01b038116331461217d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610d1c565b610ed48282614def565b61219f600080516020615d46833981519152336108a4565b6121d95760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160801b0316816001600160801b031614156122905760405162461bcd60e51b815260206004820152604660248201527f73776170436f6e74726163743a2043616e6e6f7420616464207468697320626c60448201527f6f636b636861696e20746f206172726179206f66206f7468657220626c6f636b606482015265636861696e7360d01b608482015260a401610d1c565b6001600160801b03811660009081526004602052604090205460ff16156123105760405162461bcd60e51b815260206004820152602e60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20697360448201526d08185b1c9958591e48185919195960921b6064820152608401610d1c565b6001600160801b03166000908152600460205260409020805460ff19166001179055565b61234c600080516020615d46833981519152336108a4565b8061236a575061236a600080516020615d66833981519152336108a4565b6123865760405162461bcd60e51b8152600401610d1c906159a7565b6001600160801b03909116600090815260066020526040902055565b8181016020810151604082015160609092015160009290831a601b8110156123d2576123cf601b82615bff565b90505b8060ff16601b141580156123ea57508060ff16601c14155b156123fb5760009350505050610cc7565b6001612454886040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6040805160008152602081018083529290925260ff841690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156124a2573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b6124d0600080516020615d46833981519152336108a4565b61250a5760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b7f00000000000000000000000000000000000000000000000000000000000000006001600160801b0316600090815260036020526040908190205490516370a0823160e01b81523060048201526110569133916001600160a01b03909116906370a082319060240160206040518083038186803b15801561258a57600080fd5b505afa15801561259e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c29190615870565b6001600160801b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600360205260409020546001600160a01b03169190614ca3565b6001600160a01b03811660009081527ffaf93c3d007e112089dc8351e013e6685ef67703975d0224b26fc45941d4f1f5602052604081205460ff16610c78565b612663600080516020615d46833981519152336108a4565b806126815750612681600080516020615d66833981519152336108a4565b61269d5760405162461bcd60e51b8152600401610d1c906159a7565b6001600160801b038281166000818152600360205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0385161790557f00000000000000000000000000000000000000000000000000000000000000009091161415610ed457600154604051636eb1769f60e11b81523060048201526101009091046001600160a01b03908116602483015282169063dd62ed3e9060440160206040518083038186803b15801561275657600080fd5b505afa15801561276a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278e9190615870565b156127b3576001546127b3906001600160a01b038381169161010090041660006145e5565b600154610ed4906001600160a01b03838116916101009004166000196145e5565b6127ec600080516020615d46833981519152336108a4565b8061280a575061280a600080516020615d66833981519152336108a4565b6128265760405162461bcd60e51b8152600401610d1c906159a7565b600c55565b612843600080516020615d46833981519152336108a4565b61287d5760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b611056614e6e565b6128af7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4336108a4565b61290f5760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a2043616c6c6572206973206e6f7420696e207260448201526a656c6179657220726f6c6560a81b6064820152608401610d1c565b816129825760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a20796f752063616e6e6f74207365742074686560448201527f20737461747573436f646520746f2030000000000000000000000000000000006064820152608401610d1c565b60008381526007602052604090205460011415612a2d5760405162461bcd60e51b815260206004820152605260248201527f73776170436f6e74726163743a207472616e73616374696f6e2077697468207460448201527f686973206f726967696e616c5478486173682068617320616c7265616479206260648201527f65656e2073657420617320737563636565640000000000000000000000000000608482015260a401610d1c565b60009283526007602052604090922090815560010155565b612a6f7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4336108a4565b612acf5760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a2043616c6c6572206973206e6f7420696e207260448201526a656c6179657220726f6c6560a81b6064820152608401610d1c565b60015460ff1615612b155760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b8060095481602001511015612b3c5760405162461bcd60e51b8152600401610d1c906159ed565b600a54816020015110612b615760405162461bcd60e51b8152600401610d1c90615a36565b600081606001515111612bcf5760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a2070617468206c656e677468206d757374206260448201526f652067726561746572207468616e203160801b6064820152608401610d1c565b6001600160801b037f000000000000000000000000000000000000000000000000000000000000000016600090815260036020526040812054606083015180516001600160a01b03909216929091612c3757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614612cbb5760405162461bcd60e51b815260206004820152603960248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e207468652070617468206d757374206265205275626963000000000000006064820152608401610d1c565b80516001600160a01b0316612d275760405162461bcd60e51b815260206004820152602c60248201527f73776170436f6e74726163743a20416464726573732063616e6e6f742062652060448201526b7a65726f206164647265737360a01b6064820152608401610d1c565b60418160a0015151612d399190615ccc565b15612da75760405162461bcd60e51b815260206004820152603860248201527f73776170436f6e74726163743a205369676e617475726573206c656e67746873604482015277206d75737420626520646976697369626c6520627920363560401b6064820152608401610d1c565b60085460418260a0015151612dbc9190615c24565b1015612e1d5760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204e6f7420656e6f756768207369676e6174756044820152691c995cc81c185cdcd95960b21b6064820152608401610d1c565b612e398160000151826020015183608001518460a0015161480b565b60008260600151600081518110612e6057634e487b7160e01b600052603260045260246000fd5b6020026020010151905082606001515160011415612efe5760025483516040850151612e9a926001600160a01b0385811693911691614c65565b825160408085015160808087015183516001600160a01b039095168552602085018390529284019190915260608301919091527f3cbabe7e0d754f3fa3bcb3f94369eb72d8f501d6420796a293b83da381c99e7091015b60405180910390a1505050565b6000612f198460200151600d54620f42406115879190615be7565b600254909150612f37906001600160a01b0384811691163084614c65565b600154604085810151606087015187519251634401edf760e11b815260009461010090046001600160a01b031693638803dbee936115f59390928892904290600401615b09565b612fa87fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4336108a4565b6130085760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a2043616c6c6572206973206e6f7420696e207260448201526a656c6179657220726f6c6560a81b6064820152608401610d1c565b60015460ff161561304e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b80600954816020015110156130755760405162461bcd60e51b8152600401610d1c906159ed565b600a5481602001511061309a5760405162461bcd60e51b8152600401610d1c90615a36565b6000816060015151116131085760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a2070617468206c656e677468206d757374206260448201526f652067726561746572207468616e203160801b6064820152608401610d1c565b6001600160801b037f000000000000000000000000000000000000000000000000000000000000000016600090815260036020526040812054606083015180516001600160a01b0390921692909161317057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146131f45760405162461bcd60e51b815260206004820152603960248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e207468652070617468206d757374206265205275626963000000000000006064820152608401610d1c565b80516001600160a01b03166132605760405162461bcd60e51b815260206004820152602c60248201527f73776170436f6e74726163743a20416464726573732063616e6e6f742062652060448201526b7a65726f206164647265737360a01b6064820152608401610d1c565b60418160a00151516132729190615ccc565b156132e05760405162461bcd60e51b815260206004820152603860248201527f73776170436f6e74726163743a205369676e617475726573206c656e67746873604482015277206d75737420626520646976697369626c6520627920363560401b6064820152608401610d1c565b60085460418260a00151516132f59190615c24565b10156133565760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204e6f7420656e6f756768207369676e6174756044820152691c995cc81c185cdcd95960b21b6064820152608401610d1c565b6133728160000151826020015183608001518460a0015161480b565b6020808301516001600160801b037f0000000000000000000000000000000000000000000000000000000000000000166000908152600590925260408220546133c3919061158790620f4240615c57565b9050600083606001516000815181106133ec57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516002549186015190925061341c916001600160a01b03808516929116903090614c65565b6001546040858101516060870151875192516318cbafe560e01b81526101009094046001600160a01b0316936318cbafe593611f0f93889390929091904290600401615b09565b60015460ff16156134a95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b803460008260c0015151116135165760405162461bcd60e51b815260206004820152602d60248201527f73776170436f6e74726163743a204e6f2064657374696e6174696f6e2061646460448201526c1c995cdcc81c1c9bdd9a591959609a1b6064820152608401610d1c565b815160009081526004602052604090205460ff168015613560575081516001600160801b037f00000000000000000000000000000000000000000000000000000000000000001614155b6135bd5760405162461bcd60e51b815260206004820152602860248201527f73776170436f6e74726163743a2057726f6e672063686f6f7365206f6620626c60448201526737b1b5b1b430b4b760c11b6064820152608401610d1c565b60008260400151511161362f5760405162461bcd60e51b815260206004820152603460248201527f73776170436f6e74726163743a206669727350617468206c656e677468206d7560448201527373742062652067726561746572207468616e203160601b6064820152608401610d1c565b6000826060015151116136aa5760405162461bcd60e51b815260206004820152603660248201527f73776170436f6e74726163743a207365636f6e6450617468206c656e6774682060448201527f6d7573742062652067726561746572207468616e2031000000000000000000006064820152608401610d1c565b6001600160801b037f00000000000000000000000000000000000000000000000000000000000000001660009081526003602052604090819020549083015180516001600160a01b039092169161370390600190615c57565b8151811061372157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146137a55760405162461bcd60e51b815260206004820152603d60248201527f73776170436f6e74726163743a20746865206c6173742061646472657373206960448201527f6e2074686520666972737450617468206d7573742062652052756269630000006064820152608401610d1c565b8151600090815260036020526040812054606084015180516001600160a01b039092169290916137e557634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146138695760405162461bcd60e51b815260206004820152603f60248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e20746865207365636f6e6450617468206d757374206265205275626963006064820152608401610d1c565b6009548260800151101561388f5760405162461bcd60e51b8152600401610d1c906159ed565b600a548260800151106138b45760405162461bcd60e51b8152600401610d1c90615a36565b81516000908152600660205260409020548110156139255760405162461bcd60e51b815260206004820152602860248201527f73776170436f6e74726163743a204e6f7420656e6f7567682063727970746f206044820152671c1c9bdd9a59195960c21b6064820152608401610d1c565b6000836040015160008151811061394c57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060018460400151511115613af7576020840151613981906001600160a01b0383169033903090614c65565b6001546139a1906001600160a01b038381169161010090041660006145e5565b60015460208501516139c6916001600160a01b038481169261010090920416906145e5565b600154608085015160208601516040808801516002549151634401edf760e11b815260009561010090046001600160a01b0390811695638803dbee95613a1a95919490939092909116904290600401615b09565b600060405180830381600087803b158015613a3457600080fd5b505af1158015613a48573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a7091908101906154b0565b9050613abf3382600081518110613a9757634e487b7160e01b600052603260045260246000fd5b60200260200101518760200151613aae9190615c57565b6001600160a01b0385169190614ca3565b80600081518110613ae057634e487b7160e01b600052603260045260246000fd5b602002602001015185602001818152505050613b1b565b6002546080850151613b1b916001600160a01b038481169233929190911690614c65565b508160e0015115613b785781517f63184694cb1d481d63acd8143d169186b748180c5ac69a71d542bdbf41f0765d90335b846080015185602001518660c001518760a001518860600151604051612ef19796959493929190615a7a565b81517fc3ec72ed14b363f8f349bb93b0e778bd1d4a45f1ceac1f364a4dfec78885fc729033613b4c565b613bba600080516020615d46833981519152336108a4565b80613bd85750613bd8600080516020615d66833981519152336108a4565b613bf45760405162461bcd60e51b8152600401610d1c906159a7565b600d55565b613c11600080516020615d46833981519152336108a4565b80613c2f5750613c2f600080516020615d66833981519152336108a4565b613c4b5760405162461bcd60e51b8152600401610d1c906159a7565b600a55565b613c68600080516020615d46833981519152336108a4565b80613c865750613c86600080516020615d66833981519152336108a4565b613ca25760405162461bcd60e51b8152600401610d1c906159a7565b600180546001600160a01b039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b613cef600080516020615d46833981519152336108a4565b80613d0d5750613d0d600080516020615d66833981519152336108a4565b613d295760405162461bcd60e51b8152600401610d1c906159a7565b60008111613d885760405162461bcd60e51b815260206004820152602660248201527f73776170436f6e74726163743a204761732070726963652063616e6e6f74206260448201526565207a65726f60d01b6064820152608401610d1c565b600b55565b60015460ff1615613dd35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b803460008260c001515111613e405760405162461bcd60e51b815260206004820152602d60248201527f73776170436f6e74726163743a204e6f2064657374696e6174696f6e2061646460448201526c1c995cdcc81c1c9bdd9a591959609a1b6064820152608401610d1c565b815160009081526004602052604090205460ff168015613e8a575081516001600160801b037f00000000000000000000000000000000000000000000000000000000000000001614155b613ee75760405162461bcd60e51b815260206004820152602860248201527f73776170436f6e74726163743a2057726f6e672063686f6f7365206f6620626c60448201526737b1b5b1b430b4b760c11b6064820152608401610d1c565b600082604001515111613f595760405162461bcd60e51b815260206004820152603460248201527f73776170436f6e74726163743a206669727350617468206c656e677468206d7560448201527373742062652067726561746572207468616e203160601b6064820152608401610d1c565b600082606001515111613fd45760405162461bcd60e51b815260206004820152603660248201527f73776170436f6e74726163743a207365636f6e6450617468206c656e6774682060448201527f6d7573742062652067726561746572207468616e2031000000000000000000006064820152608401610d1c565b6001600160801b037f00000000000000000000000000000000000000000000000000000000000000001660009081526003602052604090819020549083015180516001600160a01b039092169161402d90600190615c57565b8151811061404b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146140cf5760405162461bcd60e51b815260206004820152603d60248201527f73776170436f6e74726163743a20746865206c6173742061646472657373206960448201527f6e2074686520666972737450617468206d7573742062652052756269630000006064820152608401610d1c565b8151600090815260036020526040812054606084015180516001600160a01b0390921692909161410f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146141935760405162461bcd60e51b815260206004820152603f60248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e20746865207365636f6e6450617468206d757374206265205275626963006064820152608401610d1c565b600954826080015110156141b95760405162461bcd60e51b8152600401610d1c906159ed565b600a548260800151106141de5760405162461bcd60e51b8152600401610d1c90615a36565b815160009081526006602052604090205481101561424f5760405162461bcd60e51b815260206004820152602860248201527f73776170436f6e74726163743a204e6f7420656e6f7567682063727970746f206044820152671c1c9bdd9a59195960c21b6064820152608401610d1c565b825160009081526006602052604081205461426a9034615c57565b6001546080860151604080880151600254915163fb3bdb4160e01b81529495506000946001600160a01b0361010090950485169463fb3bdb419488946142ba949193919216904290600401615ad4565b6000604051808303818588803b1580156142d357600080fd5b505af11580156142e7573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261431091908101906154b0565b90508060008151811061433357634e487b7160e01b600052603260045260246000fd5b6020026020010151856020018181525050600061434d3390565b6001600160a01b03166108fc8360008151811061437a57634e487b7160e01b600052603260045260246000fd5b60200260200101518561438d9190615c57565b6040518115909202916000818181858888f193505050509050806144195760405162461bcd60e51b815260206004820152603360248201527f73776170436f6e74726163743a2063727970746f207472616e7366657220626160448201527f636b20746f2063616c6c6572206661696c6564000000000000000000000000006064820152608401610d1c565b5050508160e0015115613b785781517f63184694cb1d481d63acd8143d169186b748180c5ac69a71d542bdbf41f0765d9033613b4c565b60008281526020819052604090206001015461446c8133614cd3565b611fef8383614def565b61448e600080516020615d46833981519152336108a4565b806144ac57506144ac600080516020615d66833981519152336108a4565b6144c85760405162461bcd60e51b8152600401610d1c906159a7565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b03811660009081527fe84508f2c7fa9c351146748b3025cb78b45df37d868e48c6a75102fecdeee645602052604081205460ff16610c78565b61454f600080516020615d46833981519152336108a4565b8061456d575061456d600080516020615d66833981519152336108a4565b6145895760405162461bcd60e51b8152600401610d1c906159a7565b6001600160801b03909116600090815260056020526040902055565b6001600160a01b03811660009081527f5111aeae4aa79889928e72f88b5872109754de9d419ea9a4e3df5fba21d4d46f602052604081205460ff16610c78565b80158061466e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561463457600080fd5b505afa158015614648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061466c9190615870565b155b6146e05760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610d1c565b6040516001600160a01b038316602482015260448101829052611fef90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b031990931692909217909152614ef1565b60606147678484600085614fc3565b949350505050565b610ed48282614d51565b60015460ff16156147bf5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a1565b6000614818858585610c7e565b6000848152600760205260409020805460019091015491925090811580156148405750828114155b6148a05760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a205472616e73616374696f6e20616c7265616460448201526a1e481c1c9bd8d95cdcd95960aa1b6064820152608401610d1c565b6000604185516148b09190615c24565b905060008167ffffffffffffffff8111156148db57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015614904578160200160208202803683370190505b50905060005b82811015614aba57600061492487896106b3604186615c38565b905061492f816145a5565b6149a15760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a2056616c696461746f7220616464726573732060448201527f6e6f7420696e2077686974656c697374000000000000000000000000000000006064820152608401610d1c565b60005b82811015614a6d578381815181106149cc57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316826001600160a01b03161415614a5b5760405162461bcd60e51b815260206004820152602d60248201527f73776170436f6e74726163743a2056616c696461746f7220616464726573732060448201527f6973206475706c696361746564000000000000000000000000000000000000006064820152608401610d1c565b80614a6581615cb1565b9150506149a4565b5080838381518110614a8f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101525080614ab281615cb1565b91505061490a565b505050600094855250506007602052604090922060018082019390935591909155505050565b600080806000198587098587029250828110838203039150508060001415614b1a5760008411614b0f57600080fd5b508290049050610cc7565b808411614b2657600080fd5b600084868809808403938111909203919050600085614b4781600019615c57565b614b52906001615be7565b16958690049593849004936000819003046001019050614b728184615c38565b909317926000614b83876003615c38565b6002189050614b928188615c38565b614b9d906002615c57565b614ba79082615c38565b9050614bb38188615c38565b614bbe906002615c57565b614bc89082615c38565b9050614bd48188615c38565b614bdf906002615c57565b614be99082615c38565b9050614bf58188615c38565b614c00906002615c57565b614c0a9082615c38565b9050614c168188615c38565b614c21906002615c57565b614c2b9082615c38565b9050614c378188615c38565b614c42906002615c57565b614c4c9082615c38565b9050614c588186615c38565b9998505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052614c9d9085906323b872dd60e01b9060840161470c565b50505050565b6040516001600160a01b038316602482015260448101829052611fef90849063a9059cbb60e01b9060640161470c565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610ed457614d0f816001600160a01b031660146150eb565b614d1a8360206150eb565b604051602001614d2b929190615913565b60408051601f198184030181529082905262461bcd60e51b8252610d1c91600401615994565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610ed4576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055614dab3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610ed4576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60015460ff16614ec05760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610d1c565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336147ee565b6000614f46826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166147589092919063ffffffff16565b805190915015611fef5780806020019051810190614f649190615543565b611fef5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d1c565b6060824710156150245760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d1c565b843b6150725760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d1c565b600080866001600160a01b0316858760405161508e91906158f7565b60006040518083038185875af1925050503d80600081146150cb576040519150601f19603f3d011682016040523d82523d6000602084013e6150d0565b606091505b50915091506150e08282866152da565b979650505050505050565b606060006150fa836002615c38565b615105906002615be7565b67ffffffffffffffff81111561512b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015615155576020820181803683370190505b509050600360fc1b8160008151811061517e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106151bb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006151df846002615c38565b6151ea906001615be7565b90505b600181111561528b577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061523957634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061525d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361528481615c9a565b90506151ed565b508315610cc75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610d1c565b606083156152e9575081610cc7565b8251156152f95782518084602001fd5b8160405162461bcd60e51b8152600401610d1c9190615994565b803561531e81615d22565b919050565b600082601f830112615333578081fd5b8135602061534861534383615bc3565b615b92565b80838252828201915082860187848660051b8901011115615367578586fd5b855b8581101561538e57813561537c81615d22565b84529284019290840190600101615369565b5090979650505050505050565b803561531e81615d37565b600082601f8301126153b6578081fd5b813567ffffffffffffffff8111156153d0576153d0615d0c565b6153e3601f8201601f1916602001615b92565b8181528460208386010111156153f7578283fd5b816020850160208301379081016020019190915292915050565b80356001600160801b038116811461531e57600080fd5b600060208284031215615439578081fd5b8135610cc781615d22565b60008060408385031215615456578081fd5b823561546181615d22565b9150602083013561547181615d22565b809150509250929050565b600080600060608486031215615490578081fd5b833561549b81615d22565b95602085013595506040909401359392505050565b600060208083850312156154c2578182fd5b825167ffffffffffffffff8111156154d8578283fd5b8301601f810185136154e8578283fd5b80516154f661534382615bc3565b80828252848201915084840188868560051b8701011115615515578687fd5b8694505b83851015615537578051835260019490940193918501918501615519565b50979650505050505050565b600060208284031215615554578081fd5b8151610cc781615d37565b600060208284031215615570578081fd5b5035919050565b60008060408385031215615589578182fd5b82359150602083013561547181615d22565b6000806000606084860312156155af578081fd5b83359250602084013567ffffffffffffffff8111156155cc578182fd5b6155d8868287016153a6565b925050604084013590509250925092565b6000806000606084860312156155fd578081fd5b505081359360208301359350604090920135919050565b600060208284031215615625578081fd5b81356001600160e01b031981168114610cc7578182fd5b60006020828403121561564d578081fd5b813567ffffffffffffffff80821115615664578283fd5b9083019060c08286031215615677578283fd5b61567f615b45565b61568883615313565b815260208301356020820152604083013560408201526060830135828111156156af578485fd5b6156bb87828601615323565b6060830152506080830135608082015260a0830135828111156156dc578485fd5b6156e8878286016153a6565b60a08301525095945050505050565b600060208284031215615708578081fd5b813567ffffffffffffffff8082111561571f578283fd5b908301906101008286031215615733578283fd5b61573b615b6e565b823581526020830135602082015260408301358281111561575a578485fd5b61576687828601615323565b60408301525060608301358281111561577d578485fd5b61578987828601615323565b6060830152506080830135608082015260a083013560a082015260c0830135828111156157b4578485fd5b6157c0878286016153a6565b60c0830152506157d260e0840161539b565b60e082015295945050505050565b6000602082840312156157f1578081fd5b610cc782615411565b6000806040838503121561580c578182fd5b61546183615411565b60008060408385031215615827578182fd5b61583083615411565b915061583e60208401615411565b90509250929050565b60008060408385031215615859578182fd5b61586283615411565b946020939093013593505050565b600060208284031215615881578081fd5b5051919050565b6000815180845260208085019450808401835b838110156158c05781516001600160a01b03168752958201959082019060010161589b565b509495945050505050565b600081518084526158e3816020860160208601615c6e565b601f01601f19169290920160200192915050565b60008251615909818460208701615c6e565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161594b816017850160208801615c6e565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351615988816028840160208801615c6e565b01602801949350505050565b602081526000610cc760208301846158cb565b60208082526026908201527f43616c6c6572206973206e6f7420696e206f776e6572206f72206d616e6167656040820152657220726f6c6560d01b606082015260800190565b60208082526029908201527f73776170436f6e74726163743a204e6f7420656e6f75676820616d6f756e74206040820152686f6620746f6b656e7360b81b606082015260800190565b60208082526024908201527f73776170436f6e74726163743a20546f6f206d616e79205242432072657175656040820152631cdd195960e21b606082015260800190565b8781526001600160a01b038716602082015285604082015284606082015260e060808201526000615aae60e08301866158cb565b8460a084015282810360c0840152615ac68185615888565b9a9950505050505050505050565b848152608060208201526000615aed6080830186615888565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000615b2860a0830186615888565b6001600160a01b0394909416606083015250608001529392505050565b60405160c0810167ffffffffffffffff81118282101715615b6857615b68615d0c565b60405290565b604051610100810167ffffffffffffffff81118282101715615b6857615b68615d0c565b604051601f8201601f1916810167ffffffffffffffff81118282101715615bbb57615bbb615d0c565b604052919050565b600067ffffffffffffffff821115615bdd57615bdd615d0c565b5060051b60200190565b60008219821115615bfa57615bfa615ce0565b500190565b600060ff821660ff84168060ff03821115615c1c57615c1c615ce0565b019392505050565b600082615c3357615c33615cf6565b500490565b6000816000190483118215151615615c5257615c52615ce0565b500290565b600082821015615c6957615c69615ce0565b500390565b60005b83811015615c89578181015183820152602001615c71565b83811115614c9d5750506000910152565b600081615ca957615ca9615ce0565b506000190190565b6000600019821415615cc557615cc5615ce0565b5060010190565b600082615cdb57615cdb615cf6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146120fc57600080fd5b80151581146120fc57600080fdfeb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0843616c6c6572206973206e6f7420696e206f776e657220726f6c650000000000a2646970667358221220e56199857d02c30dada59f55d4cf041b5bc12c2cf1b31cbe335e31e63041ee2c64736f6c634300080400330000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000022ecb25c0000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000002710000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f00000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000152d02c7e14af6800000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c700000000000000000000000082f0b8b456c1a451378467398982d4834b6829c100000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Deployed Bytecode
0x6080604052600436106103a65760003560e01c8063825b5730116101e7578063ac2e49361161010d578063e14ad02d116100a0578063f33096d81161006f578063f33096d814610bc2578063f3ae241514610be7578063f4389a3214610c07578063facd743b14610c2757600080fd5b8063e14ad02d14610b31578063e58378bb14610b5e578063e9e15b4f14610b80578063ec87621c14610ba057600080fd5b8063c49baebe116100dc578063c49baebe14610aaa578063d2fa635e14610ade578063d5062e2e14610afe578063d547741f14610b1157600080fd5b8063ac2e4936146109d5578063b839a80e14610a1e578063bf9cfe0514610a3e578063c0d7865514610a8a57600080fd5b80639294a03011610185578063a39140c511610154578063a39140c51461096c578063a73caff114610982578063a82aba94146109a2578063aa16944a146109b557600080fd5b80639294a030146109015780639f28ba8614610917578063a117e33a14610937578063a217fddf1461095757600080fd5b80638ce74cd0116101c15780638ce74cd014610805578063918a15cf1461081b57806391d1485414610889578063926d7d7f146108cd57600080fd5b8063825b57301461079f57806389affc9c146107bf5780638a926d0f146107ef57600080fd5b80632f54bf6e116102cc578063534ec2b21161026a5780635c975abb116102395780635c975abb146107225780635fdb9ec91461073a578063640429b51461075a5780638124bb0f1461078a57600080fd5b8063534ec2b2146106b8578063540bc5ea146106cd578063541d5548146106e2578063557df6dc1461070257600080fd5b80633db99b36116102a65780633db99b36146106425780633de39c11146106625780634c83377c146106785780634d8327501461069857600080fd5b80632f54bf6e146105ed57806334aa4d961461060d57806336568abe1461062257600080fd5b80631f041ec6116103445780632a3221c6116103135780632a3221c61461053f5780632cb1229f1461055f5780632dd39c551461057f5780632f2ff15d146105cd57600080fd5b80631f041ec6146104ba57806320b337c4146104cf57806321e1249e146104ef578063248a9ca31461050f57600080fd5b806312b57cea1161038057806312b57cea1461043757806314d748581461044d5780631641f1ba1461047a5780631b7f05f81461049a57600080fd5b806301ffc9a7146103b2578063051f6664146103e7578063102a95af1461041557600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506103d26103cd366004615614565b610c47565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b5061040761040236600461547c565b610c7e565b6040519081526020016103de565b34801561042157600080fd5b50610435610430366004615444565b610cce565b005b34801561044357600080fd5b5061040760085481565b34801561045957600080fd5b5061040761046836600461555f565b60056020526000908152604090205481565b34801561048657600080fd5b5061043561049536600461555f565b610ed8565b3480156104a657600080fd5b506104356104b536600461555f565b610f2f565b3480156104c657600080fd5b50610435610ffc565b3480156104db57600080fd5b506104356104ea3660046157e0565b611058565b3480156104fb57600080fd5b5061043561050a36600461563c565b611147565b34801561051b57600080fd5b5061040761052a36600461555f565b60009081526020819052604090206001015490565b34801561054b57600080fd5b5061043561055a366004615815565b611700565b34801561056b57600080fd5b5061043561057a36600461563c565b6119c8565b34801561058b57600080fd5b506105b561059a36600461555f565b6003602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103de565b3480156105d957600080fd5b506104356105e8366004615577565b611fc9565b3480156105f957600080fd5b506103d2610608366004615428565b611ff4565b34801561061957600080fd5b50610435612034565b34801561062e57600080fd5b5061043561063d366004615577565b6120ff565b34801561064e57600080fd5b5061043561065d3660046157e0565b612187565b34801561066e57600080fd5b50610407600b5481565b34801561068457600080fd5b50610435610693366004615847565b612334565b3480156106a457600080fd5b506105b56106b336600461559b565b6123a2565b3480156106c457600080fd5b506104356124b8565b3480156106d957600080fd5b50610407604181565b3480156106ee57600080fd5b506103d26106fd366004615428565b61260b565b34801561070e57600080fd5b5061043561071d3660046157fa565b61264b565b34801561072e57600080fd5b5060015460ff166103d2565b34801561074657600080fd5b5061043561075536600461555f565b6127d4565b34801561076657600080fd5b506103d261077536600461555f565b60009081526004602052604090205460ff1690565b34801561079657600080fd5b5061043561282b565b3480156107ab57600080fd5b506104356107ba3660046155e9565b612885565b3480156107cb57600080fd5b506103d26107da36600461555f565b60046020526000908152604090205460ff1681565b3480156107fb57600080fd5b50610407600a5481565b34801561081157600080fd5b50610407600c5481565b34801561082757600080fd5b5061040761083636600461555f565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b34801561089557600080fd5b506103d26108a4366004615577565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156108d957600080fd5b506104077fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc481565b34801561090d57600080fd5b5061040760095481565b34801561092357600080fd5b506002546105b5906001600160a01b031681565b34801561094357600080fd5b5061043561095236600461563c565b612a45565b34801561096357600080fd5b50610407600081565b34801561097857600080fd5b50610407600d5481565b34801561098e57600080fd5b5061043561099d36600461563c565b612f7e565b6104356109b03660046156f7565b613463565b3480156109c157600080fd5b506104356109d036600461555f565b613ba2565b3480156109e157600080fd5b50610a096109f036600461555f565b6007602052600090815260409020805460019091015482565b604080519283526020830191909152016103de565b348015610a2a57600080fd5b50610435610a3936600461555f565b613bf9565b348015610a4a57600080fd5b50610a727f000000000000000000000000000000000000000000000000000000000000000681565b6040516001600160801b0390911681526020016103de565b348015610a9657600080fd5b50610435610aa5366004615428565b613c50565b348015610ab657600080fd5b506104077f21702c8af46127c7fa207f89d0b0a8441bb32959a0ac7df790e9ab1a25c9892681565b348015610aea57600080fd5b50610435610af936600461555f565b613cd7565b610435610b0c3660046156f7565b613d8d565b348015610b1d57600080fd5b50610435610b2c366004615577565b614450565b348015610b3d57600080fd5b50610407610b4c36600461555f565b60066020526000908152604090205481565b348015610b6a57600080fd5b50610407600080516020615d4683398151915281565b348015610b8c57600080fd5b50610435610b9b366004615428565b614476565b348015610bac57600080fd5b50610407600080516020615d6683398151915281565b348015610bce57600080fd5b506001546105b59061010090046001600160a01b031681565b348015610bf357600080fd5b506103d2610c02366004615428565b6144f7565b348015610c1357600080fd5b50610435610c22366004615847565b614537565b348015610c3357600080fd5b506103d2610c42366004615428565b6145a5565b60006001600160e01b03198216637965db0b60e01b1480610c7857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6040516bffffffffffffffffffffffff19606085901b16602082015260348101839052605481018290526000906074016040516020818303038152906040528051906020012090505b9392505050565b610ce6600080516020615d46833981519152336108a4565b610d255760405162461bcd60e51b815260206004820152601b6024820152600080516020615d8683398151915260448201526064015b60405180910390fd5b6001600160a01b038216331415610da45760405162461bcd60e51b815260206004820152603660248201527f73776170436f6e74726163743a204e6577206f776e6572206d7573742062652060448201527f646966666572656e74207468616e2063757272656e74000000000000000000006064820152608401610d1c565b6001600160a01b038216610e0d5760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204f776e65722063616e6e6f74206265207a65604482015269726f206164647265737360b01b6064820152608401610d1c565b6001600160a01b038116610e765760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204f776e65722063616e6e6f74206265207a65604482015269726f206164647265737360b01b6064820152608401610d1c565b610e8160008361476f565b610e99600080516020615d468339815191528361476f565b610eb1600080516020615d668339815191528261476f565b610ec9600080516020615d46833981519152336120ff565b610ed46000336120ff565b5050565b610ef0600080516020615d46833981519152336108a4565b80610f0e5750610f0e600080516020615d66833981519152336108a4565b610f2a5760405162461bcd60e51b8152600401610d1c906159a7565b600955565b610f47600080516020615d46833981519152336108a4565b610f815760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b60008111610ff75760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a204174206c65617374203120636f6e6669726d60448201527f6174696f6e2063616e20626520736574000000000000000000000000000000006064820152608401610d1c565b600855565b611014600080516020615d46833981519152336108a4565b61104e5760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b611056614779565b565b611070600080516020615d46833981519152336108a4565b6110aa5760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b6001600160801b03811660009081526004602052604090205460ff166111265760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20776160448201526a1cc81b9bdd08185919195960aa1b6064820152608401610d1c565b6001600160801b03166000908152600460205260409020805460ff19169055565b6111717fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4336108a4565b6111d15760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a2043616c6c6572206973206e6f7420696e207260448201526a656c6179657220726f6c6560a81b6064820152608401610d1c565b60015460ff16156112175760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b806009548160200151101561123e5760405162461bcd60e51b8152600401610d1c906159ed565b600a548160200151106112635760405162461bcd60e51b8152600401610d1c90615a36565b6000816060015151116112d15760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a2070617468206c656e677468206d757374206260448201526f652067726561746572207468616e203160801b6064820152608401610d1c565b6001600160801b037f000000000000000000000000000000000000000000000000000000000000000616600090815260036020526040812054606083015180516001600160a01b0390921692909161133957634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146113bd5760405162461bcd60e51b815260206004820152603960248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e207468652070617468206d757374206265205275626963000000000000006064820152608401610d1c565b80516001600160a01b03166114295760405162461bcd60e51b815260206004820152602c60248201527f73776170436f6e74726163743a20416464726573732063616e6e6f742062652060448201526b7a65726f206164647265737360a01b6064820152608401610d1c565b60418160a001515161143b9190615ccc565b156114a95760405162461bcd60e51b815260206004820152603860248201527f73776170436f6e74726163743a205369676e617475726573206c656e67746873604482015277206d75737420626520646976697369626c6520627920363560401b6064820152608401610d1c565b60085460418260a00151516114be9190615c24565b101561151f5760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204e6f7420656e6f756768207369676e6174756044820152691c995cc81c185cdcd95960b21b6064820152608401610d1c565b61153b8160000151826020015183608001518460a0015161480b565b6000826060015160008151811061156257634e487b7160e01b600052603260045260246000fd5b6020026020010151905060006115908460200151600d54620f42406115879190615be7565b620f4240614ae0565b6002549091506115ae906001600160a01b0384811691163084614c65565b600154604085810151606087015187519251632512eca560e11b815260009461010090046001600160a01b031693634a25d94a936115f59390928892904290600401615b09565b600060405180830381600087803b15801561160f57600080fd5b505af1158015611623573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261164b91908101906154b0565b60008151811061166b57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516002549091506116a4906001600160a01b03166116938385615c57565b6001600160a01b0386169190614ca3565b8451608080870151604080516001600160a01b03909416845260208401859052830184905260608301527f3cbabe7e0d754f3fa3bcb3f94369eb72d8f501d6420796a293b83da381c99e70910160405180910390a15050505050565b611718600080516020615d46833981519152336108a4565b6117525760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b806001600160801b0316826001600160801b031614156117da5760405162461bcd60e51b815260206004820152603860248201527f73776170436f6e74726163743a2043616e6e6f74206368616e676520626c6f6360448201527f6b636861696e7320776974682073616d65206e756d62657200000000000000006064820152608401610d1c565b7f00000000000000000000000000000000000000000000000000000000000000066001600160801b0316816001600160801b031614156118915760405162461bcd60e51b815260206004820152604660248201527f73776170436f6e74726163743a2043616e6e6f7420616464207468697320626c60448201527f6f636b636861696e20746f206172726179206f66206f7468657220626c6f636b606482015265636861696e7360d01b608482015260a401610d1c565b6001600160801b03821660009081526004602052604090205460ff1661190d5760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20776160448201526a1cc81b9bdd08185919195960aa1b6064820152608401610d1c565b6001600160801b03811660009081526004602052604090205460ff161561198d5760405162461bcd60e51b815260206004820152602e60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20697360448201526d08185b1c9958591e48185919195960921b6064820152608401610d1c565b6001600160801b03918216600090815260046020526040808220805460ff199081169091559290931681529190912080549091166001179055565b6119f27fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4336108a4565b611a525760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a2043616c6c6572206973206e6f7420696e207260448201526a656c6179657220726f6c6560a81b6064820152608401610d1c565b60015460ff1615611a985760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b8060095481602001511015611abf5760405162461bcd60e51b8152600401610d1c906159ed565b600a54816020015110611ae45760405162461bcd60e51b8152600401610d1c90615a36565b600081606001515111611b525760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a2070617468206c656e677468206d757374206260448201526f652067726561746572207468616e203160801b6064820152608401610d1c565b6001600160801b037f000000000000000000000000000000000000000000000000000000000000000616600090815260036020526040812054606083015180516001600160a01b03909216929091611bba57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614611c3e5760405162461bcd60e51b815260206004820152603960248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e207468652070617468206d757374206265205275626963000000000000006064820152608401610d1c565b80516001600160a01b0316611caa5760405162461bcd60e51b815260206004820152602c60248201527f73776170436f6e74726163743a20416464726573732063616e6e6f742062652060448201526b7a65726f206164647265737360a01b6064820152608401610d1c565b60418160a0015151611cbc9190615ccc565b15611d2a5760405162461bcd60e51b815260206004820152603860248201527f73776170436f6e74726163743a205369676e617475726573206c656e67746873604482015277206d75737420626520646976697369626c6520627920363560401b6064820152608401610d1c565b60085460418260a0015151611d3f9190615c24565b1015611da05760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204e6f7420656e6f756768207369676e6174756044820152691c995cc81c185cdcd95960b21b6064820152608401610d1c565b611dbc8160000151826020015183608001518460a0015161480b565b6020808301516001600160801b037f000000000000000000000000000000000000000000000000000000000000000616600090815260059092526040822054611e0d919061158790620f4240615c57565b905060008360600151600081518110611e3657634e487b7160e01b600052603260045260246000fd5b6020026020010151905083606001515160011415611ea6576002548451611e6c916001600160a01b038481169291169085614c65565b6002546020850151611ea1916001600160a01b0316903090611e8f908690615c57565b6001600160a01b038516929190614c65565b611f67565b6002546020850151611ec8916001600160a01b03848116929116903090614c65565b6001546040858101516060870151875192516338ed173960e01b81526101009094046001600160a01b0316936338ed173993611f0f93889390929091904290600401615b09565b600060405180830381600087803b158015611f2957600080fd5b505af1158015611f3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f6591908101906154b0565b505b8351602080860151608080880151604080516001600160a01b0390961686529385019290925291830185905260608301527f8157b9086cfdda00012a3010e96c58ca2bf54627629af408db9302736af9e065910160405180910390a150505050565b600082815260208190526040902060010154611fe58133614cd3565b611fef8383614d51565b505050565b6001600160a01b03811660009081527fd329ff8a035c3ce5df2b0dae604d660c0d8783bf7e64be00c1d10db96c0b87b4602052604081205460ff16610c78565b61204c600080516020615d46833981519152336108a4565b6120865760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b60405160009033904780156108fc029184818181858888f193505050509050806120fc5760405162461bcd60e51b815260206004820152602160248201527f73776170436f6e74726163743a206661696c20636f6c6c656374696e672066656044820152606560f81b6064820152608401610d1c565b50565b6001600160a01b038116331461217d5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610d1c565b610ed48282614def565b61219f600080516020615d46833981519152336108a4565b6121d95760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b7f00000000000000000000000000000000000000000000000000000000000000066001600160801b0316816001600160801b031614156122905760405162461bcd60e51b815260206004820152604660248201527f73776170436f6e74726163743a2043616e6e6f7420616464207468697320626c60448201527f6f636b636861696e20746f206172726179206f66206f7468657220626c6f636b606482015265636861696e7360d01b608482015260a401610d1c565b6001600160801b03811660009081526004602052604090205460ff16156123105760405162461bcd60e51b815260206004820152602e60248201527f73776170436f6e74726163743a205468697320626c6f636b636861696e20697360448201526d08185b1c9958591e48185919195960921b6064820152608401610d1c565b6001600160801b03166000908152600460205260409020805460ff19166001179055565b61234c600080516020615d46833981519152336108a4565b8061236a575061236a600080516020615d66833981519152336108a4565b6123865760405162461bcd60e51b8152600401610d1c906159a7565b6001600160801b03909116600090815260066020526040902055565b8181016020810151604082015160609092015160009290831a601b8110156123d2576123cf601b82615bff565b90505b8060ff16601b141580156123ea57508060ff16601c14155b156123fb5760009350505050610cc7565b6001612454886040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b6040805160008152602081018083529290925260ff841690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156124a2573d6000803e3d6000fd5b5050604051601f19015198975050505050505050565b6124d0600080516020615d46833981519152336108a4565b61250a5760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b7f00000000000000000000000000000000000000000000000000000000000000066001600160801b0316600090815260036020526040908190205490516370a0823160e01b81523060048201526110569133916001600160a01b03909116906370a082319060240160206040518083038186803b15801561258a57600080fd5b505afa15801561259e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125c29190615870565b6001600160801b037f0000000000000000000000000000000000000000000000000000000000000006166000908152600360205260409020546001600160a01b03169190614ca3565b6001600160a01b03811660009081527ffaf93c3d007e112089dc8351e013e6685ef67703975d0224b26fc45941d4f1f5602052604081205460ff16610c78565b612663600080516020615d46833981519152336108a4565b806126815750612681600080516020615d66833981519152336108a4565b61269d5760405162461bcd60e51b8152600401610d1c906159a7565b6001600160801b038281166000818152600360205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0385161790557f00000000000000000000000000000000000000000000000000000000000000069091161415610ed457600154604051636eb1769f60e11b81523060048201526101009091046001600160a01b03908116602483015282169063dd62ed3e9060440160206040518083038186803b15801561275657600080fd5b505afa15801561276a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278e9190615870565b156127b3576001546127b3906001600160a01b038381169161010090041660006145e5565b600154610ed4906001600160a01b03838116916101009004166000196145e5565b6127ec600080516020615d46833981519152336108a4565b8061280a575061280a600080516020615d66833981519152336108a4565b6128265760405162461bcd60e51b8152600401610d1c906159a7565b600c55565b612843600080516020615d46833981519152336108a4565b61287d5760405162461bcd60e51b815260206004820152601b6024820152600080516020615d868339815191526044820152606401610d1c565b611056614e6e565b6128af7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4336108a4565b61290f5760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a2043616c6c6572206973206e6f7420696e207260448201526a656c6179657220726f6c6560a81b6064820152608401610d1c565b816129825760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a20796f752063616e6e6f74207365742074686560448201527f20737461747573436f646520746f2030000000000000000000000000000000006064820152608401610d1c565b60008381526007602052604090205460011415612a2d5760405162461bcd60e51b815260206004820152605260248201527f73776170436f6e74726163743a207472616e73616374696f6e2077697468207460448201527f686973206f726967696e616c5478486173682068617320616c7265616479206260648201527f65656e2073657420617320737563636565640000000000000000000000000000608482015260a401610d1c565b60009283526007602052604090922090815560010155565b612a6f7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4336108a4565b612acf5760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a2043616c6c6572206973206e6f7420696e207260448201526a656c6179657220726f6c6560a81b6064820152608401610d1c565b60015460ff1615612b155760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b8060095481602001511015612b3c5760405162461bcd60e51b8152600401610d1c906159ed565b600a54816020015110612b615760405162461bcd60e51b8152600401610d1c90615a36565b600081606001515111612bcf5760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a2070617468206c656e677468206d757374206260448201526f652067726561746572207468616e203160801b6064820152608401610d1c565b6001600160801b037f000000000000000000000000000000000000000000000000000000000000000616600090815260036020526040812054606083015180516001600160a01b03909216929091612c3757634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b031614612cbb5760405162461bcd60e51b815260206004820152603960248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e207468652070617468206d757374206265205275626963000000000000006064820152608401610d1c565b80516001600160a01b0316612d275760405162461bcd60e51b815260206004820152602c60248201527f73776170436f6e74726163743a20416464726573732063616e6e6f742062652060448201526b7a65726f206164647265737360a01b6064820152608401610d1c565b60418160a0015151612d399190615ccc565b15612da75760405162461bcd60e51b815260206004820152603860248201527f73776170436f6e74726163743a205369676e617475726573206c656e67746873604482015277206d75737420626520646976697369626c6520627920363560401b6064820152608401610d1c565b60085460418260a0015151612dbc9190615c24565b1015612e1d5760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204e6f7420656e6f756768207369676e6174756044820152691c995cc81c185cdcd95960b21b6064820152608401610d1c565b612e398160000151826020015183608001518460a0015161480b565b60008260600151600081518110612e6057634e487b7160e01b600052603260045260246000fd5b6020026020010151905082606001515160011415612efe5760025483516040850151612e9a926001600160a01b0385811693911691614c65565b825160408085015160808087015183516001600160a01b039095168552602085018390529284019190915260608301919091527f3cbabe7e0d754f3fa3bcb3f94369eb72d8f501d6420796a293b83da381c99e7091015b60405180910390a1505050565b6000612f198460200151600d54620f42406115879190615be7565b600254909150612f37906001600160a01b0384811691163084614c65565b600154604085810151606087015187519251634401edf760e11b815260009461010090046001600160a01b031693638803dbee936115f59390928892904290600401615b09565b612fa87fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc4336108a4565b6130085760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a2043616c6c6572206973206e6f7420696e207260448201526a656c6179657220726f6c6560a81b6064820152608401610d1c565b60015460ff161561304e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b80600954816020015110156130755760405162461bcd60e51b8152600401610d1c906159ed565b600a5481602001511061309a5760405162461bcd60e51b8152600401610d1c90615a36565b6000816060015151116131085760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a2070617468206c656e677468206d757374206260448201526f652067726561746572207468616e203160801b6064820152608401610d1c565b6001600160801b037f000000000000000000000000000000000000000000000000000000000000000616600090815260036020526040812054606083015180516001600160a01b0390921692909161317057634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146131f45760405162461bcd60e51b815260206004820152603960248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e207468652070617468206d757374206265205275626963000000000000006064820152608401610d1c565b80516001600160a01b03166132605760405162461bcd60e51b815260206004820152602c60248201527f73776170436f6e74726163743a20416464726573732063616e6e6f742062652060448201526b7a65726f206164647265737360a01b6064820152608401610d1c565b60418160a00151516132729190615ccc565b156132e05760405162461bcd60e51b815260206004820152603860248201527f73776170436f6e74726163743a205369676e617475726573206c656e67746873604482015277206d75737420626520646976697369626c6520627920363560401b6064820152608401610d1c565b60085460418260a00151516132f59190615c24565b10156133565760405162461bcd60e51b815260206004820152602a60248201527f73776170436f6e74726163743a204e6f7420656e6f756768207369676e6174756044820152691c995cc81c185cdcd95960b21b6064820152608401610d1c565b6133728160000151826020015183608001518460a0015161480b565b6020808301516001600160801b037f0000000000000000000000000000000000000000000000000000000000000006166000908152600590925260408220546133c3919061158790620f4240615c57565b9050600083606001516000815181106133ec57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516002549186015190925061341c916001600160a01b03808516929116903090614c65565b6001546040858101516060870151875192516318cbafe560e01b81526101009094046001600160a01b0316936318cbafe593611f0f93889390929091904290600401615b09565b60015460ff16156134a95760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b803460008260c0015151116135165760405162461bcd60e51b815260206004820152602d60248201527f73776170436f6e74726163743a204e6f2064657374696e6174696f6e2061646460448201526c1c995cdcc81c1c9bdd9a591959609a1b6064820152608401610d1c565b815160009081526004602052604090205460ff168015613560575081516001600160801b037f00000000000000000000000000000000000000000000000000000000000000061614155b6135bd5760405162461bcd60e51b815260206004820152602860248201527f73776170436f6e74726163743a2057726f6e672063686f6f7365206f6620626c60448201526737b1b5b1b430b4b760c11b6064820152608401610d1c565b60008260400151511161362f5760405162461bcd60e51b815260206004820152603460248201527f73776170436f6e74726163743a206669727350617468206c656e677468206d7560448201527373742062652067726561746572207468616e203160601b6064820152608401610d1c565b6000826060015151116136aa5760405162461bcd60e51b815260206004820152603660248201527f73776170436f6e74726163743a207365636f6e6450617468206c656e6774682060448201527f6d7573742062652067726561746572207468616e2031000000000000000000006064820152608401610d1c565b6001600160801b037f00000000000000000000000000000000000000000000000000000000000000061660009081526003602052604090819020549083015180516001600160a01b039092169161370390600190615c57565b8151811061372157634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146137a55760405162461bcd60e51b815260206004820152603d60248201527f73776170436f6e74726163743a20746865206c6173742061646472657373206960448201527f6e2074686520666972737450617468206d7573742062652052756269630000006064820152608401610d1c565b8151600090815260036020526040812054606084015180516001600160a01b039092169290916137e557634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146138695760405162461bcd60e51b815260206004820152603f60248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e20746865207365636f6e6450617468206d757374206265205275626963006064820152608401610d1c565b6009548260800151101561388f5760405162461bcd60e51b8152600401610d1c906159ed565b600a548260800151106138b45760405162461bcd60e51b8152600401610d1c90615a36565b81516000908152600660205260409020548110156139255760405162461bcd60e51b815260206004820152602860248201527f73776170436f6e74726163743a204e6f7420656e6f7567682063727970746f206044820152671c1c9bdd9a59195960c21b6064820152608401610d1c565b6000836040015160008151811061394c57634e487b7160e01b600052603260045260246000fd5b6020026020010151905060018460400151511115613af7576020840151613981906001600160a01b0383169033903090614c65565b6001546139a1906001600160a01b038381169161010090041660006145e5565b60015460208501516139c6916001600160a01b038481169261010090920416906145e5565b600154608085015160208601516040808801516002549151634401edf760e11b815260009561010090046001600160a01b0390811695638803dbee95613a1a95919490939092909116904290600401615b09565b600060405180830381600087803b158015613a3457600080fd5b505af1158015613a48573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613a7091908101906154b0565b9050613abf3382600081518110613a9757634e487b7160e01b600052603260045260246000fd5b60200260200101518760200151613aae9190615c57565b6001600160a01b0385169190614ca3565b80600081518110613ae057634e487b7160e01b600052603260045260246000fd5b602002602001015185602001818152505050613b1b565b6002546080850151613b1b916001600160a01b038481169233929190911690614c65565b508160e0015115613b785781517f63184694cb1d481d63acd8143d169186b748180c5ac69a71d542bdbf41f0765d90335b846080015185602001518660c001518760a001518860600151604051612ef19796959493929190615a7a565b81517fc3ec72ed14b363f8f349bb93b0e778bd1d4a45f1ceac1f364a4dfec78885fc729033613b4c565b613bba600080516020615d46833981519152336108a4565b80613bd85750613bd8600080516020615d66833981519152336108a4565b613bf45760405162461bcd60e51b8152600401610d1c906159a7565b600d55565b613c11600080516020615d46833981519152336108a4565b80613c2f5750613c2f600080516020615d66833981519152336108a4565b613c4b5760405162461bcd60e51b8152600401610d1c906159a7565b600a55565b613c68600080516020615d46833981519152336108a4565b80613c865750613c86600080516020615d66833981519152336108a4565b613ca25760405162461bcd60e51b8152600401610d1c906159a7565b600180546001600160a01b039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b613cef600080516020615d46833981519152336108a4565b80613d0d5750613d0d600080516020615d66833981519152336108a4565b613d295760405162461bcd60e51b8152600401610d1c906159a7565b60008111613d885760405162461bcd60e51b815260206004820152602660248201527f73776170436f6e74726163743a204761732070726963652063616e6e6f74206260448201526565207a65726f60d01b6064820152608401610d1c565b600b55565b60015460ff1615613dd35760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b803460008260c001515111613e405760405162461bcd60e51b815260206004820152602d60248201527f73776170436f6e74726163743a204e6f2064657374696e6174696f6e2061646460448201526c1c995cdcc81c1c9bdd9a591959609a1b6064820152608401610d1c565b815160009081526004602052604090205460ff168015613e8a575081516001600160801b037f00000000000000000000000000000000000000000000000000000000000000061614155b613ee75760405162461bcd60e51b815260206004820152602860248201527f73776170436f6e74726163743a2057726f6e672063686f6f7365206f6620626c60448201526737b1b5b1b430b4b760c11b6064820152608401610d1c565b600082604001515111613f595760405162461bcd60e51b815260206004820152603460248201527f73776170436f6e74726163743a206669727350617468206c656e677468206d7560448201527373742062652067726561746572207468616e203160601b6064820152608401610d1c565b600082606001515111613fd45760405162461bcd60e51b815260206004820152603660248201527f73776170436f6e74726163743a207365636f6e6450617468206c656e6774682060448201527f6d7573742062652067726561746572207468616e2031000000000000000000006064820152608401610d1c565b6001600160801b037f00000000000000000000000000000000000000000000000000000000000000061660009081526003602052604090819020549083015180516001600160a01b039092169161402d90600190615c57565b8151811061404b57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146140cf5760405162461bcd60e51b815260206004820152603d60248201527f73776170436f6e74726163743a20746865206c6173742061646472657373206960448201527f6e2074686520666972737450617468206d7573742062652052756269630000006064820152608401610d1c565b8151600090815260036020526040812054606084015180516001600160a01b0390921692909161410f57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316146141935760405162461bcd60e51b815260206004820152603f60248201527f73776170436f6e74726163743a2074686520666972737420616464726573732060448201527f696e20746865207365636f6e6450617468206d757374206265205275626963006064820152608401610d1c565b600954826080015110156141b95760405162461bcd60e51b8152600401610d1c906159ed565b600a548260800151106141de5760405162461bcd60e51b8152600401610d1c90615a36565b815160009081526006602052604090205481101561424f5760405162461bcd60e51b815260206004820152602860248201527f73776170436f6e74726163743a204e6f7420656e6f7567682063727970746f206044820152671c1c9bdd9a59195960c21b6064820152608401610d1c565b825160009081526006602052604081205461426a9034615c57565b6001546080860151604080880151600254915163fb3bdb4160e01b81529495506000946001600160a01b0361010090950485169463fb3bdb419488946142ba949193919216904290600401615ad4565b6000604051808303818588803b1580156142d357600080fd5b505af11580156142e7573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f1916820160405261431091908101906154b0565b90508060008151811061433357634e487b7160e01b600052603260045260246000fd5b6020026020010151856020018181525050600061434d3390565b6001600160a01b03166108fc8360008151811061437a57634e487b7160e01b600052603260045260246000fd5b60200260200101518561438d9190615c57565b6040518115909202916000818181858888f193505050509050806144195760405162461bcd60e51b815260206004820152603360248201527f73776170436f6e74726163743a2063727970746f207472616e7366657220626160448201527f636b20746f2063616c6c6572206661696c6564000000000000000000000000006064820152608401610d1c565b5050508160e0015115613b785781517f63184694cb1d481d63acd8143d169186b748180c5ac69a71d542bdbf41f0765d9033613b4c565b60008281526020819052604090206001015461446c8133614cd3565b611fef8383614def565b61448e600080516020615d46833981519152336108a4565b806144ac57506144ac600080516020615d66833981519152336108a4565b6144c85760405162461bcd60e51b8152600401610d1c906159a7565b6002805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b03811660009081527fe84508f2c7fa9c351146748b3025cb78b45df37d868e48c6a75102fecdeee645602052604081205460ff16610c78565b61454f600080516020615d46833981519152336108a4565b8061456d575061456d600080516020615d66833981519152336108a4565b6145895760405162461bcd60e51b8152600401610d1c906159a7565b6001600160801b03909116600090815260056020526040902055565b6001600160a01b03811660009081527f5111aeae4aa79889928e72f88b5872109754de9d419ea9a4e3df5fba21d4d46f602052604081205460ff16610c78565b80158061466e5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b15801561463457600080fd5b505afa158015614648573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061466c9190615870565b155b6146e05760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006064820152608401610d1c565b6040516001600160a01b038316602482015260448101829052611fef90849063095ea7b360e01b906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166001600160e01b031990931692909217909152614ef1565b60606147678484600085614fc3565b949350505050565b610ed48282614d51565b60015460ff16156147bf5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610d1c565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a1565b6000614818858585610c7e565b6000848152600760205260409020805460019091015491925090811580156148405750828114155b6148a05760405162461bcd60e51b815260206004820152602b60248201527f73776170436f6e74726163743a205472616e73616374696f6e20616c7265616460448201526a1e481c1c9bd8d95cdcd95960aa1b6064820152608401610d1c565b6000604185516148b09190615c24565b905060008167ffffffffffffffff8111156148db57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015614904578160200160208202803683370190505b50905060005b82811015614aba57600061492487896106b3604186615c38565b905061492f816145a5565b6149a15760405162461bcd60e51b815260206004820152603060248201527f73776170436f6e74726163743a2056616c696461746f7220616464726573732060448201527f6e6f7420696e2077686974656c697374000000000000000000000000000000006064820152608401610d1c565b60005b82811015614a6d578381815181106149cc57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b0316826001600160a01b03161415614a5b5760405162461bcd60e51b815260206004820152602d60248201527f73776170436f6e74726163743a2056616c696461746f7220616464726573732060448201527f6973206475706c696361746564000000000000000000000000000000000000006064820152608401610d1c565b80614a6581615cb1565b9150506149a4565b5080838381518110614a8f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101525080614ab281615cb1565b91505061490a565b505050600094855250506007602052604090922060018082019390935591909155505050565b600080806000198587098587029250828110838203039150508060001415614b1a5760008411614b0f57600080fd5b508290049050610cc7565b808411614b2657600080fd5b600084868809808403938111909203919050600085614b4781600019615c57565b614b52906001615be7565b16958690049593849004936000819003046001019050614b728184615c38565b909317926000614b83876003615c38565b6002189050614b928188615c38565b614b9d906002615c57565b614ba79082615c38565b9050614bb38188615c38565b614bbe906002615c57565b614bc89082615c38565b9050614bd48188615c38565b614bdf906002615c57565b614be99082615c38565b9050614bf58188615c38565b614c00906002615c57565b614c0a9082615c38565b9050614c168188615c38565b614c21906002615c57565b614c2b9082615c38565b9050614c378188615c38565b614c42906002615c57565b614c4c9082615c38565b9050614c588186615c38565b9998505050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052614c9d9085906323b872dd60e01b9060840161470c565b50505050565b6040516001600160a01b038316602482015260448101829052611fef90849063a9059cbb60e01b9060640161470c565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610ed457614d0f816001600160a01b031660146150eb565b614d1a8360206150eb565b604051602001614d2b929190615913565b60408051601f198184030181529082905262461bcd60e51b8252610d1c91600401615994565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16610ed4576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055614dab3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1615610ed4576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60015460ff16614ec05760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610d1c565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336147ee565b6000614f46826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166147589092919063ffffffff16565b805190915015611fef5780806020019051810190614f649190615543565b611fef5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610d1c565b6060824710156150245760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610d1c565b843b6150725760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610d1c565b600080866001600160a01b0316858760405161508e91906158f7565b60006040518083038185875af1925050503d80600081146150cb576040519150601f19603f3d011682016040523d82523d6000602084013e6150d0565b606091505b50915091506150e08282866152da565b979650505050505050565b606060006150fa836002615c38565b615105906002615be7565b67ffffffffffffffff81111561512b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015615155576020820181803683370190505b509050600360fc1b8160008151811061517e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106151bb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006151df846002615c38565b6151ea906001615be7565b90505b600181111561528b577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061523957634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061525d57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361528481615c9a565b90506151ed565b508315610cc75760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610d1c565b606083156152e9575081610cc7565b8251156152f95782518084602001fd5b8160405162461bcd60e51b8152600401610d1c9190615994565b803561531e81615d22565b919050565b600082601f830112615333578081fd5b8135602061534861534383615bc3565b615b92565b80838252828201915082860187848660051b8901011115615367578586fd5b855b8581101561538e57813561537c81615d22565b84529284019290840190600101615369565b5090979650505050505050565b803561531e81615d37565b600082601f8301126153b6578081fd5b813567ffffffffffffffff8111156153d0576153d0615d0c565b6153e3601f8201601f1916602001615b92565b8181528460208386010111156153f7578283fd5b816020850160208301379081016020019190915292915050565b80356001600160801b038116811461531e57600080fd5b600060208284031215615439578081fd5b8135610cc781615d22565b60008060408385031215615456578081fd5b823561546181615d22565b9150602083013561547181615d22565b809150509250929050565b600080600060608486031215615490578081fd5b833561549b81615d22565b95602085013595506040909401359392505050565b600060208083850312156154c2578182fd5b825167ffffffffffffffff8111156154d8578283fd5b8301601f810185136154e8578283fd5b80516154f661534382615bc3565b80828252848201915084840188868560051b8701011115615515578687fd5b8694505b83851015615537578051835260019490940193918501918501615519565b50979650505050505050565b600060208284031215615554578081fd5b8151610cc781615d37565b600060208284031215615570578081fd5b5035919050565b60008060408385031215615589578182fd5b82359150602083013561547181615d22565b6000806000606084860312156155af578081fd5b83359250602084013567ffffffffffffffff8111156155cc578182fd5b6155d8868287016153a6565b925050604084013590509250925092565b6000806000606084860312156155fd578081fd5b505081359360208301359350604090920135919050565b600060208284031215615625578081fd5b81356001600160e01b031981168114610cc7578182fd5b60006020828403121561564d578081fd5b813567ffffffffffffffff80821115615664578283fd5b9083019060c08286031215615677578283fd5b61567f615b45565b61568883615313565b815260208301356020820152604083013560408201526060830135828111156156af578485fd5b6156bb87828601615323565b6060830152506080830135608082015260a0830135828111156156dc578485fd5b6156e8878286016153a6565b60a08301525095945050505050565b600060208284031215615708578081fd5b813567ffffffffffffffff8082111561571f578283fd5b908301906101008286031215615733578283fd5b61573b615b6e565b823581526020830135602082015260408301358281111561575a578485fd5b61576687828601615323565b60408301525060608301358281111561577d578485fd5b61578987828601615323565b6060830152506080830135608082015260a083013560a082015260c0830135828111156157b4578485fd5b6157c0878286016153a6565b60c0830152506157d260e0840161539b565b60e082015295945050505050565b6000602082840312156157f1578081fd5b610cc782615411565b6000806040838503121561580c578182fd5b61546183615411565b60008060408385031215615827578182fd5b61583083615411565b915061583e60208401615411565b90509250929050565b60008060408385031215615859578182fd5b61586283615411565b946020939093013593505050565b600060208284031215615881578081fd5b5051919050565b6000815180845260208085019450808401835b838110156158c05781516001600160a01b03168752958201959082019060010161589b565b509495945050505050565b600081518084526158e3816020860160208601615c6e565b601f01601f19169290920160200192915050565b60008251615909818460208701615c6e565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161594b816017850160208801615c6e565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351615988816028840160208801615c6e565b01602801949350505050565b602081526000610cc760208301846158cb565b60208082526026908201527f43616c6c6572206973206e6f7420696e206f776e6572206f72206d616e6167656040820152657220726f6c6560d01b606082015260800190565b60208082526029908201527f73776170436f6e74726163743a204e6f7420656e6f75676820616d6f756e74206040820152686f6620746f6b656e7360b81b606082015260800190565b60208082526024908201527f73776170436f6e74726163743a20546f6f206d616e79205242432072657175656040820152631cdd195960e21b606082015260800190565b8781526001600160a01b038716602082015285604082015284606082015260e060808201526000615aae60e08301866158cb565b8460a084015282810360c0840152615ac68185615888565b9a9950505050505050505050565b848152608060208201526000615aed6080830186615888565b6001600160a01b03949094166040830152506060015292915050565b85815284602082015260a060408201526000615b2860a0830186615888565b6001600160a01b0394909416606083015250608001529392505050565b60405160c0810167ffffffffffffffff81118282101715615b6857615b68615d0c565b60405290565b604051610100810167ffffffffffffffff81118282101715615b6857615b68615d0c565b604051601f8201601f1916810167ffffffffffffffff81118282101715615bbb57615bbb615d0c565b604052919050565b600067ffffffffffffffff821115615bdd57615bdd615d0c565b5060051b60200190565b60008219821115615bfa57615bfa615ce0565b500190565b600060ff821660ff84168060ff03821115615c1c57615c1c615ce0565b019392505050565b600082615c3357615c33615cf6565b500490565b6000816000190483118215151615615c5257615c52615ce0565b500290565b600082821015615c6957615c69615ce0565b500390565b60005b83811015615c89578181015183820152602001615c71565b83811115614c9d5750506000910152565b600081615ca957615ca9615ce0565b506000190190565b6000600019821415615cc557615cc5615ce0565b5060010190565b600082615cdb57615cdb615cf6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146120fc57600080fd5b80151581146120fc57600080fdfeb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b0843616c6c6572206973206e6f7420696e206f776e657220726f6c650000000000a2646970667358221220e56199857d02c30dada59f55d4cf041b5bc12c2cf1b31cbe335e31e63041ee2c64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000022ecb25c0000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000002710000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f00000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000271000000000000000000000000000000000000000000000152d02c7e14af6800000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000055d398326f99059ff775485246999027b3197955000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c700000000000000000000000082f0b8b456c1a451378467398982d4834b6829c100000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
-----Decoded View---------------
Arg [0] : _numOfThisBlockchain (uint128): 6
Arg [1] : _numsOfOtherBlockchains (uint128[]): 1,2,3,4,5
Arg [2] : tokenLimits (uint256[]): 10000,100000000000000000000000
Arg [3] : _maxGasPrice (uint256): 150000000000
Arg [4] : _minConfirmationBlocks (uint256): 3
Arg [5] : _refundSlippage (uint256): 10000
Arg [6] : _blockchainRouter (address): 0xAA30eF758139ae4a7f798112902Bf6d65612045f
Arg [7] : _RubicAddresses (address[]): 0x55d398326f99059fF775485246999027B3197955,0xdAC17F958D2ee523a2206206994597C13D831ec7,0xc2132D05D31c914a87C6611C10748AEb04B58e8F,0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7,0x82f0B8B456c1A451378467398982d4834b6829c1,0x98878B06940aE243284CA214f92Bb71a2b032B8A
-----Encoded View---------------
24 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [3] : 00000000000000000000000000000000000000000000000000000022ecb25c00
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [6] : 000000000000000000000000aa30ef758139ae4a7f798112902bf6d65612045f
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [15] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [16] : 00000000000000000000000000000000000000000000152d02c7e14af6800000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [18] : 00000000000000000000000055d398326f99059ff775485246999027b3197955
Arg [19] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [20] : 000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f
Arg [21] : 000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7
Arg [22] : 00000000000000000000000082f0b8b456c1a451378467398982d4834b6829c1
Arg [23] : 00000000000000000000000098878b06940ae243284ca214f92bb71a2b032b8a
Deployed Bytecode Sourcemap
40840:31678:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26463:204;;;;;;;;;;-1:-1:-1;26463:204:0;;;;;:::i;:::-;;:::i;:::-;;;14380:14:1;;14373:22;14355:41;;14343:2;14328:18;26463:204:0;;;;;;;;34528:238;;;;;;;;;;-1:-1:-1;34528:238:0;;;;;:::i;:::-;;:::i;:::-;;;14553:25:1;;;14541:2;14526:18;34528:238:0;14508:76:1;69353:766:0;;;;;;;;;;-1:-1:-1;69353:766:0;;;;;:::i;:::-;;:::i;:::-;;41834:44;;;;;;;;;;;;;;;;41492:56;;;;;;;;;;-1:-1:-1;41492:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;67675:155;;;;;;;;;;-1:-1:-1;67675:155:0;;;;;:::i;:::-;;:::i;67202:328::-;;;;;;;;;;-1:-1:-1;67202:328:0;;;;;:::i;:::-;;:::i;70197:72::-;;;;;;;;;;;;;:::i;62533:324::-;;;;;;;;;;-1:-1:-1;62533:324:0;;;;;:::i;:::-;;:::i;60817:880::-;;;;;;;;;;-1:-1:-1;60817:880:0;;;;;:::i;:::-;;:::i;27874:123::-;;;;;;;;;;-1:-1:-1;27874:123:0;;;;;:::i;:::-;27940:7;27967:12;;;;;;;;;;:22;;;;27874:123;63059:936;;;;;;;;;;-1:-1:-1;63059:936:0;;;;;:::i;:::-;;:::i;56547:1382::-;;;;;;;;;;-1:-1:-1;56547:1382:0;;;;;:::i;:::-;;:::i;41374:49::-;;;;;;;;;;-1:-1:-1;41374:49:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;41374:49:0;;;;;;-1:-1:-1;;;;;12666:55:1;;;12648:74;;12636:2;12621:18;41374:49:0;12603:125:1;28259:147:0;;;;;;;;;;-1:-1:-1;28259:147:0;;;;;:::i;:::-;;:::i;70558:115::-;;;;;;;;;;-1:-1:-1;70558:115:0;;;;;:::i;:::-;;:::i;64595:192::-;;;;;;;;;;;;;:::i;29307:218::-;;;;;;;;;;-1:-1:-1;29307:218:0;;;;;:::i;:::-;;:::i;61883:498::-;;;;;;;;;;-1:-1:-1;61883:498:0;;;;;:::i;:::-;;:::i;41959:26::-;;;;;;;;;;;;;;;;65872:195;;;;;;;;;;-1:-1:-1;65872:195:0;;;;;:::i;:::-;;:::i;35126:1053::-;;;;;;;;;;-1:-1:-1;35126:1053:0;;;;;:::i;:::-;;:::i;64865:240::-;;;;;;;;;;;;;:::i;41618:45::-;;;;;;;;;;;;41661:2;41618:45;;71062:119;;;;;;;;;;-1:-1:-1;71062:119:0;;;;;:::i;:::-;;:::i;66268:700::-;;;;;;;;;;-1:-1:-1;66268:700:0;;;;;:::i;:::-;;:::i;32024:86::-;;;;;;;;;;-1:-1:-1;32095:7:0;;;;32024:86;;68672:183;;;;;;;;;;-1:-1:-1;68672:183:0;;;;;:::i;:::-;;:::i;52060:184::-;;;;;;;;;;-1:-1:-1;52060:184:0;;;;;:::i;:::-;52172:4;52201:35;;;:23;:35;;;;;;;;;52060:184;70348:77;;;;;;;;;;;;;:::i;71784:621::-;;;;;;;;;;-1:-1:-1;71784:621:0;;;;;:::i;:::-;;:::i;41430:55::-;;;;;;;;;;-1:-1:-1;41430:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41923:29;;;;;;;;;;;;;;;;41992:36;;;;;;;;;;;;;;;;34774:344;;;;;;;;;;-1:-1:-1;34774:344:0;;;;;:::i;:::-;35037:58;;11568:66:1;35037:58:0;;;11556:79:1;11651:12;;;11644:28;;;34868:7:0;;11688:12:1;;35037:58:0;;;;;;;;;;;;35009:101;;;;;;34989:121;;34774:344;;;;26759:139;;;;;;;;;;-1:-1:-1;26759:139:0;;;;;:::i;:::-;26837:4;26861:12;;;;;;;;;;;-1:-1:-1;;;;;26861:29:0;;;;;;;;;;;;;;;26759:139;41090:64;;;;;;;;;;;;41129:25;41090:64;;41887:29;;;;;;;;;;;;;;;;41338;;;;;;;;;;-1:-1:-1;41338:29:0;;;;-1:-1:-1;;;;;41338:29:0;;;59428:1381;;;;;;;;;;-1:-1:-1;59428:1381:0;;;;;:::i;:::-;;:::i;24737:49::-;;;;;;;;;;-1:-1:-1;24737:49:0;24782:4;24737:49;;42035:29;;;;;;;;;;;;;;;;58019:929;;;;;;;;;;-1:-1:-1;58019:929:0;;;;;:::i;:::-;;:::i;54130:1315::-;;;;;;:::i;:::-;;:::i;68863:155::-;;;;;;;;;;-1:-1:-1;68863:155:0;;;;;:::i;:::-;;:::i;41767:60::-;;;;;;;;;;-1:-1:-1;41767:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;33874:25:1;;;33930:2;33915:18;;33908:34;;;;33847:18;41767:60:0;33829:119:1;67975:155:0;;;;;;;;;;-1:-1:-1;67975:155:0;;;;;:::i;:::-;;:::i;41238:44::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32091:47:1;;;32073:66;;32061:2;32046:18;41238:44:0;32028:117:1;64109:144:0;;;;;;;;;;-1:-1:-1;64109:144:0;;;;;:::i;:::-;;:::i;41161:68::-;;;;;;;;;;;;41202:27;41161:68;;68292:198;;;;;;;;;;-1:-1:-1;68292:198:0;;;;;:::i;:::-;;:::i;55684:773::-;;;;;;:::i;:::-;;:::i;28651:149::-;;;;;;;;;;-1:-1:-1;28651:149:0;;;;;:::i;:::-;;:::i;41555:54::-;;;;;;;;;;-1:-1:-1;41555:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;40952:60;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40952:60:0;;64368:123;;;;;;;;;;-1:-1:-1;64368:123:0;;;;;:::i;:::-;;:::i;41019:64::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;41019:64:0;;41289:42;;;;;;;;;;-1:-1:-1;41289:42:0;;;;;;;-1:-1:-1;;;;;41289:42:0;;;70808:119;;;;;;;;;;-1:-1:-1;70808:119:0;;;;;:::i;:::-;;:::i;65413:197::-;;;;;;;;;;-1:-1:-1;65413:197:0;;;;;:::i;:::-;;:::i;71326:123::-;;;;;;;;;;-1:-1:-1;71326:123:0;;;;;:::i;:::-;;:::i;26463:204::-;26548:4;-1:-1:-1;;;;;;26572:47:0;;-1:-1:-1;;;26572:47:0;;:87;;-1:-1:-1;;;;;;;;;;22388:40:0;;;26623:36;26565:94;26463:204;-1:-1:-1;;26463:204:0:o;34528:238::-;34704:53;;-1:-1:-1;;10888:2:1;10884:15;;;10880:53;34704::0;;;10868:66:1;10950:12;;;10943:28;;;10987:12;;;10980:28;;;34667:7:0;;11024:12:1;;34704:53:0;;;;;;;;;;;;34694:64;;;;;;34687:71;;34528:238;;;;;;:::o;69353:766::-;45075:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45075:33::-;45053:110;;;;-1:-1:-1;;;45053:110:0;;21433:2:1;45053:110:0;;;21415:21:1;21472:2;21452:18;;;21445:30;-1:-1:-1;;;;;;;;;;;21491:18:1;;;21484:57;21558:18;;45053:110:0;;;;;;;;;-1:-1:-1;;;;;69502:24:0;::::1;5034:10:::0;69502:24:::1;;69480:128;;;::::0;-1:-1:-1;;;69480:128:0;;16863:2:1;69480:128:0::1;::::0;::::1;16845:21:1::0;16902:2;16882:18;;;16875:30;16941:34;16921:18;;;16914:62;17012:24;16992:18;;;16985:52;17054:19;;69480:128:0::1;16835:244:1::0;69480:128:0::1;-1:-1:-1::0;;;;;69641:24:0;::::1;69619:116;;;::::0;-1:-1:-1;;;69619:116:0;;20205:2:1;69619:116:0::1;::::0;::::1;20187:21:1::0;20244:2;20224:18;;;20217:30;20283:34;20263:18;;;20256:62;-1:-1:-1;;;20334:18:1;;;20327:40;20384:19;;69619:116:0::1;20177:232:1::0;69619:116:0::1;-1:-1:-1::0;;;;;69768:26:0;::::1;69746:118;;;::::0;-1:-1:-1;;;69746:118:0;;20205:2:1;69746:118:0::1;::::0;::::1;20187:21:1::0;20244:2;20224:18;;;20217:30;20283:34;20263:18;;;20256:62;-1:-1:-1;;;20334:18:1;;;20327:40;20384:19;;69746:118:0::1;20177:232:1::0;69746:118:0::1;69875:40;24782:4;69906:8:::0;69875:10:::1;:40::i;:::-;69926:32;-1:-1:-1::0;;;;;;;;;;;69949:8:0::1;69926:10;:32::i;:::-;69969:36;-1:-1:-1::0;;;;;;;;;;;69994:10:0::1;69969;:36::i;:::-;70016:38;-1:-1:-1::0;;;;;;;;;;;5034:10:0;29307:218;:::i;70016:38::-:1;70065:46;24782:4;5034:10:::0;29307:218;:::i;70065:46::-:1;69353:766:::0;;:::o;67675:155::-;45347:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45347:33::-;:89;;;-1:-1:-1;45401:35:0;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45401:35::-;45325:177;;;;-1:-1:-1;;;45325:177:0;;;;;;;:::i;:::-;67790:14:::1;:32:::0;67675:155::o;67202:328::-;45075:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45075:33::-;45053:110;;;;-1:-1:-1;;;45053:110:0;;21433:2:1;45053:110:0;;;21415:21:1;21472:2;21452:18;;;21445:30;-1:-1:-1;;;;;;;;;;;21491:18:1;;;21484:57;21558:18;;45053:110:0;21405:177:1;45053:110:0;67380:1:::1;67351:26;:30;67329:128;;;::::0;-1:-1:-1;;;67329:128:0;;25036:2:1;67329:128:0::1;::::0;::::1;25018:21:1::0;25075:2;25055:18;;;25048:30;25114:34;25094:18;;;25087:62;25185:18;25165;;;25158:46;25221:19;;67329:128:0::1;25008:238:1::0;67329:128:0::1;67468:25;:54:::0;67202:328::o;70197:72::-;45075:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45075:33::-;45053:110;;;;-1:-1:-1;;;45053:110:0;;21433:2:1;45053:110:0;;;21415:21:1;21472:2;21452:18;;;21445:30;-1:-1:-1;;;;;;;;;;;21491:18:1;;;21484:57;21558:18;;45053:110:0;21405:177:1;45053:110:0;70253:8:::1;:6;:8::i;:::-;70197:72::o:0;62533:324::-;45075:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45075:33::-;45053:110;;;;-1:-1:-1;;;45053:110:0;;21433:2:1;45053:110:0;;;21415:21:1;21472:2;21452:18;;;21445:30;-1:-1:-1;;;;;;;;;;;21491:18:1;;;21484:57;21558:18;;45053:110:0;21405:177:1;45053:110:0;-1:-1:-1;;;;;62669:45:0;::::1;;::::0;;;:23:::1;:45;::::0;;;;;::::1;;62647:138;;;::::0;-1:-1:-1;;;62647:138:0;;23373:2:1;62647:138:0::1;::::0;::::1;23355:21:1::0;23412:2;23392:18;;;23385:30;23451:34;23431:18;;;23424:62;-1:-1:-1;;;23502:18:1;;;23495:41;23553:19;;62647:138:0::1;23345:233:1::0;62647:138:0::1;-1:-1:-1::0;;;;;62796:45:0::1;62844:5;62796:45:::0;;;:23:::1;:45;::::0;;;;:53;;-1:-1:-1;;62796:53:0::1;::::0;;62533:324::o;60817:880::-;45669:35;41129:25;5034:10;26759:139;:::i;45669:35::-;45647:128;;;;-1:-1:-1;;;45647:128:0;;21789:2:1;45647:128:0;;;21771:21:1;21828:2;21808:18;;;21801:30;21867:34;21847:18;;;21840:62;-1:-1:-1;;;21918:18:1;;;21911:41;21969:19;;45647:128:0;21761:233:1;45647:128:0;32095:7;;;;32349:9:::1;32341:38;;;::::0;-1:-1:-1;;;32341:38:0;;23028:2:1;32341:38:0::1;::::0;::::1;23010:21:1::0;23067:2;23047:18;;;23040:30;-1:-1:-1;;;23086:18:1;;;23079:46;23142:18;;32341:38:0::1;23000:166:1::0;32341:38:0::1;60959:6:::2;48495:14;;48471:6;:20;;;:38;;48449:129;;;;-1:-1:-1::0;;;48449:129:0::2;;;;;;;:::i;:::-;48634:14;;48611:6;:20;;;:37;48589:123;;;;-1:-1:-1::0;;;48589:123:0::2;;;;;;;:::i;:::-;48766:1;48745:6;:11;;;:18;:22;48723:120;;;::::0;-1:-1:-1;;;48723:120:0;;18477:2:1;48723:120:0::2;::::0;::::2;18459:21:1::0;18516:2;18496:18;;;18489:30;18555:34;18535:18;;;18528:62;-1:-1:-1;;;18606:18:1;;;18599:46;18662:19;;48723:120:0::2;18449:238:1::0;48723:120:0::2;-1:-1:-1::0;;;;;48909:19:0::2;48894:35;;::::0;;;:14:::2;:35;::::0;;;;;48876:11:::2;::::0;::::2;::::0;:14;;-1:-1:-1;;;;;48894:35:0;;::::2;::::0;48876:11;;:14:::2;;-1:-1:-1::0;;;48876:14:0::2;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48876:53:0::2;;48854:160;;;::::0;-1:-1:-1;;;48854:160:0;;23785:2:1;48854:160:0::2;::::0;::::2;23767:21:1::0;23824:2;23804:18;;;23797:30;23863:34;23843:18;;;23836:62;23934:27;23914:18;;;23907:55;23979:19;;48854:160:0::2;23757:247:1::0;48854:160:0::2;49047:11:::0;;-1:-1:-1;;;;;49047:25:0::2;49025:119;;;::::0;-1:-1:-1;;;49025:119:0;;16450:2:1;49025:119:0::2;::::0;::::2;16432:21:1::0;16489:2;16469:18;;;16462:30;16528:34;16508:18;;;16501:62;-1:-1:-1;;;16579:18:1;;;16572:42;16631:19;;49025:119:0::2;16422:234:1::0;49025:119:0::2;41661:2;49177:6;:23;;;:30;:49;;;;:::i;:::-;:54:::0;49155:160:::2;;;::::0;-1:-1:-1;;;49155:160:0;;17635:2:1;49155:160:0::2;::::0;::::2;17617:21:1::0;17674:2;17654:18;;;17647:30;17713:34;17693:18;;;17686:62;-1:-1:-1;;;17764:18:1;;;17757:54;17828:19;;49155:160:0::2;17607:246:1::0;49155:160:0::2;49418:25;;41661:2;49348:6;:23;;;:30;:49;;;;:::i;:::-;:95;;49326:187;;;::::0;-1:-1:-1;;;49326:187:0;;24625:2:1;49326:187:0::2;::::0;::::2;24607:21:1::0;24664:2;24644:18;;;24637:30;24703:34;24683:18;;;24676:62;-1:-1:-1;;;24754:18:1;;;24747:40;24804:19;;49326:187:0::2;24597:232:1::0;49326:187:0::2;49526:165;49560:6;:11;;;49586:6;:20;;;49621:6;:21;;;49657:6;:23;;;49526:19;:165::i;:::-;60983:15:::3;61008:6;:11;;;61020:1;61008:14;;;;;;-1:-1:-1::0;;;61008:14:0::3;;;;;;;;;;;;;;;60983:40;;61036:16;61055:114;61085:6;:20;;;61126:14;;61120:3;:20;;;;:::i;:::-;61155:3;61055:15;:114::i;:::-;61208:14;::::0;61036:133;;-1:-1:-1;61182:66:0::3;::::0;-1:-1:-1;;;;;61182:25:0;;::::3;::::0;61208:14:::3;61232:4;61036:133:::0;61182:25:::3;:66::i;:::-;61280:16;::::0;61333:19:::3;::::0;;::::3;::::0;61390:11:::3;::::0;::::3;::::0;61416;;61280:188;;-1:-1:-1;;;61280:188:0;;61261:16:::3;::::0;61280::::3;::::0;::::3;-1:-1:-1::0;;;;;61280:16:0::3;::::0;:38:::3;::::0;:188:::3;::::0;61333:19;;61367:8;;61416:11;61442:15:::3;::::0;61280:188:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;::::0;;::::3;-1:-1:-1::0;;61280:188:0::3;::::0;::::3;;::::0;::::3;::::0;;;::::3;::::0;::::3;:::i;:::-;61469:1;61280:191;;;;;;-1:-1:-1::0;;;61280:191:0::3;;;;;;;;;;::::0;;::::3;::::0;;;;;;61506:14:::3;::::0;61280:191;;-1:-1:-1;61484:58:0::3;::::0;-1:-1:-1;;;;;61506:14:0::3;61522:19;61280:191:::0;61522:8;:19:::3;:::i;:::-;-1:-1:-1::0;;;;;61484:21:0;::::3;::::0;:58;:21:::3;:58::i;:::-;61585:11:::0;;61657:21:::3;::::0;;::::3;::::0;61558:131:::3;::::0;;-1:-1:-1;;;;;14019:55:1;;;14001:74;;14106:2;14091:18;;14084:34;;;14134:18;;14127:34;;;14192:2;14177:18;;14170:34;61558:131:0::3;::::0;13973:19:1;61558:131:0::3;;;;;;;49702:1;;;32390::::2;60817:880:::0;:::o;63059:936::-;45075:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45075:33::-;45053:110;;;;-1:-1:-1;;;45053:110:0;;21433:2:1;45053:110:0;;;21415:21:1;21472:2;21452:18;;;21445:30;-1:-1:-1;;;;;;;;;;;21491:18:1;;;21484:57;21558:18;;45053:110:0;21405:177:1;45053:110:0;63260:23:::1;-1:-1:-1::0;;;;;63233:50:0::1;:23;-1:-1:-1::0;;;;;63233:50:0::1;;;63211:156;;;::::0;-1:-1:-1;;;63211:156:0;;19780:2:1;63211:156:0::1;::::0;::::1;19762:21:1::0;19819:2;19799:18;;;19792:30;19858:34;19838:18;;;19831:62;19929:26;19909:18;;;19902:54;19973:19;;63211:156:0::1;19752:246:1::0;63211:156:0::1;63427:19;-1:-1:-1::0;;;;;63400:46:0::1;:23;-1:-1:-1::0;;;;;63400:46:0::1;;;63378:166;;;::::0;-1:-1:-1;;;63378:166:0;;19301:2:1;63378:166:0::1;::::0;::::1;19283:21:1::0;19340:2;19320:18;;;19313:30;19379:34;19359:18;;;19352:62;19450:34;19430:18;;;19423:62;-1:-1:-1;;;19501:19:1;;;19494:37;19548:19;;63378:166:0::1;19273:300:1::0;63378:166:0::1;-1:-1:-1::0;;;;;63577:48:0;::::1;;::::0;;;:23:::1;:48;::::0;;;;;::::1;;63555:141;;;::::0;-1:-1:-1;;;63555:141:0;;23373:2:1;63555:141:0::1;::::0;::::1;23355:21:1::0;23412:2;23392:18;;;23385:30;23451:34;23431:18;;;23424:62;-1:-1:-1;;;23502:18:1;;;23495:41;23553:19;;63555:141:0::1;23345:233:1::0;63555:141:0::1;-1:-1:-1::0;;;;;63730:48:0;::::1;;::::0;;;:23:::1;:48;::::0;;;;;::::1;;63729:49;63707:145;;;::::0;-1:-1:-1;;;63707:145:0;;26702:2:1;63707:145:0::1;::::0;::::1;26684:21:1::0;26741:2;26721:18;;;26714:30;26780:34;26760:18;;;26753:62;-1:-1:-1;;;26831:18:1;;;26824:44;26885:19;;63707:145:0::1;26674:236:1::0;63707:145:0::1;-1:-1:-1::0;;;;;63865:48:0;;::::1;63916:5;63865:48:::0;;;:23:::1;:48;::::0;;;;;:56;;-1:-1:-1;;63865:56:0;;::::1;::::0;;;63932:48;;;::::1;::::0;;;;;;:55;;;;::::1;63865:56:::0;63932:55:::1;::::0;;63059:936::o;56547:1382::-;45669:35;41129:25;5034:10;26759:139;:::i;45669:35::-;45647:128;;;;-1:-1:-1;;;45647:128:0;;21789:2:1;45647:128:0;;;21771:21:1;21828:2;21808:18;;;21801:30;21867:34;21847:18;;;21840:62;-1:-1:-1;;;21918:18:1;;;21911:41;21969:19;;45647:128:0;21761:233:1;45647:128:0;32095:7;;;;32349:9:::1;32341:38;;;::::0;-1:-1:-1;;;32341:38:0;;23028:2:1;32341:38:0::1;::::0;::::1;23010:21:1::0;23067:2;23047:18;;;23040:30;-1:-1:-1;;;23086:18:1;;;23079:46;23142:18;;32341:38:0::1;23000:166:1::0;32341:38:0::1;56694:6:::2;48495:14;;48471:6;:20;;;:38;;48449:129;;;;-1:-1:-1::0;;;48449:129:0::2;;;;;;;:::i;:::-;48634:14;;48611:6;:20;;;:37;48589:123;;;;-1:-1:-1::0;;;48589:123:0::2;;;;;;;:::i;:::-;48766:1;48745:6;:11;;;:18;:22;48723:120;;;::::0;-1:-1:-1;;;48723:120:0;;18477:2:1;48723:120:0::2;::::0;::::2;18459:21:1::0;18516:2;18496:18;;;18489:30;18555:34;18535:18;;;18528:62;-1:-1:-1;;;18606:18:1;;;18599:46;18662:19;;48723:120:0::2;18449:238:1::0;48723:120:0::2;-1:-1:-1::0;;;;;48909:19:0::2;48894:35;;::::0;;;:14:::2;:35;::::0;;;;;48876:11:::2;::::0;::::2;::::0;:14;;-1:-1:-1;;;;;48894:35:0;;::::2;::::0;48876:11;;:14:::2;;-1:-1:-1::0;;;48876:14:0::2;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48876:53:0::2;;48854:160;;;::::0;-1:-1:-1;;;48854:160:0;;23785:2:1;48854:160:0::2;::::0;::::2;23767:21:1::0;23824:2;23804:18;;;23797:30;23863:34;23843:18;;;23836:62;23934:27;23914:18;;;23907:55;23979:19;;48854:160:0::2;23757:247:1::0;48854:160:0::2;49047:11:::0;;-1:-1:-1;;;;;49047:25:0::2;49025:119;;;::::0;-1:-1:-1;;;49025:119:0;;16450:2:1;49025:119:0::2;::::0;::::2;16432:21:1::0;16489:2;16469:18;;;16462:30;16528:34;16508:18;;;16501:62;-1:-1:-1;;;16579:18:1;;;16572:42;16631:19;;49025:119:0::2;16422:234:1::0;49025:119:0::2;41661:2;49177:6;:23;;;:30;:49;;;;:::i;:::-;:54:::0;49155:160:::2;;;::::0;-1:-1:-1;;;49155:160:0;;17635:2:1;49155:160:0::2;::::0;::::2;17617:21:1::0;17674:2;17654:18;;;17647:30;17713:34;17693:18;;;17686:62;-1:-1:-1;;;17764:18:1;;;17757:54;17828:19;;49155:160:0::2;17607:246:1::0;49155:160:0::2;49418:25;;41661:2;49348:6;:23;;;:30;:49;;;;:::i;:::-;:95;;49326:187;;;::::0;-1:-1:-1;;;49326:187:0;;24625:2:1;49326:187:0::2;::::0;::::2;24607:21:1::0;24664:2;24644:18;;;24637:30;24703:34;24683:18;;;24676:62;-1:-1:-1;;;24754:18:1;;;24747:40;24804:19;;49326:187:0::2;24597:232:1::0;49326:187:0::2;49526:165;49560:6;:11;;;49586:6;:20;;;49621:6;:21;;;49657:6;:23;;;49526:19;:165::i;:::-;56775:20:::3;::::0;;::::3;::::0;-1:-1:-1;;;;;56838:19:0::3;56816:42;56718:24;56816:42:::0;;;:21:::3;:42:::0;;;;;;;56745:142:::3;::::0;56775:20;56810:48:::3;::::0;:3:::3;:48;:::i;56745:142::-;56718:169;;56900:15;56925:6;:11;;;56937:1;56925:14;;;;;;-1:-1:-1::0;;;56925:14:0::3;;;;;;;;;;;;;;;56900:40;;56957:6;:11;;;:18;56979:1;56957:23;56953:787;;;57041:14;::::0;57074:11;;56997:138:::3;::::0;-1:-1:-1;;;;;56997:25:0;;::::3;::::0;57041:14;::::3;::::0;57104:16;56997:25:::3;:138::i;:::-;57194:14;::::0;57259:20:::3;::::0;::::3;::::0;57150:163:::3;::::0;-1:-1:-1;;;;;57194:14:0::3;::::0;57235:4:::3;::::0;57259:39:::3;::::0;57282:16;;57259:39:::3;:::i;:::-;-1:-1:-1::0;;;;;57150:25:0;::::3;::::0;:163;;:25:::3;:163::i;:::-;56953:787;;;57390:14;::::0;57455:20:::3;::::0;::::3;::::0;57346:144:::3;::::0;-1:-1:-1;;;;;57346:25:0;;::::3;::::0;57390:14;::::3;::::0;57431:4:::3;::::0;57346:25:::3;:144::i;:::-;57505:16;::::0;57600:19:::3;::::0;;::::3;::::0;57638:11:::3;::::0;::::3;::::0;57668;;57505:223;;-1:-1:-1;;;57505:223:0;;:16:::3;::::0;;::::3;-1:-1:-1::0;;;;;57505:16:0::3;::::0;:41:::3;::::0;:223:::3;::::0;57565:16;;57600:19;;57638:11;;57668;57698:15:::3;::::0;57505:223:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;::::0;;::::3;-1:-1:-1::0;;57505:223:0::3;::::0;::::3;;::::0;::::3;::::0;;;::::3;::::0;::::3;:::i;:::-;;56953:787;57797:11:::0;;57823:20:::3;::::0;;::::3;::::0;57889:21:::3;::::0;;::::3;::::0;57755:166:::3;::::0;;-1:-1:-1;;;;;14019:55:1;;;14001:74;;14091:18;;;14084:34;;;;14134:18;;;14127:34;;;14192:2;14177:18;;14170:34;57755:166:0::3;::::0;13973:19:1;57755:166:0::3;;;;;;;49702:1;;32390::::2;56547:1382:::0;:::o;28259:147::-;27940:7;27967:12;;;;;;;;;;:22;;;26341:30;26352:4;5034:10;26341;:30::i;:::-;28373:25:::1;28384:4;28390:7;28373:10;:25::i;:::-;28259:147:::0;;;:::o;70558:115::-;-1:-1:-1;;;;;26861:29:0;;70613:4;26861:29;;;:12;;:29;:12;:29;;;;;70637:28;26759:139;64595:192;45075:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45075:33::-;45053:110;;;;-1:-1:-1;;;45053:110:0;;21433:2:1;45053:110:0;;;21415:21:1;21472:2;21452:18;;;21445:30;-1:-1:-1;;;;;;;;;;;21491:18:1;;;21484:57;21558:18;;45053:110:0;21405:177:1;45053:110:0;64668:47:::1;::::0;64653:12:::1;::::0;64676:10:::1;::::0;64693:21:::1;64668:47:::0;::::1;;;::::0;64653:12;64668:47;64653:12;64668:47;64693:21;64676:10;64668:47;::::1;;;;;;64653:62;;64734:7;64726:53;;;::::0;-1:-1:-1;;;64726:53:0;;25453:2:1;64726:53:0::1;::::0;::::1;25435:21:1::0;25492:2;25472:18;;;25465:30;25531:34;25511:18;;;25504:62;-1:-1:-1;;;25582:18:1;;;25575:31;25623:19;;64726:53:0::1;25425:223:1::0;64726:53:0::1;45174:1;64595:192::o:0;29307:218::-;-1:-1:-1;;;;;29403:23:0;;5034:10;29403:23;29395:83;;;;-1:-1:-1;;;29395:83:0;;31308:2:1;29395:83:0;;;31290:21:1;31347:2;31327:18;;;31320:30;31386:34;31366:18;;;31359:62;31457:17;31437:18;;;31430:45;31492:19;;29395:83:0;31280:237:1;29395:83:0;29491:26;29503:4;29509:7;29491:11;:26::i;61883:498::-;45075:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45075:33::-;45053:110;;;;-1:-1:-1;;;45053:110:0;;21433:2:1;45053:110:0;;;21415:21:1;21472:2;21452:18;;;21445:30;-1:-1:-1;;;;;;;;;;;21491:18:1;;;21484:57;21558:18;;45053:110:0;21405:177:1;45053:110:0;62040:19:::1;-1:-1:-1::0;;;;;62016:43:0::1;:20;-1:-1:-1::0;;;;;62016:43:0::1;;;61994:163;;;::::0;-1:-1:-1;;;61994:163:0;;19301:2:1;61994:163:0::1;::::0;::::1;19283:21:1::0;19340:2;19320:18;;;19313:30;19379:34;19359:18;;;19352:62;19450:34;19430:18;;;19423:62;-1:-1:-1;;;19501:19:1;;;19494:37;19548:19;;61994:163:0::1;19273:300:1::0;61994:163:0::1;-1:-1:-1::0;;;;;62191:45:0;::::1;;::::0;;;:23:::1;:45;::::0;;;;;::::1;;62190:46;62168:142;;;::::0;-1:-1:-1;;;62168:142:0;;26702:2:1;62168:142:0::1;::::0;::::1;26684:21:1::0;26741:2;26721:18;;;26714:30;26780:34;26760:18;;;26753:62;-1:-1:-1;;;26831:18:1;;;26824:44;26885:19;;62168:142:0::1;26674:236:1::0;62168:142:0::1;-1:-1:-1::0;;;;;62321:45:0::1;;::::0;;;:23:::1;:45;::::0;;;;:52;;-1:-1:-1;;62321:52:0::1;62369:4;62321:52;::::0;;61883:498::o;65872:195::-;45347:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45347:33::-;:89;;;-1:-1:-1;45401:35:0;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45401:35::-;45325:177;;;;-1:-1:-1;;;45325:177:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66012:35:0;;::::1;;::::0;;;:19:::1;:35;::::0;;;;:47;65872:195::o;35126:1053::-;35454:33;;;35481:4;35454:33;;35448:40;35540:4;35513:33;;35507:40;35607:4;35580:33;;;35574:40;35260:7;;35507:40;35566:49;;35738:2;35734:6;;35730:46;;;35757:7;35762:2;35757:7;;:::i;:::-;;;35730:46;35856:1;:7;;35861:2;35856:7;;:18;;;;;35867:1;:7;;35872:2;35867:7;;35856:18;35852:70;;;35907:1;35891:19;;;;;;;35852:70;36123:48;36133:28;36156:4;35037:58;;11568:66:1;35037:58:0;;;11556:79:1;11651:12;;;11644:28;;;34868:7:0;;11688:12:1;;35037:58:0;;;;;;;;;;;;35009:101;;;;;;34989:121;;34774:344;;;;36133:28;36123:48;;;;;;;;;;;;14816:25:1;;;;14889:4;14877:17;;14857:18;;;14850:45;14911:18;;;14904:34;;;14954:18;;;14947:34;;;14788:19;;36123:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36123:48:0;;-1:-1:-1;;36123:48:0;;;35126:1053;-1:-1:-1;;;;;;;;35126:1053:0:o;64865:240::-;45075:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45075:33::-;45053:110;;;;-1:-1:-1;;;45053:110:0;;21433:2:1;45053:110:0;;;21415:21:1;21472:2;21452:18;;;21445:30;-1:-1:-1;;;;;;;;;;;21491:18:1;;;21484:57;21558:18;;45053:110:0;21405:177:1;45053:110:0;65040:19:::1;-1:-1:-1::0;;;;;65025:35:0::1;;::::0;;;:14:::1;:35;::::0;;;;;;;65018:68;;-1:-1:-1;;;65018:68:0;;65080:4:::1;65018:68;::::0;::::1;12648:74:1::0;64922:175:0::1;::::0;64993:10:::1;::::0;-1:-1:-1;;;;;65025:35:0;;::::1;::::0;65018:53:::1;::::0;12621:18:1;;65018:68:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;64944:19:0::1;64929:35;;::::0;;;:14:::1;:35;::::0;;;;;-1:-1:-1;;;;;64929:35:0::1;::::0;64922:175;:56:::1;:175::i;71062:119::-:0;-1:-1:-1;;;;;26861:29:0;;71119:4;26861:29;;;:12;;:29;:12;:29;;;;;71143:30;26759:139;66268:700;45347:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45347:33::-;:89;;;-1:-1:-1;45401:35:0;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45401:35::-;45325:177;;;;-1:-1:-1;;;45325:177:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;66417:30:0;;::::1;;::::0;;;:14:::1;:30;::::0;;;;:46;;-1:-1:-1;;66417:46:0::1;-1:-1:-1::0;;;;;66417:46:0;::::1;;::::0;;66496:19:::1;66478:37:::0;;::::1;;66474:487;;;66652:16;::::0;66554:134:::1;::::0;-1:-1:-1;;;66554:134:0;;66616:4:::1;66554:134;::::0;::::1;12968:34:1::0;66652:16:0::1;::::0;;::::1;-1:-1:-1::0;;;;;66652:16:0;;::::1;13018:18:1::0;;;13011:43;66554:31:0;::::1;::::0;::::1;::::0;12880:18:1;;66554:134:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:139:::0;66532:275:::1;;66770:16;::::0;66728:63:::1;::::0;-1:-1:-1;;;;;66728:33:0;;::::1;::::0;66770:16:::1;::::0;::::1;;66789:1;66728:33;:63::i;:::-;66881:16;::::0;66821:128:::1;::::0;-1:-1:-1;;;;;66821:33:0;;::::1;::::0;66881:16:::1;::::0;::::1;;-1:-1:-1::0;;66821:33:0::1;:128::i;68672:183::-:0;45347:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45347:33::-;:89;;;-1:-1:-1;45401:35:0;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45401:35::-;45325:177;;;;-1:-1:-1;;;45325:177:0;;;;;;;:::i;:::-;68801:21:::1;:46:::0;68672:183::o;70348:77::-;45075:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45075:33::-;45053:110;;;;-1:-1:-1;;;45053:110:0;;21433:2:1;45053:110:0;;;21415:21:1;21472:2;21452:18;;;21445:30;-1:-1:-1;;;;;;;;;;;21491:18:1;;;21484:57;21558:18;;45053:110:0;21405:177:1;45053:110:0;70407:10:::1;:8;:10::i;71784:621::-:0;45669:35;41129:25;5034:10;26759:139;:::i;45669:35::-;45647:128;;;;-1:-1:-1;;;45647:128:0;;21789:2:1;45647:128:0;;;21771:21:1;21828:2;21808:18;;;21801:30;21867:34;21847:18;;;21840:62;-1:-1:-1;;;21918:18:1;;;21911:41;21969:19;;45647:128:0;21761:233:1;45647:128:0;71962:15;71940:113:::1;;;::::0;-1:-1:-1;;;71940:113:0;;26285:2:1;71940:113:0::1;::::0;::::1;26267:21:1::0;26324:2;26304:18;;;26297:30;26363:34;26343:18;;;26336:62;26434:18;26414;;;26407:46;26470:19;;71940:113:0::1;26257:238:1::0;71940:113:0::1;72086:37;::::0;;;:21:::1;:37;::::0;;;;:48;72138:1:::1;72086:53;;72064:185;;;::::0;-1:-1:-1;;;72064:185:0;;29151:2:1;72064:185:0::1;::::0;::::1;29133:21:1::0;29190:2;29170:18;;;29163:30;29229:34;29209:18;;;29202:62;29300:34;29280:18;;;29273:62;29372:20;29351:19;;;29344:49;29410:19;;72064:185:0::1;29123:312:1::0;72064:185:0::1;72260:37;::::0;;;:21:::1;:37;::::0;;;;;:61;;;72332:50:::1;;:65:::0;71784:621::o;59428:1381::-;45669:35;41129:25;5034:10;26759:139;:::i;45669:35::-;45647:128;;;;-1:-1:-1;;;45647:128:0;;21789:2:1;45647:128:0;;;21771:21:1;21828:2;21808:18;;;21801:30;21867:34;21847:18;;;21840:62;-1:-1:-1;;;21918:18:1;;;21911:41;21969:19;;45647:128:0;21761:233:1;45647:128:0;32095:7;;;;32349:9:::1;32341:38;;;::::0;-1:-1:-1;;;32341:38:0;;23028:2:1;32341:38:0::1;::::0;::::1;23010:21:1::0;23067:2;23047:18;;;23040:30;-1:-1:-1;;;23086:18:1;;;23079:46;23142:18;;32341:38:0::1;23000:166:1::0;32341:38:0::1;59570:6:::2;48495:14;;48471:6;:20;;;:38;;48449:129;;;;-1:-1:-1::0;;;48449:129:0::2;;;;;;;:::i;:::-;48634:14;;48611:6;:20;;;:37;48589:123;;;;-1:-1:-1::0;;;48589:123:0::2;;;;;;;:::i;:::-;48766:1;48745:6;:11;;;:18;:22;48723:120;;;::::0;-1:-1:-1;;;48723:120:0;;18477:2:1;48723:120:0::2;::::0;::::2;18459:21:1::0;18516:2;18496:18;;;18489:30;18555:34;18535:18;;;18528:62;-1:-1:-1;;;18606:18:1;;;18599:46;18662:19;;48723:120:0::2;18449:238:1::0;48723:120:0::2;-1:-1:-1::0;;;;;48909:19:0::2;48894:35;;::::0;;;:14:::2;:35;::::0;;;;;48876:11:::2;::::0;::::2;::::0;:14;;-1:-1:-1;;;;;48894:35:0;;::::2;::::0;48876:11;;:14:::2;;-1:-1:-1::0;;;48876:14:0::2;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48876:53:0::2;;48854:160;;;::::0;-1:-1:-1;;;48854:160:0;;23785:2:1;48854:160:0::2;::::0;::::2;23767:21:1::0;23824:2;23804:18;;;23797:30;23863:34;23843:18;;;23836:62;23934:27;23914:18;;;23907:55;23979:19;;48854:160:0::2;23757:247:1::0;48854:160:0::2;49047:11:::0;;-1:-1:-1;;;;;49047:25:0::2;49025:119;;;::::0;-1:-1:-1;;;49025:119:0;;16450:2:1;49025:119:0::2;::::0;::::2;16432:21:1::0;16489:2;16469:18;;;16462:30;16528:34;16508:18;;;16501:62;-1:-1:-1;;;16579:18:1;;;16572:42;16631:19;;49025:119:0::2;16422:234:1::0;49025:119:0::2;41661:2;49177:6;:23;;;:30;:49;;;;:::i;:::-;:54:::0;49155:160:::2;;;::::0;-1:-1:-1;;;49155:160:0;;17635:2:1;49155:160:0::2;::::0;::::2;17617:21:1::0;17674:2;17654:18;;;17647:30;17713:34;17693:18;;;17686:62;-1:-1:-1;;;17764:18:1;;;17757:54;17828:19;;49155:160:0::2;17607:246:1::0;49155:160:0::2;49418:25;;41661:2;49348:6;:23;;;:30;:49;;;;:::i;:::-;:95;;49326:187;;;::::0;-1:-1:-1;;;49326:187:0;;24625:2:1;49326:187:0::2;::::0;::::2;24607:21:1::0;24664:2;24644:18;;;24637:30;24703:34;24683:18;;;24676:62;-1:-1:-1;;;24754:18:1;;;24747:40;24804:19;;49326:187:0::2;24597:232:1::0;49326:187:0::2;49526:165;49560:6;:11;;;49586:6;:20;;;49621:6;:21;;;49657:6;:23;;;49526:19;:165::i;:::-;59594:15:::3;59619:6;:11;;;59631:1;59619:14;;;;;;-1:-1:-1::0;;;59619:14:0::3;;;;;;;;;;;;;;;59594:40;;59651:6;:11;;;:18;59673:1;59651:23;59647:1155;;;59735:14;::::0;59768:11;;59798:19:::3;::::0;::::3;::::0;59691:141:::3;::::0;-1:-1:-1;;;;;59691:25:0;;::::3;::::0;59735:14;::::3;::::0;59691:25:::3;:141::i;:::-;59883:11:::0;;59913:19:::3;::::0;;::::3;::::0;59989:21:::3;::::0;;::::3;::::0;59852:173;;-1:-1:-1;;;;;14019:55:1;;;14001:74;;14106:2;14091:18;;14084:34;;;14134:18;;;14127:34;;;;14192:2;14177:18;;14170:34;;;;59852:173:0::3;::::0;13973:19:1;59852:173:0::3;;;;;;;;28259:147:::0;;;:::o;59647:1155::-:3;60058:16;60077:130;60111:6;:20;;;60156:14;;60150:3;:20;;;;:::i;60077:130::-;60250:14;::::0;60058:149;;-1:-1:-1;60224:66:0::3;::::0;-1:-1:-1;;;;;60224:25:0;;::::3;::::0;60250:14:::3;60274:4;60058:149:::0;60224:25:::3;:66::i;:::-;60326:16;::::0;60386:19:::3;::::0;;::::3;::::0;60451:11:::3;::::0;::::3;::::0;60481;;60326:215;;-1:-1:-1;;;60326:215:0;;60307:16:::3;::::0;60326::::3;::::0;::::3;-1:-1:-1::0;;;;;60326:16:0::3;::::0;:41:::3;::::0;:215:::3;::::0;60386:19;;60424:8;;60481:11;60511:15:::3;::::0;60326:215:::3;;;:::i;58019:929::-:0;45669:35;41129:25;5034:10;26759:139;:::i;45669:35::-;45647:128;;;;-1:-1:-1;;;45647:128:0;;21789:2:1;45647:128:0;;;21771:21:1;21828:2;21808:18;;;21801:30;21867:34;21847:18;;;21840:62;-1:-1:-1;;;21918:18:1;;;21911:41;21969:19;;45647:128:0;21761:233:1;45647:128:0;32095:7;;;;32349:9:::1;32341:38;;;::::0;-1:-1:-1;;;32341:38:0;;23028:2:1;32341:38:0::1;::::0;::::1;23010:21:1::0;23067:2;23047:18;;;23040:30;-1:-1:-1;;;23086:18:1;;;23079:46;23142:18;;32341:38:0::1;23000:166:1::0;32341:38:0::1;58166:6:::2;48495:14;;48471:6;:20;;;:38;;48449:129;;;;-1:-1:-1::0;;;48449:129:0::2;;;;;;;:::i;:::-;48634:14;;48611:6;:20;;;:37;48589:123;;;;-1:-1:-1::0;;;48589:123:0::2;;;;;;;:::i;:::-;48766:1;48745:6;:11;;;:18;:22;48723:120;;;::::0;-1:-1:-1;;;48723:120:0;;18477:2:1;48723:120:0::2;::::0;::::2;18459:21:1::0;18516:2;18496:18;;;18489:30;18555:34;18535:18;;;18528:62;-1:-1:-1;;;18606:18:1;;;18599:46;18662:19;;48723:120:0::2;18449:238:1::0;48723:120:0::2;-1:-1:-1::0;;;;;48909:19:0::2;48894:35;;::::0;;;:14:::2;:35;::::0;;;;;48876:11:::2;::::0;::::2;::::0;:14;;-1:-1:-1;;;;;48894:35:0;;::::2;::::0;48876:11;;:14:::2;;-1:-1:-1::0;;;48876:14:0::2;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;48876:53:0::2;;48854:160;;;::::0;-1:-1:-1;;;48854:160:0;;23785:2:1;48854:160:0::2;::::0;::::2;23767:21:1::0;23824:2;23804:18;;;23797:30;23863:34;23843:18;;;23836:62;23934:27;23914:18;;;23907:55;23979:19;;48854:160:0::2;23757:247:1::0;48854:160:0::2;49047:11:::0;;-1:-1:-1;;;;;49047:25:0::2;49025:119;;;::::0;-1:-1:-1;;;49025:119:0;;16450:2:1;49025:119:0::2;::::0;::::2;16432:21:1::0;16489:2;16469:18;;;16462:30;16528:34;16508:18;;;16501:62;-1:-1:-1;;;16579:18:1;;;16572:42;16631:19;;49025:119:0::2;16422:234:1::0;49025:119:0::2;41661:2;49177:6;:23;;;:30;:49;;;;:::i;:::-;:54:::0;49155:160:::2;;;::::0;-1:-1:-1;;;49155:160:0;;17635:2:1;49155:160:0::2;::::0;::::2;17617:21:1::0;17674:2;17654:18;;;17647:30;17713:34;17693:18;;;17686:62;-1:-1:-1;;;17764:18:1;;;17757:54;17828:19;;49155:160:0::2;17607:246:1::0;49155:160:0::2;49418:25;;41661:2;49348:6;:23;;;:30;:49;;;;:::i;:::-;:95;;49326:187;;;::::0;-1:-1:-1;;;49326:187:0;;24625:2:1;49326:187:0::2;::::0;::::2;24607:21:1::0;24664:2;24644:18;;;24637:30;24703:34;24683:18;;;24676:62;-1:-1:-1;;;24754:18:1;;;24747:40;24804:19;;49326:187:0::2;24597:232:1::0;49326:187:0::2;49526:165;49560:6;:11;;;49586:6;:20;;;49621:6;:21;;;49657:6;:23;;;49526:19;:165::i;:::-;58247:20:::3;::::0;;::::3;::::0;-1:-1:-1;;;;;58310:19:0::3;58288:42;58190:24;58288:42:::0;;;:21:::3;:42:::0;;;;;;;58217:142:::3;::::0;58247:20;58282:48:::3;::::0;:3:::3;:48;:::i;58217:142::-;58190:169;;58372:15;58397:6;:11;;;58409:1;58397:14;;;;;;-1:-1:-1::0;;;58397:14:0::3;;;;;;;;;;::::0;;::::3;::::0;;;;;;;58463::::3;::::0;58520:20;;::::3;::::0;58397:14;;-1:-1:-1;58423:128:0::3;::::0;-1:-1:-1;;;;;58423:25:0;;::::3;::::0;58463:14;::::3;::::0;58500:4:::3;::::0;58423:25:::3;:128::i;:::-;58562:16;::::0;58646:19:::3;::::0;;::::3;::::0;58680:11:::3;::::0;::::3;::::0;58706;;58562:196;;-1:-1:-1;;;58562:196:0;;:16:::3;::::0;;::::3;-1:-1:-1::0;;;;;58562:16:0::3;::::0;:38:::3;::::0;:196:::3;::::0;58615:16;;58646:19;;58680:11;;58706;58732:15:::3;::::0;58562:196:::3;;;:::i;54130:1315::-:0;32095:7;;;;32349:9;32341:38;;;;-1:-1:-1;;;32341:38:0;;23028:2:1;32341:38:0;;;23010:21:1;23067:2;23047:18;;;23040:30;-1:-1:-1;;;23086:18:1;;;23079:46;23142:18;;32341:38:0;23000:166:1;32341:38:0;54273:6:::1;54281:9;46120:1;46092:6;:17;;;46086:31;:35;46064:130;;;::::0;-1:-1:-1;;;46064:130:0;;24211:2:1;46064:130:0::1;::::0;::::1;24193:21:1::0;24250:2;24230:18;;;24223:30;24289:34;24269:18;;;24262:62;-1:-1:-1;;;24340:18:1;;;24333:43;24393:19;;46064:130:0::1;24183:235:1::0;46064:130:0::1;46251:17:::0;;46227:42:::1;::::0;;;:23:::1;:42;::::0;;;;;::::1;;:103:::0;::::1;;;-1:-1:-1::0;46290:17:0;;-1:-1:-1;;;;;46311:19:0::1;46290:40;;;46227:103;46205:193;;;::::0;-1:-1:-1;;;46205:193:0;;28328:2:1;46205:193:0::1;::::0;::::1;28310:21:1::0;28367:2;28347:18;;;28340:30;28406:34;28386:18;;;28379:62;-1:-1:-1;;;28457:18:1;;;28450:38;28505:19;;46205:193:0::1;28300:230:1::0;46205:193:0::1;46457:1;46431:6;:16;;;:23;:27;46409:129;;;::::0;-1:-1:-1;;;46409:129:0;;27907:2:1;46409:129:0::1;::::0;::::1;27889:21:1::0;27946:2;27926:18;;;27919:30;27985:34;27965:18;;;27958:62;-1:-1:-1;;;28036:18:1;;;28029:50;28096:19;;46409:129:0::1;27879:242:1::0;46409:129:0::1;46598:1;46571:6;:17;;;:24;:28;46549:132;;;::::0;-1:-1:-1;;;46549:132:0;;30053:2:1;46549:132:0::1;::::0;::::1;30035:21:1::0;30092:2;30072:18;;;30065:30;30131:34;30111:18;;;30104:62;30202:24;30182:18;;;30175:52;30244:19;;46549:132:0::1;30025:244:1::0;46549:132:0::1;-1:-1:-1::0;;;;;46795:19:0::1;46780:35;;::::0;;;:14:::1;:35;::::0;;;;;;;46714:16;;::::1;::::0;46731:23;;-1:-1:-1;;;;;46780:35:0;;::::1;::::0;46731:27:::1;::::0;46780:35;;46731:27:::1;:::i;:::-;46714:45;;;;;;-1:-1:-1::0;;;46714:45:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46714:101:0::1;;46692:212;;;::::0;-1:-1:-1;;;46692:212:0;;25855:2:1;46692:212:0::1;::::0;::::1;25837:21:1::0;25894:2;25874:18;;;25867:30;25933:34;25913:18;;;25906:62;26004:31;25984:18;;;25977:59;26053:19;;46692:212:0::1;25827:251:1::0;46692:212:0::1;46976:17:::0;;46961:33:::1;::::0;;;:14:::1;:33;::::0;;;;;46937:17:::1;::::0;::::1;::::0;:20;;-1:-1:-1;;;;;46961:33:0;;::::1;::::0;46937:17;;:20:::1;;-1:-1:-1::0;;;46937:20:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46937:57:0::1;;46915:170;;;::::0;-1:-1:-1;;;46915:170:0;;27117:2:1;46915:170:0::1;::::0;::::1;27099:21:1::0;27156:2;27136:18;;;27129:30;27195:34;27175:18;;;27168:62;27266:33;27246:18;;;27239:61;27317:19;;46915:170:0::1;27089:253:1::0;46915:170:0::1;47145:14;;47118:6;:23;;;:41;;47096:132;;;;-1:-1:-1::0;;;47096:132:0::1;;;;;;;:::i;:::-;47287:14;;47261:6;:23;;;:40;47239:126;;;;-1:-1:-1::0;;;47239:126:0::1;;;;;;;:::i;:::-;47427:17:::0;;47407:38:::1;::::0;;;:19:::1;:38;::::0;;;;;47398:47;::::1;;47376:137;;;::::0;-1:-1:-1;;;47376:137:0;;30899:2:1;47376:137:0::1;::::0;::::1;30881:21:1::0;30938:2;30918:18;;;30911:30;30977:34;30957:18;;;30950:62;-1:-1:-1;;;31028:18:1;;;31021:38;31076:19;;47376:137:0::1;30871:230:1::0;47376:137:0::1;54308:14:::2;54332:6;:16;;;54349:1;54332:19;;;;;;-1:-1:-1::0;;;54332:19:0::2;;;;;;;;;;;;;;;54308:44;;54393:1;54367:6;:16;;;:23;:27;54363:1075;;;54515:20;::::0;::::2;::::0;54411:139:::2;::::0;-1:-1:-1;;;;;54411:24:0;::::2;::::0;54454:10:::2;::::0;54491:4:::2;::::0;54411:24:::2;:139::i;:::-;54593:16;::::0;54565:49:::2;::::0;-1:-1:-1;;;;;54565:19:0;;::::2;::::0;54593:16:::2;::::0;::::2;;54612:1;54565:19;:49::i;:::-;54675:16;::::0;54711:20:::2;::::0;::::2;::::0;54629:117:::2;::::0;-1:-1:-1;;;;;54629:19:0;;::::2;::::0;54675:16:::2;::::0;;::::2;;::::0;54629:19:::2;:117::i;:::-;54788:16;::::0;54870:23:::2;::::0;::::2;::::0;54916:20:::2;::::0;::::2;::::0;54959:16:::2;::::0;;::::2;::::0;54998:14:::2;::::0;54788:281;;-1:-1:-1;;;54788:281:0;;54761:24:::2;::::0;54788:16:::2;::::0;::::2;-1:-1:-1::0;;;;;54788:16:0;;::::2;::::0;:59:::2;::::0;:281:::2;::::0;54870:23;;54916:20;;54959:16;;54998:14;;::::2;::::0;55035:15:::2;::::0;54788:281:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;54788:281:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;54761:308:::0;-1:-1:-1;55084:118:0::2;5034:10:::0;55177:7:::2;55185:1;55177:10;;;;;;-1:-1:-1::0;;;55177:10:0::2;;;;;;;;;;;;;;;55154:6;:20;;;:33;;;;:::i;:::-;-1:-1:-1::0;;;;;55084:20:0;::::2;::::0;:118;:20:::2;:118::i;:::-;55240:7;55248:1;55240:10;;;;;;-1:-1:-1::0;;;55240:10:0::2;;;;;;;;;;;;;;;55217:6;:20;;:33;;;::::0;::::2;54363:1075;;;;55355:14;::::0;55388:23:::2;::::0;::::2;::::0;55283:143:::2;::::0;-1:-1:-1;;;;;55283:24:0;;::::2;::::0;55326:10:::2;::::0;55355:14;;;::::2;::::0;55283:24:::2;:143::i;:::-;47524:1;47540:6:::1;:19;;;47536:709;;;47635:17:::0;;47581:307:::1;::::0;5034:10;47671:12:::1;47702:6;:23;;;47744:6;:20;;;47783:6;:17;;;47819:6;:18;;;47856:6;:17;;;47581:307;;;;;;;;;;;;:::i;47536:709::-;47980:17:::0;;47926:307:::1;::::0;5034:10;48016:12:::1;4954:98:::0;68863:155;45347:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45347:33::-;:89;;;-1:-1:-1;45401:35:0;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45401:35::-;45325:177;;;;-1:-1:-1;;;45325:177:0;;;;;;;:::i;:::-;68978:14:::1;:32:::0;68863:155::o;67975:::-;45347:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45347:33::-;:89;;;-1:-1:-1;45401:35:0;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45401:35::-;45325:177;;;;-1:-1:-1;;;45325:177:0;;;;;;;:::i;:::-;68090:14:::1;:32:::0;67975:155::o;64109:144::-;45347:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45347:33::-;:89;;;-1:-1:-1;45401:35:0;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45401:35::-;45325:177;;;;-1:-1:-1;;;45325:177:0;;;;;;;:::i;:::-;64219:16:::1;:26:::0;;-1:-1:-1;;;;;64219:26:0;;::::1;;;-1:-1:-1::0;;64219:26:0;;::::1;::::0;;;::::1;::::0;;64109:144::o;68292:198::-;45347:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45347:33::-;:89;;;-1:-1:-1;45401:35:0;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45401:35::-;45325:177;;;;-1:-1:-1;;;45325:177:0;;;;;;;:::i;:::-;68401:1:::1;68386:12;:16;68378:67;;;::::0;-1:-1:-1;;;68378:67:0;;18894:2:1;68378:67:0::1;::::0;::::1;18876:21:1::0;18933:2;18913:18;;;18906:30;18972:34;18952:18;;;18945:62;-1:-1:-1;;;19023:18:1;;;19016:36;19069:19;;68378:67:0::1;18866:228:1::0;68378:67:0::1;68456:11;:26:::0;68292:198::o;55684:773::-;32095:7;;;;32349:9;32341:38;;;;-1:-1:-1;;;32341:38:0;;23028:2:1;32341:38:0;;;23010:21:1;23067:2;23047:18;;;23040:30;-1:-1:-1;;;23086:18:1;;;23079:46;23142:18;;32341:38:0;23000:166:1;32341:38:0;55827:6:::1;55835:9;46120:1;46092:6;:17;;;46086:31;:35;46064:130;;;::::0;-1:-1:-1;;;46064:130:0;;24211:2:1;46064:130:0::1;::::0;::::1;24193:21:1::0;24250:2;24230:18;;;24223:30;24289:34;24269:18;;;24262:62;-1:-1:-1;;;24340:18:1;;;24333:43;24393:19;;46064:130:0::1;24183:235:1::0;46064:130:0::1;46251:17:::0;;46227:42:::1;::::0;;;:23:::1;:42;::::0;;;;;::::1;;:103:::0;::::1;;;-1:-1:-1::0;46290:17:0;;-1:-1:-1;;;;;46311:19:0::1;46290:40;;;46227:103;46205:193;;;::::0;-1:-1:-1;;;46205:193:0;;28328:2:1;46205:193:0::1;::::0;::::1;28310:21:1::0;28367:2;28347:18;;;28340:30;28406:34;28386:18;;;28379:62;-1:-1:-1;;;28457:18:1;;;28450:38;28505:19;;46205:193:0::1;28300:230:1::0;46205:193:0::1;46457:1;46431:6;:16;;;:23;:27;46409:129;;;::::0;-1:-1:-1;;;46409:129:0;;27907:2:1;46409:129:0::1;::::0;::::1;27889:21:1::0;27946:2;27926:18;;;27919:30;27985:34;27965:18;;;27958:62;-1:-1:-1;;;28036:18:1;;;28029:50;28096:19;;46409:129:0::1;27879:242:1::0;46409:129:0::1;46598:1;46571:6;:17;;;:24;:28;46549:132;;;::::0;-1:-1:-1;;;46549:132:0;;30053:2:1;46549:132:0::1;::::0;::::1;30035:21:1::0;30092:2;30072:18;;;30065:30;30131:34;30111:18;;;30104:62;30202:24;30182:18;;;30175:52;30244:19;;46549:132:0::1;30025:244:1::0;46549:132:0::1;-1:-1:-1::0;;;;;46795:19:0::1;46780:35;;::::0;;;:14:::1;:35;::::0;;;;;;;46714:16;;::::1;::::0;46731:23;;-1:-1:-1;;;;;46780:35:0;;::::1;::::0;46731:27:::1;::::0;46780:35;;46731:27:::1;:::i;:::-;46714:45;;;;;;-1:-1:-1::0;;;46714:45:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46714:101:0::1;;46692:212;;;::::0;-1:-1:-1;;;46692:212:0;;25855:2:1;46692:212:0::1;::::0;::::1;25837:21:1::0;25894:2;25874:18;;;25867:30;25933:34;25913:18;;;25906:62;26004:31;25984:18;;;25977:59;26053:19;;46692:212:0::1;25827:251:1::0;46692:212:0::1;46976:17:::0;;46961:33:::1;::::0;;;:14:::1;:33;::::0;;;;;46937:17:::1;::::0;::::1;::::0;:20;;-1:-1:-1;;;;;46961:33:0;;::::1;::::0;46937:17;;:20:::1;;-1:-1:-1::0;;;46937:20:0::1;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;46937:57:0::1;;46915:170;;;::::0;-1:-1:-1;;;46915:170:0;;27117:2:1;46915:170:0::1;::::0;::::1;27099:21:1::0;27156:2;27136:18;;;27129:30;27195:34;27175:18;;;27168:62;27266:33;27246:18;;;27239:61;27317:19;;46915:170:0::1;27089:253:1::0;46915:170:0::1;47145:14;;47118:6;:23;;;:41;;47096:132;;;;-1:-1:-1::0;;;47096:132:0::1;;;;;;;:::i;:::-;47287:14;;47261:6;:23;;;:40;47239:126;;;;-1:-1:-1::0;;;47239:126:0::1;;;;;;;:::i;:::-;47427:17:::0;;47407:38:::1;::::0;;;:19:::1;:38;::::0;;;;;47398:47;::::1;;47376:137;;;::::0;-1:-1:-1;;;47376:137:0;;30899:2:1;47376:137:0::1;::::0;::::1;30881:21:1::0;30938:2;30918:18;;;30911:30;30977:34;30957:18;;;30950:62;-1:-1:-1;;;31028:18:1;;;31021:38;31076:19;;47376:137:0::1;30871:230:1::0;47376:137:0::1;55934:17:::0;;55862:24:::2;55914:38:::0;;;:19:::2;:38;::::0;;;;;55889:63:::2;::::0;:9:::2;:63;:::i;:::-;55990:16;::::0;56092:23:::2;::::0;::::2;::::0;56130:16:::2;::::0;;::::2;::::0;56161:14:::2;::::0;55990:226;;-1:-1:-1;;;55990:226:0;;55862:90;;-1:-1:-1;55963:24:0::2;::::0;-1:-1:-1;;;;;55990:16:0::2;::::0;;::::2;::::0;::::2;::::0;:38:::2;::::0;55862:90;;55990:226:::2;::::0;56092:23;;56130:16;;56161:14:::2;::::0;56190:15:::2;::::0;55990:226:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;55990:226:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;55963:253;;56250:7;56258:1;56250:10;;;;;;-1:-1:-1::0;;;56250:10:0::2;;;;;;;;;;;;;;;56227:6;:20;;:33;;;::::0;::::2;56271:12;56294;5034:10:::0;;4954:98;56294:12:::2;-1:-1:-1::0;;;;;56286:26:0::2;:81;56346:7;56354:1;56346:10;;;;;;-1:-1:-1::0;;;56346:10:0::2;;;;;;;;;;;;;;;56327:16;:29;;;;:::i;:::-;56286:81;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;;;;;;56271:96;;56386:7;56378:71;;;::::0;-1:-1:-1;;;56378:71:0;;22608:2:1;56378:71:0::2;::::0;::::2;22590:21:1::0;22647:2;22627:18;;;22620:30;22686:34;22666:18;;;22659:62;22757:21;22737:18;;;22730:49;22796:19;;56378:71:0::2;22580:241:1::0;56378:71:0::2;47524:1;;;47540:6:::1;:19;;;47536:709;;;47635:17:::0;;47581:307:::1;::::0;5034:10;47671:12:::1;4954:98:::0;28651:149;27940:7;27967:12;;;;;;;;;;:22;;;26341:30;26352:4;5034:10;26341;:30::i;:::-;28766:26:::1;28778:4;28784:7;28766:11;:26::i;64368:123::-:0;45347:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45347:33::-;:89;;;-1:-1:-1;45401:35:0;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45401:35::-;45325:177;;;;-1:-1:-1;;;45325:177:0;;;;;;;:::i;:::-;64454:14:::1;:29:::0;;-1:-1:-1;;64454:29:0::1;-1:-1:-1::0;;;;;64454:29:0;;;::::1;::::0;;;::::1;::::0;;64368:123::o;70808:119::-;-1:-1:-1;;;;;26861:29:0;;70865:4;26861:29;;;:12;;:29;:12;:29;;;;;70889:30;26759:139;65413:197;45347:33;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45347:33::-;:89;;;-1:-1:-1;45401:35:0;-1:-1:-1;;;;;;;;;;;5034:10:0;26759:139;:::i;45401:35::-;45325:177;;;;-1:-1:-1;;;45325:177:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;65553:37:0;;::::1;;::::0;;;:21:::1;:37;::::0;;;;:49;65413:197::o;71326:123::-;-1:-1:-1;;;;;26861:29:0;;71385:4;26861:29;;;:12;;:29;:12;:29;;;;;71409:32;26759:139;18997:616;19361:10;;;19360:62;;-1:-1:-1;19377:39:0;;-1:-1:-1;;;19377:39:0;;19401:4;19377:39;;;12968:34:1;-1:-1:-1;;;;;13038:15:1;;;13018:18;;;13011:43;19377:15:0;;;;;12880:18:1;;19377:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;19360:62;19338:166;;;;-1:-1:-1;;;19338:166:0;;30476:2:1;19338:166:0;;;30458:21:1;30515:2;30495:18;;;30488:30;30554:34;30534:18;;;30527:62;30625:24;30605:18;;;30598:52;30667:19;;19338:166:0;30448:244:1;19338:166:0;19542:62;;-1:-1:-1;;;;;13660:55:1;;19542:62:0;;;13642:74:1;13732:18;;;13725:34;;;19515:90:0;;19535:5;;-1:-1:-1;;;19565:22:0;13615:18:1;;19542:62:0;;;;-1:-1:-1;;19542:62:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19542:62:0;;;;;;;;;;19515:19;:90::i;13425:229::-;13562:12;13594:52;13616:6;13624:4;13630:1;13633:12;13594:21;:52::i;:::-;13587:59;13425:229;-1:-1:-1;;;;13425:229:0:o;30108:112::-;30187:25;30198:4;30204:7;30187:10;:25::i;32824:118::-;32095:7;;;;32349:9;32341:38;;;;-1:-1:-1;;;32341:38:0;;23028:2:1;32341:38:0;;;23010:21:1;23067:2;23047:18;;;23040:30;-1:-1:-1;;;23086:18:1;;;23079:46;23142:18;;32341:38:0;23000:166:1;32341:38:0;32894:4:::1;32884:14:::0;;-1:-1:-1;;32884:14:0::1;::::0;::::1;::::0;;32914:20:::1;5034:10:::0;32921:12:::1;32914:20;::::0;-1:-1:-1;;;;;12666:55:1;;;12648:74;;12636:2;12621:18;32914:20:0::1;;;;;;;32824:118::o:0;52252:1639::-;52435:20;52458:100;52486:4;52505:13;52533:14;52458:13;:100::i;:::-;52569:18;52590:37;;;:21;:37;;;;;:48;;52669:50;;;;;52435:123;;-1:-1:-1;52590:48:0;52752:15;;:44;;;;;52784:12;52771:9;:25;;52752:44;52730:137;;;;-1:-1:-1;;;52730:137:0;;16038:2:1;52730:137:0;;;16020:21:1;16077:2;16057:18;;;16050:30;16116:34;16096:18;;;16089:62;-1:-1:-1;;;16167:18:1;;;16160:41;16218:19;;52730:137:0;16010:233:1;52730:137:0;52880:23;41661:2;52906:16;:23;:64;;;;:::i;:::-;52880:90;;52981:35;53033:15;53019:30;;;;;;-1:-1:-1;;;53019:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53019:30:0;;52981:68;;53065:9;53060:685;53084:15;53080:1;:19;53060:685;;;53121:24;53148:135;53182:12;53213:16;53248:20;41661:2;53248:1;:20;:::i;53148:135::-;53121:162;;53324:29;53336:16;53324:11;:29::i;:::-;53298:139;;;;-1:-1:-1;;;53298:139:0;;18060:2:1;53298:139:0;;;18042:21:1;18099:2;18079:18;;;18072:30;18138:34;18118:18;;;18111:62;18209:18;18189;;;18182:46;18245:19;;53298:139:0;18032:238:1;53298:139:0;53457:9;53452:227;53476:1;53472;:5;53452:227;;;53553:18;53572:1;53553:21;;;;;;-1:-1:-1;;;53553:21:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;53533:41:0;:16;-1:-1:-1;;;;;53533:41:0;;;53503:160;;;;-1:-1:-1;;;53503:160:0;;28737:2:1;53503:160:0;;;28719:21:1;28776:2;28756:18;;;28749:30;28815:34;28795:18;;;28788:62;28886:15;28866:18;;;28859:43;28919:19;;53503:160:0;28709:235:1;53503:160:0;53479:3;;;;:::i;:::-;;;;53452:227;;;;53717:16;53693:18;53712:1;53693:21;;;;;;-1:-1:-1;;;53693:21:0;;;;;;;;;-1:-1:-1;;;;;53693:40:0;;;:21;;;;;;;;;;;:40;-1:-1:-1;53101:3:0;;;;:::i;:::-;;;;53060:685;;;-1:-1:-1;;;53755:37:0;;;;-1:-1:-1;;53755:21:0;:37;;;;;;:50;;;;:65;;;;53831:52;;;;-1:-1:-1;;;52252:1639:0:o;36886:3893::-;37002:14;;;-1:-1:-1;;37518:1:0;37515;37508:20;37558:1;37555;37551:9;37542:18;;37610:5;37606:2;37603:13;37595:5;37591:2;37587:14;37583:34;37574:43;;;37703:5;37712:1;37703:10;37699:185;;;37752:1;37738:11;:15;37730:24;;;;;;-1:-1:-1;37807:23:0;;;;-1:-1:-1;37859:13:0;;37699:185;38015:5;38001:11;:19;37993:28;;;;;;38306:17;38384:11;38381:1;38378;38371:25;38561:21;;;;38517:20;;38506:32;;;;38358:38;-1:-1:-1;38747:12:0;38802:11;38763:31;38802:11;-1:-1:-1;;38763:31:0;:::i;:::-;:35;;38797:1;38763:35;:::i;:::-;38762:51;38910:22;;;;;39043:16;;;;;39297:1;39293:12;;;39289:23;39314:1;39285:31;;-1:-1:-1;39346:12:0;39285:31;39346:5;:12;:::i;:::-;39337:21;;;;39699:11;39714:15;39718:11;39714:1;:15;:::i;:::-;39733:1;39713:21;;-1:-1:-1;39964:17:0;39713:21;39964:11;:17;:::i;:::-;39960:21;;:1;:21;:::i;:::-;39953:28;;;;:::i;:::-;;-1:-1:-1;40023:17:0;39953:28;40023:11;:17;:::i;:::-;40019:21;;:1;:21;:::i;:::-;40012:28;;;;:::i;:::-;;-1:-1:-1;40083:17:0;40012:28;40083:11;:17;:::i;:::-;40079:21;;:1;:21;:::i;:::-;40072:28;;;;:::i;:::-;;-1:-1:-1;40143:17:0;40072:28;40143:11;:17;:::i;:::-;40139:21;;:1;:21;:::i;:::-;40132:28;;;;:::i;:::-;;-1:-1:-1;40203:17:0;40132:28;40203:11;:17;:::i;:::-;40199:21;;:1;:21;:::i;:::-;40192:28;;;;:::i;:::-;;-1:-1:-1;40264:17:0;40192:28;40264:11;:17;:::i;:::-;40260:21;;:1;:21;:::i;:::-;40253:28;;;;:::i;:::-;;-1:-1:-1;40736:11:0;40253:28;40736:5;:11;:::i;:::-;40727:20;36886:3893;-1:-1:-1;;;;;;;;;36886:3893:0:o;18480:248::-;18651:68;;-1:-1:-1;;;;;13346:15:1;;;18651:68:0;;;13328:34:1;13398:15;;13378:18;;;13371:43;13430:18;;;13423:34;;;18624:96:0;;18644:5;;-1:-1:-1;;;18674:27:0;13240:18:1;;18651:68:0;13222:241:1;18624:96:0;18480:248;;;;:::o;18261:211::-;18405:58;;-1:-1:-1;;;;;13660:55:1;;18405:58:0;;;13642:74:1;13732:18;;;13725:34;;;18378:86:0;;18398:5;;-1:-1:-1;;;18428:23:0;13615:18:1;;18405:58:0;13597:168:1;27188:497:0;26837:4;26861:12;;;;;;;;;;;-1:-1:-1;;;;;26861:29:0;;;;;;;;;;;;27264:414;;27457:41;27485:7;-1:-1:-1;;;;;27457:41:0;27495:2;27457:19;:41::i;:::-;27571:38;27599:4;27606:2;27571:19;:38::i;:::-;27362:270;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27362:270:0;;;;;;;;;;-1:-1:-1;;;27308:358:0;;;;;;;:::i;30555:229::-;26837:4;26861:12;;;;;;;;;;;-1:-1:-1;;;;;26861:29:0;;;;;;;;;;;;30625:152;;30669:6;:12;;;;;;;;;;;-1:-1:-1;;;;;30669:29:0;;;;;;;;;:36;;-1:-1:-1;;30669:36:0;30701:4;30669:36;;;30752:12;5034:10;;4954:98;30752:12;-1:-1:-1;;;;;30725:40:0;30743:7;-1:-1:-1;;;;;30725:40:0;30737:4;30725:40;;;;;;;;;;30555:229;;:::o;30792:230::-;26837:4;26861:12;;;;;;;;;;;-1:-1:-1;;;;;26861:29:0;;;;;;;;;;;;30863:152;;;30938:5;30906:12;;;;;;;;;;;-1:-1:-1;;;;;30906:29:0;;;;;;;;;;:37;;-1:-1:-1;;30906:37:0;;;30963:40;5034:10;;30906:12;;30963:40;;30938:5;30963:40;30792:230;;:::o;33083:120::-;32095:7;;;;32619:41;;;;-1:-1:-1;;;32619:41:0;;17286:2:1;32619:41:0;;;17268:21:1;17325:2;17305:18;;;17298:30;17364:22;17344:18;;;17337:50;17404:18;;32619:41:0;17258:170:1;32619:41:0;33142:7:::1;:15:::0;;-1:-1:-1;;33142:15:0::1;::::0;;33173:22:::1;5034:10:::0;33182:12:::1;4954:98:::0;20834:716;21258:23;21284:69;21312:4;21284:69;;;;;;;;;;;;;;;;;21292:5;-1:-1:-1;;;;;21284:27:0;;;:69;;;;;:::i;:::-;21368:17;;21258:95;;-1:-1:-1;21368:21:0;21364:179;;21465:10;21454:30;;;;;;;;;;;;:::i;:::-;21446:85;;;;-1:-1:-1;;;21446:85:0;;29642:2:1;21446:85:0;;;29624:21:1;29681:2;29661:18;;;29654:30;29720:34;29700:18;;;29693:62;-1:-1:-1;;;29771:18:1;;;29764:40;29821:19;;21446:85:0;29614:232:1;14545:511:0;14715:12;14773:5;14748:21;:30;;14740:81;;;;-1:-1:-1;;;14740:81:0;;22201:2:1;14740:81:0;;;22183:21:1;22240:2;22220:18;;;22213:30;22279:34;22259:18;;;22252:62;-1:-1:-1;;;22330:18:1;;;22323:36;22376:19;;14740:81:0;22173:228:1;14740:81:0;10942:20;;14832:60;;;;-1:-1:-1;;;14832:60:0;;27549:2:1;14832:60:0;;;27531:21:1;27588:2;27568:18;;;27561:30;27627:31;27607:18;;;27600:59;27676:18;;14832:60:0;27521:179:1;14832:60:0;14906:12;14920:23;14947:6;-1:-1:-1;;;;;14947:11:0;14966:5;14973:4;14947:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14905:73;;;;14996:52;15014:7;15023:10;15035:12;14996:17;:52::i;:::-;14989:59;14545:511;-1:-1:-1;;;;;;;14545:511:0:o;6701:451::-;6776:13;6802:19;6834:10;6838:6;6834:1;:10;:::i;:::-;:14;;6847:1;6834:14;:::i;:::-;6824:25;;;;;;-1:-1:-1;;;6824:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6824:25:0;;6802:47;;-1:-1:-1;;;6860:6:0;6867:1;6860:9;;;;;;-1:-1:-1;;;6860:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;6860:15:0;;;;;;;;;-1:-1:-1;;;6886:6:0;6893:1;6886:9;;;;;;-1:-1:-1;;;6886:9:0;;;;;;;;;;;;:15;-1:-1:-1;;;;;6886:15:0;;;;;;;;-1:-1:-1;6917:9:0;6929:10;6933:6;6929:1;:10;:::i;:::-;:14;;6942:1;6929:14;:::i;:::-;6917:26;;6912:135;6949:1;6945;:5;6912:135;;;6984:12;6997:5;7005:3;6997:11;6984:25;;;;;-1:-1:-1;;;6984:25:0;;;;;;;;;;;;6972:6;6979:1;6972:9;;;;;;-1:-1:-1;;;6972:9:0;;;;;;;;;;;;:37;-1:-1:-1;;;;;6972:37:0;;;;;;;;-1:-1:-1;7034:1:0;7024:11;;;;;6952:3;;;:::i;:::-;;;6912:135;;;-1:-1:-1;7065:10:0;;7057:55;;;;-1:-1:-1;;;7057:55:0;;15677:2:1;7057:55:0;;;15659:21:1;;;15696:18;;;15689:30;15755:34;15735:18;;;15728:62;15807:18;;7057:55:0;15649:182:1;17014:712:0;17164:12;17193:7;17189:530;;;-1:-1:-1;17224:10:0;17217:17;;17189:530;17338:17;;:21;17334:374;;17536:10;17530:17;17597:15;17584:10;17580:2;17576:19;17569:44;17484:148;17679:12;17672:20;;-1:-1:-1;;;17672:20:0;;;;;;;;:::i;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;63:85;;;:::o;153:768::-;207:5;260:3;253:4;245:6;241:17;237:27;227:2;;282:5;275;268:20;227:2;322:6;309:20;348:4;372:60;388:43;428:2;388:43;:::i;:::-;372:60;:::i;:::-;454:3;478:2;473:3;466:15;506:2;501:3;497:12;490:19;;541:2;533:6;529:15;593:3;588:2;582;579:1;575:10;567:6;563:23;559:32;556:41;553:2;;;614:5;607;600:20;553:2;640:5;654:238;668:2;665:1;662:9;654:238;;;739:3;726:17;756:31;781:5;756:31;:::i;:::-;800:18;;838:12;;;;870;;;;686:1;679:9;654:238;;;-1:-1:-1;910:5:1;;217:704;-1:-1:-1;;;;;;;217:704:1:o;926:128::-;991:20;;1020:28;991:20;1020:28;:::i;1059:550::-;1101:5;1154:3;1147:4;1139:6;1135:17;1131:27;1121:2;;1176:5;1169;1162:20;1121:2;1216:6;1203:20;1242:18;1238:2;1235:26;1232:2;;;1264:18;;:::i;:::-;1308:55;1351:2;1332:13;;-1:-1:-1;;1328:27:1;1357:4;1324:38;1308:55;:::i;:::-;1388:2;1379:7;1372:19;1434:3;1427:4;1422:2;1414:6;1410:15;1406:26;1403:35;1400:2;;;1455:5;1448;1441:20;1400:2;1524;1517:4;1509:6;1505:17;1498:4;1489:7;1485:18;1472:55;1547:16;;;1565:4;1543:27;1536:42;;;;1551:7;1111:498;-1:-1:-1;;1111:498:1:o;1614:188::-;1682:20;;-1:-1:-1;;;;;1731:46:1;;1721:57;;1711:2;;1792:1;1789;1782:12;1807:257;1866:6;1919:2;1907:9;1898:7;1894:23;1890:32;1887:2;;;1940:6;1932;1925:22;1887:2;1984:9;1971:23;2003:31;2028:5;2003:31;:::i;2069:398::-;2137:6;2145;2198:2;2186:9;2177:7;2173:23;2169:32;2166:2;;;2219:6;2211;2204:22;2166:2;2263:9;2250:23;2282:31;2307:5;2282:31;:::i;:::-;2332:5;-1:-1:-1;2389:2:1;2374:18;;2361:32;2402:33;2361:32;2402:33;:::i;:::-;2454:7;2444:17;;;2156:311;;;;;:::o;2472:393::-;2549:6;2557;2565;2618:2;2606:9;2597:7;2593:23;2589:32;2586:2;;;2639:6;2631;2624:22;2586:2;2683:9;2670:23;2702:31;2727:5;2702:31;:::i;:::-;2752:5;2804:2;2789:18;;2776:32;;-1:-1:-1;2855:2:1;2840:18;;;2827:32;;2576:289;-1:-1:-1;;;2576:289:1:o;2870:937::-;2965:6;2996:2;3039;3027:9;3018:7;3014:23;3010:32;3007:2;;;3060:6;3052;3045:22;3007:2;3098:9;3092:16;3131:18;3123:6;3120:30;3117:2;;;3168:6;3160;3153:22;3117:2;3196:22;;3249:4;3241:13;;3237:27;-1:-1:-1;3227:2:1;;3283:6;3275;3268:22;3227:2;3317;3311:9;3340:60;3356:43;3396:2;3356:43;:::i;3340:60::-;3422:3;3446:2;3441:3;3434:15;3474:2;3469:3;3465:12;3458:19;;3505:2;3501;3497:11;3553:7;3548:2;3542;3539:1;3535:10;3531:2;3527:19;3523:28;3520:41;3517:2;;;3579:6;3571;3564:22;3517:2;3606:6;3597:15;;3621:156;3635:2;3632:1;3629:9;3621:156;;;3692:10;;3680:23;;3653:1;3646:9;;;;;3723:12;;;;3755;;3621:156;;;-1:-1:-1;3796:5:1;2976:831;-1:-1:-1;;;;;;;2976:831:1:o;3812:255::-;3879:6;3932:2;3920:9;3911:7;3907:23;3903:32;3900:2;;;3953:6;3945;3938:22;3900:2;3990:9;3984:16;4009:28;4031:5;4009:28;:::i;4072:190::-;4131:6;4184:2;4172:9;4163:7;4159:23;4155:32;4152:2;;;4205:6;4197;4190:22;4152:2;-1:-1:-1;4233:23:1;;4142:120;-1:-1:-1;4142:120:1:o;4267:325::-;4335:6;4343;4396:2;4384:9;4375:7;4371:23;4367:32;4364:2;;;4417:6;4409;4402:22;4364:2;4458:9;4445:23;4435:33;;4518:2;4507:9;4503:18;4490:32;4531:31;4556:5;4531:31;:::i;4597:476::-;4683:6;4691;4699;4752:2;4740:9;4731:7;4727:23;4723:32;4720:2;;;4773:6;4765;4758:22;4720:2;4814:9;4801:23;4791:33;;4875:2;4864:9;4860:18;4847:32;4902:18;4894:6;4891:30;4888:2;;;4939:6;4931;4924:22;4888:2;4967:49;5008:7;4999:6;4988:9;4984:22;4967:49;:::i;:::-;4957:59;;;5063:2;5052:9;5048:18;5035:32;5025:42;;4710:363;;;;;:::o;5078:326::-;5155:6;5163;5171;5224:2;5212:9;5203:7;5199:23;5195:32;5192:2;;;5245:6;5237;5230:22;5192:2;-1:-1:-1;;5273:23:1;;;5343:2;5328:18;;5315:32;;-1:-1:-1;5394:2:1;5379:18;;;5366:32;;5182:222;-1:-1:-1;5182:222:1:o;5409:306::-;5467:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:2;;;5541:6;5533;5526:22;5488:2;5572:23;;-1:-1:-1;;;;;;5624:32:1;;5614:43;;5604:2;;5676:6;5668;5661:22;6009:1091;6100:6;6153:2;6141:9;6132:7;6128:23;6124:32;6121:2;;;6174:6;6166;6159:22;6121:2;6219:9;6206:23;6248:18;6289:2;6281:6;6278:14;6275:2;;;6310:6;6302;6295:22;6275:2;6338:22;;;;6394:4;6376:16;;;6372:27;6369:2;;;6417:6;6409;6402:22;6369:2;6448:22;;:::i;:::-;6493;6512:2;6493:22;:::i;:::-;6486:5;6479:37;6569:2;6565;6561:11;6548:25;6543:2;6536:5;6532:14;6525:49;6627:2;6623;6619:11;6606:25;6601:2;6594:5;6590:14;6583:49;6678:2;6674;6670:11;6657:25;6707:2;6697:8;6694:16;6691:2;;;6728:6;6720;6713:22;6691:2;6769:56;6817:7;6806:8;6802:2;6798:17;6769:56;:::i;:::-;6764:2;6757:5;6753:14;6746:80;;6880:3;6876:2;6872:12;6859:26;6853:3;6846:5;6842:15;6835:51;6932:3;6928:2;6924:12;6911:26;6962:2;6952:8;6949:16;6946:2;;;6983:6;6975;6968:22;6946:2;7025:44;7061:7;7050:8;7046:2;7042:17;7025:44;:::i;:::-;7019:3;7008:15;;7001:69;-1:-1:-1;7012:5:1;6111:989;-1:-1:-1;;;;;6111:989:1:o;7105:1344::-;7194:6;7247:2;7235:9;7226:7;7222:23;7218:32;7215:2;;;7268:6;7260;7253:22;7215:2;7313:9;7300:23;7342:18;7383:2;7375:6;7372:14;7369:2;;;7404:6;7396;7389:22;7369:2;7432:22;;;;7488:6;7470:16;;;7466:29;7463:2;;;7513:6;7505;7498:22;7463:2;7544:22;;:::i;:::-;7602:2;7589:16;7582:5;7575:31;7659:2;7655;7651:11;7638:25;7633:2;7626:5;7622:14;7615:49;7710:2;7706;7702:11;7689:25;7739:2;7729:8;7726:16;7723:2;;;7760:6;7752;7745:22;7723:2;7801:56;7849:7;7838:8;7834:2;7830:17;7801:56;:::i;:::-;7796:2;7789:5;7785:14;7778:80;;7904:2;7900;7896:11;7883:25;7933:2;7923:8;7920:16;7917:2;;;7954:6;7946;7939:22;7917:2;7995:56;8043:7;8032:8;8028:2;8024:17;7995:56;:::i;:::-;7990:2;7983:5;7979:14;7972:80;;8106:3;8102:2;8098:12;8085:26;8079:3;8072:5;8068:15;8061:51;8166:3;8162:2;8158:12;8145:26;8139:3;8132:5;8128:15;8121:51;8218:3;8214:2;8210:12;8197:26;8248:2;8238:8;8235:16;8232:2;;;8269:6;8261;8254:22;8232:2;8311:44;8347:7;8336:8;8332:2;8328:17;8311:44;:::i;:::-;8305:3;8298:5;8294:15;8287:69;;8389:29;8413:3;8409:2;8405:12;8389:29;:::i;:::-;8383:3;8372:15;;8365:54;8376:5;7205:1244;-1:-1:-1;;;;;7205:1244:1:o;8454:196::-;8513:6;8566:2;8554:9;8545:7;8541:23;8537:32;8534:2;;;8587:6;8579;8572:22;8534:2;8615:29;8634:9;8615:29;:::i;8655:331::-;8723:6;8731;8784:2;8772:9;8763:7;8759:23;8755:32;8752:2;;;8805:6;8797;8790:22;8752:2;8833:29;8852:9;8833:29;:::i;8991:270::-;9059:6;9067;9120:2;9108:9;9099:7;9095:23;9091:32;9088:2;;;9141:6;9133;9126:22;9088:2;9169:29;9188:9;9169:29;:::i;:::-;9159:39;;9217:38;9251:2;9240:9;9236:18;9217:38;:::i;:::-;9207:48;;9078:183;;;;;:::o;9266:264::-;9334:6;9342;9395:2;9383:9;9374:7;9370:23;9366:32;9363:2;;;9416:6;9408;9401:22;9363:2;9444:29;9463:9;9444:29;:::i;:::-;9434:39;9520:2;9505:18;;;;9492:32;;-1:-1:-1;;;9353:177:1:o;9730:194::-;9800:6;9853:2;9841:9;9832:7;9828:23;9824:32;9821:2;;;9874:6;9866;9859:22;9821:2;-1:-1:-1;9902:16:1;;9811:113;-1:-1:-1;9811:113:1:o;9929:486::-;9982:3;10020:5;10014:12;10047:6;10042:3;10035:19;10073:4;10102:2;10097:3;10093:12;10086:19;;10139:2;10132:5;10128:14;10160:3;10172:218;10186:6;10183:1;10180:13;10172:218;;;10251:13;;-1:-1:-1;;;;;10247:62:1;10235:75;;10330:12;;;;10365:15;;;;10208:1;10201:9;10172:218;;;-1:-1:-1;10406:3:1;;9990:425;-1:-1:-1;;;;;9990:425:1:o;10420:258::-;10462:3;10500:5;10494:12;10527:6;10522:3;10515:19;10543:63;10599:6;10592:4;10587:3;10583:14;10576:4;10569:5;10565:16;10543:63;:::i;:::-;10660:2;10639:15;-1:-1:-1;;10635:29:1;10626:39;;;;10667:4;10622:50;;10470:208;-1:-1:-1;;10470:208:1:o;11047:274::-;11176:3;11214:6;11208:13;11230:53;11276:6;11271:3;11264:4;11256:6;11252:17;11230:53;:::i;:::-;11299:16;;;;;11184:137;-1:-1:-1;;11184:137:1:o;11711:786::-;12122:25;12117:3;12110:38;12092:3;12177:6;12171:13;12193:62;12248:6;12243:2;12238:3;12234:12;12227:4;12219:6;12215:17;12193:62;:::i;:::-;12319:19;12314:2;12274:16;;;12306:11;;;12299:40;12364:13;;12386:63;12364:13;12435:2;12427:11;;12420:4;12408:17;;12386:63;:::i;:::-;12469:17;12488:2;12465:26;;12100:397;-1:-1:-1;;;;12100:397:1:o;15250:220::-;15399:2;15388:9;15381:21;15362:4;15419:45;15460:2;15449:9;15445:18;15437:6;15419:45;:::i;20414:402::-;20616:2;20598:21;;;20655:2;20635:18;;;20628:30;20694:34;20689:2;20674:18;;20667:62;-1:-1:-1;;;20760:2:1;20745:18;;20738:36;20806:3;20791:19;;20588:228::o;20821:405::-;21023:2;21005:21;;;21062:2;21042:18;;;21035:30;21101:34;21096:2;21081:18;;21074:62;-1:-1:-1;;;21167:2:1;21152:18;;21145:39;21216:3;21201:19;;20995:231::o;31522:400::-;31724:2;31706:21;;;31763:2;31743:18;;;31736:30;31802:34;31797:2;31782:18;;31775:62;-1:-1:-1;;;31868:2:1;31853:18;;31846:34;31912:3;31897:19;;31696:226::o;32332:833::-;32699:6;32688:9;32681:25;-1:-1:-1;;;;;32746:6:1;32742:55;32737:2;32726:9;32722:18;32715:83;32834:6;32829:2;32818:9;32814:18;32807:34;32877:6;32872:2;32861:9;32857:18;32850:34;32921:3;32915;32904:9;32900:19;32893:32;32662:4;32948:46;32989:3;32978:9;32974:19;32966:6;32948:46;:::i;:::-;33031:6;33025:3;33014:9;33010:19;33003:35;33087:9;33079:6;33075:22;33069:3;33058:9;33054:19;33047:51;33115:44;33152:6;33144;33115:44;:::i;:::-;33107:52;32671:494;-1:-1:-1;;;;;;;;;;32671:494:1:o;33170:525::-;33433:6;33422:9;33415:25;33476:3;33471:2;33460:9;33456:18;33449:31;33396:4;33497:57;33549:3;33538:9;33534:19;33526:6;33497:57;:::i;:::-;-1:-1:-1;;;;;33590:55:1;;;;33585:2;33570:18;;33563:83;-1:-1:-1;33677:2:1;33662:18;33655:34;33489:65;33405:290;-1:-1:-1;;33405:290:1:o;33953:597::-;34244:6;34233:9;34226:25;34287:6;34282:2;34271:9;34267:18;34260:34;34330:3;34325:2;34314:9;34310:18;34303:31;34207:4;34351:57;34403:3;34392:9;34388:19;34380:6;34351:57;:::i;:::-;-1:-1:-1;;;;;34444:55:1;;;;34439:2;34424:18;;34417:83;-1:-1:-1;34531:3:1;34516:19;34509:35;34343:65;34216:334;-1:-1:-1;;;34216:334:1:o;34555:253::-;34627:2;34621:9;34669:4;34657:17;;34704:18;34689:34;;34725:22;;;34686:62;34683:2;;;34751:18;;:::i;:::-;34787:2;34780:22;34601:207;:::o;34813:255::-;34885:2;34879:9;34927:6;34915:19;;34964:18;34949:34;;34985:22;;;34946:62;34943:2;;;35011:18;;:::i;35073:275::-;35144:2;35138:9;35209:2;35190:13;;-1:-1:-1;;35186:27:1;35174:40;;35244:18;35229:34;;35265:22;;;35226:62;35223:2;;;35291:18;;:::i;:::-;35327:2;35320:22;35118:230;;-1:-1:-1;35118:230:1:o;35353:183::-;35413:4;35446:18;35438:6;35435:30;35432:2;;;35468:18;;:::i;:::-;-1:-1:-1;35513:1:1;35509:14;35525:4;35505:25;;35422:114::o;35541:128::-;35581:3;35612:1;35608:6;35605:1;35602:13;35599:2;;;35618:18;;:::i;:::-;-1:-1:-1;35654:9:1;;35589:80::o;35674:204::-;35712:3;35748:4;35745:1;35741:12;35780:4;35777:1;35773:12;35815:3;35809:4;35805:14;35800:3;35797:23;35794:2;;;35823:18;;:::i;:::-;35859:13;;35720:158;-1:-1:-1;;;35720:158:1:o;35883:120::-;35923:1;35949;35939:2;;35954:18;;:::i;:::-;-1:-1:-1;35988:9:1;;35929:74::o;36008:168::-;36048:7;36114:1;36110;36106:6;36102:14;36099:1;36096:21;36091:1;36084:9;36077:17;36073:45;36070:2;;;36121:18;;:::i;:::-;-1:-1:-1;36161:9:1;;36060:116::o;36181:125::-;36221:4;36249:1;36246;36243:8;36240:2;;;36254:18;;:::i;:::-;-1:-1:-1;36291:9:1;;36230:76::o;36311:258::-;36383:1;36393:113;36407:6;36404:1;36401:13;36393:113;;;36483:11;;;36477:18;36464:11;;;36457:39;36429:2;36422:10;36393:113;;;36524:6;36521:1;36518:13;36515:2;;;-1:-1:-1;;36559:1:1;36541:16;;36534:27;36364:205::o;36574:136::-;36613:3;36641:5;36631:2;;36650:18;;:::i;:::-;-1:-1:-1;;;36686:18:1;;36621:89::o;36715:135::-;36754:3;-1:-1:-1;;36775:17:1;;36772:2;;;36795:18;;:::i;:::-;-1:-1:-1;36842:1:1;36831:13;;36762:88::o;36855:112::-;36887:1;36913;36903:2;;36918:18;;:::i;:::-;-1:-1:-1;36952:9:1;;36893:74::o;36972:127::-;37033:10;37028:3;37024:20;37021:1;37014:31;37064:4;37061:1;37054:15;37088:4;37085:1;37078:15;37104:127;37165:10;37160:3;37156:20;37153:1;37146:31;37196:4;37193:1;37186:15;37220:4;37217:1;37210:15;37236:127;37297:10;37292:3;37288:20;37285:1;37278:31;37328:4;37325:1;37318:15;37352:4;37349:1;37342:15;37368:154;-1:-1:-1;;;;;37447:5:1;37443:54;37436:5;37433:65;37423:2;;37512:1;37509;37502:12;37527:118;37613:5;37606:13;37599:21;37592:5;37589:32;37579:2;;37635:1;37632;37625:12
Swarm Source
ipfs://e56199857d02c30dada59f55d4cf041b5bc12c2cf1b31cbe335e31e63041ee2c
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$5.90
Net Worth in MOVR
Token Allocations
USDC
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.999612 | 5.9 | $5.9 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.