More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 570 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Embark With Sign... | 20625715 | 2 days ago | IN | 0 ETH | 0.00000109 | ||||
Embark With Sign... | 19353593 | 51 days ago | IN | 0 ETH | 0.00003077 | ||||
Embark With Sign... | 17354543 | 130 days ago | IN | 0 ETH | 0.00001836 | ||||
Embark With Sign... | 16832085 | 150 days ago | IN | 0 ETH | 0.00001663 | ||||
Embark With Sign... | 15717170 | 191 days ago | IN | 0 ETH | 0.00000777 | ||||
Embark With Sign... | 14422592 | 236 days ago | IN | 0 ETH | 0.0000095 | ||||
Embark With Sign... | 14049667 | 249 days ago | IN | 0 ETH | 0.00001015 | ||||
Embark With Sign... | 12619954 | 299 days ago | IN | 0 ETH | 0.00000814 | ||||
Embark With Sign... | 12056216 | 319 days ago | IN | 0 ETH | 0.00008007 | ||||
Embark With Sign... | 12022986 | 320 days ago | IN | 0 ETH | 0.00006894 | ||||
Embark With Sign... | 11938849 | 323 days ago | IN | 0 ETH | 0.00006392 | ||||
Embark With Sign... | 11383350 | 342 days ago | IN | 0 ETH | 0.00038411 | ||||
Embark With Sign... | 10449483 | 375 days ago | IN | 0 ETH | 0.0017916 | ||||
Embark With Sign... | 10020378 | 390 days ago | IN | 0 ETH | 0.00032427 | ||||
Embark With Sign... | 9558566 | 410 days ago | IN | 0 ETH | 0.00031757 | ||||
Embark With Sign... | 9301936 | 421 days ago | IN | 0 ETH | 0.0008483 | ||||
Embark With Sign... | 8938905 | 438 days ago | IN | 0 ETH | 0.00017371 | ||||
Embark With Sign... | 8732731 | 446 days ago | IN | 0 ETH | 0.00035832 | ||||
Embark With Sign... | 5511283 | 544 days ago | IN | 0 ETH | 0.00006864 | ||||
Embark With Sign... | 5283216 | 552 days ago | IN | 0 ETH | 0.00006977 | ||||
Embark With Sign... | 4590194 | 574 days ago | IN | 0 ETH | 0.00017374 | ||||
Embark With Sign... | 4580194 | 574 days ago | IN | 0 ETH | 0.00014117 | ||||
Embark With Sign... | 4394008 | 580 days ago | IN | 0 ETH | 0.0000752 | ||||
Embark With Sign... | 4378318 | 580 days ago | IN | 0 ETH | 0.00011537 | ||||
Embark With Sign... | 4321011 | 582 days ago | IN | 0 ETH | 0.00006755 |
Loading...
Loading
Contract Name:
Fraxferry
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at zkevm.polygonscan.com on 2023-04-04 */ // SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.8.0; // Sources flattened with hardhat v2.13.0 https://hardhat.org // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File @uniswap/v3-periphery/contracts/libraries/[email protected] library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF'); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST'); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA'); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'STE'); } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/utils/math/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // 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]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } // File contracts/Fraxferry/Fraxferry.sol // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ============================ Fraxferry ============================= // ==================================================================== // Ferry that can be used to ship tokens between chains // Frax Finance: https://github.com/FraxFinance // Primary Author(s) // Dennis: https://github.com/denett /* ** Modus operandi: ** - User sends tokens to the contract. This transaction is stored in the contract. ** - Captain queries the source chain for transactions to ship. ** - Captain sends batch (start, end, hash) to start the trip, ** - Crewmembers check the batch and can dispute it if it is invalid. ** - Non disputed batches can be executed by the first officer by providing the transactions as calldata. ** - Hash of the transactions must be equal to the hash in the batch. User receives their tokens on the other chain. ** - In case there was a fraudulent transaction (a hacker for example), the owner can cancel a single transaction, such that it will not be executed. ** - The owner can manually manage the tokens in the contract and must make sure it has enough funds. ** ** What must happen for a false batch to be executed: ** - Captain is tricked into proposing a batch with a false hash ** - All crewmembers bots are offline/censured/compromised and no one disputes the proposal ** ** Other risks: ** - Reorgs on the source chain. Avoided, by only returning the transactions on the source chain that are at least one hour old. ** - Rollbacks of optimistic rollups. Avoided by running a node. ** - Operators do not have enough time to pause the chain after a fake proposal. Avoided by requiring a minimal amount of time between sending the proposal and executing it. */ contract Fraxferry { IERC20 immutable public token; IERC20 immutable public targetToken; uint immutable public chainid; uint immutable public targetChain; address public owner; address public nominatedOwner; address public captain; address public firstOfficer; mapping(address => bool) public crewmembers; mapping(address => bool) public fee_exempt_addrs; bool public paused; uint public MIN_WAIT_PERIOD_ADD=3600; // Minimal 1 hour waiting uint public MIN_WAIT_PERIOD_EXECUTE=79200; // Minimal 22 hour waiting uint public FEE_RATE=10; // 0.1% fee uint public FEE_MIN=5*1e18; // 5 token min fee uint public FEE_MAX=100*1e18; // 100 token max fee uint constant MAX_FEE_RATE=100; // Max fee rate is 1% uint constant MAX_FEE_MIN=100e18; // Max minimum fee is 100 tokens uint constant MAX_FEE_MAX=1000e18; // Max fee is 1000 tokens uint constant public REDUCED_DECIMALS=1e10; Transaction[] public transactions; mapping(uint => bool) public cancelled; uint public executeIndex; Batch[] public batches; struct Transaction { address user; uint64 amount; uint32 timestamp; } struct Batch { uint64 start; uint64 end; uint64 departureTime; uint64 status; bytes32 hash; } struct BatchData { uint startTransactionNo; Transaction[] transactions; } constructor(address _token, uint _chainid, address _targetToken, uint _targetChain) { //require (block.chainid==_chainid,"Wrong chain"); chainid=_chainid; token = IERC20(_token); targetToken = IERC20(_targetToken); owner = msg.sender; targetChain = _targetChain; } // ############## Events ############## event Embark(address indexed sender, uint index, uint amount, uint amountAfterFee, uint timestamp); event Disembark(uint start, uint end, bytes32 hash); event Depart(uint batchNo,uint start,uint end,bytes32 hash); event RemoveBatch(uint batchNo); event DisputeBatch(uint batchNo, bytes32 hash); event Cancelled(uint index, bool cancel); event Pause(bool paused); event OwnerNominated(address indexed newOwner); event OwnerChanged(address indexed previousOwner,address indexed newOwner); event SetCaptain(address indexed previousCaptain, address indexed newCaptain); event SetFirstOfficer(address indexed previousFirstOfficer, address indexed newFirstOfficer); event SetCrewmember(address indexed crewmember,bool set); event SetFee(uint previousFeeRate, uint feeRate,uint previousFeeMin, uint feeMin,uint previousFeeMax, uint feeMax); event SetMinWaitPeriods(uint previousMinWaitAdd,uint previousMinWaitExecute,uint minWaitAdd,uint minWaitExecute); event FeeExemptToggled(address addr,bool is_fee_exempt); // ############## Modifiers ############## modifier isOwner() { require (msg.sender==owner,"Not owner"); _; } modifier isCaptain() { require (msg.sender==captain,"Not captain"); _; } modifier isFirstOfficer() { require (msg.sender==firstOfficer,"Not first officer"); _; } modifier isCrewmember() { require (crewmembers[msg.sender] || msg.sender==owner || msg.sender==captain || msg.sender==firstOfficer,"Not crewmember"); _; } modifier notPaused() { require (!paused,"Paused"); _; } // ############## Ferry actions ############## function embarkWithRecipient(uint amount, address recipient) public notPaused { amount = (amount/REDUCED_DECIMALS)*REDUCED_DECIMALS; // Round amount to fit in data structure uint fee; if(fee_exempt_addrs[msg.sender]) fee = 0; else { fee = Math.min(Math.max(FEE_MIN,amount*FEE_RATE/10000),FEE_MAX); } require (amount>fee,"Amount too low"); require (amount/REDUCED_DECIMALS<=type(uint64).max,"Amount too high"); TransferHelper.safeTransferFrom(address(token),msg.sender,address(this),amount); uint64 amountAfterFee = uint64((amount-fee)/REDUCED_DECIMALS); emit Embark(recipient,transactions.length,amount,amountAfterFee*REDUCED_DECIMALS,block.timestamp); transactions.push(Transaction(recipient,amountAfterFee,uint32(block.timestamp))); } function embark(uint amount) public { embarkWithRecipient(amount, msg.sender) ; } function embarkWithSignature( uint256 _amount, address recipient, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) public { uint amount = approveMax ? type(uint256).max : _amount; IERC20Permit(address(token)).permit(msg.sender, address(this), amount, deadline, v, r, s); embarkWithRecipient(amount,recipient); } function depart(uint start, uint end, bytes32 hash) external notPaused isCaptain { require ((batches.length==0 && start==0) || (batches.length>0 && start==batches[batches.length-1].end+1),"Wrong start"); require (end>=start && end<type(uint64).max,"Wrong end"); batches.push(Batch(uint64(start),uint64(end),uint64(block.timestamp),0,hash)); emit Depart(batches.length-1,start,end,hash); } function disembark(BatchData calldata batchData) external notPaused isFirstOfficer { Batch memory batch = batches[executeIndex++]; require (batch.status==0,"Batch disputed"); require (batch.start==batchData.startTransactionNo,"Wrong start"); require (batch.start+batchData.transactions.length-1==batch.end,"Wrong size"); require (block.timestamp-batch.departureTime>=MIN_WAIT_PERIOD_EXECUTE,"Too soon"); bytes32 hash = keccak256(abi.encodePacked(targetChain, targetToken, chainid, token, batch.start)); for (uint i=0;i<batchData.transactions.length;++i) { if (!cancelled[batch.start+i]) { TransferHelper.safeTransfer(address(token),batchData.transactions[i].user,batchData.transactions[i].amount*REDUCED_DECIMALS); } hash = keccak256(abi.encodePacked(hash, batchData.transactions[i].user,batchData.transactions[i].amount)); } require (batch.hash==hash,"Wrong hash"); emit Disembark(batch.start,batch.end,hash); } function removeBatches(uint batchNo) external isOwner { require (executeIndex<=batchNo,"Batch already executed"); while (batches.length>batchNo) batches.pop(); emit RemoveBatch(batchNo); } function disputeBatch(uint batchNo, bytes32 hash) external isCrewmember { require (batches[batchNo].hash==hash,"Wrong hash"); require (executeIndex<=batchNo,"Batch already executed"); require (batches[batchNo].status==0,"Batch already disputed"); batches[batchNo].status=1; // Set status on disputed _pause(true); emit DisputeBatch(batchNo,hash); } function pause() external isCrewmember { _pause(true); } function unPause() external isOwner { _pause(false); } function _pause(bool _paused) internal { paused=_paused; emit Pause(_paused); } function _jettison(uint index, bool cancel) internal { require (executeIndex==0 || index>batches[executeIndex-1].end,"Transaction already executed"); cancelled[index]=cancel; emit Cancelled(index,cancel); } function jettison(uint index, bool cancel) external isOwner { _jettison(index,cancel); } function jettisonGroup(uint[] calldata indexes, bool cancel) external isOwner { for (uint i=0;i<indexes.length;++i) { _jettison(indexes[i],cancel); } } // ############## Parameters management ############## function setFee(uint _FEE_RATE, uint _FEE_MIN, uint _FEE_MAX) external isOwner { require(_FEE_RATE<MAX_FEE_RATE); require(_FEE_MIN<MAX_FEE_MIN); require(_FEE_MAX<MAX_FEE_MAX); emit SetFee(FEE_RATE,_FEE_RATE,FEE_MIN,_FEE_MIN,FEE_MAX,_FEE_MAX); FEE_RATE=_FEE_RATE; FEE_MIN=_FEE_MIN; FEE_MAX=_FEE_MAX; } function setMinWaitPeriods(uint _MIN_WAIT_PERIOD_ADD, uint _MIN_WAIT_PERIOD_EXECUTE) external isOwner { require(_MIN_WAIT_PERIOD_ADD>=3600 && _MIN_WAIT_PERIOD_EXECUTE>=3600,"Period too short"); emit SetMinWaitPeriods(MIN_WAIT_PERIOD_ADD, MIN_WAIT_PERIOD_EXECUTE,_MIN_WAIT_PERIOD_ADD, _MIN_WAIT_PERIOD_EXECUTE); MIN_WAIT_PERIOD_ADD=_MIN_WAIT_PERIOD_ADD; MIN_WAIT_PERIOD_EXECUTE=_MIN_WAIT_PERIOD_EXECUTE; } // ############## Roles management ############## function nominateNewOwner(address newOwner) external isOwner { nominatedOwner = newOwner; emit OwnerNominated(newOwner); } function acceptOwnership() external { require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); emit OwnerChanged(owner, nominatedOwner); owner = nominatedOwner; nominatedOwner = address(0); } function setCaptain(address newCaptain) external isOwner { emit SetCaptain(captain,newCaptain); captain=newCaptain; } function setFirstOfficer(address newFirstOfficer) external isOwner { emit SetFirstOfficer(firstOfficer,newFirstOfficer); firstOfficer=newFirstOfficer; } function setCrewmember(address crewmember, bool set) external isOwner { crewmembers[crewmember]=set; emit SetCrewmember(crewmember,set); } function toggleFeeExemptAddr(address addr) external isOwner { fee_exempt_addrs[addr] = !fee_exempt_addrs[addr]; emit FeeExemptToggled(addr,fee_exempt_addrs[addr]); } // ############## Token management ############## function sendTokens(address receiver, uint amount) external isOwner { require (receiver!=address(0),"Zero address not allowed"); TransferHelper.safeTransfer(address(token),receiver,amount); } // Generic proxy function execute(address _to, uint256 _value, bytes calldata _data) external isOwner returns (bool, bytes memory) { require(_data.length==0 || _to.code.length>0,"Can not call a function on a EOA"); (bool success, bytes memory result) = _to.call{value:_value}(_data); return (success, result); } // ############## Views ############## function getNextBatch(uint _start, uint max) public view returns (uint start, uint end, bytes32 hash) { uint cutoffTime = block.timestamp-MIN_WAIT_PERIOD_ADD; if (_start<transactions.length && transactions[_start].timestamp<cutoffTime) { start=_start; end=start+max-1; if (end>=transactions.length) end=transactions.length-1; while(transactions[end].timestamp>=cutoffTime) end--; hash = getTransactionsHash(start,end); } } function getBatchData(uint start, uint end) public view returns (BatchData memory data) { data.startTransactionNo = start; data.transactions = new Transaction[](end-start+1); for (uint i=start;i<=end;++i) { data.transactions[i-start]=transactions[i]; } } function getBatchAmount(uint start, uint end) public view returns (uint totalAmount) { for (uint i=start;i<=end;++i) { totalAmount+=transactions[i].amount; } totalAmount*=REDUCED_DECIMALS; } function getTransactionsHash(uint start, uint end) public view returns (bytes32) { bytes32 result = keccak256(abi.encodePacked(chainid, token, targetChain, targetToken, uint64(start))); for (uint i=start;i<=end;++i) { result = keccak256(abi.encodePacked(result, transactions[i].user,transactions[i].amount)); } return result; } function noTransactions() public view returns (uint) { return transactions.length; } function noBatches() public view returns (uint) { return batches.length; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_chainid","type":"uint256"},{"internalType":"address","name":"_targetToken","type":"address"},{"internalType":"uint256","name":"_targetChain","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"bool","name":"cancel","type":"bool"}],"name":"Cancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"batchNo","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Depart","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"Disembark","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"batchNo","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"DisputeBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountAfterFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Embark","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"is_fee_exempt","type":"bool"}],"name":"FeeExemptToggled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"batchNo","type":"uint256"}],"name":"RemoveBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousCaptain","type":"address"},{"indexed":true,"internalType":"address","name":"newCaptain","type":"address"}],"name":"SetCaptain","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"crewmember","type":"address"},{"indexed":false,"internalType":"bool","name":"set","type":"bool"}],"name":"SetCrewmember","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousFeeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousFeeMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousFeeMax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeMax","type":"uint256"}],"name":"SetFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousFirstOfficer","type":"address"},{"indexed":true,"internalType":"address","name":"newFirstOfficer","type":"address"}],"name":"SetFirstOfficer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousMinWaitAdd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousMinWaitExecute","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minWaitAdd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minWaitExecute","type":"uint256"}],"name":"SetMinWaitPeriods","type":"event"},{"inputs":[],"name":"FEE_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_MIN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_WAIT_PERIOD_ADD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_WAIT_PERIOD_EXECUTE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REDUCED_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"batches","outputs":[{"internalType":"uint64","name":"start","type":"uint64"},{"internalType":"uint64","name":"end","type":"uint64"},{"internalType":"uint64","name":"departureTime","type":"uint64"},{"internalType":"uint64","name":"status","type":"uint64"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cancelled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"captain","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"crewmembers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"depart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"startTransactionNo","type":"uint256"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"uint32","name":"timestamp","type":"uint32"}],"internalType":"struct Fraxferry.Transaction[]","name":"transactions","type":"tuple[]"}],"internalType":"struct Fraxferry.BatchData","name":"batchData","type":"tuple"}],"name":"disembark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"batchNo","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"disputeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"embark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"embarkWithRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"embarkWithSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"execute","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fee_exempt_addrs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstOfficer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getBatchAmount","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getBatchData","outputs":[{"components":[{"internalType":"uint256","name":"startTransactionNo","type":"uint256"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"uint32","name":"timestamp","type":"uint32"}],"internalType":"struct Fraxferry.Transaction[]","name":"transactions","type":"tuple[]"}],"internalType":"struct Fraxferry.BatchData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"getNextBatch","outputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getTransactionsHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"cancel","type":"bool"}],"name":"jettison","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indexes","type":"uint256[]"},{"internalType":"bool","name":"cancel","type":"bool"}],"name":"jettisonGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"noBatches","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"noTransactions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"batchNo","type":"uint256"}],"name":"removeBatches","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sendTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCaptain","type":"address"}],"name":"setCaptain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"crewmember","type":"address"},{"internalType":"bool","name":"set","type":"bool"}],"name":"setCrewmember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_FEE_RATE","type":"uint256"},{"internalType":"uint256","name":"_FEE_MIN","type":"uint256"},{"internalType":"uint256","name":"_FEE_MAX","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFirstOfficer","type":"address"}],"name":"setFirstOfficer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_MIN_WAIT_PERIOD_ADD","type":"uint256"},{"internalType":"uint256","name":"_MIN_WAIT_PERIOD_EXECUTE","type":"uint256"}],"name":"setMinWaitPeriods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"targetChain","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"toggleFeeExemptAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint64","name":"amount","type":"uint64"},{"internalType":"uint32","name":"timestamp","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unPause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610100604052610e1060075562013560600855600a600955674563918244f40000600a5568056bc75e2d63100000600b553480156200003d57600080fd5b5060405162003ea938038062003ea98339810160408190526200006091620000b2565b60c0929092526001600160a01b0392831660805290911660a052600080546001600160a01b0319163317905560e052620000fb565b80516001600160a01b0381168114620000ad57600080fd5b919050565b60008060008060808587031215620000c957600080fd5b620000d48562000095565b935060208501519250620000eb6040860162000095565b6060959095015193969295505050565b60805160a05160c05160e051613d2062000189600039600081816105350152818161137c0152611bbc0152600081816106ce015281816113c00152611b450152600081816103c30152818161139e0152611be20152600081816107b1015281816108ee01528181610ae5015281816113e2015281816114e201528181611b9001526128c90152613d206000f3fe608060405234801561001057600080fd5b50600436106103205760003560e01c80638456cb59116101a7578063c2f6afe5116100ee578063e050be5711610097578063f7b188a511610071578063f7b188a5146107a4578063fc0c546a146107ac578063fd433ec0146107d357600080fd5b8063e050be571461074e578063f40e349f14610771578063f55ebb8f1461078457600080fd5b8063d2c1626c116100c8578063d2c1626c146106f8578063d9fb265d1461070b578063de7974a41461072e57600080fd5b8063c2f6afe5146106b6578063cd84980e146106c9578063cdbdfdc2146106f057600080fd5b80639b8c624a11610150578063b61325cd1161012a578063b61325cd14610683578063b61d27f61461068c578063c2624e1e146106ad57600080fd5b80639b8c624a1461060e578063a3a6d9e814610621578063b32c4d8d1461063457600080fd5b80638e714a72116101815780638e714a7214610587578063907c6c2e1461059a5780639ace38c2146105ba57600080fd5b80638456cb59146105575780638b928bd31461055f5780638da5cb5b1461056757600080fd5b80633beaf5261161026b5780635c975abb1161021457806366e64f97116101ee57806366e64f971461051c57806379ba5097146105285780638304e6d21461053057600080fd5b80635c975abb146104c95780635f62fa6f146104e6578063652dfc3b1461050957600080fd5b806353a47bb71161024557806353a47bb71461048d57806359c13403146104ad5780635b65b9ab146104b657600080fd5b80633beaf526146104395780634a474aa31461044c578063525862f91461045f57600080fd5b8063165282c3116102cd57806333032dd0116102a757806333032dd01461040a57806333efa2b21461041357806336f734c11461042657600080fd5b8063165282c3146103a25780632d11c58a146103b5578063327107f7146103be57600080fd5b806307cca166116102fe57806307cca16614610369578063081c46241461037c5780631627540c1461038f57600080fd5b8063024faa8c1461032557806305ab421d1461034157806305c211d214610356575b600080fd5b61032e60085481565b6040519081526020015b60405180910390f35b61035461034f366004613633565b6107e6565b005b61035461036436600461365d565b610918565b610354610377366004613697565b610cb7565b61035461038a3660046136ce565b610dc2565b61035461039d3660046136f3565b610e4d565b61032e6103b036600461370e565b610f3d565b61032e60095481565b6103e57f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610338565b61032e60075481565b610354610421366004613730565b610fbc565b61035461043436600461376b565b611752565b61032e61044736600461370e565b611b3f565b61035461045a366004613797565b611d67565b61047261046d36600461370e565b611ee7565b60408051938452602084019290925290820152606001610338565b6001546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b61032e600a5481565b6103546104c436600461376b565b612000565b6006546104d69060ff1681565b6040519015158152602001610338565b6104d66104f43660046136f3565b60056020526000908152604090205460ff1681565b6103546105173660046137b0565b612123565b61032e6402540be40081565b6103546121e7565b61032e7f000000000000000000000000000000000000000000000000000000000000000081565b610354612324565b600f5461032e565b6000546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6103546105953660046136f3565b61240f565b6105ad6105a836600461370e565b61251e565b6040516103389190613836565b6105cd6105c8366004613797565b6126ae565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845267ffffffffffffffff909216602084015263ffffffff1690820152606001610338565b61035461061c3660046136f3565b61272f565b61035461062f3660046138cd565b61283e565b610647610642366004613797565b61294e565b6040805167ffffffffffffffff96871681529486166020860152928516928401929092529092166060820152608081019190915260a001610338565b61032e600e5481565b61069f61069a366004613942565b6129ce565b6040516103389291906139ed565b61032e600b5481565b6103546106c436600461370e565b612b5a565b61032e7f000000000000000000000000000000000000000000000000000000000000000081565b600c5461032e565b6103546107063660046136f3565b612cae565b6104d66107193660046136f3565b60046020526000908152604090205460ff1681565b6003546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6104d661075c366004613797565b600d6020526000908152604090205460ff1681565b61035461077f36600461370e565b612dbd565b6002546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6103546130da565b6103e57f000000000000000000000000000000000000000000000000000000000000000081565b6103546107e1366004613797565b613165565b60005473ffffffffffffffffffffffffffffffffffffffff16331461086c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166108e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5a65726f2061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610863565b6109147f00000000000000000000000000000000000000000000000000000000000000008383613172565b5050565b60065460ff1615610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b6402540be4006109958184613a76565b61099f9190613ab1565b336000908152600560205260408120549193509060ff16156109c3575060006109f7565b6109f46109ec600a54612710600954876109dd9190613ab1565b6109e79190613a76565b6132e2565b600b546132f8565b90505b808311610a60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416d6f756e7420746f6f206c6f770000000000000000000000000000000000006044820152606401610863565b67ffffffffffffffff610a786402540be40085613a76565b1115610ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f416d6f756e7420746f6f206869676800000000000000000000000000000000006044820152606401610863565b610b0c7f0000000000000000000000000000000000000000000000000000000000000000333086613307565b60006402540be400610b1e8386613ac8565b610b289190613a76565b600c5490915073ffffffffffffffffffffffffffffffffffffffff8416907f0250c838bae2cda1e214f0925d41846180714450539039d6fd90a4121d98738e9086610b826402540be40067ffffffffffffffff8716613ab1565b6040805193845260208401929092529082015242606082015260800160405180910390a26040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815267ffffffffffffffff9283166020820190815263ffffffff428116938301938452600c805460018101825560009190915292517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79093018054925194519091167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490951674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921692909616919091171716179091555050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff821660008181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f6a5f1fd939b33c2480886a44e0780806ce19041ef2c91734cb752c54288ca5ac910160405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b6109148282613480565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b6000825b828111610fa557600c8181548110610f5b57610f5b613adb565b600091825260209091200154610f939074010000000000000000000000000000000000000000900467ffffffffffffffff1683613b0a565b9150610f9e81613b1d565b9050610f41565b50610fb56402540be40082613ab1565b9392505050565b60065460ff1615611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f74206669727374206f6666696365720000000000000000000000000000006044820152606401610863565b600e8054600091600f9190836110bf83613b1d565b91905055815481106110d3576110d3613adb565b60009182526020918290206040805160a0810182526002909302909101805467ffffffffffffffff8082168552680100000000000000008204811695850195909552700100000000000000000000000000000000810485169284019290925278010000000000000000000000000000000000000000000000009091049092166060820181905260019092015460808201529150156111cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42617463682064697370757465640000000000000000000000000000000000006044820152606401610863565b805167ffffffffffffffff16823514611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b806020015167ffffffffffffffff1660018380602001906112639190613b55565b8451611279925067ffffffffffffffff16613b0a565b6112839190613ac8565b146112ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672073697a65000000000000000000000000000000000000000000006044820152606401610863565b60085460408201516113069067ffffffffffffffff1642613ac8565b101561136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f546f6f20736f6f6e0000000000000000000000000000000000000000000000006044820152606401610863565b8051604051600091611476917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091602001948552606093841b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090811660208701526034860193909352921b16605483015260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016606882015260700190565b60405160208183030381529060405280519060200120905060005b61149e6020850185613b55565b905081101561168757600d600082856000015167ffffffffffffffff166114c59190613b0a565b815260208101919091526040016000205460ff16611588576115887f000000000000000000000000000000000000000000000000000000000000000061150e6020870187613b55565b8481811061151e5761151e613adb565b61153492602060609092020190810191506136f3565b6402540be4006115476020890189613b55565b8681811061155757611557613adb565b905060600201602001602081019061156f9190613bc3565b67ffffffffffffffff166115839190613ab1565b613172565b816115966020860186613b55565b838181106115a6576115a6613adb565b6115bc92602060609092020190810191506136f3565b6115c96020870187613b55565b848181106115d9576115d9613adb565b90506060020160200160208101906115f19190613bc3565b60405160200161165e9392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b6040516020818303038152906040528051906020012091508061168090613b1d565b9050611491565b50808260800151146116f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81516020808401516040805167ffffffffffffffff9485168152939091169183019190915281018290527fce67cdf2a5dbd123a7aa5e9fd21b2136e06d33eb30e024ee5c491a6ec934a48b906060015b60405180910390a1505050565b60065460ff16156117bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60025473ffffffffffffffffffffffffffffffffffffffff163314611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f74206361707461696e0000000000000000000000000000000000000000006044820152606401610863565b600f5415801561184e575082155b806118bf5750600f54158015906118bf5750600f805461187090600190613ac8565b8154811061188057611880613adb565b60009182526020909120600290910201546118b29068010000000000000000900467ffffffffffffffff166001613bed565b67ffffffffffffffff1683145b611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b82821015801561193c575067ffffffffffffffff82105b6119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f57726f6e6720656e6400000000000000000000000000000000000000000000006044820152606401610863565b6040805160a08101825267ffffffffffffffff80861682528481166020830190815242821693830193845260006060840181815260808501878152600f80546001818101835594829052965160029097027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281018054965199519451881678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff95891670010000000000000000000000000000000002959095166fffffffffffffffffffffffffffffffff9a891668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090981699909816989098179590951797909716949094171790935590517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8039091015590547fe078fb854f34cd8ca5f749fe2e680b692ef7df5e057026369a30c8965a3219ca91611b1d91613ac8565b6040805191825260208201869052810184905260608101839052608001611745565b604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000606090811b8216848601527f000000000000000000000000000000000000000000000000000000000000000060548501527f0000000000000000000000000000000000000000000000000000000000000000901b1660748301527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b1660888301528251808303607001815260909092019092528051910120600090835b838111611d5d5781600c8281548110611c6c57611c6c613adb565b600091825260209091200154600c805473ffffffffffffffffffffffffffffffffffffffff9092169184908110611ca557611ca5613adb565b9060005260206000200160000160149054906101000a900467ffffffffffffffff16604051602001611d349392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b60405160208183030381529060405280519060200120915080611d5690613b1d565b9050611c51565b5090505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611de8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b80600e541115611e54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f54811015611eb057600f805480611e6f57611e6f613c0e565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600101559055611e54565b6040518181527f992e817214d6c9aa9d52b4faf1913b1d1321ce1a6ff98258e88a5d78e71a0183906020015b60405180910390a150565b60008060008060075442611efb9190613ac8565b600c5490915086108015611f52575080600c8781548110611f1e57611f1e613adb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16105b15611ff8578593506001611f668686613b0a565b611f709190613ac8565b600c549093508310611f8e57600c54611f8b90600190613ac8565b92505b80600c8481548110611fa257611fa2613adb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1610611feb5782611fe381613c3d565b935050611f8e565b611ff58484611b3f565b91505b509250925092565b60005473ffffffffffffffffffffffffffffffffffffffff163314612081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b6064831061208e57600080fd5b68056bc75e2d6310000082106120a357600080fd5b683635c9adc5dea0000081106120b857600080fd5b600954600a54600b54604080519384526020840187905283019190915260608201849052608082015260a081018290527f0bc992b511038194430d3b93b01ed9d312562944591645c91130b33b0d920d139060c00160405180910390a1600992909255600a55600b55565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60005b828110156121e1576121d18484838181106121c4576121c4613adb565b9050602002013583613480565b6121da81613b1d565b90506121a7565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152608401610863565b6001546000805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a360018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b3360009081526004602052604090205460ff1680612359575060005473ffffffffffffffffffffffffffffffffffffffff1633145b8061237b575060025473ffffffffffffffffffffffffffffffffffffffff1633145b8061239d575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612403576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b61240d60016135ab565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60025460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff18effac70e61c427eeb822dabc8c030ad0d6178e38899b5436e10f9b599028f90600090a3600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b604080518082019091526060602082015282815261253c8383613ac8565b612547906001613b0a565b67ffffffffffffffff81111561255f5761255f613c72565b6040519080825280602002602001820160405280156125c857816020015b60408051606081018252600080825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161257d5790505b506020820152825b8281116126a757600c81815481106125ea576125ea613adb565b600091825260209182902060408051606081018252929091015473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000810467ffffffffffffffff16838501527c0100000000000000000000000000000000000000000000000000000000900463ffffffff16908201529083015161267b8684613ac8565b8151811061268b5761268b613adb565b6020026020010181905250806126a090613b1d565b90506125d0565b5092915050565b600c81815481106126be57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8116915074010000000000000000000000000000000000000000810467ffffffffffffffff16907c0100000000000000000000000000000000000000000000000000000000900463ffffffff1683565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60035460405173ffffffffffffffffffffffffffffffffffffffff8084169216907fd64fbe94bc529b7e39db059497f4956a94c5ade6b2df42325818876b1c013bcd90600090a3600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008461284b578761286d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290526064810188905260ff8616608482015260a4810185905260c481018490529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063d505accf9060e401600060405180830381600087803b15801561292257600080fd5b505af1158015612936573d6000803e3d6000fd5b505050506129448188610918565b5050505050505050565b600f818154811061295e57600080fd5b60009182526020909120600290910201805460019091015467ffffffffffffffff8083169350680100000000000000008304811692700100000000000000000000000000000000810482169278010000000000000000000000000000000000000000000000009091049091169085565b6000805460609073ffffffffffffffffffffffffffffffffffffffff163314612a53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b821580612a77575060008673ffffffffffffffffffffffffffffffffffffffff163b115b612add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f43616e206e6f742063616c6c20612066756e6374696f6e206f6e206120454f416044820152606401610863565b6000808773ffffffffffffffffffffffffffffffffffffffff16878787604051612b08929190613ca1565b60006040518083038185875af1925050503d8060008114612b45576040519150601f19603f3d011682016040523d82523d6000602084013e612b4a565b606091505b5090999098509650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b610e108210158015612bef5750610e108110155b612c55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506572696f6420746f6f2073686f7274000000000000000000000000000000006044820152606401610863565b6007546008546040805192835260208301919091528101839052606081018290527f7e8d6c37faafc79578015f383c6a5d31a846c93210a9d639e01843943e9fd5f89060800160405180910390a1600791909155600855565b60005473ffffffffffffffffffffffffffffffffffffffff163314612d2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260056020908152604091829020805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921682179092558351948552161515908301527f017149285d09d144b60699c89d370abbf31f058fc660d50c3881391f93af1bd79101611edc565b3360009081526004602052604090205460ff1680612df2575060005473ffffffffffffffffffffffffffffffffffffffff1633145b80612e14575060025473ffffffffffffffffffffffffffffffffffffffff1633145b80612e36575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612e9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b80600f8381548110612eb057612eb0613adb565b90600052602060002090600202016001015414612f29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81600e541115612f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f8281548110612fa857612fa8613adb565b60009182526020909120600290910201547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1615613046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206469737075746564000000000000000000006044820152606401610863565b6001600f838154811061305b5761305b613adb565b906000526020600020906002020160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555061309c60016135ab565b60408051838152602081018390527f2292bdbb5281fd856c02c8a97b23b28fd9c47e895224d5262ef02c9647c1ebc091015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461315b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b61240d60006135ab565b61316f8133610918565b50565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916132099190613cb1565b6000604051808303816000865af19150503d8060008114613246576040519150601f19603f3d011682016040523d82523d6000602084013e61324b565b606091505b50915091508180156132755750805115806132755750808060200190518101906132759190613ccd565b6132db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f53540000000000000000000000000000000000000000000000000000000000006044820152606401610863565b5050505050565b60008183116132f15781610fb5565b5090919050565b60008183106132f15781610fb5565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916133a69190613cb1565b6000604051808303816000865af19150503d80600081146133e3576040519150601f19603f3d011682016040523d82523d6000602084013e6133e8565b606091505b50915091508180156134125750805115806134125750808060200190518101906134129190613ccd565b613478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f53544600000000000000000000000000000000000000000000000000000000006044820152606401610863565b505050505050565b600e5415806134d55750600f6001600e5461349b9190613ac8565b815481106134ab576134ab613adb565b600091825260209091206002909102015468010000000000000000900467ffffffffffffffff1682115b61353b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5472616e73616374696f6e20616c7265616479206578656375746564000000006044820152606401610863565b6000828152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415159081179091558251858152918201527fdf11c22eefc5804dfbf9c567c2522c17e93416278a0f8a6f8e8f327ee6cb032e91016130ce565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f9422424b175dda897495a07b091ef74a3ef715cf6d866fc972954c1c7f45930490602001611edc565b803573ffffffffffffffffffffffffffffffffffffffff8116811461362e57600080fd5b919050565b6000806040838503121561364657600080fd5b61364f8361360a565b946020939093013593505050565b6000806040838503121561367057600080fd5b823591506136806020840161360a565b90509250929050565b801515811461316f57600080fd5b600080604083850312156136aa57600080fd5b6136b38361360a565b915060208301356136c381613689565b809150509250929050565b600080604083850312156136e157600080fd5b8235915060208301356136c381613689565b60006020828403121561370557600080fd5b610fb58261360a565b6000806040838503121561372157600080fd5b50508035926020909101359150565b60006020828403121561374257600080fd5b813567ffffffffffffffff81111561375957600080fd5b820160408185031215610fb557600080fd5b60008060006060848603121561378057600080fd5b505081359360208301359350604090920135919050565b6000602082840312156137a957600080fd5b5035919050565b6000806000604084860312156137c557600080fd5b833567ffffffffffffffff808211156137dd57600080fd5b818601915086601f8301126137f157600080fd5b81358181111561380057600080fd5b8760208260051b850101111561381557600080fd5b6020928301955093505084013561382b81613689565b809150509250925092565b60006020808352606080840185518386015282860151604080818801528282518085526080890191508684019450600093505b808410156138c0578451805173ffffffffffffffffffffffffffffffffffffffff1683528781015167ffffffffffffffff168884015283015163ffffffff1683830152938601936001939093019290850190613869565b5098975050505050505050565b600080600080600080600060e0888a0312156138e857600080fd5b873596506138f86020890161360a565b955060408801359450606088013561390f81613689565b9350608088013560ff8116811461392557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806000806060858703121561395857600080fd5b6139618561360a565b935060208501359250604085013567ffffffffffffffff8082111561398557600080fd5b818701915087601f83011261399957600080fd5b8135818111156139a857600080fd5b8860208285010111156139ba57600080fd5b95989497505060200194505050565b60005b838110156139e45781810151838201526020016139cc565b50506000910152565b82151581526040602082015260008251806040840152613a148160608501602087016139c9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082613aac577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417611d6157611d61613a47565b81810381811115611d6157611d61613a47565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115611d6157611d61613a47565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b4e57613b4e613a47565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b8a57600080fd5b83018035915067ffffffffffffffff821115613ba557600080fd5b6020019150606081023603821315613bbc57600080fd5b9250929050565b600060208284031215613bd557600080fd5b813567ffffffffffffffff81168114610fb557600080fd5b67ffffffffffffffff8181168382160190808211156126a7576126a7613a47565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081613c4c57613c4c613a47565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8183823760009101908152919050565b60008251613cc38184602087016139c9565b9190910192915050565b600060208284031215613cdf57600080fd5b8151610fb58161368956fea264697066735822122069e7c5f063e7a539f17de9d4599662f3a8e3777ea146d5d6195727dcb75e03ee64736f6c63430008110033000000000000000000000000ff8544fed5379d9ffa8d47a74ce6b91e632ac44d000000000000000000000000000000000000000000000000000000000000044d000000000000000000000000853d955acef822db058eb8505911ed77f175b99e0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103205760003560e01c80638456cb59116101a7578063c2f6afe5116100ee578063e050be5711610097578063f7b188a511610071578063f7b188a5146107a4578063fc0c546a146107ac578063fd433ec0146107d357600080fd5b8063e050be571461074e578063f40e349f14610771578063f55ebb8f1461078457600080fd5b8063d2c1626c116100c8578063d2c1626c146106f8578063d9fb265d1461070b578063de7974a41461072e57600080fd5b8063c2f6afe5146106b6578063cd84980e146106c9578063cdbdfdc2146106f057600080fd5b80639b8c624a11610150578063b61325cd1161012a578063b61325cd14610683578063b61d27f61461068c578063c2624e1e146106ad57600080fd5b80639b8c624a1461060e578063a3a6d9e814610621578063b32c4d8d1461063457600080fd5b80638e714a72116101815780638e714a7214610587578063907c6c2e1461059a5780639ace38c2146105ba57600080fd5b80638456cb59146105575780638b928bd31461055f5780638da5cb5b1461056757600080fd5b80633beaf5261161026b5780635c975abb1161021457806366e64f97116101ee57806366e64f971461051c57806379ba5097146105285780638304e6d21461053057600080fd5b80635c975abb146104c95780635f62fa6f146104e6578063652dfc3b1461050957600080fd5b806353a47bb71161024557806353a47bb71461048d57806359c13403146104ad5780635b65b9ab146104b657600080fd5b80633beaf526146104395780634a474aa31461044c578063525862f91461045f57600080fd5b8063165282c3116102cd57806333032dd0116102a757806333032dd01461040a57806333efa2b21461041357806336f734c11461042657600080fd5b8063165282c3146103a25780632d11c58a146103b5578063327107f7146103be57600080fd5b806307cca166116102fe57806307cca16614610369578063081c46241461037c5780631627540c1461038f57600080fd5b8063024faa8c1461032557806305ab421d1461034157806305c211d214610356575b600080fd5b61032e60085481565b6040519081526020015b60405180910390f35b61035461034f366004613633565b6107e6565b005b61035461036436600461365d565b610918565b610354610377366004613697565b610cb7565b61035461038a3660046136ce565b610dc2565b61035461039d3660046136f3565b610e4d565b61032e6103b036600461370e565b610f3d565b61032e60095481565b6103e57f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610338565b61032e60075481565b610354610421366004613730565b610fbc565b61035461043436600461376b565b611752565b61032e61044736600461370e565b611b3f565b61035461045a366004613797565b611d67565b61047261046d36600461370e565b611ee7565b60408051938452602084019290925290820152606001610338565b6001546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b61032e600a5481565b6103546104c436600461376b565b612000565b6006546104d69060ff1681565b6040519015158152602001610338565b6104d66104f43660046136f3565b60056020526000908152604090205460ff1681565b6103546105173660046137b0565b612123565b61032e6402540be40081565b6103546121e7565b61032e7f000000000000000000000000000000000000000000000000000000000000000181565b610354612324565b600f5461032e565b6000546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6103546105953660046136f3565b61240f565b6105ad6105a836600461370e565b61251e565b6040516103389190613836565b6105cd6105c8366004613797565b6126ae565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845267ffffffffffffffff909216602084015263ffffffff1690820152606001610338565b61035461061c3660046136f3565b61272f565b61035461062f3660046138cd565b61283e565b610647610642366004613797565b61294e565b6040805167ffffffffffffffff96871681529486166020860152928516928401929092529092166060820152608081019190915260a001610338565b61032e600e5481565b61069f61069a366004613942565b6129ce565b6040516103389291906139ed565b61032e600b5481565b6103546106c436600461370e565b612b5a565b61032e7f000000000000000000000000000000000000000000000000000000000000044d81565b600c5461032e565b6103546107063660046136f3565b612cae565b6104d66107193660046136f3565b60046020526000908152604090205460ff1681565b6003546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6104d661075c366004613797565b600d6020526000908152604090205460ff1681565b61035461077f36600461370e565b612dbd565b6002546103e59073ffffffffffffffffffffffffffffffffffffffff1681565b6103546130da565b6103e57f000000000000000000000000ff8544fed5379d9ffa8d47a74ce6b91e632ac44d81565b6103546107e1366004613797565b613165565b60005473ffffffffffffffffffffffffffffffffffffffff16331461086c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e6572000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166108e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5a65726f2061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610863565b6109147f000000000000000000000000ff8544fed5379d9ffa8d47a74ce6b91e632ac44d8383613172565b5050565b60065460ff1615610985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b6402540be4006109958184613a76565b61099f9190613ab1565b336000908152600560205260408120549193509060ff16156109c3575060006109f7565b6109f46109ec600a54612710600954876109dd9190613ab1565b6109e79190613a76565b6132e2565b600b546132f8565b90505b808311610a60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416d6f756e7420746f6f206c6f770000000000000000000000000000000000006044820152606401610863565b67ffffffffffffffff610a786402540be40085613a76565b1115610ae0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f416d6f756e7420746f6f206869676800000000000000000000000000000000006044820152606401610863565b610b0c7f000000000000000000000000ff8544fed5379d9ffa8d47a74ce6b91e632ac44d333086613307565b60006402540be400610b1e8386613ac8565b610b289190613a76565b600c5490915073ffffffffffffffffffffffffffffffffffffffff8416907f0250c838bae2cda1e214f0925d41846180714450539039d6fd90a4121d98738e9086610b826402540be40067ffffffffffffffff8716613ab1565b6040805193845260208401929092529082015242606082015260800160405180910390a26040805160608101825273ffffffffffffffffffffffffffffffffffffffff948516815267ffffffffffffffff9283166020820190815263ffffffff428116938301938452600c805460018101825560009190915292517fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c79093018054925194519091167c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490951674010000000000000000000000000000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921692909616919091171716179091555050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff821660008181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f6a5f1fd939b33c2480886a44e0780806ce19041ef2c91734cb752c54288ca5ac910160405180910390a25050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b6109148282613480565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ece576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b6000825b828111610fa557600c8181548110610f5b57610f5b613adb565b600091825260209091200154610f939074010000000000000000000000000000000000000000900467ffffffffffffffff1683613b0a565b9150610f9e81613b1d565b9050610f41565b50610fb56402540be40082613ab1565b9392505050565b60065460ff1615611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60035473ffffffffffffffffffffffffffffffffffffffff1633146110aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4e6f74206669727374206f6666696365720000000000000000000000000000006044820152606401610863565b600e8054600091600f9190836110bf83613b1d565b91905055815481106110d3576110d3613adb565b60009182526020918290206040805160a0810182526002909302909101805467ffffffffffffffff8082168552680100000000000000008204811695850195909552700100000000000000000000000000000000810485169284019290925278010000000000000000000000000000000000000000000000009091049092166060820181905260019092015460808201529150156111cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42617463682064697370757465640000000000000000000000000000000000006044820152606401610863565b805167ffffffffffffffff16823514611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b806020015167ffffffffffffffff1660018380602001906112639190613b55565b8451611279925067ffffffffffffffff16613b0a565b6112839190613ac8565b146112ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672073697a65000000000000000000000000000000000000000000006044820152606401610863565b60085460408201516113069067ffffffffffffffff1642613ac8565b101561136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f546f6f20736f6f6e0000000000000000000000000000000000000000000000006044820152606401610863565b8051604051600091611476917f0000000000000000000000000000000000000000000000000000000000000001917f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e917f000000000000000000000000000000000000000000000000000000000000044d917f000000000000000000000000ff8544fed5379d9ffa8d47a74ce6b91e632ac44d91602001948552606093841b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090811660208701526034860193909352921b16605483015260c01b7fffffffffffffffff00000000000000000000000000000000000000000000000016606882015260700190565b60405160208183030381529060405280519060200120905060005b61149e6020850185613b55565b905081101561168757600d600082856000015167ffffffffffffffff166114c59190613b0a565b815260208101919091526040016000205460ff16611588576115887f000000000000000000000000ff8544fed5379d9ffa8d47a74ce6b91e632ac44d61150e6020870187613b55565b8481811061151e5761151e613adb565b61153492602060609092020190810191506136f3565b6402540be4006115476020890189613b55565b8681811061155757611557613adb565b905060600201602001602081019061156f9190613bc3565b67ffffffffffffffff166115839190613ab1565b613172565b816115966020860186613b55565b838181106115a6576115a6613adb565b6115bc92602060609092020190810191506136f3565b6115c96020870187613b55565b848181106115d9576115d9613adb565b90506060020160200160208101906115f19190613bc3565b60405160200161165e9392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b6040516020818303038152906040528051906020012091508061168090613b1d565b9050611491565b50808260800151146116f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81516020808401516040805167ffffffffffffffff9485168152939091169183019190915281018290527fce67cdf2a5dbd123a7aa5e9fd21b2136e06d33eb30e024ee5c491a6ec934a48b906060015b60405180910390a1505050565b60065460ff16156117bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f50617573656400000000000000000000000000000000000000000000000000006044820152606401610863565b60025473ffffffffffffffffffffffffffffffffffffffff163314611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4e6f74206361707461696e0000000000000000000000000000000000000000006044820152606401610863565b600f5415801561184e575082155b806118bf5750600f54158015906118bf5750600f805461187090600190613ac8565b8154811061188057611880613adb565b60009182526020909120600290910201546118b29068010000000000000000900467ffffffffffffffff166001613bed565b67ffffffffffffffff1683145b611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f57726f6e672073746172740000000000000000000000000000000000000000006044820152606401610863565b82821015801561193c575067ffffffffffffffff82105b6119a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f57726f6e6720656e6400000000000000000000000000000000000000000000006044820152606401610863565b6040805160a08101825267ffffffffffffffff80861682528481166020830190815242821693830193845260006060840181815260808501878152600f80546001818101835594829052965160029097027f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80281018054965199519451881678010000000000000000000000000000000000000000000000000277ffffffffffffffffffffffffffffffffffffffffffffffff95891670010000000000000000000000000000000002959095166fffffffffffffffffffffffffffffffff9a891668010000000000000000027fffffffffffffffffffffffffffffffff0000000000000000000000000000000090981699909816989098179590951797909716949094171790935590517f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8039091015590547fe078fb854f34cd8ca5f749fe2e680b692ef7df5e057026369a30c8965a3219ca91611b1d91613ac8565b6040805191825260208201869052810184905260608101839052608001611745565b604080517f000000000000000000000000000000000000000000000000000000000000044d6020808301919091527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000007f000000000000000000000000ff8544fed5379d9ffa8d47a74ce6b91e632ac44d606090811b8216848601527f000000000000000000000000000000000000000000000000000000000000000160548501527f000000000000000000000000853d955acef822db058eb8505911ed77f175b99e901b1660748301527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b1660888301528251808303607001815260909092019092528051910120600090835b838111611d5d5781600c8281548110611c6c57611c6c613adb565b600091825260209091200154600c805473ffffffffffffffffffffffffffffffffffffffff9092169184908110611ca557611ca5613adb565b9060005260206000200160000160149054906101000a900467ffffffffffffffff16604051602001611d349392919092835260609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260c01b7fffffffffffffffff000000000000000000000000000000000000000000000000166034820152603c0190565b60405160208183030381529060405280519060200120915080611d5690613b1d565b9050611c51565b5090505b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611de8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b80600e541115611e54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f54811015611eb057600f805480611e6f57611e6f613c0e565b60008281526020812060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90930192830201818155600101559055611e54565b6040518181527f992e817214d6c9aa9d52b4faf1913b1d1321ce1a6ff98258e88a5d78e71a0183906020015b60405180910390a150565b60008060008060075442611efb9190613ac8565b600c5490915086108015611f52575080600c8781548110611f1e57611f1e613adb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16105b15611ff8578593506001611f668686613b0a565b611f709190613ac8565b600c549093508310611f8e57600c54611f8b90600190613ac8565b92505b80600c8481548110611fa257611fa2613adb565b6000918252602090912001547c0100000000000000000000000000000000000000000000000000000000900463ffffffff1610611feb5782611fe381613c3d565b935050611f8e565b611ff58484611b3f565b91505b509250925092565b60005473ffffffffffffffffffffffffffffffffffffffff163314612081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b6064831061208e57600080fd5b68056bc75e2d6310000082106120a357600080fd5b683635c9adc5dea0000081106120b857600080fd5b600954600a54600b54604080519384526020840187905283019190915260608201849052608082015260a081018290527f0bc992b511038194430d3b93b01ed9d312562944591645c91130b33b0d920d139060c00160405180910390a1600992909255600a55600b55565b60005473ffffffffffffffffffffffffffffffffffffffff1633146121a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60005b828110156121e1576121d18484838181106121c4576121c4613adb565b9050602002013583613480565b6121da81613b1d565b90506121a7565b50505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461228e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560448201527f2063616e20616363657074206f776e65727368697000000000000000000000006064820152608401610863565b6001546000805460405173ffffffffffffffffffffffffffffffffffffffff93841693909116917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a360018054600080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b3360009081526004602052604090205460ff1680612359575060005473ffffffffffffffffffffffffffffffffffffffff1633145b8061237b575060025473ffffffffffffffffffffffffffffffffffffffff1633145b8061239d575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612403576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b61240d60016135ab565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60025460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff18effac70e61c427eeb822dabc8c030ad0d6178e38899b5436e10f9b599028f90600090a3600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b604080518082019091526060602082015282815261253c8383613ac8565b612547906001613b0a565b67ffffffffffffffff81111561255f5761255f613c72565b6040519080825280602002602001820160405280156125c857816020015b60408051606081018252600080825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161257d5790505b506020820152825b8281116126a757600c81815481106125ea576125ea613adb565b600091825260209182902060408051606081018252929091015473ffffffffffffffffffffffffffffffffffffffff8116835274010000000000000000000000000000000000000000810467ffffffffffffffff16838501527c0100000000000000000000000000000000000000000000000000000000900463ffffffff16908201529083015161267b8684613ac8565b8151811061268b5761268b613adb565b6020026020010181905250806126a090613b1d565b90506125d0565b5092915050565b600c81815481106126be57600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff8116915074010000000000000000000000000000000000000000810467ffffffffffffffff16907c0100000000000000000000000000000000000000000000000000000000900463ffffffff1683565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b60035460405173ffffffffffffffffffffffffffffffffffffffff8084169216907fd64fbe94bc529b7e39db059497f4956a94c5ade6b2df42325818876b1c013bcd90600090a3600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008461284b578761286d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018290526064810188905260ff8616608482015260a4810185905260c481018490529091507f000000000000000000000000ff8544fed5379d9ffa8d47a74ce6b91e632ac44d73ffffffffffffffffffffffffffffffffffffffff169063d505accf9060e401600060405180830381600087803b15801561292257600080fd5b505af1158015612936573d6000803e3d6000fd5b505050506129448188610918565b5050505050505050565b600f818154811061295e57600080fd5b60009182526020909120600290910201805460019091015467ffffffffffffffff8083169350680100000000000000008304811692700100000000000000000000000000000000810482169278010000000000000000000000000000000000000000000000009091049091169085565b6000805460609073ffffffffffffffffffffffffffffffffffffffff163314612a53576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b821580612a77575060008673ffffffffffffffffffffffffffffffffffffffff163b115b612add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f43616e206e6f742063616c6c20612066756e6374696f6e206f6e206120454f416044820152606401610863565b6000808773ffffffffffffffffffffffffffffffffffffffff16878787604051612b08929190613ca1565b60006040518083038185875af1925050503d8060008114612b45576040519150601f19603f3d011682016040523d82523d6000602084013e612b4a565b606091505b5090999098509650505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314612bdb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b610e108210158015612bef5750610e108110155b612c55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f506572696f6420746f6f2073686f7274000000000000000000000000000000006044820152606401610863565b6007546008546040805192835260208301919091528101839052606081018290527f7e8d6c37faafc79578015f383c6a5d31a846c93210a9d639e01843943e9fd5f89060800160405180910390a1600791909155600855565b60005473ffffffffffffffffffffffffffffffffffffffff163314612d2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b73ffffffffffffffffffffffffffffffffffffffff8116600081815260056020908152604091829020805460ff808216157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090921682179092558351948552161515908301527f017149285d09d144b60699c89d370abbf31f058fc660d50c3881391f93af1bd79101611edc565b3360009081526004602052604090205460ff1680612df2575060005473ffffffffffffffffffffffffffffffffffffffff1633145b80612e14575060025473ffffffffffffffffffffffffffffffffffffffff1633145b80612e36575060035473ffffffffffffffffffffffffffffffffffffffff1633145b612e9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f4e6f7420637265776d656d6265720000000000000000000000000000000000006044820152606401610863565b80600f8381548110612eb057612eb0613adb565b90600052602060002090600202016001015414612f29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f57726f6e672068617368000000000000000000000000000000000000000000006044820152606401610863565b81600e541115612f95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206578656375746564000000000000000000006044820152606401610863565b600f8281548110612fa857612fa8613adb565b60009182526020909120600290910201547801000000000000000000000000000000000000000000000000900467ffffffffffffffff1615613046576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f426174636820616c7265616479206469737075746564000000000000000000006044820152606401610863565b6001600f838154811061305b5761305b613adb565b906000526020600020906002020160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555061309c60016135ab565b60408051838152602081018390527f2292bdbb5281fd856c02c8a97b23b28fd9c47e895224d5262ef02c9647c1ebc091015b60405180910390a15050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461315b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e657200000000000000000000000000000000000000000000006044820152606401610863565b61240d60006135ab565b61316f8133610918565b50565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916132099190613cb1565b6000604051808303816000865af19150503d8060008114613246576040519150601f19603f3d011682016040523d82523d6000602084013e61324b565b606091505b50915091508180156132755750805115806132755750808060200190518101906132759190613ccd565b6132db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f53540000000000000000000000000000000000000000000000000000000000006044820152606401610863565b5050505050565b60008183116132f15781610fb5565b5090919050565b60008183106132f15781610fb5565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291516000928392908816916133a69190613cb1565b6000604051808303816000865af19150503d80600081146133e3576040519150601f19603f3d011682016040523d82523d6000602084013e6133e8565b606091505b50915091508180156134125750805115806134125750808060200190518101906134129190613ccd565b613478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f53544600000000000000000000000000000000000000000000000000000000006044820152606401610863565b505050505050565b600e5415806134d55750600f6001600e5461349b9190613ac8565b815481106134ab576134ab613adb565b600091825260209091206002909102015468010000000000000000900467ffffffffffffffff1682115b61353b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f5472616e73616374696f6e20616c7265616479206578656375746564000000006044820152606401610863565b6000828152600d602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168415159081179091558251858152918201527fdf11c22eefc5804dfbf9c567c2522c17e93416278a0f8a6f8e8f327ee6cb032e91016130ce565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f9422424b175dda897495a07b091ef74a3ef715cf6d866fc972954c1c7f45930490602001611edc565b803573ffffffffffffffffffffffffffffffffffffffff8116811461362e57600080fd5b919050565b6000806040838503121561364657600080fd5b61364f8361360a565b946020939093013593505050565b6000806040838503121561367057600080fd5b823591506136806020840161360a565b90509250929050565b801515811461316f57600080fd5b600080604083850312156136aa57600080fd5b6136b38361360a565b915060208301356136c381613689565b809150509250929050565b600080604083850312156136e157600080fd5b8235915060208301356136c381613689565b60006020828403121561370557600080fd5b610fb58261360a565b6000806040838503121561372157600080fd5b50508035926020909101359150565b60006020828403121561374257600080fd5b813567ffffffffffffffff81111561375957600080fd5b820160408185031215610fb557600080fd5b60008060006060848603121561378057600080fd5b505081359360208301359350604090920135919050565b6000602082840312156137a957600080fd5b5035919050565b6000806000604084860312156137c557600080fd5b833567ffffffffffffffff808211156137dd57600080fd5b818601915086601f8301126137f157600080fd5b81358181111561380057600080fd5b8760208260051b850101111561381557600080fd5b6020928301955093505084013561382b81613689565b809150509250925092565b60006020808352606080840185518386015282860151604080818801528282518085526080890191508684019450600093505b808410156138c0578451805173ffffffffffffffffffffffffffffffffffffffff1683528781015167ffffffffffffffff168884015283015163ffffffff1683830152938601936001939093019290850190613869565b5098975050505050505050565b600080600080600080600060e0888a0312156138e857600080fd5b873596506138f86020890161360a565b955060408801359450606088013561390f81613689565b9350608088013560ff8116811461392557600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806000806060858703121561395857600080fd5b6139618561360a565b935060208501359250604085013567ffffffffffffffff8082111561398557600080fd5b818701915087601f83011261399957600080fd5b8135818111156139a857600080fd5b8860208285010111156139ba57600080fd5b95989497505060200194505050565b60005b838110156139e45781810151838201526020016139cc565b50506000910152565b82151581526040602082015260008251806040840152613a148160608501602087016139c9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082613aac577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082028115828204841417611d6157611d61613a47565b81810381811115611d6157611d61613a47565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115611d6157611d61613a47565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b4e57613b4e613a47565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613b8a57600080fd5b83018035915067ffffffffffffffff821115613ba557600080fd5b6020019150606081023603821315613bbc57600080fd5b9250929050565b600060208284031215613bd557600080fd5b813567ffffffffffffffff81168114610fb557600080fd5b67ffffffffffffffff8181168382160190808211156126a7576126a7613a47565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081613c4c57613c4c613a47565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b8183823760009101908152919050565b60008251613cc38184602087016139c9565b9190910192915050565b600060208284031215613cdf57600080fd5b8151610fb58161368956fea264697066735822122069e7c5f063e7a539f17de9d4599662f3a8e3777ea146d5d6195727dcb75e03ee64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ff8544fed5379d9ffa8d47a74ce6b91e632ac44d000000000000000000000000000000000000000000000000000000000000044d000000000000000000000000853d955acef822db058eb8505911ed77f175b99e0000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _token (address): 0xFf8544feD5379D9ffa8D47a74cE6b91e632AC44D
Arg [1] : _chainid (uint256): 1101
Arg [2] : _targetToken (address): 0x853d955aCEf822Db058eb8505911ED77F175b99e
Arg [3] : _targetChain (uint256): 1
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000ff8544fed5379d9ffa8d47a74ce6b91e632ac44d
Arg [1] : 000000000000000000000000000000000000000000000000000000000000044d
Arg [2] : 000000000000000000000000853d955acef822db058eb8505911ed77f175b99e
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
23112:12248:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23619:41;;;;;;;;;160:25:1;;;148:2;133:18;23619:41:0;;;;;;;;33119:209;;;;;;:::i;:::-;;:::i;:::-;;26736:831;;;;;;:::i;:::-;;:::i;32691:156::-;;;;;;:::i;:::-;;:::i;30704:99::-;;;;;;:::i;:::-;;:::i;31937:140::-;;;;;;:::i;:::-;;:::i;34550:225::-;;;;;;:::i;:::-;;:::i;23693:23::-;;;;;;23172:35;;;;;;;;2305:42:1;2293:55;;;2275:74;;2263:2;2248:18;23172:35:0;2116:239:1;23551:36:0;;;;;;28526:1037;;;;;;:::i;:::-;;:::i;28096:420::-;;;;;;:::i;:::-;;:::i;34785:369::-;;;;;;:::i;:::-;;:::i;29573:213::-;;;;;;:::i;:::-;;:::i;33737:497::-;;;;;;:::i;:::-;;:::i;:::-;;;;3643:25:1;;;3699:2;3684:18;;3677:34;;;;3727:18;;;3720:34;3631:2;3616:18;33737:497:0;3441:319:1;23321:29:0;;;;;;;;;23739:26;;;;;;31069:353;;;;;;:::i;:::-;;:::i;23522:18::-;;;;;;;;;;;;4482:14:1;;4475:22;4457:41;;4445:2;4430:18;23522::0;4317:187:1;23466:48:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30813:179;;;;;;:::i;:::-;;:::i;24051:42::-;;24089:4;24051:42;;32090:262;;;:::i;23248:33::-;;;;;30200:67;;;:::i;35272:85::-;35336:7;:14;35272:85;;23295:20;;;;;;;;;32362:135;;;;;;:::i;:::-;;:::i;34244:296::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;24104:33::-;;;;;;:::i;:::-;;:::i;:::-;;;;6559:42:1;6547:55;;;6529:74;;6651:18;6639:31;;;6634:2;6619:18;;6612:59;6719:10;6707:23;6687:18;;;6680:51;6517:2;6502:18;24104:33:0;6331:406:1;32507:170:0;;;;;;:::i;:::-;;:::i;27676:407::-;;;;;;:::i;:::-;;:::i;24217:22::-;;;;;;:::i;:::-;;:::i;:::-;;;;7764:18:1;7809:15;;;7791:34;;7861:15;;;7856:2;7841:18;;7834:43;7913:15;;;7893:18;;;7886:43;;;;7965:15;;;7960:2;7945:18;;7938:43;8012:3;7997:19;;7990:35;;;;7741:3;7726:19;24217:22:0;7503:528:1;24187:24:0;;;;;;33362:319;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;23792:28::-;;;;;;31432:436;;;;;;:::i;:::-;;:::i;23213:29::-;;;;;35167:95;35236:12;:19;35167:95;;32857:183;;;;;;:::i;:::-;;:::i;23417:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23384:27;;;;;;;;;24143:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29796:394;;;;;;:::i;:::-;;:::i;23356:22::-;;;;;;;;;30277:65;;;:::i;23137:29::-;;;;;27577:92;;;;;;:::i;:::-;;:::i;33119:209::-;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;;;;;;;;;33205:20:::1;::::0;::::1;33196:57;;;::::0;::::1;::::0;;10360:2:1;33196:57:0::1;::::0;::::1;10342:21:1::0;10399:2;10379:18;;;10372:30;10438:26;10418:18;;;10411:54;10482:18;;33196:57:0::1;10158:348:1::0;33196:57:0::1;33262:59;33298:5;33305:8;33314:6;33262:27;:59::i;:::-;33119:209:::0;;:::o;26736:831::-;26636:6;;;;26635:7;26626:26;;;;;;;10713:2:1;26626:26:0;;;10695:21:1;10752:1;10732:18;;;10725:29;10790:8;10770:18;;;10763:36;10816:18;;26626:26:0;10511:329:1;26626:26:0;24089:4:::1;26833:23;24089:4:::0;26833:6;:23:::1;:::i;:::-;26832:42;;;;:::i;:::-;26961:10;26924:8;26944:28:::0;;;:16:::1;:28;::::0;;;;;26823:51;;-1:-1:-1;26924:8:0;26944:28:::1;;26941:139;;;-1:-1:-1::0;26980:1:0::1;26941:139;;;27013:57;27022:39;27031:7;;27055:5;27046:8;;27039:6;:15;;;;:::i;:::-;:21;;;;:::i;:::-;27022:8;:39::i;:::-;27062:7;;27013:8;:57::i;:::-;27007:63;;26941:139;27104:3;27097:6;:10;27088:37;;;::::0;::::1;::::0;;11688:2:1;27088:37:0::1;::::0;::::1;11670:21:1::0;11727:2;11707:18;;;11700:30;11766:16;11746:18;;;11739:44;11800:18;;27088:37:0::1;11486:338:1::0;27088:37:0::1;27168:16;27143:23;24089:4;27143:6:::0;:23:::1;:::i;:::-;:41;;27134:69;;;::::0;::::1;::::0;;12031:2:1;27134:69:0::1;::::0;::::1;12013:21:1::0;12070:2;12050:18;;;12043:30;12109:17;12089:18;;;12082:45;12144:18;;27134:69:0::1;11829:339:1::0;27134:69:0::1;27212:79;27252:5;27259:10;27278:4;27284:6;27212:31;:79::i;:::-;27301:21;24089:4;27333:10;27340:3:::0;27333:6;:10:::1;:::i;:::-;27332:29;;;;:::i;:::-;27393:12;:19:::0;27301:61;;-1:-1:-1;27376:92:0::1;::::0;::::1;::::0;::::1;::::0;27413:6;27420:31:::1;24089:4;27420:31;::::0;::::1;;:::i;:::-;27376:92;::::0;;12537:25:1;;;12593:2;12578:18;;12571:34;;;;12621:18;;;12614:34;27452:15:0::1;12679:2:1::0;12664:18;;12657:34;12524:3;12509:19;27376:92:0::1;;;;;;;27495:61;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;;;::::1;27539:15;27495:61:::0;::::1;::::0;;;;;;27477:12:::1;:80:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;27477:80:0;;;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;::::1;;;::::0;;;-1:-1:-1;;26736:831:0:o;32691:156::-;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;32770:23:::1;::::0;::::1;;::::0;;;:11:::1;:23;::::0;;;;;;;;:27;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;32811:29;;4457:41:1;;;32811:29:0::1;::::0;4430:18:1;32811:29:0::1;;;;;;;32691:156:::0;;:::o;30704:99::-;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;30773:23:::1;30783:5;30789:6;30773:9;:23::i;31937:140::-:0;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;32007:14:::1;:25:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;32046:24:::1;::::0;::::1;::::0;-1:-1:-1;;32046:24:0::1;31937:140:::0;:::o;34550:225::-;34617:16;34656:5;34644:87;34665:3;34662:1;:6;34644:87;;34699:12;34712:1;34699:15;;;;;;;;:::i;:::-;;;;;;;;;;:22;34686:35;;34699:22;;;;;34686:35;;:::i;:::-;;-1:-1:-1;34669:3:0;;;:::i;:::-;;;34644:87;;;-1:-1:-1;34739:29:0;24089:4;34739:29;;:::i;:::-;;34550:225;-1:-1:-1;;;34550:225:0:o;28526:1037::-;26636:6;;;;26635:7;26626:26;;;;;;;10713:2:1;26626:26:0;;;10695:21:1;10752:1;10732:18;;;10725:29;10790:8;10770:18;;;10763:36;10816:18;;26626:26:0;10511:329:1;26626:26:0;26350:12:::1;::::0;::::1;;26338:10;:24;26329:54;;;::::0;::::1;::::0;;13423:2:1;26329:54:0::1;::::0;::::1;13405:21:1::0;13462:2;13442:18;;;13435:30;13501:19;13481:18;;;13474:47;13538:18;;26329:54:0::1;13221:341:1::0;26329:54:0::1;28647:12:::2;:14:::0;;28618:18:::2;::::0;28639:7:::2;::::0;28647:14;28618:18;28647:14:::2;::::0;::::2;:::i;:::-;;;;;28639:23;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;28618:44:::2;::::0;;::::2;::::0;::::2;::::0;;28639:23:::2;::::0;;::::2;::::0;;::::2;28618:44:::0;;::::2;::::0;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;::::2;::::0;;::::2;::::0;;;;;;;;;::::2;::::0;;;;;;-1:-1:-1;28680:15:0;28671:42:::2;;;::::0;::::2;::::0;;13769:2:1;28671:42:0::2;::::0;::::2;13751:21:1::0;13808:2;13788:18;;;13781:30;13847:16;13827:18;;;13820:44;13881:18;;28671:42:0::2;13567:338:1::0;28671:42:0::2;28731:11:::0;;:41:::2;;28744:28:::0;::::2;28731:41;28722:65;;;::::0;::::2;::::0;;14112:2:1;28722:65:0::2;::::0;::::2;14094:21:1::0;14151:2;14131:18;;;14124:30;14190:13;14170:18;;;14163:41;14221:18;;28722:65:0::2;13910:335:1::0;28722:65:0::2;28850:5;:9;;;28805:54;;28847:1;28817:9;:22;;;;;;;;:::i;:::-;28805:11:::0;;:41:::2;::::0;-1:-1:-1;28805:41:0::2;;;:::i;:::-;:43;;;;:::i;:::-;:54;28796:77;;;::::0;::::2;::::0;;15095:2:1;28796:77:0::2;::::0;::::2;15077:21:1::0;15134:2;15114:18;;;15107:30;15173:12;15153:18;;;15146:40;15203:18;;28796:77:0::2;14893:334:1::0;28796:77:0::2;28928:23;::::0;28907:19:::2;::::0;::::2;::::0;28891:35:::2;::::0;::::2;;:15;:35;:::i;:::-;:60;;28882:81;;;::::0;::::2;::::0;;15434:2:1;28882:81:0::2;::::0;::::2;15416:21:1::0;15473:1;15453:18;;;15446:29;15511:10;15491:18;;;15484:38;15539:18;;28882:81:0::2;15232:331:1::0;28882:81:0::2;29064:11:::0;;29005:71:::2;::::0;28980:12:::2;::::0;29005:71:::2;::::0;29022:11:::2;::::0;29035::::2;::::0;29048:7:::2;::::0;29057:5:::2;::::0;29005:71:::2;;15833:19:1::0;;;15975:2;15971:15;;;15871:66;15967:24;;;15962:2;15953:12;;15946:46;16017:2;16008:12;;16001:28;;;;16063:15;;16059:24;16054:2;16045:12;;16038:46;16123:3;16119:16;16137:66;16115:89;16109:3;16100:13;;16093:112;16230:3;16221:13;;15568:672;29005:71:0::2;;;;;;;;;;;;;28995:82;;;;;;28980:97;;29091:6;29086:372;29102:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;:29;;29100:1;:31;29086:372;;;29154:9;:24;29176:1;29164:5;:11;;;:13;;;;;;:::i;:::-;29154:24:::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;29154:24:0;;::::2;;29149:183;;29195:124;29231:5;29238:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;29261:1;29238:25;;;;;;;:::i;:::-;:30;::::0;::::2;:25;::::0;;::::2;;:30:::0;;::::2;::::0;-1:-1:-1;29238:30:0::2;:::i;:::-;24089:4;29269:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;29292:1;29269:25;;;;;;;:::i;:::-;;;;;;:32;;;;;;;;;;:::i;:::-;:49;;;;;;:::i;:::-;29195:27;:124::i;:::-;29377:4:::0;29383:22:::2;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;29406:1;29383:25;;;;;;;:::i;:::-;:30;::::0;::::2;:25;::::0;;::::2;;:30:::0;;::::2;::::0;-1:-1:-1;29383:30:0::2;:::i;:::-;29414:22;;::::0;::::2;:9:::0;:22:::2;:::i;:::-;29437:1;29414:25;;;;;;;:::i;:::-;;;;;;:32;;;;;;;;;;:::i;:::-;29360:87;;;;;;;;;16717:19:1::0;;;16774:2;16770:15;;;;16787:66;16766:88;16761:2;16752:12;;16745:110;16893:3;16889:16;16907:66;16885:89;16880:2;16871:12;;16864:111;17000:2;16991:12;;16534:475;29360:87:0::2;;;;;;;;;;;;;29350:98;;;;;;29343:105;;29132:3;;;;:::i;:::-;;;29086:372;;;;29487:4;29475:5;:10;;;:16;29466:39;;;::::0;::::2;::::0;;17216:2:1;29466:39:0::2;::::0;::::2;17198:21:1::0;17255:2;17235:18;;;17228:30;17294:12;17274:18;;;17267:40;17324:18;;29466:39:0::2;17014:334:1::0;29466:39:0::2;29529:11:::0;;29541:9:::2;::::0;;::::2;::::0;29519:37:::2;::::0;;17563:18:1;17608:15;;;17590:34;;17660:15;;;;17640:18;;;17633:43;;;;17692:18;;17685:34;;;29519:37:0::2;::::0;17541:2:1;17526:18;29519:37:0::2;;;;;;;;28609:954;;28526:1037:::0;:::o;28096:420::-;26636:6;;;;26635:7;26626:26;;;;;;;10713:2:1;26626:26:0;;;10695:21:1;10752:1;10732:18;;;10725:29;10790:8;10770:18;;;10763:36;10816:18;;26626:26:0;10511:329:1;26626:26:0;26245:7:::1;::::0;::::1;;26233:10;:19;26224:43;;;::::0;::::1;::::0;;17932:2:1;26224:43:0::1;::::0;::::1;17914:21:1::0;17971:2;17951:18;;;17944:30;18010:13;17990:18;;;17983:41;18041:18;;26224:43:0::1;17730:335:1::0;26224:43:0::1;28196:7:::2;:14:::0;:17;:29;::::2;;;-1:-1:-1::0;28217:8:0;;28196:29:::2;28195:95;;;-1:-1:-1::0;28231:7:0::2;:14:::0;:16;;;;:58:::2;;-1:-1:-1::0;28258:7:0::2;28266:14:::0;;:16:::2;::::0;28281:1:::2;::::0;28266:16:::2;:::i;:::-;28258:25;;;;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;::::2;::::0;;::::2;;:29:::0;:31:::2;::::0;:29;;::::2;;;28288:1;28258:31;:::i;:::-;28251:38;;:5;:38;28231:58;28186:119;;;::::0;::::2;::::0;;14112:2:1;28186:119:0::2;::::0;::::2;14094:21:1::0;14151:2;14131:18;;;14124:30;14190:13;14170:18;;;14163:41;14221:18;;28186:119:0::2;13910:335:1::0;28186:119:0::2;28328:5;28323:3;:10;;:34;;;;-1:-1:-1::0;28341:16:0::2;28337:20:::0;::::2;28323:34;28314:56;;;::::0;::::2;::::0;;18457:2:1;28314:56:0::2;::::0;::::2;18439:21:1::0;18496:1;18476:18;;;18469:29;18534:11;18514:18;;;18507:39;18563:18;;28314:56:0::2;18255:332:1::0;28314:56:0::2;28392:63;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;::::2;;::::0;::::2;::::0;;;28431:15:::2;28392:63:::0;::::2;::::0;;;;;;-1:-1:-1;28392:63:0;;;;;;;;;;;;28379:7:::2;:77:::0;;::::2;::::0;;::::2;::::0;;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;;;;;;::::2;::::0;::::2;::::0;;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;::::2;::::0;;;;;;;;;;28477:14;;28470:39:::2;::::0;28477:16:::2;::::0;::::2;:::i;:::-;28470:39;::::0;;12537:25:1;;;12593:2;12578:18;;12571:34;;;12621:18;;12614:34;;;12679:2;12664:18;;12657:34;;;12524:3;12509:19;28470:39:0::2;12306:391:1::0;34785:369:0;34902:73;;;34919:7;34902:73;;;;15833:19:1;;;;15871:66;34928:5:0;15975:2:1;15971:15;;;15967:24;;15953:12;;;15946:46;34935:11:0;16008:12:1;;;16001:28;34948:11:0;16063:15:1;;16059:24;16045:12;;;16038:46;16137:66;16123:3;16119:16;;;16115:89;16100:13;;;16093:112;34902:73:0;;;;;;;;;16221:13:1;;;;34902:73:0;;;34892:84;;;;;-1:-1:-1;;16119:16:1;34985:141:0;35006:3;35003:1;:6;34985:141;;35063:6;35071:12;35084:1;35071:15;;;;;;;;:::i;:::-;;;;;;;;;;:20;35092:12;:15;;35071:20;;;;;35105:1;;35092:15;;;;;;:::i;:::-;;;;;;;;:22;;;;;;;;;;;;35046:69;;;;;;;;;16717:19:1;;;16774:2;16770:15;;;;16787:66;16766:88;16761:2;16752:12;;16745:110;16893:3;16889:16;16907:66;16885:89;16880:2;16871:12;;16864:111;17000:2;16991:12;;16534:475;35046:69:0;;;;;;;;;;;;;35036:80;;;;;;35027:89;;35010:3;;;;:::i;:::-;;;34985:141;;;-1:-1:-1;35141:6:0;-1:-1:-1;34785:369:0;;;;;:::o;29573:213::-;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;29659:7:::1;29645:12;;:21;;29636:56;;;::::0;::::1;::::0;;19190:2:1;29636:56:0::1;::::0;::::1;19172:21:1::0;19229:2;19209:18;;;19202:30;19268:24;19248:18;;;19241:52;19310:18;;29636:56:0::1;18988:346:1::0;29636:56:0::1;29708:7;:14:::0;:22;-1:-1:-1;29701:44:0::1;;;29732:7;:13;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;;;;;::::1;;::::0;;;::::1;;::::0;;;29701:44:::1;;;29759:20;::::0;160:25:1;;;29759:20:0::1;::::0;148:2:1;133:18;29759:20:0::1;;;;;;;;29573:213:::0;:::o;33737:497::-;33803:10;33815:8;33825:12;33848:15;33882:19;;33866:15;:35;;;;:::i;:::-;33921:12;:19;33848:53;;-1:-1:-1;33914:26:0;;:71;;;;;33975:10;33944:12;33957:6;33944:20;;;;;;;;:::i;:::-;;;;;;;;;;:30;;;;;;:41;33914:71;33910:318;;;34005:6;;-1:-1:-1;34037:1:0;34027:9;34033:3;34005:6;34027:9;:::i;:::-;:11;;;;:::i;:::-;34059:12;:19;34023:15;;-1:-1:-1;34054:24:0;;34050:55;;34084:12;:19;:21;;34104:1;;34084:21;:::i;:::-;34080:25;;34050:55;34152:10;34123:12;34136:3;34123:17;;;;;;;;:::i;:::-;;;;;;;;;;:27;;;;;;:39;34117:52;;34164:5;;;;:::i;:::-;;;;34117:52;;;34188:30;34208:5;34214:3;34188:19;:30::i;:::-;34181:37;;33910:318;33839:395;33737:497;;;;;:::o;31069:353::-;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;23879:3:::1;31165:9;:22;31157:31;;;::::0;::::1;;23936:6;31205:8;:20;31197:29;;;::::0;::::1;;24007:7;31243:8;:20;31235:29;;;::::0;::::1;;31285:8;::::0;31304:7:::1;::::0;31321::::1;::::0;31278:60:::1;::::0;;20016:25:1;;;20072:2;20057:18;;20050:34;;;20100:18;;20093:34;;;;20158:2;20143:18;;20136:34;;;20201:3;20186:19;;20179:35;20245:3;20230:19;;20223:35;;;31278:60:0::1;::::0;20003:3:1;19988:19;31278:60:0::1;;;;;;;31347:8;:18:::0;;;;31374:7:::1;:16:::0;31399:7:::1;:16:::0;31069:353::o;30813:179::-;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;30905:6:::1;30900:86;30914:16:::0;;::::1;30900:86;;;30948:28;30958:7;;30966:1;30958:10;;;;;;;:::i;:::-;;;;;;;30969:6;30948:9;:28::i;:::-;30931:3;::::0;::::1;:::i;:::-;;;30900:86;;;;30813:179:::0;;;:::o;32090:262::-;32157:14;;;;32143:10;:28;32135:94;;;;;;;20471:2:1;32135:94:0;;;20453:21:1;20510:2;20490:18;;;20483:30;20549:34;20529:18;;;20522:62;20620:23;20600:18;;;20593:51;20661:19;;32135:94:0;20269:417:1;32135:94:0;32263:14;;;32256:5;;32243:35;;32263:14;;;;;32256:5;;;;32243:35;;;32295:14;;;;32287:22;;;;;;32295:14;;;32287:22;;;;32318:27;;;32090:262::o;30200:67::-;26468:10;26456:23;;;;:11;:23;;;;;;;;;:44;;-1:-1:-1;26495:5:0;;;;26483:10;:17;26456:44;:67;;;-1:-1:-1;26516:7:0;;;;26504:10;:19;26456:67;:95;;;-1:-1:-1;26539:12:0;;;;26527:10;:24;26456:95;26447:122;;;;;;;20893:2:1;26447:122:0;;;20875:21:1;20932:2;20912:18;;;20905:30;20971:16;20951:18;;;20944:44;21005:18;;26447:122:0;20691:338:1;26447:122:0;30248:12:::1;30255:4;30248:6;:12::i;:::-;30200:67::o:0;32362:135::-;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;32444:7:::1;::::0;32433:30:::1;::::0;::::1;::::0;;::::1;::::0;32444:7:::1;::::0;32433:30:::1;::::0;32444:7:::1;::::0;32433:30:::1;32472:7;:18:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;32362:135::o;34244:296::-;-1:-1:-1;;;;;;;;;;;;;;34341:31:0;;;34419:9;34341:31;34419:3;:9;:::i;:::-;:11;;34429:1;34419:11;:::i;:::-;34401:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;34401:30:0;;;;;;;;;;;;;;-1:-1:-1;34381:17:0;;;:50;34452:5;34440:94;34461:3;34458:1;:6;34440:94;;34509:12;34522:1;34509:15;;;;;;;;:::i;:::-;;;;;;;;;;34482:42;;;;;;;;34509:15;;;;34482:42;;;;;;;;;;;;;;;;;;;;;;;;:17;;;;34500:7;34502:5;34500:1;:7;:::i;:::-;34482:26;;;;;;;;:::i;:::-;;;;;;:42;;;;34465:3;;;;:::i;:::-;;;34440:94;;;;34244:296;;;;:::o;24104:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24104:33:0;;;;;;;;;;;;:::o;32507:170::-;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;32604:12:::1;::::0;32588:45:::1;::::0;::::1;::::0;;::::1;::::0;32604:12:::1;::::0;32588:45:::1;::::0;32604:12:::1;::::0;32588:45:::1;32642:12;:28:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;32507:170::o;27676:407::-;27878:11;27892:10;:40;;27925:7;27892:40;;;27905:17;27892:40;27941:89;;;;;27977:10;27941:89;;;21595:34:1;27997:4:0;21645:18:1;;;21638:43;21697:18;;;21690:34;;;21740:18;;;21733:34;;;21816:4;21804:17;;21783:19;;;21776:46;21838:19;;;21831:35;;;21882:19;;;21875:35;;;27878:54:0;;-1:-1:-1;27962:5:0;27941:35;;;;;21506:19:1;;27941:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28039:37;28059:6;28066:9;28039:19;:37::i;:::-;27869:214;27676:407;;;;;;;:::o;24217:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24217:22:0;;;;;;;;;;;;;;;;;;;;;:::o;33362:319::-;33456:4;26149:5;;33462:12;;26149:5;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;33493:15;;;:36:::1;;;33528:1;33512:3;:15;;;:17;33493:36;33485:80;;;::::0;::::1;::::0;;22123:2:1;33485:80:0::1;::::0;::::1;22105:21:1::0;;;22142:18;;;22135:30;22201:34;22181:18;;;22174:62;22253:18;;33485:80:0::1;21921:356:1::0;33485:80:0::1;33575:12;33589:19:::0;33612:3:::1;:8;;33627:6;33635:5;;33612:29;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;33574:67:0;;;;-1:-1:-1;33362:319:0;-1:-1:-1;;;;;;;33362:319:0:o;31432:436::-;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;31573:4:::1;31551:20;:26;;:60;;;;;31607:4;31581:24;:30;;31551:60;31543:88;;;::::0;::::1;::::0;;22760:2:1;31543:88:0::1;::::0;::::1;22742:21:1::0;22799:2;22779:18;;;22772:30;22838:18;22818;;;22811:46;22874:18;;31543:88:0::1;22558:340:1::0;31543:88:0::1;31663:19;::::0;31684:23:::1;::::0;31645:110:::1;::::0;;12537:25:1;;;12593:2;12578:18;;12571:34;;;;12621:18;;12614:34;;;12679:2;12664:18;;12657:34;;;31645:110:0::1;::::0;12524:3:1;12509:19;31645:110:0::1;;;;;;;31764:19;:40:::0;;;;31813:23:::1;:48:::0;31432:436::o;32857:183::-;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;32952:22:::1;::::0;::::1;;::::0;;;:16:::1;:22;::::0;;;;;;;;;;::::1;::::0;;::::1;32951:23;32926:48:::0;;;::::1;::::0;::::1;::::0;;;32988:45;;23071:74:1;;;33010:22:0;23188:14:1;23181:22;23161:18;;;23154:50;32988:45:0::1;::::0;23044:18:1;32988:45:0::1;22903:307:1::0;29796:394:0;26468:10;26456:23;;;;:11;:23;;;;;;;;;:44;;-1:-1:-1;26495:5:0;;;;26483:10;:17;26456:44;:67;;;-1:-1:-1;26516:7:0;;;;26504:10;:19;26456:67;:95;;;-1:-1:-1;26539:12:0;;;;26527:10;:24;26456:95;26447:122;;;;;;;20893:2:1;26447:122:0;;;20875:21:1;20932:2;20912:18;;;20905:30;20971:16;20951:18;;;20944:44;21005:18;;26447:122:0;20691:338:1;26447:122:0;29909:4:::1;29886:7;29894;29886:16;;;;;;;;:::i;:::-;;;;;;;;;;;:21;;;:27;29877:50;;;::::0;::::1;::::0;;17216:2:1;29877:50:0::1;::::0;::::1;17198:21:1::0;17255:2;17235:18;;;17228:30;17294:12;17274:18;;;17267:40;17324:18;;29877:50:0::1;17014:334:1::0;29877:50:0::1;29959:7;29945:12;;:21;;29936:56;;;::::0;::::1;::::0;;19190:2:1;29936:56:0::1;::::0;::::1;19172:21:1::0;19229:2;19209:18;;;19202:30;19268:24;19248:18;;;19241:52;19310:18;;29936:56:0::1;18988:346:1::0;29936:56:0::1;30010:7;30018;30010:16;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:23:::0;;;::::1;;;:26:::0;30001:61:::1;;;::::0;::::1;::::0;;23417:2:1;30001:61:0::1;::::0;::::1;23399:21:1::0;23456:2;23436:18;;;23429:30;23495:24;23475:18;;;23468:52;23537:18;;30001:61:0::1;23215:346:1::0;30001:61:0::1;30095:1;30071:7;30079;30071:16;;;;;;;;:::i;:::-;;;;;;;;;;;:23;;;:25;;;;;;;;;;;;;;;;;;30131:12;30138:4;30131:6;:12::i;:::-;30157:26;::::0;;23740:25:1;;;23796:2;23781:18;;23774:34;;;30157:26:0::1;::::0;23713:18:1;30157:26:0::1;;;;;;;;29796:394:::0;;:::o;30277:65::-;26149:5;;;;26137:10;:17;26128:39;;;;;;;10023:2:1;26128:39:0;;;10005:21:1;10062:1;10042:18;;;10035:29;10100:11;10080:18;;;10073:39;10129:18;;26128:39:0;9821:332:1;26128:39:0;30322:13:::1;30329:5;30322:6;:13::i;27577:92::-:0;27622:39;27642:6;27650:10;27622:19;:39::i;:::-;27577:92;:::o;4185:316::-;4350:59;;;4339:10;24011:55:1;;;4350:59:0;;;23993:74:1;24083:18;;;;24076:34;;;4350:59:0;;;;;;;;;;23966:18:1;;;;4350:59:0;;;;;;;;;4373:24;4350:59;;;4339:71;;-1:-1:-1;;;;4339:10:0;;;;:71;;4350:59;4339:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4303:107;;;;4429:7;:57;;;;-1:-1:-1;4441:11:0;;:16;;:44;;;4472:4;4461:24;;;;;;;;;;;;:::i;:::-;4421:72;;;;;;;24865:2:1;4421:72:0;;;24847:21:1;24904:1;24884:18;;;24877:29;24942:4;24922:18;;;24915:32;24964:18;;4421:72:0;24663:325:1;4421:72:0;4292:209;;4185:316;;;:::o;8329:106::-;8387:7;8418:1;8414;:5;:13;;8426:1;8414:13;;;-1:-1:-1;8422:1:0;;8329:106;-1:-1:-1;8329:106:0:o;8511:::-;8569:7;8600:1;8596;:5;:13;;8608:1;8596:13;;3519:367;3724:69;;;3713:10;25274:15:1;;;3724:69:0;;;25256:34:1;25326:15;;;25306:18;;;25299:43;25358:18;;;;25351:34;;;3724:69:0;;;;;;;;;;25168:18:1;;;;3724:69:0;;;;;;;;;3747:28;3724:69;;;3713:81;;-1:-1:-1;;;;3713:10:0;;;;:81;;3724:69;3713:81;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3664:130;;;;3813:7;:57;;;;-1:-1:-1;3825:11:0;;:16;;:44;;;3856:4;3845:24;;;;;;;;;;;;:::i;:::-;3805:73;;;;;;;25598:2:1;3805:73:0;;;25580:21:1;25637:1;25617:18;;;25610:29;25675:5;25655:18;;;25648:33;25698:18;;3805:73:0;25396:326:1;3805:73:0;3653:233;;3519:367;;;;:::o;30463:231::-;30534:12;;:15;;:52;;;30559:7;30580:1;30567:12;;:14;;;;:::i;:::-;30559:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:27;;;;;;30553:33;;30534:52;30525:93;;;;;;;25929:2:1;30525:93:0;;;25911:21:1;25968:2;25948:18;;;25941:30;26007;25987:18;;;25980:58;26055:18;;30525:93:0;25727:352:1;30525:93:0;30627:16;;;;:9;:16;;;;;;;;;:23;;;;;;;;;;;;;30664;;26252:25:1;;;26293:18;;;26286:50;30664:23:0;;26225:18:1;30664:23:0;26084:258:1;30355:97:0;30403:6;:14;;;;;;;;;;;;;30431;;4457:41:1;;;30431:14:0;;4445:2:1;4430:18;30431:14:0;4317:187:1;196:196;264:20;;324:42;313:54;;303:65;;293:93;;382:1;379;372:12;293:93;196:196;;;:::o;397:254::-;465:6;473;526:2;514:9;505:7;501:23;497:32;494:52;;;542:1;539;532:12;494:52;565:29;584:9;565:29;:::i;:::-;555:39;641:2;626:18;;;;613:32;;-1:-1:-1;;;397:254:1:o;656:::-;724:6;732;785:2;773:9;764:7;760:23;756:32;753:52;;;801:1;798;791:12;753:52;837:9;824:23;814:33;;866:38;900:2;889:9;885:18;866:38;:::i;:::-;856:48;;656:254;;;;;:::o;915:118::-;1001:5;994:13;987:21;980:5;977:32;967:60;;1023:1;1020;1013:12;1038:315;1103:6;1111;1164:2;1152:9;1143:7;1139:23;1135:32;1132:52;;;1180:1;1177;1170:12;1132:52;1203:29;1222:9;1203:29;:::i;:::-;1193:39;;1282:2;1271:9;1267:18;1254:32;1295:28;1317:5;1295:28;:::i;:::-;1342:5;1332:15;;;1038:315;;;;;:::o;1358:309::-;1423:6;1431;1484:2;1472:9;1463:7;1459:23;1455:32;1452:52;;;1500:1;1497;1490:12;1452:52;1536:9;1523:23;1513:33;;1596:2;1585:9;1581:18;1568:32;1609:28;1631:5;1609:28;:::i;1672:186::-;1731:6;1784:2;1772:9;1763:7;1759:23;1755:32;1752:52;;;1800:1;1797;1790:12;1752:52;1823:29;1842:9;1823:29;:::i;1863:248::-;1931:6;1939;1992:2;1980:9;1971:7;1967:23;1963:32;1960:52;;;2008:1;2005;1998:12;1960:52;-1:-1:-1;;2031:23:1;;;2101:2;2086:18;;;2073:32;;-1:-1:-1;1863:248:1:o;2360:388::-;2448:6;2501:2;2489:9;2480:7;2476:23;2472:32;2469:52;;;2517:1;2514;2507:12;2469:52;2557:9;2544:23;2590:18;2582:6;2579:30;2576:50;;;2622:1;2619;2612:12;2576:50;2645:22;;2701:2;2683:16;;;2679:25;2676:45;;;2717:1;2714;2707:12;2753:316;2830:6;2838;2846;2899:2;2887:9;2878:7;2874:23;2870:32;2867:52;;;2915:1;2912;2905:12;2867:52;-1:-1:-1;;2938:23:1;;;3008:2;2993:18;;2980:32;;-1:-1:-1;3059:2:1;3044:18;;;3031:32;;2753:316;-1:-1:-1;2753:316:1:o;3256:180::-;3315:6;3368:2;3356:9;3347:7;3343:23;3339:32;3336:52;;;3384:1;3381;3374:12;3336:52;-1:-1:-1;3407:23:1;;3256:180;-1:-1:-1;3256:180:1:o;4509:750::-;4601:6;4609;4617;4670:2;4658:9;4649:7;4645:23;4641:32;4638:52;;;4686:1;4683;4676:12;4638:52;4726:9;4713:23;4755:18;4796:2;4788:6;4785:14;4782:34;;;4812:1;4809;4802:12;4782:34;4850:6;4839:9;4835:22;4825:32;;4895:7;4888:4;4884:2;4880:13;4876:27;4866:55;;4917:1;4914;4907:12;4866:55;4957:2;4944:16;4983:2;4975:6;4972:14;4969:34;;;4999:1;4996;4989:12;4969:34;5054:7;5047:4;5037:6;5034:1;5030:14;5026:2;5022:23;5018:34;5015:47;5012:67;;;5075:1;5072;5065:12;5012:67;5106:4;5098:13;;;;-1:-1:-1;5130:6:1;-1:-1:-1;;5171:20:1;;5158:34;5201:28;5158:34;5201:28;:::i;:::-;5248:5;5238:15;;;4509:750;;;;;:::o;5264:1062::-;5410:4;5439:2;5468;5457:9;5450:21;5490:2;5530;5519:9;5515:18;5575:6;5569:13;5564:2;5553:9;5549:18;5542:41;5630:2;5622:6;5618:15;5612:22;5653:4;5693:2;5688;5677:9;5673:18;5666:30;5716:6;5751:12;5745:19;5788:6;5780;5773:22;5826:3;5815:9;5811:19;5804:26;;5871:2;5857:12;5853:21;5839:35;;5892:1;5883:10;;5902:398;5916:6;5913:1;5910:13;5902:398;;;5975:13;;6017:9;;6028:42;6013:58;6001:71;;6116:11;;;6110:18;6130;6106:43;6092:12;;;6085:65;6194:11;;6188:18;6208:10;6184:35;6170:12;;;6163:57;6275:15;;;;5938:1;5931:9;;;;;6240:12;;;;5902:398;;;-1:-1:-1;6317:3:1;5264:1062;-1:-1:-1;;;;;;;;5264:1062:1:o;6742:756::-;6850:6;6858;6866;6874;6882;6890;6898;6951:3;6939:9;6930:7;6926:23;6922:33;6919:53;;;6968:1;6965;6958:12;6919:53;7004:9;6991:23;6981:33;;7033:38;7067:2;7056:9;7052:18;7033:38;:::i;:::-;7023:48;;7118:2;7107:9;7103:18;7090:32;7080:42;;7172:2;7161:9;7157:18;7144:32;7185:28;7207:5;7185:28;:::i;:::-;7232:5;-1:-1:-1;7289:3:1;7274:19;;7261:33;7338:4;7325:18;;7313:31;;7303:59;;7358:1;7355;7348:12;7303:59;6742:756;;;;-1:-1:-1;6742:756:1;;;;7381:7;7435:3;7420:19;;7407:33;;-1:-1:-1;7487:3:1;7472:19;;;7459:33;;6742:756;-1:-1:-1;;6742:756:1:o;8036:733::-;8124:6;8132;8140;8148;8201:2;8189:9;8180:7;8176:23;8172:32;8169:52;;;8217:1;8214;8207:12;8169:52;8240:29;8259:9;8240:29;:::i;:::-;8230:39;;8316:2;8305:9;8301:18;8288:32;8278:42;;8371:2;8360:9;8356:18;8343:32;8394:18;8435:2;8427:6;8424:14;8421:34;;;8451:1;8448;8441:12;8421:34;8489:6;8478:9;8474:22;8464:32;;8534:7;8527:4;8523:2;8519:13;8515:27;8505:55;;8556:1;8553;8546:12;8505:55;8596:2;8583:16;8622:2;8614:6;8611:14;8608:34;;;8638:1;8635;8628:12;8608:34;8683:7;8678:2;8669:6;8665:2;8661:15;8657:24;8654:37;8651:57;;;8704:1;8701;8694:12;8651:57;8036:733;;;;-1:-1:-1;;8735:2:1;8727:11;;-1:-1:-1;;;8036:733:1:o;8774:250::-;8859:1;8869:113;8883:6;8880:1;8877:13;8869:113;;;8959:11;;;8953:18;8940:11;;;8933:39;8905:2;8898:10;8869:113;;;-1:-1:-1;;9016:1:1;8998:16;;8991:27;8774:250::o;9029:534::-;9212:6;9205:14;9198:22;9187:9;9180:41;9257:2;9252;9241:9;9237:18;9230:30;9161:4;9289:6;9283:13;9332:6;9327:2;9316:9;9312:18;9305:34;9348:79;9420:6;9415:2;9404:9;9400:18;9395:2;9387:6;9383:15;9348:79;:::i;:::-;9479:2;9467:15;9484:66;9463:88;9448:104;;;;9554:2;9444:113;;9029:534;-1:-1:-1;;;9029:534:1:o;10845:184::-;10897:77;10894:1;10887:88;10994:4;10991:1;10984:15;11018:4;11015:1;11008:15;11034:274;11074:1;11100;11090:189;;11135:77;11132:1;11125:88;11236:4;11233:1;11226:15;11264:4;11261:1;11254:15;11090:189;-1:-1:-1;11293:9:1;;11034:274::o;11313:168::-;11386:9;;;11417;;11434:15;;;11428:22;;11414:37;11404:71;;11455:18;;:::i;12173:128::-;12240:9;;;12261:11;;;12258:37;;;12275:18;;:::i;12702:184::-;12754:77;12751:1;12744:88;12851:4;12848:1;12841:15;12875:4;12872:1;12865:15;12891:125;12956:9;;;12977:10;;;12974:36;;;12990:18;;:::i;13021:195::-;13060:3;13091:66;13084:5;13081:77;13078:103;;13161:18;;:::i;:::-;-1:-1:-1;13208:1:1;13197:13;;13021:195::o;14250:638::-;14374:4;14380:6;14440:11;14427:25;14530:66;14519:8;14503:14;14499:29;14495:102;14475:18;14471:127;14461:155;;14612:1;14609;14602:12;14461:155;14639:33;;14691:20;;;-1:-1:-1;14734:18:1;14723:30;;14720:50;;;14766:1;14763;14756:12;14720:50;14799:4;14787:17;;-1:-1:-1;14858:4:1;14846:17;;14830:14;14826:38;14816:49;;14813:69;;;14878:1;14875;14868:12;14813:69;14250:638;;;;;:::o;16245:284::-;16303:6;16356:2;16344:9;16335:7;16331:23;16327:32;16324:52;;;16372:1;16369;16362:12;16324:52;16411:9;16398:23;16461:18;16454:5;16450:30;16443:5;16440:41;16430:69;;16495:1;16492;16485:12;18070:180;18137:18;18175:10;;;18187;;;18171:27;;18210:11;;;18207:37;;;18224:18;;:::i;19339:184::-;19391:77;19388:1;19381:88;19488:4;19485:1;19478:15;19512:4;19509:1;19502:15;19528:196;19567:3;19595:5;19585:39;;19604:18;;:::i;:::-;-1:-1:-1;19651:66:1;19640:78;;19528:196::o;21034:184::-;21086:77;21083:1;21076:88;21183:4;21180:1;21173:15;21207:4;21204:1;21197:15;22282:271;22465:6;22457;22452:3;22439:33;22421:3;22491:16;;22516:13;;;22491:16;22282:271;-1:-1:-1;22282:271:1:o;24121:287::-;24250:3;24288:6;24282:13;24304:66;24363:6;24358:3;24351:4;24343:6;24339:17;24304:66;:::i;:::-;24386:16;;;;;24121:287;-1:-1:-1;;24121:287:1:o;24413:245::-;24480:6;24533:2;24521:9;24512:7;24508:23;24504:32;24501:52;;;24549:1;24546;24539:12;24501:52;24581:9;24575:16;24600:28;24622:5;24600:28;:::i
Swarm Source
ipfs://69e7c5f063e7a539f17de9d4599662f3a8e3777ea146d5d6195727dcb75e03ee
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ZKEVM | 100.00% | $0.998785 | 2,000 | $1,997.57 |
[ 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.