More Info
Private Name Tags
ContractCreator
Latest 12 from a total of 12 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Send From | 19562746 | 170 days ago | IN | 0.00041 ETH | 0.00719069 | ||||
Send From | 19561596 | 171 days ago | IN | 0.00041 ETH | 0.00796956 | ||||
Send From | 19561492 | 171 days ago | IN | 0.00041 ETH | 0.00781486 | ||||
Send From | 19561446 | 171 days ago | IN | 0.00041 ETH | 0.00723911 | ||||
Send From | 19555844 | 171 days ago | IN | 0.0005 ETH | 0.00644024 | ||||
Set Min Dst Gas | 19549484 | 172 days ago | IN | 0 ETH | 0.00102136 | ||||
Set Trusted Remo... | 19549472 | 172 days ago | IN | 0 ETH | 0.0017088 | ||||
Send From | 19407802 | 192 days ago | IN | 0.0003 ETH | 0.01789669 | ||||
Send From | 19407385 | 192 days ago | IN | 0.0003 ETH | 0.02042621 | ||||
Set Min Dst Gas | 19407356 | 192 days ago | IN | 0 ETH | 0.00303958 | ||||
Set Trusted Remo... | 19407334 | 192 days ago | IN | 0 ETH | 0.00620453 | ||||
0x60c06040 | 19407200 | 192 days ago | IN | 0 ETH | 0.25707154 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
LEARNoft
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-10 */ // SPDX-License-Identifier: UNLICENSED // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @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/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @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: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: https://github.com/LayerZero-Labs/solidity-examples/contracts/token/oft/v1/interfaces/IOFTCore.sol pragma solidity >=0.5.0; /** * @dev Interface of the IOFT core standard */ interface IOFTCore is IERC165 { /** * @dev estimate send token `_tokenId` to (`_dstChainId`, `_toAddress`) * _dstChainId - L0 defined chain id to send tokens too * _toAddress - dynamic bytes array which contains the address to whom you are sending tokens to on the dstChain * _amount - amount of the tokens to transfer * _useZro - indicates to use zro to pay L0 fees * _adapterParam - flexible bytes array to indicate messaging adapter services in L0 */ function estimateSendFee(uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams) external view returns (uint nativeFee, uint zroFee); /** * @dev send `_amount` amount of token to (`_dstChainId`, `_toAddress`) from `_from` * `_from` the owner of token * `_dstChainId` the destination chain identifier * `_toAddress` can be any size depending on the `dstChainId`. * `_amount` the quantity of tokens in wei * `_refundAddress` the address LayerZero refunds if too much message fee is sent * `_zroPaymentAddress` set to address(0x0) if not paying in ZRO (LayerZero Token) * `_adapterParams` is a flexible bytes array to indicate messaging adapter services */ function sendFrom(address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; /** * @dev returns the circulating amount of tokens on current chain */ function circulatingSupply() external view returns (uint); /** * @dev returns the address of the ERC20 token */ function token() external view returns (address); /** * @dev Emitted when `_amount` tokens are moved from the `_sender` to (`_dstChainId`, `_toAddress`) * `_nonce` is the outbound nonce */ event SendToChain(uint16 indexed _dstChainId, address indexed _from, bytes _toAddress, uint _amount); /** * @dev Emitted when `_amount` tokens are received from `_srcChainId` into the `_toAddress` on the local chain. * `_nonce` is the inbound nonce. */ event ReceiveFromChain(uint16 indexed _srcChainId, address indexed _to, uint _amount); event SetUseCustomAdapterParams(bool _useCustomAdapterParams); } // File: https://github.com/LayerZero-Labs/solidity-examples/contracts/libraries/ExcessivelySafeCall.sol pragma solidity >=0.7.6; library ExcessivelySafeCall { uint constant LOW_28_MASK = 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff; /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeCall( address _target, uint _gas, uint16 _maxCopy, bytes memory _calldata ) internal returns (bool, bytes memory) { // set up for assembly call uint _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := call( _gas, // gas _target, // recipient 0, // ether value add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /// @notice Use when you _really_ really _really_ don't trust the called /// contract. This prevents the called contract from causing reversion of /// the caller in as many ways as we can. /// @dev The main difference between this and a solidity low-level call is /// that we limit the number of bytes that the callee can cause to be /// copied to caller memory. This prevents stupid things like malicious /// contracts returning 10,000,000 bytes causing a local OOG when copying /// to memory. /// @param _target The address to call /// @param _gas The amount of gas to forward to the remote contract /// @param _maxCopy The maximum number of bytes of returndata to copy /// to memory. /// @param _calldata The data to send to the remote contract /// @return success and returndata, as `.call()`. Returndata is capped to /// `_maxCopy` bytes. function excessivelySafeStaticCall( address _target, uint _gas, uint16 _maxCopy, bytes memory _calldata ) internal view returns (bool, bytes memory) { // set up for assembly call uint _toCopy; bool _success; bytes memory _returnData = new bytes(_maxCopy); // dispatch message to recipient // by assembly calling "handle" function // we call via assembly to avoid memcopying a very large returndata // returned by a malicious contract assembly { _success := staticcall( _gas, // gas _target, // recipient add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) // limit our copy to 256 bytes _toCopy := returndatasize() if gt(_toCopy, _maxCopy) { _toCopy := _maxCopy } // Store the length of the copied bytes mstore(_returnData, _toCopy) // copy the bytes from returndata[0:_toCopy] returndatacopy(add(_returnData, 0x20), 0, _toCopy) } return (_success, _returnData); } /** * @notice Swaps function selectors in encoded contract calls * @dev Allows reuse of encoded calldata for functions with identical * argument types but different names. It simply swaps out the first 4 bytes * for the new selector. This function modifies memory in place, and should * only be used with caution. * @param _newSelector The new 4-byte selector * @param _buf The encoded contract args */ function swapSelector(bytes4 _newSelector, bytes memory _buf) internal pure { require(_buf.length >= 4); uint _mask = LOW_28_MASK; assembly { // load the first word of let _word := mload(add(_buf, 0x20)) // mask out the top 4 bytes // /x _word := and(_word, _mask) _word := or(_newSelector, _word) mstore(add(_buf, 0x20), _word) } } } // File: https://github.com/LayerZero-Labs/solidity-examples/contracts/libraries/BytesLib.sol /* * @title Solidity Bytes Arrays Utils * @author Gonçalo Sá <[email protected]> * * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity. * The library lets you concatenate, slice and type cast bytes arrays both in memory and storage. */ pragma solidity >=0.8.0 <0.9.0; library BytesLib { function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) { bytes memory tempBytes; assembly { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // Store the length of the first bytes array at the beginning of // the memory for tempBytes. let length := mload(_preBytes) mstore(tempBytes, length) // Maintain a memory counter for the current write location in the // temp bytes array by adding the 32 bytes for the array length to // the starting location. let mc := add(tempBytes, 0x20) // Stop copying when the memory counter reaches the length of the // first bytes array. let end := add(mc, length) for { // Initialize a copy counter to the start of the _preBytes data, // 32 bytes into its memory. let cc := add(_preBytes, 0x20) } lt(mc, end) { // Increase both counters by 32 bytes each iteration. mc := add(mc, 0x20) cc := add(cc, 0x20) } { // Write the _preBytes data into the tempBytes memory 32 bytes // at a time. mstore(mc, mload(cc)) } // Add the length of _postBytes to the current length of tempBytes // and store it as the new length in the first 32 bytes of the // tempBytes memory. length := mload(_postBytes) mstore(tempBytes, add(length, mload(tempBytes))) // Move the memory counter back from a multiple of 0x20 to the // actual end of the _preBytes data. mc := end // Stop copying when the memory counter reaches the new combined // length of the arrays. end := add(mc, length) for { let cc := add(_postBytes, 0x20) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } // Update the free-memory pointer by padding our last write location // to 32 bytes: add 31 bytes to the end of tempBytes to move to the // next 32 byte block, then round down to the nearest multiple of // 32. If the sum of the length of the two arrays is zero then add // one before rounding down to leave a blank 32 bytes (the length block with 0). mstore( 0x40, and( add(add(end, iszero(add(length, mload(_preBytes)))), 31), not(31) // Round down to the nearest 32 bytes. ) ) } return tempBytes; } function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal { assembly { // Read the first 32 bytes of _preBytes storage, which is the length // of the array. (We don't need to use the offset into the slot // because arrays use the entire slot.) let fslot := sload(_preBytes.slot) // Arrays of 31 bytes or less have an even value in their slot, // while longer arrays have an odd value. The actual length is // the slot divided by two for odd values, and the lowest order // byte divided by two for even values. // If the slot is even, bitwise and the slot with 255 and divide by // two to get the length. If the slot is odd, bitwise and the slot // with -1 and divide by two. let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) let newlength := add(slength, mlength) // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage switch add(lt(slength, 32), lt(newlength, 32)) case 2 { // Since the new array still fits in the slot, we just need to // update the contents of the slot. // uint256(bytes_storage) = uint256(bytes_storage) + uint256(bytes_memory) + new_length sstore( _preBytes.slot, // all the modifications to the slot are inside this // next block add( // we can just add to the slot contents because the // bytes we want to change are the LSBs fslot, add( mul( div( // load the bytes from memory mload(add(_postBytes, 0x20)), // zero all bytes to the right exp(0x100, sub(32, mlength)) ), // and now shift left the number of bytes to // leave space for the length in the slot exp(0x100, sub(32, newlength)) ), // increase length by the double of the memory // bytes length mul(mlength, 2) ) ) ) } case 1 { // The stored value fits in the slot, but the combined value // will exceed it. // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // The contents of the _postBytes array start 32 bytes into // the structure. Our first read should obtain the `submod` // bytes that can fit into the unused space in the last word // of the stored array. To get this, we read 32 bytes starting // from `submod`, so the data we read overlaps with the array // contents by `submod` bytes. Masking the lowest-order // `submod` bytes allows us to add that value directly to the // stored value. let submod := sub(32, slength) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(and(fslot, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00), and(mload(mc), mask))) for { mc := add(mc, 0x20) sc := add(sc, 1) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } default { // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) // Start copying to the last used word of the stored array. let sc := add(keccak256(0x0, 0x20), div(slength, 32)) // save new length sstore(_preBytes.slot, add(mul(newlength, 2), 1)) // Copy over the first `submod` bytes of the new data as in // case 1 above. let slengthmod := mod(slength, 32) let mlengthmod := mod(mlength, 32) let submod := sub(32, slengthmod) let mc := add(_postBytes, submod) let end := add(_postBytes, mlength) let mask := sub(exp(0x100, submod), 1) sstore(sc, add(sload(sc), and(mload(mc), mask))) for { sc := add(sc, 1) mc := add(mc, 0x20) } lt(mc, end) { sc := add(sc, 1) mc := add(mc, 0x20) } { sstore(sc, mload(mc)) } mask := exp(0x100, sub(mc, end)) sstore(sc, mul(div(mload(mc), mask), mask)) } } } function slice( bytes memory _bytes, uint _start, uint _length ) internal pure returns (bytes memory) { require(_length + 31 >= _length, "slice_overflow"); require(_bytes.length >= _start + _length, "slice_outOfBounds"); bytes memory tempBytes; assembly { switch iszero(_length) case 0 { // Get a location of some free memory and store it in tempBytes as // Solidity does for memory variables. tempBytes := mload(0x40) // The first word of the slice result is potentially a partial // word read from the original array. To read it, we calculate // the length of that partial word and start copying that many // bytes into the array. The first word we copy will start with // data we don't care about, but the last `lengthmod` bytes will // land at the beginning of the contents of the new array. When // we're done copying, we overwrite the full first word with // the actual length of the slice. let lengthmod := and(_length, 31) // The multiplication in the next line is necessary // because when slicing multiples of 32 bytes (lengthmod == 0) // the following copy loop was copying the origin's length // and then ending prematurely not copying everything it should. let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod))) let end := add(mc, _length) for { // The multiplication in the next line has the same exact purpose // as the one above. let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start) } lt(mc, end) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { mstore(mc, mload(cc)) } mstore(tempBytes, _length) //update free-memory pointer //allocating the array padded to 32 bytes like the compiler does now mstore(0x40, and(add(mc, 31), not(31))) } //if we want a zero-length slice let's just return a zero-length array default { tempBytes := mload(0x40) //zero out the 32 bytes slice we are about to return //we need to do it because Solidity does not garbage collect mstore(tempBytes, 0) mstore(0x40, add(tempBytes, 0x20)) } } return tempBytes; } function toAddress(bytes memory _bytes, uint _start) internal pure returns (address) { require(_bytes.length >= _start + 20, "toAddress_outOfBounds"); address tempAddress; assembly { tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000) } return tempAddress; } function toUint8(bytes memory _bytes, uint _start) internal pure returns (uint8) { require(_bytes.length >= _start + 1, "toUint8_outOfBounds"); uint8 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x1), _start)) } return tempUint; } function toUint16(bytes memory _bytes, uint _start) internal pure returns (uint16) { require(_bytes.length >= _start + 2, "toUint16_outOfBounds"); uint16 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x2), _start)) } return tempUint; } function toUint32(bytes memory _bytes, uint _start) internal pure returns (uint32) { require(_bytes.length >= _start + 4, "toUint32_outOfBounds"); uint32 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x4), _start)) } return tempUint; } function toUint64(bytes memory _bytes, uint _start) internal pure returns (uint64) { require(_bytes.length >= _start + 8, "toUint64_outOfBounds"); uint64 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x8), _start)) } return tempUint; } function toUint96(bytes memory _bytes, uint _start) internal pure returns (uint96) { require(_bytes.length >= _start + 12, "toUint96_outOfBounds"); uint96 tempUint; assembly { tempUint := mload(add(add(_bytes, 0xc), _start)) } return tempUint; } function toUint128(bytes memory _bytes, uint _start) internal pure returns (uint128) { require(_bytes.length >= _start + 16, "toUint128_outOfBounds"); uint128 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x10), _start)) } return tempUint; } function toUint256(bytes memory _bytes, uint _start) internal pure returns (uint) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint _start) internal pure returns (bytes32) { require(_bytes.length >= _start + 32, "toBytes32_outOfBounds"); bytes32 tempBytes32; assembly { tempBytes32 := mload(add(add(_bytes, 0x20), _start)) } return tempBytes32; } function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) { bool success = true; assembly { let length := mload(_preBytes) // if lengths don't match the arrays are not equal switch eq(length, mload(_postBytes)) case 1 { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 let mc := add(_preBytes, 0x20) let end := add(mc, length) for { let cc := add(_postBytes, 0x20) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) } eq(add(lt(mc, end), cb), 2) { mc := add(mc, 0x20) cc := add(cc, 0x20) } { // if any of these checks fails then arrays are not equal if iszero(eq(mload(mc), mload(cc))) { // unsuccess: success := 0 cb := 0 } } } default { // unsuccess: success := 0 } } return success; } function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) { bool success = true; assembly { // we know _preBytes_offset is 0 let fslot := sload(_preBytes.slot) // Decode the length of the stored array like in concatStorage(). let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2) let mlength := mload(_postBytes) // if lengths don't match the arrays are not equal switch eq(slength, mlength) case 1 { // slength can contain both the length and contents of the array // if length < 32 bytes so let's prepare for that // v. http://solidity.readthedocs.io/en/latest/miscellaneous.html#layout-of-state-variables-in-storage if iszero(iszero(slength)) { switch lt(slength, 32) case 1 { // blank the last byte which is the length fslot := mul(div(fslot, 0x100), 0x100) if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) { // unsuccess: success := 0 } } default { // cb is a circuit breaker in the for loop since there's // no said feature for inline assembly loops // cb = 1 - don't breaker // cb = 0 - break let cb := 1 // get the keccak hash to get the contents of the array mstore(0x0, _preBytes.slot) let sc := keccak256(0x0, 0x20) let mc := add(_postBytes, 0x20) let end := add(mc, mlength) // the next line is the loop condition: // while(uint256(mc < end) + cb == 2) for { } eq(add(lt(mc, end), cb), 2) { sc := add(sc, 1) mc := add(mc, 0x20) } { if iszero(eq(sload(sc), mload(mc))) { // unsuccess: success := 0 cb := 0 } } } } } default { // unsuccess: success := 0 } } return success; } } // File: https://github.com/LayerZero-Labs/solidity-examples/contracts/lzApp/interfaces/ILayerZeroUserApplicationConfig.sol pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig( uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config ) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; } // File: https://github.com/LayerZero-Labs/solidity-examples/contracts/lzApp/interfaces/ILayerZeroEndpoint.sol pragma solidity >=0.5.0; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send( uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams ) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload( uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload ) external; // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees( uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam ) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload( uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload ) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig( uint16 _version, uint16 _chainId, address _userApplication, uint _configType ) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); } // File: https://github.com/LayerZero-Labs/solidity-examples/contracts/lzApp/interfaces/ILayerZeroReceiver.sol pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) external; } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: https://github.com/LayerZero-Labs/solidity-examples/contracts/lzApp/LzApp.sol pragma solidity ^0.8.0; /* * a generic LzReceiver implementation */ abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { using BytesLib for bytes; // ua can not send payload larger than this by default, but it can be changed by the ua owner uint public constant DEFAULT_PAYLOAD_SIZE_LIMIT = 10000; ILayerZeroEndpoint public immutable lzEndpoint; mapping(uint16 => bytes) public trustedRemoteLookup; mapping(uint16 => mapping(uint16 => uint)) public minDstGasLookup; mapping(uint16 => uint) public payloadSizeLimitLookup; address public precrime; event SetPrecrime(address precrime); event SetTrustedRemote(uint16 _remoteChainId, bytes _path); event SetTrustedRemoteAddress(uint16 _remoteChainId, bytes _remoteAddress); event SetMinDstGas(uint16 _dstChainId, uint16 _type, uint _minDstGas); constructor(address _endpoint) { lzEndpoint = ILayerZeroEndpoint(_endpoint); } function lzReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) public virtual override { // lzReceive must be called by the endpoint for security require(_msgSender() == address(lzEndpoint), "LzApp: invalid endpoint caller"); bytes memory trustedRemote = trustedRemoteLookup[_srcChainId]; // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote. require( _srcAddress.length == trustedRemote.length && trustedRemote.length > 0 && keccak256(_srcAddress) == keccak256(trustedRemote), "LzApp: invalid source sending contract" ); _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging function _blockingLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual; function _lzSend( uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams, uint _nativeFee ) internal virtual { bytes memory trustedRemote = trustedRemoteLookup[_dstChainId]; require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source"); _checkPayloadSize(_dstChainId, _payload.length); lzEndpoint.send{value: _nativeFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams); } function _checkGasLimit( uint16 _dstChainId, uint16 _type, bytes memory _adapterParams, uint _extraGas ) internal view virtual { uint providedGasLimit = _getGasLimit(_adapterParams); uint minGasLimit = minDstGasLookup[_dstChainId][_type]; require(minGasLimit > 0, "LzApp: minGasLimit not set"); require(providedGasLimit >= minGasLimit + _extraGas, "LzApp: gas limit is too low"); } function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint gasLimit) { require(_adapterParams.length >= 34, "LzApp: invalid adapterParams"); assembly { gasLimit := mload(add(_adapterParams, 34)) } } function _checkPayloadSize(uint16 _dstChainId, uint _payloadSize) internal view virtual { uint payloadSizeLimit = payloadSizeLimitLookup[_dstChainId]; if (payloadSizeLimit == 0) { // use default if not set payloadSizeLimit = DEFAULT_PAYLOAD_SIZE_LIMIT; } require(_payloadSize <= payloadSizeLimit, "LzApp: payload size is too large"); } //---------------------------UserApplication config---------------------------------------- function getConfig( uint16 _version, uint16 _chainId, address, uint _configType ) external view returns (bytes memory) { return lzEndpoint.getConfig(_version, _chainId, address(this), _configType); } // generic config for LayerZero user Application function setConfig( uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config ) external override onlyOwner { lzEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 _version) external override onlyOwner { lzEndpoint.setSendVersion(_version); } function setReceiveVersion(uint16 _version) external override onlyOwner { lzEndpoint.setReceiveVersion(_version); } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } // _path = abi.encodePacked(remoteAddress, localAddress) // this function set the trusted path for the cross-chain communication function setTrustedRemote(uint16 _remoteChainId, bytes calldata _path) external onlyOwner { trustedRemoteLookup[_remoteChainId] = _path; emit SetTrustedRemote(_remoteChainId, _path); } function setTrustedRemoteAddress(uint16 _remoteChainId, bytes calldata _remoteAddress) external onlyOwner { trustedRemoteLookup[_remoteChainId] = abi.encodePacked(_remoteAddress, address(this)); emit SetTrustedRemoteAddress(_remoteChainId, _remoteAddress); } function getTrustedRemoteAddress(uint16 _remoteChainId) external view returns (bytes memory) { bytes memory path = trustedRemoteLookup[_remoteChainId]; require(path.length != 0, "LzApp: no trusted path record"); return path.slice(0, path.length - 20); // the last 20 bytes should be address(this) } function setPrecrime(address _precrime) external onlyOwner { precrime = _precrime; emit SetPrecrime(_precrime); } function setMinDstGas( uint16 _dstChainId, uint16 _packetType, uint _minGas ) external onlyOwner { minDstGasLookup[_dstChainId][_packetType] = _minGas; emit SetMinDstGas(_dstChainId, _packetType, _minGas); } // if the size is 0, it means default size limit function setPayloadSizeLimit(uint16 _dstChainId, uint _size) external onlyOwner { payloadSizeLimitLookup[_dstChainId] = _size; } //--------------------------- VIEW FUNCTION ---------------------------------------- function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } } // File: https://github.com/LayerZero-Labs/solidity-examples/contracts/lzApp/NonblockingLzApp.sol pragma solidity ^0.8.0; /* * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress) */ abstract contract NonblockingLzApp is LzApp { using ExcessivelySafeCall for address; constructor(address _endpoint) LzApp(_endpoint) {} mapping(uint16 => mapping(bytes => mapping(uint64 => bytes32))) public failedMessages; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload, bytes _reason); event RetryMessageSuccess(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes32 _payloadHash); // overriding the virtual function in LzReceiver function _blockingLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual override { (bool success, bytes memory reason) = address(this).excessivelySafeCall( gasleft(), 150, abi.encodeWithSelector(this.nonblockingLzReceive.selector, _srcChainId, _srcAddress, _nonce, _payload) ); if (!success) { _storeFailedMessage(_srcChainId, _srcAddress, _nonce, _payload, reason); } } function _storeFailedMessage( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload, bytes memory _reason ) internal virtual { failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload); emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload, _reason); } function nonblockingLzReceive( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) public virtual { // only internal transaction require(_msgSender() == address(this), "NonblockingLzApp: caller must be LzApp"); _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } //@notice override this function function _nonblockingLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual; function retryMessage( uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload ) public payable virtual { // assert there is message to retry bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce]; require(payloadHash != bytes32(0), "NonblockingLzApp: no stored message"); require(keccak256(_payload) == payloadHash, "NonblockingLzApp: invalid payload"); // clear the stored message failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0); // execute the message. revert if it fails again _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); emit RetryMessageSuccess(_srcChainId, _srcAddress, _nonce, payloadHash); } } // File: https://github.com/LayerZero-Labs/solidity-examples/contracts/token/oft/v1/OFTCore.sol pragma solidity ^0.8.0; abstract contract OFTCore is NonblockingLzApp, ERC165, IOFTCore { using BytesLib for bytes; uint public constant NO_EXTRA_GAS = 0; // packet type uint16 public constant PT_SEND = 0; bool public useCustomAdapterParams; constructor(address _lzEndpoint) NonblockingLzApp(_lzEndpoint) {} function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IOFTCore).interfaceId || super.supportsInterface(interfaceId); } function estimateSendFee( uint16 _dstChainId, bytes calldata _toAddress, uint _amount, bool _useZro, bytes calldata _adapterParams ) public view virtual override returns (uint nativeFee, uint zroFee) { // mock the payload for sendFrom() bytes memory payload = abi.encode(PT_SEND, _toAddress, _amount); return lzEndpoint.estimateFees(_dstChainId, address(this), payload, _useZro, _adapterParams); } function sendFrom( address _from, uint16 _dstChainId, bytes calldata _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams ) public payable virtual override { _send(_from, _dstChainId, _toAddress, _amount, _refundAddress, _zroPaymentAddress, _adapterParams); } function setUseCustomAdapterParams(bool _useCustomAdapterParams) public virtual onlyOwner { useCustomAdapterParams = _useCustomAdapterParams; emit SetUseCustomAdapterParams(_useCustomAdapterParams); } function _nonblockingLzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) internal virtual override { uint16 packetType; assembly { packetType := mload(add(_payload, 32)) } if (packetType == PT_SEND) { _sendAck(_srcChainId, _srcAddress, _nonce, _payload); } else { revert("OFTCore: unknown packet type"); } } function _send( address _from, uint16 _dstChainId, bytes memory _toAddress, uint _amount, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams ) internal virtual { _checkAdapterParams(_dstChainId, PT_SEND, _adapterParams, NO_EXTRA_GAS); uint amount = _debitFrom(_from, _dstChainId, _toAddress, _amount); bytes memory lzPayload = abi.encode(PT_SEND, _toAddress, amount); _lzSend(_dstChainId, lzPayload, _refundAddress, _zroPaymentAddress, _adapterParams, msg.value); emit SendToChain(_dstChainId, _from, _toAddress, amount); } function _sendAck( uint16 _srcChainId, bytes memory, uint64, bytes memory _payload ) internal virtual { (, bytes memory toAddressBytes, uint amount) = abi.decode(_payload, (uint16, bytes, uint)); address to = toAddressBytes.toAddress(0); amount = _creditTo(_srcChainId, to, amount); emit ReceiveFromChain(_srcChainId, to, amount); } function _checkAdapterParams( uint16 _dstChainId, uint16 _pkType, bytes memory _adapterParams, uint _extraGas ) internal virtual { if (useCustomAdapterParams) { _checkGasLimit(_dstChainId, _pkType, _adapterParams, _extraGas); } else { require(_adapterParams.length == 0, "OFTCore: _adapterParams must be empty."); } } function _debitFrom( address _from, uint16 _dstChainId, bytes memory _toAddress, uint _amount ) internal virtual returns (uint); function _creditTo( uint16 _srcChainId, address _toAddress, uint _amount ) internal virtual returns (uint); } // File: LEARNoftProxy.sol pragma solidity ^0.8.0; contract LEARNoft is OFTCore { using SafeERC20 for IERC20; IERC20 internal immutable innerToken; constructor(address _lzEndpoint, address _token) OFTCore(_lzEndpoint) Ownable(msg.sender) { innerToken = IERC20(_token); } function circulatingSupply() public view virtual override returns (uint) { unchecked { return innerToken.totalSupply() - innerToken.balanceOf(address(this)); } } function token() public view virtual override returns (address) { return address(innerToken); } function _debitFrom( address _from, uint16, bytes memory, uint _amount ) internal virtual override returns (uint) { require(_from == _msgSender(), "ProxyOFT: owner is not send caller"); uint before = innerToken.balanceOf(address(this)); innerToken.safeTransferFrom(_from, address(this), _amount); return innerToken.balanceOf(address(this)) - before; } function _creditTo( uint16, address _toAddress, uint _amount ) internal virtual override returns (uint) { uint before = innerToken.balanceOf(_toAddress); innerToken.safeTransfer(_toAddress, _amount); return innerToken.balanceOf(_toAddress) - before; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_lzEndpoint","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"_reason","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceiveFromChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"_payloadHash","type":"bytes32"}],"name":"RetryMessageSuccess","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"bytes","name":"_toAddress","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"SendToChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"_type","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_minDstGas","type":"uint256"}],"name":"SetMinDstGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"precrime","type":"address"}],"name":"SetPrecrime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_path","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"SetTrustedRemoteAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"SetUseCustomAdapterParams","type":"event"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_EXTRA_GAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PT_SEND","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_useZro","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateSendFee","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint64","name":"","type":"uint64"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"}],"name":"getTrustedRemoteAddress","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lzEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"minDstGasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"payloadSizeLimitLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"sendFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint16","name":"_packetType","type":"uint16"},{"internalType":"uint256","name":"_minGas","type":"uint256"}],"name":"setMinDstGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_dstChainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setPayloadSizeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_precrime","type":"address"}],"name":"setPrecrime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_path","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes","name":"_remoteAddress","type":"bytes"}],"name":"setTrustedRemoteAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_useCustomAdapterParams","type":"bool"}],"name":"setUseCustomAdapterParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useCustomAdapterParams","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620051a1380380620051a1833981810160405281019062000037919062000263565b81808033600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000b05760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000a79190620002bb565b60405180910390fd5b620000c1816200013560201b60201c565b508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505050508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250505050620002d8565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200022b82620001fe565b9050919050565b6200023d816200021e565b81146200024957600080fd5b50565b6000815190506200025d8162000232565b92915050565b600080604083850312156200027d576200027c620001f9565b5b60006200028d858286016200024c565b9250506020620002a0858286016200024c565b9150509250929050565b620002b5816200021e565b82525050565b6000602082019050620002d26000830184620002aa565b92915050565b60805160a051614e336200036e600039600081816111a60152818161124001528181611ad6015281816121f201528181612294015281816122dc01528181612815015281816128b601526128fd01526000818161080c01528181610ae401528181610ba601528181610c6101528181610e09015281816114a80152818161155d01528181611a2501526124820152614e336000f3fe6080604052600436106101f85760003560e01c80638da5cb5b1161010d578063cbed8b9c116100a0578063eb8d72b71161006f578063eb8d72b714610725578063ed629c5c1461074e578063f2fde38b14610779578063f5ecbdbc146107a2578063fc0c546a146107df576101f8565b8063cbed8b9c1461068e578063d1deba1f146106b7578063df2a5b3b146106d3578063eab45d9c146106fc576101f8565b8063a6c3d165116100dc578063a6c3d165146105e6578063b353aaa71461060f578063baf3292d1461063a578063c446183414610663576101f8565b80638da5cb5b146105285780639358928b14610553578063950c8a741461057e5780639f38369a146105a9576101f8565b806342d65a8d116101905780635b8c41e61161015f5780635b8c41e61461043157806366ad5c8a1461046e578063715018a6146104975780637533d788146104ae5780638cfd8f5c146104eb576101f8565b806342d65a8d1461039657806344770515146103bf5780634c42899a146103ea5780635190563614610415576101f8565b806310ddb137116101cc57806310ddb137146102b55780632a205e3d146102de5780633d8b38f61461031c5780633f1f4fa414610359576101f8565b80621d3567146101fd57806301ffc9a71461022657806307e0db17146102635780630df374831461028c575b600080fd5b34801561020957600080fd5b50610224600480360381019061021f9190612df2565b61080a565b005b34801561023257600080fd5b5061024d60048036038101906102489190612ef1565b610a60565b60405161025a9190612f39565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612f54565b610ada565b005b34801561029857600080fd5b506102b360048036038101906102ae9190612fb7565b610b70565b005b3480156102c157600080fd5b506102dc60048036038101906102d79190612f54565b610b9c565b005b3480156102ea57600080fd5b5061030560048036038101906103009190613023565b610c32565b6040516103139291906130ee565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613117565b610d13565b6040516103509190612f39565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612f54565b610de7565b60405161038d9190613177565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190613117565b610dff565b005b3480156103cb57600080fd5b506103d4610e9b565b6040516103e19190613177565b60405180910390f35b3480156103f657600080fd5b506103ff610ea0565b60405161040c91906131a1565b60405180910390f35b61042f600480360381019061042a9190613258565b610ea5565b005b34801561043d57600080fd5b506104586004803603810190610453919061347b565b610f47565b6040516104659190613503565b60405180910390f35b34801561047a57600080fd5b5061049560048036038101906104909190612df2565b610f8f565b005b3480156104a357600080fd5b506104ac6110a0565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190612f54565b6110b4565b6040516104e2919061359d565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d91906135bf565b611154565b60405161051f9190613177565b60405180910390f35b34801561053457600080fd5b5061053d611179565b60405161054a919061360e565b60405180910390f35b34801561055f57600080fd5b506105686111a2565b6040516105759190613177565b60405180910390f35b34801561058a57600080fd5b506105936112d3565b6040516105a0919061360e565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190612f54565b6112f9565b6040516105dd919061359d565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190613117565b611412565b005b34801561061b57600080fd5b506106246114a6565b6040516106319190613688565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c91906136a3565b6114ca565b005b34801561066f57600080fd5b5061067861154d565b6040516106859190613177565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b091906136d0565b611553565b005b6106d160048036038101906106cc9190612df2565b6115f5565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190613758565b611838565b005b34801561070857600080fd5b50610723600480360381019061071e91906137ab565b6118b9565b005b34801561073157600080fd5b5061074c60048036038101906107479190613117565b611915565b005b34801561075a57600080fd5b50610763611988565b6040516107709190612f39565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b91906136a3565b61199b565b005b3480156107ae57600080fd5b506107c960048036038101906107c491906137d8565b611a21565b6040516107d6919061359d565b60405180910390f35b3480156107eb57600080fd5b506107f4611ad2565b604051610801919061360e565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610849611afa565b73ffffffffffffffffffffffffffffffffffffffff161461089f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108969061389c565b60405180910390fd5b6000600160008861ffff1661ffff16815260200190815260200160002080546108c7906138eb565b80601f01602080910402602001604051908101604052809291908181526020018280546108f3906138eb565b80156109405780601f1061091557610100808354040283529160200191610940565b820191906000526020600020905b81548152906001019060200180831161092357829003601f168201915b5050505050905080518686905014801561095b575060008151115b801561098457508080519060200120868660405161097a92919061394c565b6040518091039020145b6109c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ba906139d7565b60405180910390fd5b610a578787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611b02565b50505050505050565b60007f14e4ceea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad35750610ad282611bcd565b5b9050919050565b610ae2611c37565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610b3b91906131a1565b600060405180830381600087803b158015610b5557600080fd5b505af1158015610b69573d6000803e3d6000fd5b5050505050565b610b78611c37565b80600360008461ffff1661ffff168152602001908152602001600020819055505050565b610ba4611c37565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610bfd91906131a1565b600060405180830381600087803b158015610c1757600080fd5b505af1158015610c2b573d6000803e3d6000fd5b5050505050565b600080600080898989604051602001610c4e9493929190613a24565b60405160208183030381529060405290507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340a7bb108b30848a8a8a6040518763ffffffff1660e01b8152600401610cc296959493929190613a64565b6040805180830381865afa158015610cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d029190613adc565b925092505097509795505050505050565b600080600160008661ffff1661ffff1681526020019081526020016000208054610d3c906138eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d68906138eb565b8015610db55780601f10610d8a57610100808354040283529160200191610db5565b820191906000526020600020905b815481529060010190602001808311610d9857829003601f168201915b505050505090508383604051610dcc92919061394c565b60405180910390208180519060200120149150509392505050565b60036020528060005260406000206000915090505481565b610e07611c37565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b8152600401610e6493929190613b1c565b600060405180830381600087803b158015610e7e57600080fd5b505af1158015610e92573d6000803e3d6000fd5b50505050505050565b600081565b600081565b610f3c898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611cbe565b505050505050505050565b60056020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050505481565b3073ffffffffffffffffffffffffffffffffffffffff16610fae611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb90613bc0565b60405180910390fd5b6110988686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d72565b505050505050565b6110a8611c37565b6110b26000611dde565b565b600160205280600052604060002060009150905080546110d3906138eb565b80601f01602080910402602001604051908101604052809291908181526020018280546110ff906138eb565b801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b505050505081565b6002602052816000526040600020602052806000526040600020600091509150505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111fd919061360e565b602060405180830381865afa15801561121a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123e9190613be0565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613be0565b03905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000600160008461ffff1661ffff1681526020019081526020016000208054611323906138eb565b80601f016020809104026020016040519081016040528092919081815260200182805461134f906138eb565b801561139c5780601f106113715761010080835404028352916020019161139c565b820191906000526020600020905b81548152906001019060200180831161137f57829003601f168201915b5050505050905060008151036113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90613c59565b60405180910390fd5b61140a6000601483516113fa9190613ca8565b83611ea29092919063ffffffff16565b915050919050565b61141a611c37565b81813060405160200161142f93929190613d24565b604051602081830303815290604052600160008561ffff1661ffff16815260200190815260200160002090816114659190613ef0565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161149993929190613b1c565b60405180910390a1505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6114d2611c37565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b81604051611542919061360e565b60405180910390a150565b61271081565b61155b611c37565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b81526004016115bc959493929190613fc2565b600060405180830381600087803b1580156115d657600080fd5b505af11580156115ea573d6000803e3d6000fd5b505050505050505050565b6000600560008861ffff1661ffff168152602001908152602001600020868660405161162292919061394c565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000205490506000801b810361169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169490614082565b60405180910390fd5b8083836040516116ae92919061394c565b6040518091039020146116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90614114565b60405180910390fd5b6000801b600560008961ffff1661ffff168152602001908152602001600020878760405161172592919061394c565b908152602001604051809103902060008667ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055506117f08787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d72565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611827959493929190614143565b60405180910390a150505050505050565b611840611c37565b80600260008561ffff1661ffff16815260200190815260200160002060008461ffff1661ffff168152602001908152602001600020819055507f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac08383836040516118ac93929190614191565b60405180910390a1505050565b6118c1611c37565b80600660006101000a81548160ff0219169083151502179055507f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a48160405161190a9190612f39565b60405180910390a150565b61191d611c37565b8181600160008661ffff1661ffff16815260200190815260200160002091826119479291906141d3565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161197b93929190613b1c565b60405180910390a1505050565b600660009054906101000a900460ff1681565b6119a3611c37565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a155760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611a0c919061360e565b60405180910390fd5b611a1e81611dde565b50565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b8152600401611a8294939291906142a3565b600060405180830381865afa158015611a9f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ac89190614358565b9050949350505050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b600033905090565b600080611bae5a60966366ad5c8a60e01b89898989604051602401611b2a94939291906143a1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050503073ffffffffffffffffffffffffffffffffffffffff16611fc0909392919063ffffffff16565b9150915081611bc557611bc48686868685612058565b5b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611c3f611afa565b73ffffffffffffffffffffffffffffffffffffffff16611c5d611179565b73ffffffffffffffffffffffffffffffffffffffff1614611cbc57611c80611afa565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611cb3919061360e565b60405180910390fd5b565b611ccc866000836000612106565b6000611cda88888888612177565b90506000808783604051602001611cf3939291906143f4565b6040516020818303038152906040529050611d12888287878734612389565b8873ffffffffffffffffffffffffffffffffffffffff168861ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d08985604051611d5f929190614432565b60405180910390a3505050505050505050565b600060208201519050600061ffff168161ffff1603611d9c57611d978585858561251f565b611dd7565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce906144ae565b60405180910390fd5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606081601f83611eb291906144ce565b1015611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea9061454e565b60405180910390fd5b8183611eff91906144ce565b84511015611f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f39906145ba565b60405180910390fd5b6060821560008114611f635760405191506000825260208201604052611fb4565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611fa15780518352602083019250602081019050611f84565b50868552601f19601f8301166040525050505b50809150509392505050565b6000606060008060008661ffff1667ffffffffffffffff811115611fe757611fe6613350565b5b6040519080825280601f01601f1916602001820160405280156120195781602001600182028036833780820191505090505b50905060008087516020890160008d8df191503d92508683111561203b578692505b828152826000602083013e81819450945050505094509492505050565b8180519060200120600560008761ffff1661ffff16815260200190815260200160002085604051612089919061460b565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055507fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c85858585856040516120f7959493929190614622565b60405180910390a15050505050565b600660009054906101000a900460ff161561212c57612127848484846125bc565b612171565b6000825114612170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612167906146fc565b60405180910390fd5b5b50505050565b6000612181611afa565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146121ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e59061478e565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612249919061360e565b602060405180830381865afa158015612266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228a9190613be0565b90506122d98630857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1661269b909392919063ffffffff16565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612333919061360e565b602060405180830381865afa158015612350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123749190613be0565b61237e9190613ca8565b915050949350505050565b6000600160008861ffff1661ffff16815260200190815260200160002080546123b1906138eb565b80601f01602080910402602001604051908101604052809291908181526020018280546123dd906138eb565b801561242a5780601f106123ff5761010080835404028352916020019161242a565b820191906000526020600020905b81548152906001019060200180831161240d57829003601f168201915b505050505090506000815103612475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246c90614820565b60405180910390fd5b612480878751612724565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c58031008389848a8a8a8a6040518863ffffffff1660e01b81526004016124e49695949392919061484f565b6000604051808303818588803b1580156124fd57600080fd5b505af1158015612511573d6000803e3d6000fd5b505050505050505050505050565b6000808280602001905181019061253691906148da565b9250925050600061255160008461279a90919063ffffffff16565b905061255e878284612810565b91508073ffffffffffffffffffffffffffffffffffffffff168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf846040516125ab9190613177565b60405180910390a350505050505050565b60006125c7836129a9565b90506000600260008761ffff1661ffff16815260200190815260200160002060008661ffff1661ffff16815260200190815260200160002054905060008111612645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263c90614995565b60405180910390fd5b828161265191906144ce565b821015612693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268a90614a01565b60405180910390fd5b505050505050565b61271e846323b872dd60e01b8585856040516024016126bc93929190614a21565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129fc565b50505050565b6000600360008461ffff1661ffff168152602001908152602001600020549050600081036127525761271090505b80821115612795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278c90614aa4565b60405180910390fd5b505050565b60006014826127a991906144ce565b835110156127ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e390614b10565b60405180910390fd5b60006c01000000000000000000000000836020860101510490508091505092915050565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b815260040161286c919061360e565b602060405180830381865afa158015612889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ad9190613be0565b90506128fa84847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ac39092919063ffffffff16565b807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401612954919061360e565b602060405180830381865afa158015612971573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129959190613be0565b61299f9190613ca8565b9150509392505050565b60006022825110156129f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e790614b7c565b60405180910390fd5b60228201519050919050565b6000612a5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b499092919063ffffffff16565b9050600081511115612abe5780806020019051810190612a7e9190614bb1565b612abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab490614c50565b60405180910390fd5b5b505050565b612b448363a9059cbb60e01b8484604051602401612ae2929190614c70565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129fc565b505050565b6060612b588484600085612b61565b90509392505050565b606082471015612ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9d90614d0b565b60405180910390fd5b612baf85612c75565b612bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be590614d77565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612c17919061460b565b60006040518083038185875af1925050503d8060008114612c54576040519150601f19603f3d011682016040523d82523d6000602084013e612c59565b606091505b5091509150612c69828286612c98565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612ca857829050612cf8565b600083511115612cbb5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cef9190614ddb565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b612d2a81612d13565b8114612d3557600080fd5b50565b600081359050612d4781612d21565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612d7257612d71612d4d565b5b8235905067ffffffffffffffff811115612d8f57612d8e612d52565b5b602083019150836001820283011115612dab57612daa612d57565b5b9250929050565b600067ffffffffffffffff82169050919050565b612dcf81612db2565b8114612dda57600080fd5b50565b600081359050612dec81612dc6565b92915050565b60008060008060008060808789031215612e0f57612e0e612d09565b5b6000612e1d89828a01612d38565b965050602087013567ffffffffffffffff811115612e3e57612e3d612d0e565b5b612e4a89828a01612d5c565b95509550506040612e5d89828a01612ddd565b935050606087013567ffffffffffffffff811115612e7e57612e7d612d0e565b5b612e8a89828a01612d5c565b92509250509295509295509295565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ece81612e99565b8114612ed957600080fd5b50565b600081359050612eeb81612ec5565b92915050565b600060208284031215612f0757612f06612d09565b5b6000612f1584828501612edc565b91505092915050565b60008115159050919050565b612f3381612f1e565b82525050565b6000602082019050612f4e6000830184612f2a565b92915050565b600060208284031215612f6a57612f69612d09565b5b6000612f7884828501612d38565b91505092915050565b6000819050919050565b612f9481612f81565b8114612f9f57600080fd5b50565b600081359050612fb181612f8b565b92915050565b60008060408385031215612fce57612fcd612d09565b5b6000612fdc85828601612d38565b9250506020612fed85828601612fa2565b9150509250929050565b61300081612f1e565b811461300b57600080fd5b50565b60008135905061301d81612ff7565b92915050565b600080600080600080600060a0888a03121561304257613041612d09565b5b60006130508a828b01612d38565b975050602088013567ffffffffffffffff81111561307157613070612d0e565b5b61307d8a828b01612d5c565b965096505060406130908a828b01612fa2565b94505060606130a18a828b0161300e565b935050608088013567ffffffffffffffff8111156130c2576130c1612d0e565b5b6130ce8a828b01612d5c565b925092505092959891949750929550565b6130e881612f81565b82525050565b600060408201905061310360008301856130df565b61311060208301846130df565b9392505050565b6000806000604084860312156131305761312f612d09565b5b600061313e86828701612d38565b935050602084013567ffffffffffffffff81111561315f5761315e612d0e565b5b61316b86828701612d5c565b92509250509250925092565b600060208201905061318c60008301846130df565b92915050565b61319b81612d13565b82525050565b60006020820190506131b66000830184613192565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131e7826131bc565b9050919050565b6131f7816131dc565b811461320257600080fd5b50565b600081359050613214816131ee565b92915050565b6000613225826131bc565b9050919050565b6132358161321a565b811461324057600080fd5b50565b6000813590506132528161322c565b92915050565b600080600080600080600080600060e08a8c03121561327a57613279612d09565b5b60006132888c828d01613205565b99505060206132998c828d01612d38565b98505060408a013567ffffffffffffffff8111156132ba576132b9612d0e565b5b6132c68c828d01612d5c565b975097505060606132d98c828d01612fa2565b95505060806132ea8c828d01613243565b94505060a06132fb8c828d01613205565b93505060c08a013567ffffffffffffffff81111561331c5761331b612d0e565b5b6133288c828d01612d5c565b92509250509295985092959850929598565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133888261333f565b810181811067ffffffffffffffff821117156133a7576133a6613350565b5b80604052505050565b60006133ba612cff565b90506133c6828261337f565b919050565b600067ffffffffffffffff8211156133e6576133e5613350565b5b6133ef8261333f565b9050602081019050919050565b82818337600083830152505050565b600061341e613419846133cb565b6133b0565b90508281526020810184848401111561343a5761343961333a565b5b6134458482856133fc565b509392505050565b600082601f83011261346257613461612d4d565b5b813561347284826020860161340b565b91505092915050565b60008060006060848603121561349457613493612d09565b5b60006134a286828701612d38565b935050602084013567ffffffffffffffff8111156134c3576134c2612d0e565b5b6134cf8682870161344d565b92505060406134e086828701612ddd565b9150509250925092565b6000819050919050565b6134fd816134ea565b82525050565b600060208201905061351860008301846134f4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561355857808201518184015260208101905061353d565b60008484015250505050565b600061356f8261351e565b6135798185613529565b935061358981856020860161353a565b6135928161333f565b840191505092915050565b600060208201905081810360008301526135b78184613564565b905092915050565b600080604083850312156135d6576135d5612d09565b5b60006135e485828601612d38565b92505060206135f585828601612d38565b9150509250929050565b613608816131dc565b82525050565b600060208201905061362360008301846135ff565b92915050565b6000819050919050565b600061364e613649613644846131bc565b613629565b6131bc565b9050919050565b600061366082613633565b9050919050565b600061367282613655565b9050919050565b61368281613667565b82525050565b600060208201905061369d6000830184613679565b92915050565b6000602082840312156136b9576136b8612d09565b5b60006136c784828501613205565b91505092915050565b6000806000806000608086880312156136ec576136eb612d09565b5b60006136fa88828901612d38565b955050602061370b88828901612d38565b945050604061371c88828901612fa2565b935050606086013567ffffffffffffffff81111561373d5761373c612d0e565b5b61374988828901612d5c565b92509250509295509295909350565b60008060006060848603121561377157613770612d09565b5b600061377f86828701612d38565b935050602061379086828701612d38565b92505060406137a186828701612fa2565b9150509250925092565b6000602082840312156137c1576137c0612d09565b5b60006137cf8482850161300e565b91505092915050565b600080600080608085870312156137f2576137f1612d09565b5b600061380087828801612d38565b945050602061381187828801612d38565b935050604061382287828801613205565b925050606061383387828801612fa2565b91505092959194509250565b600082825260208201905092915050565b7f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c65720000600082015250565b6000613886601e8361383f565b915061389182613850565b602082019050919050565b600060208201905081810360008301526138b581613879565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061390357607f821691505b602082108103613916576139156138bc565b5b50919050565b600081905092915050565b6000613933838561391c565b93506139408385846133fc565b82840190509392505050565b6000613959828486613927565b91508190509392505050565b7f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b60006139c160268361383f565b91506139cc82613965565b604082019050919050565b600060208201905081810360008301526139f0816139b4565b9050919050565b6000613a038385613529565b9350613a108385846133fc565b613a198361333f565b840190509392505050565b6000606082019050613a396000830187613192565b8181036020830152613a4c8185876139f7565b9050613a5b60408301846130df565b95945050505050565b600060a082019050613a796000830189613192565b613a8660208301886135ff565b8181036040830152613a988187613564565b9050613aa76060830186612f2a565b8181036080830152613aba8184866139f7565b9050979650505050505050565b600081519050613ad681612f8b565b92915050565b60008060408385031215613af357613af2612d09565b5b6000613b0185828601613ac7565b9250506020613b1285828601613ac7565b9150509250929050565b6000604082019050613b316000830186613192565b8181036020830152613b448184866139f7565b9050949350505050565b7f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560008201527f204c7a4170700000000000000000000000000000000000000000000000000000602082015250565b6000613baa60268361383f565b9150613bb582613b4e565b604082019050919050565b60006020820190508181036000830152613bd981613b9d565b9050919050565b600060208284031215613bf657613bf5612d09565b5b6000613c0484828501613ac7565b91505092915050565b7f4c7a4170703a206e6f20747275737465642070617468207265636f7264000000600082015250565b6000613c43601d8361383f565b9150613c4e82613c0d565b602082019050919050565b60006020820190508181036000830152613c7281613c36565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613cb382612f81565b9150613cbe83612f81565b9250828203905081811115613cd657613cd5613c79565b5b92915050565b60008160601b9050919050565b6000613cf482613cdc565b9050919050565b6000613d0682613ce9565b9050919050565b613d1e613d19826131dc565b613cfb565b82525050565b6000613d31828587613927565b9150613d3d8284613d0d565b601482019150819050949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613db07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d73565b613dba8683613d73565b95508019841693508086168417925050509392505050565b6000613ded613de8613de384612f81565b613629565b612f81565b9050919050565b6000819050919050565b613e0783613dd2565b613e1b613e1382613df4565b848454613d80565b825550505050565b600090565b613e30613e23565b613e3b818484613dfe565b505050565b5b81811015613e5f57613e54600082613e28565b600181019050613e41565b5050565b601f821115613ea457613e7581613d4e565b613e7e84613d63565b81016020851015613e8d578190505b613ea1613e9985613d63565b830182613e40565b50505b505050565b600082821c905092915050565b6000613ec760001984600802613ea9565b1980831691505092915050565b6000613ee08383613eb6565b9150826002028217905092915050565b613ef98261351e565b67ffffffffffffffff811115613f1257613f11613350565b5b613f1c82546138eb565b613f27828285613e63565b600060209050601f831160018114613f5a5760008415613f48578287015190505b613f528582613ed4565b865550613fba565b601f198416613f6886613d4e565b60005b82811015613f9057848901518255600182019150602085019450602081019050613f6b565b86831015613fad5784890151613fa9601f891682613eb6565b8355505b6001600288020188555050505b505050505050565b6000608082019050613fd76000830188613192565b613fe46020830187613192565b613ff160408301866130df565b81810360608301526140048184866139f7565b90509695505050505050565b7f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360008201527f6167650000000000000000000000000000000000000000000000000000000000602082015250565b600061406c60238361383f565b915061407782614010565b604082019050919050565b6000602082019050818103600083015261409b8161405f565b9050919050565b7f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f6160008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006140fe60218361383f565b9150614109826140a2565b604082019050919050565b6000602082019050818103600083015261412d816140f1565b9050919050565b61413d81612db2565b82525050565b60006080820190506141586000830188613192565b818103602083015261416b8186886139f7565b905061417a6040830185614134565b61418760608301846134f4565b9695505050505050565b60006060820190506141a66000830186613192565b6141b36020830185613192565b6141c060408301846130df565b949350505050565b600082905092915050565b6141dd83836141c8565b67ffffffffffffffff8111156141f6576141f5613350565b5b61420082546138eb565b61420b828285613e63565b6000601f83116001811461423a5760008415614228578287013590505b6142328582613ed4565b86555061429a565b601f19841661424886613d4e565b60005b828110156142705784890135825560018201915060208501945060208101905061424b565b8683101561428d5784890135614289601f891682613eb6565b8355505b6001600288020188555050505b50505050505050565b60006080820190506142b86000830187613192565b6142c56020830186613192565b6142d260408301856135ff565b6142df60608301846130df565b95945050505050565b60006142fb6142f6846133cb565b6133b0565b9050828152602081018484840111156143175761431661333a565b5b61432284828561353a565b509392505050565b600082601f83011261433f5761433e612d4d565b5b815161434f8482602086016142e8565b91505092915050565b60006020828403121561436e5761436d612d09565b5b600082015167ffffffffffffffff81111561438c5761438b612d0e565b5b6143988482850161432a565b91505092915050565b60006080820190506143b66000830187613192565b81810360208301526143c88186613564565b90506143d76040830185614134565b81810360608301526143e98184613564565b905095945050505050565b60006060820190506144096000830186613192565b818103602083015261441b8185613564565b905061442a60408301846130df565b949350505050565b6000604082019050818103600083015261444c8185613564565b905061445b60208301846130df565b9392505050565b7f4f4654436f72653a20756e6b6e6f776e207061636b6574207479706500000000600082015250565b6000614498601c8361383f565b91506144a382614462565b602082019050919050565b600060208201905081810360008301526144c78161448b565b9050919050565b60006144d982612f81565b91506144e483612f81565b92508282019050808211156144fc576144fb613c79565b5b92915050565b7f736c6963655f6f766572666c6f77000000000000000000000000000000000000600082015250565b6000614538600e8361383f565b915061454382614502565b602082019050919050565b600060208201905081810360008301526145678161452b565b9050919050565b7f736c6963655f6f75744f66426f756e6473000000000000000000000000000000600082015250565b60006145a460118361383f565b91506145af8261456e565b602082019050919050565b600060208201905081810360008301526145d381614597565b9050919050565b60006145e58261351e565b6145ef818561391c565b93506145ff81856020860161353a565b80840191505092915050565b600061461782846145da565b915081905092915050565b600060a0820190506146376000830188613192565b81810360208301526146498187613564565b90506146586040830186614134565b818103606083015261466a8185613564565b9050818103608083015261467e8184613564565b90509695505050505050565b7f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060008201527f656d7074792e0000000000000000000000000000000000000000000000000000602082015250565b60006146e660268361383f565b91506146f18261468a565b604082019050919050565b60006020820190508181036000830152614715816146d9565b9050919050565b7f50726f78794f46543a206f776e6572206973206e6f742073656e642063616c6c60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061477860228361383f565b91506147838261471c565b604082019050919050565b600060208201905081810360008301526147a78161476b565b9050919050565b7f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060008201527f61207472757374656420736f7572636500000000000000000000000000000000602082015250565b600061480a60308361383f565b9150614815826147ae565b604082019050919050565b60006020820190508181036000830152614839816147fd565b9050919050565b6148498161321a565b82525050565b600060c0820190506148646000830189613192565b81810360208301526148768188613564565b9050818103604083015261488a8187613564565b90506148996060830186614840565b6148a660808301856135ff565b81810360a08301526148b88184613564565b9050979650505050505050565b6000815190506148d481612d21565b92915050565b6000806000606084860312156148f3576148f2612d09565b5b6000614901868287016148c5565b935050602084015167ffffffffffffffff81111561492257614921612d0e565b5b61492e8682870161432a565b925050604061493f86828701613ac7565b9150509250925092565b7f4c7a4170703a206d696e4761734c696d6974206e6f7420736574000000000000600082015250565b600061497f601a8361383f565b915061498a82614949565b602082019050919050565b600060208201905081810360008301526149ae81614972565b9050919050565b7f4c7a4170703a20676173206c696d697420697320746f6f206c6f770000000000600082015250565b60006149eb601b8361383f565b91506149f6826149b5565b602082019050919050565b60006020820190508181036000830152614a1a816149de565b9050919050565b6000606082019050614a3660008301866135ff565b614a4360208301856135ff565b614a5060408301846130df565b949350505050565b7f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c61726765600082015250565b6000614a8e60208361383f565b9150614a9982614a58565b602082019050919050565b60006020820190508181036000830152614abd81614a81565b9050919050565b7f746f416464726573735f6f75744f66426f756e64730000000000000000000000600082015250565b6000614afa60158361383f565b9150614b0582614ac4565b602082019050919050565b60006020820190508181036000830152614b2981614aed565b9050919050565b7f4c7a4170703a20696e76616c69642061646170746572506172616d7300000000600082015250565b6000614b66601c8361383f565b9150614b7182614b30565b602082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b600081519050614bab81612ff7565b92915050565b600060208284031215614bc757614bc6612d09565b5b6000614bd584828501614b9c565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614c3a602a8361383f565b9150614c4582614bde565b604082019050919050565b60006020820190508181036000830152614c6981614c2d565b9050919050565b6000604082019050614c8560008301856135ff565b614c9260208301846130df565b9392505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614cf560268361383f565b9150614d0082614c99565b604082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614d61601d8361383f565b9150614d6c82614d2b565b602082019050919050565b60006020820190508181036000830152614d9081614d54565b9050919050565b600081519050919050565b6000614dad82614d97565b614db7818561383f565b9350614dc781856020860161353a565b614dd08161333f565b840191505092915050565b60006020820190508181036000830152614df58184614da2565b90509291505056fea26469706673582212205a5013f9946bb61821701dc4e2229291d48998842f1cc445c228ce162cce205664736f6c6343000818003300000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f0
Deployed Bytecode
0x6080604052600436106101f85760003560e01c80638da5cb5b1161010d578063cbed8b9c116100a0578063eb8d72b71161006f578063eb8d72b714610725578063ed629c5c1461074e578063f2fde38b14610779578063f5ecbdbc146107a2578063fc0c546a146107df576101f8565b8063cbed8b9c1461068e578063d1deba1f146106b7578063df2a5b3b146106d3578063eab45d9c146106fc576101f8565b8063a6c3d165116100dc578063a6c3d165146105e6578063b353aaa71461060f578063baf3292d1461063a578063c446183414610663576101f8565b80638da5cb5b146105285780639358928b14610553578063950c8a741461057e5780639f38369a146105a9576101f8565b806342d65a8d116101905780635b8c41e61161015f5780635b8c41e61461043157806366ad5c8a1461046e578063715018a6146104975780637533d788146104ae5780638cfd8f5c146104eb576101f8565b806342d65a8d1461039657806344770515146103bf5780634c42899a146103ea5780635190563614610415576101f8565b806310ddb137116101cc57806310ddb137146102b55780632a205e3d146102de5780633d8b38f61461031c5780633f1f4fa414610359576101f8565b80621d3567146101fd57806301ffc9a71461022657806307e0db17146102635780630df374831461028c575b600080fd5b34801561020957600080fd5b50610224600480360381019061021f9190612df2565b61080a565b005b34801561023257600080fd5b5061024d60048036038101906102489190612ef1565b610a60565b60405161025a9190612f39565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612f54565b610ada565b005b34801561029857600080fd5b506102b360048036038101906102ae9190612fb7565b610b70565b005b3480156102c157600080fd5b506102dc60048036038101906102d79190612f54565b610b9c565b005b3480156102ea57600080fd5b5061030560048036038101906103009190613023565b610c32565b6040516103139291906130ee565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e9190613117565b610d13565b6040516103509190612f39565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b9190612f54565b610de7565b60405161038d9190613177565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b89190613117565b610dff565b005b3480156103cb57600080fd5b506103d4610e9b565b6040516103e19190613177565b60405180910390f35b3480156103f657600080fd5b506103ff610ea0565b60405161040c91906131a1565b60405180910390f35b61042f600480360381019061042a9190613258565b610ea5565b005b34801561043d57600080fd5b506104586004803603810190610453919061347b565b610f47565b6040516104659190613503565b60405180910390f35b34801561047a57600080fd5b5061049560048036038101906104909190612df2565b610f8f565b005b3480156104a357600080fd5b506104ac6110a0565b005b3480156104ba57600080fd5b506104d560048036038101906104d09190612f54565b6110b4565b6040516104e2919061359d565b60405180910390f35b3480156104f757600080fd5b50610512600480360381019061050d91906135bf565b611154565b60405161051f9190613177565b60405180910390f35b34801561053457600080fd5b5061053d611179565b60405161054a919061360e565b60405180910390f35b34801561055f57600080fd5b506105686111a2565b6040516105759190613177565b60405180910390f35b34801561058a57600080fd5b506105936112d3565b6040516105a0919061360e565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190612f54565b6112f9565b6040516105dd919061359d565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190613117565b611412565b005b34801561061b57600080fd5b506106246114a6565b6040516106319190613688565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c91906136a3565b6114ca565b005b34801561066f57600080fd5b5061067861154d565b6040516106859190613177565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b091906136d0565b611553565b005b6106d160048036038101906106cc9190612df2565b6115f5565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190613758565b611838565b005b34801561070857600080fd5b50610723600480360381019061071e91906137ab565b6118b9565b005b34801561073157600080fd5b5061074c60048036038101906107479190613117565b611915565b005b34801561075a57600080fd5b50610763611988565b6040516107709190612f39565b60405180910390f35b34801561078557600080fd5b506107a0600480360381019061079b91906136a3565b61199b565b005b3480156107ae57600080fd5b506107c960048036038101906107c491906137d8565b611a21565b6040516107d6919061359d565b60405180910390f35b3480156107eb57600080fd5b506107f4611ad2565b604051610801919061360e565b60405180910390f35b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff16610849611afa565b73ffffffffffffffffffffffffffffffffffffffff161461089f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108969061389c565b60405180910390fd5b6000600160008861ffff1661ffff16815260200190815260200160002080546108c7906138eb565b80601f01602080910402602001604051908101604052809291908181526020018280546108f3906138eb565b80156109405780601f1061091557610100808354040283529160200191610940565b820191906000526020600020905b81548152906001019060200180831161092357829003601f168201915b5050505050905080518686905014801561095b575060008151115b801561098457508080519060200120868660405161097a92919061394c565b6040518091039020145b6109c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ba906139d7565b60405180910390fd5b610a578787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611b02565b50505050505050565b60007f14e4ceea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad35750610ad282611bcd565b5b9050919050565b610ae2611c37565b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610b3b91906131a1565b600060405180830381600087803b158015610b5557600080fd5b505af1158015610b69573d6000803e3d6000fd5b5050505050565b610b78611c37565b80600360008461ffff1661ffff168152602001908152602001600020819055505050565b610ba4611c37565b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610bfd91906131a1565b600060405180830381600087803b158015610c1757600080fd5b505af1158015610c2b573d6000803e3d6000fd5b5050505050565b600080600080898989604051602001610c4e9493929190613a24565b60405160208183030381529060405290507f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff166340a7bb108b30848a8a8a6040518763ffffffff1660e01b8152600401610cc296959493929190613a64565b6040805180830381865afa158015610cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d029190613adc565b925092505097509795505050505050565b600080600160008661ffff1661ffff1681526020019081526020016000208054610d3c906138eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610d68906138eb565b8015610db55780601f10610d8a57610100808354040283529160200191610db5565b820191906000526020600020905b815481529060010190602001808311610d9857829003601f168201915b505050505090508383604051610dcc92919061394c565b60405180910390208180519060200120149150509392505050565b60036020528060005260406000206000915090505481565b610e07611c37565b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b8152600401610e6493929190613b1c565b600060405180830381600087803b158015610e7e57600080fd5b505af1158015610e92573d6000803e3d6000fd5b50505050505050565b600081565b600081565b610f3c898989898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611cbe565b505050505050505050565b60056020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050505481565b3073ffffffffffffffffffffffffffffffffffffffff16610fae611afa565b73ffffffffffffffffffffffffffffffffffffffff1614611004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffb90613bc0565b60405180910390fd5b6110988686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d72565b505050505050565b6110a8611c37565b6110b26000611dde565b565b600160205280600052604060002060009150905080546110d3906138eb565b80601f01602080910402602001604051908101604052809291908181526020018280546110ff906138eb565b801561114c5780601f106111215761010080835404028352916020019161114c565b820191906000526020600020905b81548152906001019060200180831161112f57829003601f168201915b505050505081565b6002602052816000526040600020602052806000526040600020600091509150505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60007f000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111fd919061360e565b602060405180830381865afa15801561121a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123e9190613be0565b7f000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613be0565b03905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606000600160008461ffff1661ffff1681526020019081526020016000208054611323906138eb565b80601f016020809104026020016040519081016040528092919081815260200182805461134f906138eb565b801561139c5780601f106113715761010080835404028352916020019161139c565b820191906000526020600020905b81548152906001019060200180831161137f57829003601f168201915b5050505050905060008151036113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90613c59565b60405180910390fd5b61140a6000601483516113fa9190613ca8565b83611ea29092919063ffffffff16565b915050919050565b61141a611c37565b81813060405160200161142f93929190613d24565b604051602081830303815290604052600160008561ffff1661ffff16815260200190815260200160002090816114659190613ef0565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161149993929190613b1c565b60405180910390a1505050565b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67581565b6114d2611c37565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b81604051611542919061360e565b60405180910390a150565b61271081565b61155b611c37565b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b81526004016115bc959493929190613fc2565b600060405180830381600087803b1580156115d657600080fd5b505af11580156115ea573d6000803e3d6000fd5b505050505050505050565b6000600560008861ffff1661ffff168152602001908152602001600020868660405161162292919061394c565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff1681526020019081526020016000205490506000801b810361169d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169490614082565b60405180910390fd5b8083836040516116ae92919061394c565b6040518091039020146116f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ed90614114565b60405180910390fd5b6000801b600560008961ffff1661ffff168152602001908152602001600020878760405161172592919061394c565b908152602001604051809103902060008667ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055506117f08787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611d72565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611827959493929190614143565b60405180910390a150505050505050565b611840611c37565b80600260008561ffff1661ffff16815260200190815260200160002060008461ffff1661ffff168152602001908152602001600020819055507f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac08383836040516118ac93929190614191565b60405180910390a1505050565b6118c1611c37565b80600660006101000a81548160ff0219169083151502179055507f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a48160405161190a9190612f39565b60405180910390a150565b61191d611c37565b8181600160008661ffff1661ffff16815260200190815260200160002091826119479291906141d3565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161197b93929190613b1c565b60405180910390a1505050565b600660009054906101000a900460ff1681565b6119a3611c37565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a155760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611a0c919061360e565b60405180910390fd5b611a1e81611dde565b50565b60607f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b8152600401611a8294939291906142a3565b600060405180830381865afa158015611a9f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611ac89190614358565b9050949350505050565b60007f000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f0905090565b600033905090565b600080611bae5a60966366ad5c8a60e01b89898989604051602401611b2a94939291906143a1565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050503073ffffffffffffffffffffffffffffffffffffffff16611fc0909392919063ffffffff16565b9150915081611bc557611bc48686868685612058565b5b505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611c3f611afa565b73ffffffffffffffffffffffffffffffffffffffff16611c5d611179565b73ffffffffffffffffffffffffffffffffffffffff1614611cbc57611c80611afa565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611cb3919061360e565b60405180910390fd5b565b611ccc866000836000612106565b6000611cda88888888612177565b90506000808783604051602001611cf3939291906143f4565b6040516020818303038152906040529050611d12888287878734612389565b8873ffffffffffffffffffffffffffffffffffffffff168861ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d08985604051611d5f929190614432565b60405180910390a3505050505050505050565b600060208201519050600061ffff168161ffff1603611d9c57611d978585858561251f565b611dd7565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dce906144ae565b60405180910390fd5b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606081601f83611eb291906144ce565b1015611ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eea9061454e565b60405180910390fd5b8183611eff91906144ce565b84511015611f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f39906145ba565b60405180910390fd5b6060821560008114611f635760405191506000825260208201604052611fb4565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015611fa15780518352602083019250602081019050611f84565b50868552601f19601f8301166040525050505b50809150509392505050565b6000606060008060008661ffff1667ffffffffffffffff811115611fe757611fe6613350565b5b6040519080825280601f01601f1916602001820160405280156120195781602001600182028036833780820191505090505b50905060008087516020890160008d8df191503d92508683111561203b578692505b828152826000602083013e81819450945050505094509492505050565b8180519060200120600560008761ffff1661ffff16815260200190815260200160002085604051612089919061460b565b908152602001604051809103902060008567ffffffffffffffff1667ffffffffffffffff168152602001908152602001600020819055507fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c85858585856040516120f7959493929190614622565b60405180910390a15050505050565b600660009054906101000a900460ff161561212c57612127848484846125bc565b612171565b6000825114612170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612167906146fc565b60405180910390fd5b5b50505050565b6000612181611afa565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146121ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e59061478e565b60405180910390fd5b60007f000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612249919061360e565b602060405180830381865afa158015612266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228a9190613be0565b90506122d98630857f000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f073ffffffffffffffffffffffffffffffffffffffff1661269b909392919063ffffffff16565b807f000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612333919061360e565b602060405180830381865afa158015612350573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123749190613be0565b61237e9190613ca8565b915050949350505050565b6000600160008861ffff1661ffff16815260200190815260200160002080546123b1906138eb565b80601f01602080910402602001604051908101604052809291908181526020018280546123dd906138eb565b801561242a5780601f106123ff5761010080835404028352916020019161242a565b820191906000526020600020905b81548152906001019060200180831161240d57829003601f168201915b505050505090506000815103612475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246c90614820565b60405180910390fd5b612480878751612724565b7f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67573ffffffffffffffffffffffffffffffffffffffff1663c58031008389848a8a8a8a6040518863ffffffff1660e01b81526004016124e49695949392919061484f565b6000604051808303818588803b1580156124fd57600080fd5b505af1158015612511573d6000803e3d6000fd5b505050505050505050505050565b6000808280602001905181019061253691906148da565b9250925050600061255160008461279a90919063ffffffff16565b905061255e878284612810565b91508073ffffffffffffffffffffffffffffffffffffffff168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf846040516125ab9190613177565b60405180910390a350505050505050565b60006125c7836129a9565b90506000600260008761ffff1661ffff16815260200190815260200160002060008661ffff1661ffff16815260200190815260200160002054905060008111612645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263c90614995565b60405180910390fd5b828161265191906144ce565b821015612693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268a90614a01565b60405180910390fd5b505050505050565b61271e846323b872dd60e01b8585856040516024016126bc93929190614a21565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129fc565b50505050565b6000600360008461ffff1661ffff168152602001908152602001600020549050600081036127525761271090505b80821115612795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278c90614aa4565b60405180910390fd5b505050565b60006014826127a991906144ce565b835110156127ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e390614b10565b60405180910390fd5b60006c01000000000000000000000000836020860101510490508091505092915050565b6000807f000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f073ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b815260040161286c919061360e565b602060405180830381865afa158015612889573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ad9190613be0565b90506128fa84847f000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f073ffffffffffffffffffffffffffffffffffffffff16612ac39092919063ffffffff16565b807f000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f073ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401612954919061360e565b602060405180830381865afa158015612971573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129959190613be0565b61299f9190613ca8565b9150509392505050565b60006022825110156129f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e790614b7c565b60405180910390fd5b60228201519050919050565b6000612a5e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612b499092919063ffffffff16565b9050600081511115612abe5780806020019051810190612a7e9190614bb1565b612abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab490614c50565b60405180910390fd5b5b505050565b612b448363a9059cbb60e01b8484604051602401612ae2929190614c70565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506129fc565b505050565b6060612b588484600085612b61565b90509392505050565b606082471015612ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9d90614d0b565b60405180910390fd5b612baf85612c75565b612bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be590614d77565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612c17919061460b565b60006040518083038185875af1925050503d8060008114612c54576040519150601f19603f3d011682016040523d82523d6000602084013e612c59565b606091505b5091509150612c69828286612c98565b92505050949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315612ca857829050612cf8565b600083511115612cbb5782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cef9190614ddb565b60405180910390fd5b9392505050565b6000604051905090565b600080fd5b600080fd5b600061ffff82169050919050565b612d2a81612d13565b8114612d3557600080fd5b50565b600081359050612d4781612d21565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612d7257612d71612d4d565b5b8235905067ffffffffffffffff811115612d8f57612d8e612d52565b5b602083019150836001820283011115612dab57612daa612d57565b5b9250929050565b600067ffffffffffffffff82169050919050565b612dcf81612db2565b8114612dda57600080fd5b50565b600081359050612dec81612dc6565b92915050565b60008060008060008060808789031215612e0f57612e0e612d09565b5b6000612e1d89828a01612d38565b965050602087013567ffffffffffffffff811115612e3e57612e3d612d0e565b5b612e4a89828a01612d5c565b95509550506040612e5d89828a01612ddd565b935050606087013567ffffffffffffffff811115612e7e57612e7d612d0e565b5b612e8a89828a01612d5c565b92509250509295509295509295565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ece81612e99565b8114612ed957600080fd5b50565b600081359050612eeb81612ec5565b92915050565b600060208284031215612f0757612f06612d09565b5b6000612f1584828501612edc565b91505092915050565b60008115159050919050565b612f3381612f1e565b82525050565b6000602082019050612f4e6000830184612f2a565b92915050565b600060208284031215612f6a57612f69612d09565b5b6000612f7884828501612d38565b91505092915050565b6000819050919050565b612f9481612f81565b8114612f9f57600080fd5b50565b600081359050612fb181612f8b565b92915050565b60008060408385031215612fce57612fcd612d09565b5b6000612fdc85828601612d38565b9250506020612fed85828601612fa2565b9150509250929050565b61300081612f1e565b811461300b57600080fd5b50565b60008135905061301d81612ff7565b92915050565b600080600080600080600060a0888a03121561304257613041612d09565b5b60006130508a828b01612d38565b975050602088013567ffffffffffffffff81111561307157613070612d0e565b5b61307d8a828b01612d5c565b965096505060406130908a828b01612fa2565b94505060606130a18a828b0161300e565b935050608088013567ffffffffffffffff8111156130c2576130c1612d0e565b5b6130ce8a828b01612d5c565b925092505092959891949750929550565b6130e881612f81565b82525050565b600060408201905061310360008301856130df565b61311060208301846130df565b9392505050565b6000806000604084860312156131305761312f612d09565b5b600061313e86828701612d38565b935050602084013567ffffffffffffffff81111561315f5761315e612d0e565b5b61316b86828701612d5c565b92509250509250925092565b600060208201905061318c60008301846130df565b92915050565b61319b81612d13565b82525050565b60006020820190506131b66000830184613192565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131e7826131bc565b9050919050565b6131f7816131dc565b811461320257600080fd5b50565b600081359050613214816131ee565b92915050565b6000613225826131bc565b9050919050565b6132358161321a565b811461324057600080fd5b50565b6000813590506132528161322c565b92915050565b600080600080600080600080600060e08a8c03121561327a57613279612d09565b5b60006132888c828d01613205565b99505060206132998c828d01612d38565b98505060408a013567ffffffffffffffff8111156132ba576132b9612d0e565b5b6132c68c828d01612d5c565b975097505060606132d98c828d01612fa2565b95505060806132ea8c828d01613243565b94505060a06132fb8c828d01613205565b93505060c08a013567ffffffffffffffff81111561331c5761331b612d0e565b5b6133288c828d01612d5c565b92509250509295985092959850929598565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133888261333f565b810181811067ffffffffffffffff821117156133a7576133a6613350565b5b80604052505050565b60006133ba612cff565b90506133c6828261337f565b919050565b600067ffffffffffffffff8211156133e6576133e5613350565b5b6133ef8261333f565b9050602081019050919050565b82818337600083830152505050565b600061341e613419846133cb565b6133b0565b90508281526020810184848401111561343a5761343961333a565b5b6134458482856133fc565b509392505050565b600082601f83011261346257613461612d4d565b5b813561347284826020860161340b565b91505092915050565b60008060006060848603121561349457613493612d09565b5b60006134a286828701612d38565b935050602084013567ffffffffffffffff8111156134c3576134c2612d0e565b5b6134cf8682870161344d565b92505060406134e086828701612ddd565b9150509250925092565b6000819050919050565b6134fd816134ea565b82525050565b600060208201905061351860008301846134f4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561355857808201518184015260208101905061353d565b60008484015250505050565b600061356f8261351e565b6135798185613529565b935061358981856020860161353a565b6135928161333f565b840191505092915050565b600060208201905081810360008301526135b78184613564565b905092915050565b600080604083850312156135d6576135d5612d09565b5b60006135e485828601612d38565b92505060206135f585828601612d38565b9150509250929050565b613608816131dc565b82525050565b600060208201905061362360008301846135ff565b92915050565b6000819050919050565b600061364e613649613644846131bc565b613629565b6131bc565b9050919050565b600061366082613633565b9050919050565b600061367282613655565b9050919050565b61368281613667565b82525050565b600060208201905061369d6000830184613679565b92915050565b6000602082840312156136b9576136b8612d09565b5b60006136c784828501613205565b91505092915050565b6000806000806000608086880312156136ec576136eb612d09565b5b60006136fa88828901612d38565b955050602061370b88828901612d38565b945050604061371c88828901612fa2565b935050606086013567ffffffffffffffff81111561373d5761373c612d0e565b5b61374988828901612d5c565b92509250509295509295909350565b60008060006060848603121561377157613770612d09565b5b600061377f86828701612d38565b935050602061379086828701612d38565b92505060406137a186828701612fa2565b9150509250925092565b6000602082840312156137c1576137c0612d09565b5b60006137cf8482850161300e565b91505092915050565b600080600080608085870312156137f2576137f1612d09565b5b600061380087828801612d38565b945050602061381187828801612d38565b935050604061382287828801613205565b925050606061383387828801612fa2565b91505092959194509250565b600082825260208201905092915050565b7f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c65720000600082015250565b6000613886601e8361383f565b915061389182613850565b602082019050919050565b600060208201905081810360008301526138b581613879565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061390357607f821691505b602082108103613916576139156138bc565b5b50919050565b600081905092915050565b6000613933838561391c565b93506139408385846133fc565b82840190509392505050565b6000613959828486613927565b91508190509392505050565b7f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b60006139c160268361383f565b91506139cc82613965565b604082019050919050565b600060208201905081810360008301526139f0816139b4565b9050919050565b6000613a038385613529565b9350613a108385846133fc565b613a198361333f565b840190509392505050565b6000606082019050613a396000830187613192565b8181036020830152613a4c8185876139f7565b9050613a5b60408301846130df565b95945050505050565b600060a082019050613a796000830189613192565b613a8660208301886135ff565b8181036040830152613a988187613564565b9050613aa76060830186612f2a565b8181036080830152613aba8184866139f7565b9050979650505050505050565b600081519050613ad681612f8b565b92915050565b60008060408385031215613af357613af2612d09565b5b6000613b0185828601613ac7565b9250506020613b1285828601613ac7565b9150509250929050565b6000604082019050613b316000830186613192565b8181036020830152613b448184866139f7565b9050949350505050565b7f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d75737420626560008201527f204c7a4170700000000000000000000000000000000000000000000000000000602082015250565b6000613baa60268361383f565b9150613bb582613b4e565b604082019050919050565b60006020820190508181036000830152613bd981613b9d565b9050919050565b600060208284031215613bf657613bf5612d09565b5b6000613c0484828501613ac7565b91505092915050565b7f4c7a4170703a206e6f20747275737465642070617468207265636f7264000000600082015250565b6000613c43601d8361383f565b9150613c4e82613c0d565b602082019050919050565b60006020820190508181036000830152613c7281613c36565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613cb382612f81565b9150613cbe83612f81565b9250828203905081811115613cd657613cd5613c79565b5b92915050565b60008160601b9050919050565b6000613cf482613cdc565b9050919050565b6000613d0682613ce9565b9050919050565b613d1e613d19826131dc565b613cfb565b82525050565b6000613d31828587613927565b9150613d3d8284613d0d565b601482019150819050949350505050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613db07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d73565b613dba8683613d73565b95508019841693508086168417925050509392505050565b6000613ded613de8613de384612f81565b613629565b612f81565b9050919050565b6000819050919050565b613e0783613dd2565b613e1b613e1382613df4565b848454613d80565b825550505050565b600090565b613e30613e23565b613e3b818484613dfe565b505050565b5b81811015613e5f57613e54600082613e28565b600181019050613e41565b5050565b601f821115613ea457613e7581613d4e565b613e7e84613d63565b81016020851015613e8d578190505b613ea1613e9985613d63565b830182613e40565b50505b505050565b600082821c905092915050565b6000613ec760001984600802613ea9565b1980831691505092915050565b6000613ee08383613eb6565b9150826002028217905092915050565b613ef98261351e565b67ffffffffffffffff811115613f1257613f11613350565b5b613f1c82546138eb565b613f27828285613e63565b600060209050601f831160018114613f5a5760008415613f48578287015190505b613f528582613ed4565b865550613fba565b601f198416613f6886613d4e565b60005b82811015613f9057848901518255600182019150602085019450602081019050613f6b565b86831015613fad5784890151613fa9601f891682613eb6565b8355505b6001600288020188555050505b505050505050565b6000608082019050613fd76000830188613192565b613fe46020830187613192565b613ff160408301866130df565b81810360608301526140048184866139f7565b90509695505050505050565b7f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d65737360008201527f6167650000000000000000000000000000000000000000000000000000000000602082015250565b600061406c60238361383f565b915061407782614010565b604082019050919050565b6000602082019050818103600083015261409b8161405f565b9050919050565b7f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f6160008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b60006140fe60218361383f565b9150614109826140a2565b604082019050919050565b6000602082019050818103600083015261412d816140f1565b9050919050565b61413d81612db2565b82525050565b60006080820190506141586000830188613192565b818103602083015261416b8186886139f7565b905061417a6040830185614134565b61418760608301846134f4565b9695505050505050565b60006060820190506141a66000830186613192565b6141b36020830185613192565b6141c060408301846130df565b949350505050565b600082905092915050565b6141dd83836141c8565b67ffffffffffffffff8111156141f6576141f5613350565b5b61420082546138eb565b61420b828285613e63565b6000601f83116001811461423a5760008415614228578287013590505b6142328582613ed4565b86555061429a565b601f19841661424886613d4e565b60005b828110156142705784890135825560018201915060208501945060208101905061424b565b8683101561428d5784890135614289601f891682613eb6565b8355505b6001600288020188555050505b50505050505050565b60006080820190506142b86000830187613192565b6142c56020830186613192565b6142d260408301856135ff565b6142df60608301846130df565b95945050505050565b60006142fb6142f6846133cb565b6133b0565b9050828152602081018484840111156143175761431661333a565b5b61432284828561353a565b509392505050565b600082601f83011261433f5761433e612d4d565b5b815161434f8482602086016142e8565b91505092915050565b60006020828403121561436e5761436d612d09565b5b600082015167ffffffffffffffff81111561438c5761438b612d0e565b5b6143988482850161432a565b91505092915050565b60006080820190506143b66000830187613192565b81810360208301526143c88186613564565b90506143d76040830185614134565b81810360608301526143e98184613564565b905095945050505050565b60006060820190506144096000830186613192565b818103602083015261441b8185613564565b905061442a60408301846130df565b949350505050565b6000604082019050818103600083015261444c8185613564565b905061445b60208301846130df565b9392505050565b7f4f4654436f72653a20756e6b6e6f776e207061636b6574207479706500000000600082015250565b6000614498601c8361383f565b91506144a382614462565b602082019050919050565b600060208201905081810360008301526144c78161448b565b9050919050565b60006144d982612f81565b91506144e483612f81565b92508282019050808211156144fc576144fb613c79565b5b92915050565b7f736c6963655f6f766572666c6f77000000000000000000000000000000000000600082015250565b6000614538600e8361383f565b915061454382614502565b602082019050919050565b600060208201905081810360008301526145678161452b565b9050919050565b7f736c6963655f6f75744f66426f756e6473000000000000000000000000000000600082015250565b60006145a460118361383f565b91506145af8261456e565b602082019050919050565b600060208201905081810360008301526145d381614597565b9050919050565b60006145e58261351e565b6145ef818561391c565b93506145ff81856020860161353a565b80840191505092915050565b600061461782846145da565b915081905092915050565b600060a0820190506146376000830188613192565b81810360208301526146498187613564565b90506146586040830186614134565b818103606083015261466a8185613564565b9050818103608083015261467e8184613564565b90509695505050505050565b7f4f4654436f72653a205f61646170746572506172616d73206d7573742062652060008201527f656d7074792e0000000000000000000000000000000000000000000000000000602082015250565b60006146e660268361383f565b91506146f18261468a565b604082019050919050565b60006020820190508181036000830152614715816146d9565b9050919050565b7f50726f78794f46543a206f776e6572206973206e6f742073656e642063616c6c60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b600061477860228361383f565b91506147838261471c565b604082019050919050565b600060208201905081810360008301526147a78161476b565b9050919050565b7f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060008201527f61207472757374656420736f7572636500000000000000000000000000000000602082015250565b600061480a60308361383f565b9150614815826147ae565b604082019050919050565b60006020820190508181036000830152614839816147fd565b9050919050565b6148498161321a565b82525050565b600060c0820190506148646000830189613192565b81810360208301526148768188613564565b9050818103604083015261488a8187613564565b90506148996060830186614840565b6148a660808301856135ff565b81810360a08301526148b88184613564565b9050979650505050505050565b6000815190506148d481612d21565b92915050565b6000806000606084860312156148f3576148f2612d09565b5b6000614901868287016148c5565b935050602084015167ffffffffffffffff81111561492257614921612d0e565b5b61492e8682870161432a565b925050604061493f86828701613ac7565b9150509250925092565b7f4c7a4170703a206d696e4761734c696d6974206e6f7420736574000000000000600082015250565b600061497f601a8361383f565b915061498a82614949565b602082019050919050565b600060208201905081810360008301526149ae81614972565b9050919050565b7f4c7a4170703a20676173206c696d697420697320746f6f206c6f770000000000600082015250565b60006149eb601b8361383f565b91506149f6826149b5565b602082019050919050565b60006020820190508181036000830152614a1a816149de565b9050919050565b6000606082019050614a3660008301866135ff565b614a4360208301856135ff565b614a5060408301846130df565b949350505050565b7f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c61726765600082015250565b6000614a8e60208361383f565b9150614a9982614a58565b602082019050919050565b60006020820190508181036000830152614abd81614a81565b9050919050565b7f746f416464726573735f6f75744f66426f756e64730000000000000000000000600082015250565b6000614afa60158361383f565b9150614b0582614ac4565b602082019050919050565b60006020820190508181036000830152614b2981614aed565b9050919050565b7f4c7a4170703a20696e76616c69642061646170746572506172616d7300000000600082015250565b6000614b66601c8361383f565b9150614b7182614b30565b602082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b600081519050614bab81612ff7565b92915050565b600060208284031215614bc757614bc6612d09565b5b6000614bd584828501614b9c565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000614c3a602a8361383f565b9150614c4582614bde565b604082019050919050565b60006020820190508181036000830152614c6981614c2d565b9050919050565b6000604082019050614c8560008301856135ff565b614c9260208301846130df565b9392505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000614cf560268361383f565b9150614d0082614c99565b604082019050919050565b60006020820190508181036000830152614d2481614ce8565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614d61601d8361383f565b9150614d6c82614d2b565b602082019050919050565b60006020820190508181036000830152614d9081614d54565b9050919050565b600081519050919050565b6000614dad82614d97565b614db7818561383f565b9350614dc781856020860161353a565b614dd08161333f565b840191505092915050565b60006020820190508181036000830152614df58184614da2565b90509291505056fea26469706673582212205a5013f9946bb61821701dc4e2229291d48998842f1cc445c228ce162cce205664736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f0
-----Decoded View---------------
Arg [0] : _lzEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [1] : _token (address): 0x842C521436E6E91B3c1919a0240e91D1788265f0
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [1] : 000000000000000000000000842c521436e6e91b3c1919a0240e91d1788265f0
Deployed Bytecode Sourcemap
75242:1341:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61572:842;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71459:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65196:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67099:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65327:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71682:479;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;67339:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61114:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65464:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71234:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71300:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72169:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68236:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69559:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59624:103;;;;;;;;;;;;;:::i;:::-;;60984:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61042:65;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58949:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75502:197;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61174:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66293:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66004:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60931:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66631:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60867:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64941:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70177:810;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66775:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72581:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65789:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71343:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59882:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64625:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75707:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61572:842;61855:10;61831:35;;:12;:10;:12::i;:::-;:35;;;61823:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;61914:26;61943:19;:32;61963:11;61943:32;;;;;;;;;;;;;;;61914:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62163:13;:20;62141:11;;:18;;:42;:70;;;;;62210:1;62187:13;:20;:24;62141:70;:124;;;;;62251:13;62241:24;;;;;;62225:11;;62215:22;;;;;;;:::i;:::-;;;;;;;;:50;62141:124;62119:212;;;;;;;;;;;;:::i;:::-;;;;;;;;;62344:62;62363:11;62376;;62344:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62389:6;62397:8;;62344:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:62::i;:::-;61746:668;61572:842;;;;;;:::o;71459:215::-;71561:4;71600:26;71585:41;;;:11;:41;;;;:81;;;;71630:36;71654:11;71630:23;:36::i;:::-;71585:81;71578:88;;71459:215;;;:::o;65196:123::-;58835:13;:11;:13::i;:::-;65276:10:::1;:25;;;65302:8;65276:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65196:123:::0;:::o;67099:142::-;58835:13;:11;:13::i;:::-;67228:5:::1;67190:22;:35;67213:11;67190:35;;;;;;;;;;;;;;;:43;;;;67099:142:::0;;:::o;65327:129::-;58835:13;:11;:13::i;:::-;65410:10:::1;:28;;;65439:8;65410:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65327:129:::0;:::o;71682:479::-;71903:14;71919:11;71987:20;71333:1;72030:10;;72042:7;72010:40;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71987:63;;72068:10;:23;;;72092:11;72113:4;72120:7;72129;72138:14;;72068:85;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72061:92;;;;;71682:479;;;;;;;;;;:::o;67339:250::-;67435:4;67452:26;67481:19;:32;67501:11;67481:32;;;;;;;;;;;;;;;67452:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67569:11;;67559:22;;;;;;;:::i;:::-;;;;;;;;67541:13;67531:24;;;;;;:50;67524:57;;;67339:250;;;;;:::o;61114:53::-;;;;;;;;;;;;;;;;;:::o;65464:178::-;58835:13;:11;:13::i;:::-;65579:10:::1;:29;;;65609:11;65622;;65579:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;65464:178:::0;;;:::o;71234:37::-;71270:1;71234:37;:::o;71300:34::-;71333:1;71300:34;:::o;72169:404::-;72467:98;72473:5;72480:11;72493:10;;72467:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72505:7;72514:14;72530:18;72550:14;;72467:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:98::i;:::-;72169:404;;;;;;;;;:::o;68236:85::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69559:389::-;69816:4;69792:29;;:12;:10;:12::i;:::-;:29;;;69784:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;69875:65;69897:11;69910;;69875:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69923:6;69931:8;;69875:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:65::i;:::-;69559:389;;;;;;:::o;59624:103::-;58835:13;:11;:13::i;:::-;59689:30:::1;59716:1;59689:18;:30::i;:::-;59624:103::o:0;60984:51::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61042:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58949:87::-;58995:7;59022:6;;;;;;;;;;;59015:13;;58949:87;:::o;75502:197::-;75569:4;75645:10;:20;;;75674:4;75645:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75618:10;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;75611:69;;75502:197;:::o;61174:23::-;;;;;;;;;;;;;:::o;66293:330::-;66372:12;66397:17;66417:19;:35;66437:14;66417:35;;;;;;;;;;;;;;;66397:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66486:1;66471:4;:11;:16;66463:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66539:31;66550:1;66567:2;66553:4;:11;:16;;;;:::i;:::-;66539:4;:10;;:31;;;;;:::i;:::-;66532:38;;;66293:330;;;:::o;66004:281::-;58835:13;:11;:13::i;:::-;66176:14:::1;;66200:4;66159:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66121:19;:35;66141:14;66121:35;;;;;;;;;;;;;;;:85;;;;;;:::i;:::-;;66222:55;66246:14;66262;;66222:55;;;;;;;;:::i;:::-;;;;;;;;66004:281:::0;;;:::o;60931:46::-;;;:::o;66631:136::-;58835:13;:11;:13::i;:::-;66712:9:::1;66701:8;;:20;;;;;;;;;;;;;;;;;;66737:22;66749:9;66737:22;;;;;;:::i;:::-;;;;;;;;66631:136:::0;:::o;60867:55::-;60917:5;60867:55;:::o;64941:247::-;58835:13;:11;:13::i;:::-;65118:10:::1;:20;;;65139:8;65149;65159:11;65172:7;;65118:62;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64941:247:::0;;;;;:::o;70177:810::-;70409:19;70431:14;:27;70446:11;70431:27;;;;;;;;;;;;;;;70459:11;;70431:40;;;;;;;:::i;:::-;;;;;;;;;;;;;:48;70472:6;70431:48;;;;;;;;;;;;;;;;70409:70;;70521:1;70513:10;;70498:11;:25;70490:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;70605:11;70592:8;;70582:19;;;;;;;:::i;:::-;;;;;;;;:34;70574:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;70761:1;70753:10;;70702:14;:27;70717:11;70702:27;;;;;;;;;;;;;;;70730:11;;70702:40;;;;;;;:::i;:::-;;;;;;;;;;;;;:48;70743:6;70702:48;;;;;;;;;;;;;;;:61;;;;70832:65;70854:11;70867;;70832:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70880:6;70888:8;;70832:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:65::i;:::-;70913:66;70933:11;70946;;70959:6;70967:11;70913:66;;;;;;;;;;:::i;:::-;;;;;;;;70353:634;70177:810;;;;;;:::o;66775:262::-;58835:13;:11;:13::i;:::-;66959:7:::1;66915:15;:28;66931:11;66915:28;;;;;;;;;;;;;;;:41;66944:11;66915:41;;;;;;;;;;;;;;;:51;;;;66982:47;66995:11;67008;67021:7;66982:47;;;;;;;;:::i;:::-;;;;;;;;66775:262:::0;;;:::o;72581:223::-;58835:13;:11;:13::i;:::-;72707:23:::1;72682:22;;:48;;;;;;;;;;;;;;;;;;72746:50;72772:23;72746:50;;;;;;:::i;:::-;;;;;;;;72581:223:::0;:::o;65789:207::-;58835:13;:11;:13::i;:::-;65928:5:::1;;65890:19;:35;65910:14;65890:35;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;65949:39;65966:14;65982:5;;65949:39;;;;;;;;:::i;:::-;;;;;;;;65789:207:::0;;;:::o;71343:34::-;;;;;;;;;;;;;:::o;59882:220::-;58835:13;:11;:13::i;:::-;59987:1:::1;59967:22;;:8;:22;;::::0;59963:93:::1;;60041:1;60013:31;;;;;;;;;;;:::i;:::-;;;;;;;;59963:93;60066:28;60085:8;60066:18;:28::i;:::-;59882:220:::0;:::o;64625:254::-;64771:12;64803:10;:20;;;64824:8;64834;64852:4;64859:11;64803:68;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64796:75;;64625:254;;;;;;:::o;75707:109::-;75762:7;75797:10;75782:26;;75707:109;:::o;57065:98::-;57118:7;57145:10;57138:17;;57065:98;:::o;68605:563::-;68798:12;68812:19;68835:203;68883:9;68907:3;68948:34;;;68984:11;68997;69010:6;69018:8;68925:102;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68843:4;68835:33;;;;:203;;;;;;:::i;:::-;68797:241;;;;69054:7;69049:112;;69078:71;69098:11;69111;69124:6;69132:8;69142:6;69078:19;:71::i;:::-;69049:112;68786:382;;68605:563;;;;:::o;20125:157::-;20210:4;20249:25;20234:40;;;:11;:40;;;;20227:47;;20125:157;;;:::o;59114:166::-;59185:12;:10;:12::i;:::-;59174:23;;:7;:5;:7::i;:::-;:23;;;59170:103;;59248:12;:10;:12::i;:::-;59221:40;;;;;;;;;;;:::i;:::-;;;;;;;;59170:103;59114:166::o;73312:684::-;73588:71;73608:11;71333:1;73630:14;71270:1;73588:19;:71::i;:::-;73672:11;73686:51;73697:5;73704:11;73717:10;73729:7;73686:10;:51::i;:::-;73672:65;;73750:22;71333:1;73795:10;73807:6;73775:39;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73750:64;;73825:94;73833:11;73846:9;73857:14;73873:18;73893:14;73909:9;73825:7;:94::i;:::-;73962:5;73937:51;;73949:11;73937:51;;;73969:10;73981:6;73937:51;;;;;;;:::i;:::-;;;;;;;;73577:419;;73312:684;;;;;;;:::o;72812:492::-;73007:17;73093:2;73083:8;73079:17;73073:24;73059:38;;71333:1;73124:21;;:10;:21;;;73120:177;;73162:52;73171:11;73184;73197:6;73205:8;73162;:52::i;:::-;73120:177;;;73247:38;;;;;;;;;;:::i;:::-;;;;;;;;73120:177;72996:308;72812:492;;;;:::o;60262:191::-;60336:16;60355:6;;;;;;;;;;;60336:25;;60381:8;60372:6;;:17;;;;;;;;;;;;;;;;;;60436:8;60405:40;;60426:8;60405:40;;;;;;;;;;;;60325:128;60262:191;:::o;38053:2833::-;38173:12;38222:7;38216:2;38206:7;:12;;;;:::i;:::-;:23;;38198:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;38293:7;38284:6;:16;;;;:::i;:::-;38267:6;:13;:33;;38259:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38335:22;38408:7;38401:15;38435:1;38430:2005;;;;40579:4;40573:11;40560:24;;40768:1;40757:9;40750:20;40818:4;40807:9;40803:20;40797:4;40790:34;38394:2445;;38430:2005;38615:4;38609:11;38596:24;;39284:2;39275:7;39271:16;39672:9;39665:17;39659:4;39655:28;39643:9;39632;39628:25;39624:60;39721:7;39717:2;39713:16;39978:6;39964:9;39957:17;39951:4;39947:28;39935:9;39927:6;39923:22;39919:57;39915:70;39749:434;40012:3;40008:2;40005:11;39749:434;;;40160:2;40154:9;40150:2;40143:21;40054:4;40050:2;40046:13;40040:19;;40095:4;40091:2;40087:13;40081:19;;39749:434;;;39753:251;40221:7;40210:9;40203:26;40415:2;40411:7;40406:2;40402;40398:11;40394:25;40388:4;40381:39;38437:1998;;;38394:2445;;40869:9;40862:16;;;38053:2833;;;;;:::o;24060:1309::-;24219:4;24225:12;24287;24310:13;24334:24;24371:8;24361:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24334:46;;24890:1;24860;24822:9;24816:16;24783:4;24772:9;24768:20;24733:1;24694:7;24664:4;24641:275;24629:287;;24985:16;24974:27;;25030:8;25021:7;25018:21;25015:78;;;25070:8;25059:19;;25015:78;25180:7;25167:11;25160:28;25302:7;25299:1;25292:4;25279:11;25275:22;25260:50;25339:8;25349:11;25331:30;;;;;;;24060:1309;;;;;;;:::o;69176:375::-;69452:8;69442:19;;;;;;69391:14;:27;69406:11;69391:27;;;;;;;;;;;;;;;69419:11;69391:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;69432:6;69391:48;;;;;;;;;;;;;;;:70;;;;69477:66;69491:11;69504;69517:6;69525:8;69535:7;69477:66;;;;;;;;;;:::i;:::-;;;;;;;;69176:375;;;;;:::o;74430:416::-;74615:22;;;;;;;;;;;74611:228;;;74654:63;74669:11;74682:7;74691:14;74707:9;74654:14;:63::i;:::-;74611:228;;;74783:1;74758:14;:21;:26;74750:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;74611:228;74430:416;;;;:::o;75824:433::-;75973:4;76007:12;:10;:12::i;:::-;75998:21;;:5;:21;;;75990:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76069:11;76083:10;:20;;;76112:4;76083:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76069:49;;76129:58;76157:5;76172:4;76179:7;76129:10;:27;;;;:58;;;;;;:::i;:::-;76243:6;76205:10;:20;;;76234:4;76205:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;;;:::i;:::-;76198:51;;;75824:433;;;;;;:::o;62746:614::-;63001:26;63030:19;:32;63050:11;63030:32;;;;;;;;;;;;;;;63001:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63105:1;63081:13;:20;:25;63073:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;63170:47;63188:11;63201:8;:15;63170:17;:47::i;:::-;63228:10;:15;;;63251:10;63263:11;63276:13;63291:8;63301:14;63317:18;63337:14;63228:124;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62990:370;62746:614;;;;;;:::o;74004:418::-;74161:27;74190:11;74216:8;74205:43;;;;;;;;;;;;:::i;:::-;74158:90;;;;;74261:10;74274:27;74299:1;74274:14;:24;;:27;;;;:::i;:::-;74261:40;;74323:34;74333:11;74346:2;74350:6;74323:9;:34::i;:::-;74314:43;;74403:2;74373:41;;74390:11;74373:41;;;74407:6;74373:41;;;;;;:::i;:::-;;;;;;;;74147:275;;;74004:418;;;;:::o;63368:463::-;63547:21;63571:28;63584:14;63571:12;:28::i;:::-;63547:52;;63610:16;63629:15;:28;63645:11;63629:28;;;;;;;;;;;;;;;:35;63658:5;63629:35;;;;;;;;;;;;;;;;63610:54;;63697:1;63683:11;:15;63675:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;63782:9;63768:11;:23;;;;:::i;:::-;63748:16;:43;;63740:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;63536:295;;63368:463;;;;:::o;14772:248::-;14916:96;14936:5;14966:27;;;14995:4;15001:2;15005:5;14943:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14916:19;:96::i;:::-;14772:248;;;;:::o;64118:402::-;64217:21;64241:22;:35;64264:11;64241:35;;;;;;;;;;;;;;;;64217:59;;64311:1;64291:16;:21;64287:138;;60917:5;64368:45;;64287:138;64459:16;64443:12;:32;;64435:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;64206:314;64118:402;;:::o;40894:360::-;40970:7;41024:2;41015:6;:11;;;;:::i;:::-;40998:6;:13;:28;;40990:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;41063:19;41177:27;41167:6;41160:4;41152:6;41148:17;41144:30;41138:37;41134:71;41119:86;;41235:11;41228:18;;;40894:360;;;;:::o;76265:315::-;76395:4;76412:11;76426:10;:20;;;76447:10;76426:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76412:46;;76469:44;76493:10;76505:7;76469:10;:23;;;;:44;;;;;:::i;:::-;76566:6;76531:10;:20;;;76552:10;76531:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;;:::i;:::-;76524:48;;;76265:315;;;;;:::o;63839:271::-;63921:13;63980:2;63955:14;:21;:27;;63947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64088:2;64072:14;64068:23;64062:30;64050:42;;63839:271;;;:::o;17620:716::-;18044:23;18070:69;18098:4;18070:69;;;;;;;;;;;;;;;;;18078:5;18070:27;;;;:69;;;;;:::i;:::-;18044:95;;18174:1;18154:10;:17;:21;18150:179;;;18251:10;18240:30;;;;;;;;;;;;:::i;:::-;18232:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;18150:179;17690:646;17620:716;;:::o;14553:211::-;14670:86;14690:5;14720:23;;;14745:2;14749:5;14697:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14670:19;:86::i;:::-;14553:211;;;:::o;4020:229::-;4157:12;4189:52;4211:6;4219:4;4225:1;4228:12;4189:21;:52::i;:::-;4182:59;;4020:229;;;;;:::o;5140:510::-;5310:12;5368:5;5343:21;:30;;5335:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;5435:18;5446:6;5435:10;:18::i;:::-;5427:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5501:12;5515:23;5542:6;:11;;5561:5;5568:4;5542:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5500:73;;;;5591:51;5608:7;5617:10;5629:12;5591:16;:51::i;:::-;5584:58;;;;5140:510;;;;;;:::o;1275:326::-;1335:4;1592:1;1570:7;:19;;;:23;1563:30;;1275:326;;;:::o;7826:762::-;7976:12;8005:7;8001:580;;;8036:10;8029:17;;;;8001:580;8170:1;8150:10;:17;:21;8146:424;;;8398:10;8392:17;8459:15;8446:10;8442:2;8438:19;8431:44;8146:424;8541:12;8534:20;;;;;;;;;;;:::i;:::-;;;;;;;;7826:762;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:89;370:7;410:6;403:5;399:18;388:29;;334:89;;;:::o;429:120::-;501:23;518:5;501:23;:::i;:::-;494:5;491:34;481:62;;539:1;536;529:12;481:62;429:120;:::o;555:137::-;600:5;638:6;625:20;616:29;;654:32;680:5;654:32;:::i;:::-;555:137;;;;:::o;698:117::-;807:1;804;797:12;821:117;930:1;927;920:12;944:117;1053:1;1050;1043:12;1080:552;1137:8;1147:6;1197:3;1190:4;1182:6;1178:17;1174:27;1164:122;;1205:79;;:::i;:::-;1164:122;1318:6;1305:20;1295:30;;1348:18;1340:6;1337:30;1334:117;;;1370:79;;:::i;:::-;1334:117;1484:4;1476:6;1472:17;1460:29;;1538:3;1530:4;1522:6;1518:17;1508:8;1504:32;1501:41;1498:128;;;1545:79;;:::i;:::-;1498:128;1080:552;;;;;:::o;1638:101::-;1674:7;1714:18;1707:5;1703:30;1692:41;;1638:101;;;:::o;1745:120::-;1817:23;1834:5;1817:23;:::i;:::-;1810:5;1807:34;1797:62;;1855:1;1852;1845:12;1797:62;1745:120;:::o;1871:137::-;1916:5;1954:6;1941:20;1932:29;;1970:32;1996:5;1970:32;:::i;:::-;1871:137;;;;:::o;2014:1157::-;2120:6;2128;2136;2144;2152;2160;2209:3;2197:9;2188:7;2184:23;2180:33;2177:120;;;2216:79;;:::i;:::-;2177:120;2336:1;2361:52;2405:7;2396:6;2385:9;2381:22;2361:52;:::i;:::-;2351:62;;2307:116;2490:2;2479:9;2475:18;2462:32;2521:18;2513:6;2510:30;2507:117;;;2543:79;;:::i;:::-;2507:117;2656:64;2712:7;2703:6;2692:9;2688:22;2656:64;:::i;:::-;2638:82;;;;2433:297;2769:2;2795:52;2839:7;2830:6;2819:9;2815:22;2795:52;:::i;:::-;2785:62;;2740:117;2924:2;2913:9;2909:18;2896:32;2955:18;2947:6;2944:30;2941:117;;;2977:79;;:::i;:::-;2941:117;3090:64;3146:7;3137:6;3126:9;3122:22;3090:64;:::i;:::-;3072:82;;;;2867:297;2014:1157;;;;;;;;:::o;3177:149::-;3213:7;3253:66;3246:5;3242:78;3231:89;;3177:149;;;:::o;3332:120::-;3404:23;3421:5;3404:23;:::i;:::-;3397:5;3394:34;3384:62;;3442:1;3439;3432:12;3384:62;3332:120;:::o;3458:137::-;3503:5;3541:6;3528:20;3519:29;;3557:32;3583:5;3557:32;:::i;:::-;3458:137;;;;:::o;3601:327::-;3659:6;3708:2;3696:9;3687:7;3683:23;3679:32;3676:119;;;3714:79;;:::i;:::-;3676:119;3834:1;3859:52;3903:7;3894:6;3883:9;3879:22;3859:52;:::i;:::-;3849:62;;3805:116;3601:327;;;;:::o;3934:90::-;3968:7;4011:5;4004:13;3997:21;3986:32;;3934:90;;;:::o;4030:109::-;4111:21;4126:5;4111:21;:::i;:::-;4106:3;4099:34;4030:109;;:::o;4145:210::-;4232:4;4270:2;4259:9;4255:18;4247:26;;4283:65;4345:1;4334:9;4330:17;4321:6;4283:65;:::i;:::-;4145:210;;;;:::o;4361:327::-;4419:6;4468:2;4456:9;4447:7;4443:23;4439:32;4436:119;;;4474:79;;:::i;:::-;4436:119;4594:1;4619:52;4663:7;4654:6;4643:9;4639:22;4619:52;:::i;:::-;4609:62;;4565:116;4361:327;;;;:::o;4694:77::-;4731:7;4760:5;4749:16;;4694:77;;;:::o;4777:122::-;4850:24;4868:5;4850:24;:::i;:::-;4843:5;4840:35;4830:63;;4889:1;4886;4879:12;4830:63;4777:122;:::o;4905:139::-;4951:5;4989:6;4976:20;4967:29;;5005:33;5032:5;5005:33;:::i;:::-;4905:139;;;;:::o;5050:472::-;5117:6;5125;5174:2;5162:9;5153:7;5149:23;5145:32;5142:119;;;5180:79;;:::i;:::-;5142:119;5300:1;5325:52;5369:7;5360:6;5349:9;5345:22;5325:52;:::i;:::-;5315:62;;5271:116;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5050:472;;;;;:::o;5528:116::-;5598:21;5613:5;5598:21;:::i;:::-;5591:5;5588:32;5578:60;;5634:1;5631;5624:12;5578:60;5528:116;:::o;5650:133::-;5693:5;5731:6;5718:20;5709:29;;5747:30;5771:5;5747:30;:::i;:::-;5650:133;;;;:::o;5789:1299::-;5902:6;5910;5918;5926;5934;5942;5950;5999:3;5987:9;5978:7;5974:23;5970:33;5967:120;;;6006:79;;:::i;:::-;5967:120;6126:1;6151:52;6195:7;6186:6;6175:9;6171:22;6151:52;:::i;:::-;6141:62;;6097:116;6280:2;6269:9;6265:18;6252:32;6311:18;6303:6;6300:30;6297:117;;;6333:79;;:::i;:::-;6297:117;6446:64;6502:7;6493:6;6482:9;6478:22;6446:64;:::i;:::-;6428:82;;;;6223:297;6559:2;6585:53;6630:7;6621:6;6610:9;6606:22;6585:53;:::i;:::-;6575:63;;6530:118;6687:2;6713:50;6755:7;6746:6;6735:9;6731:22;6713:50;:::i;:::-;6703:60;;6658:115;6840:3;6829:9;6825:19;6812:33;6872:18;6864:6;6861:30;6858:117;;;6894:79;;:::i;:::-;6858:117;7007:64;7063:7;7054:6;7043:9;7039:22;7007:64;:::i;:::-;6989:82;;;;6783:298;5789:1299;;;;;;;;;;:::o;7094:118::-;7181:24;7199:5;7181:24;:::i;:::-;7176:3;7169:37;7094:118;;:::o;7218:332::-;7339:4;7377:2;7366:9;7362:18;7354:26;;7390:71;7458:1;7447:9;7443:17;7434:6;7390:71;:::i;:::-;7471:72;7539:2;7528:9;7524:18;7515:6;7471:72;:::i;:::-;7218:332;;;;;:::o;7556:670::-;7634:6;7642;7650;7699:2;7687:9;7678:7;7674:23;7670:32;7667:119;;;7705:79;;:::i;:::-;7667:119;7825:1;7850:52;7894:7;7885:6;7874:9;7870:22;7850:52;:::i;:::-;7840:62;;7796:116;7979:2;7968:9;7964:18;7951:32;8010:18;8002:6;7999:30;7996:117;;;8032:79;;:::i;:::-;7996:117;8145:64;8201:7;8192:6;8181:9;8177:22;8145:64;:::i;:::-;8127:82;;;;7922:297;7556:670;;;;;:::o;8232:222::-;8325:4;8363:2;8352:9;8348:18;8340:26;;8376:71;8444:1;8433:9;8429:17;8420:6;8376:71;:::i;:::-;8232:222;;;;:::o;8460:115::-;8545:23;8562:5;8545:23;:::i;:::-;8540:3;8533:36;8460:115;;:::o;8581:218::-;8672:4;8710:2;8699:9;8695:18;8687:26;;8723:69;8789:1;8778:9;8774:17;8765:6;8723:69;:::i;:::-;8581:218;;;;:::o;8805:126::-;8842:7;8882:42;8875:5;8871:54;8860:65;;8805:126;;;:::o;8937:96::-;8974:7;9003:24;9021:5;9003:24;:::i;:::-;8992:35;;8937:96;;;:::o;9039:122::-;9112:24;9130:5;9112:24;:::i;:::-;9105:5;9102:35;9092:63;;9151:1;9148;9141:12;9092:63;9039:122;:::o;9167:139::-;9213:5;9251:6;9238:20;9229:29;;9267:33;9294:5;9267:33;:::i;:::-;9167:139;;;;:::o;9312:104::-;9357:7;9386:24;9404:5;9386:24;:::i;:::-;9375:35;;9312:104;;;:::o;9422:138::-;9503:32;9529:5;9503:32;:::i;:::-;9496:5;9493:43;9483:71;;9550:1;9547;9540:12;9483:71;9422:138;:::o;9566:155::-;9620:5;9658:6;9645:20;9636:29;;9674:41;9709:5;9674:41;:::i;:::-;9566:155;;;;:::o;9727:1613::-;9869:6;9877;9885;9893;9901;9909;9917;9925;9933;9982:3;9970:9;9961:7;9957:23;9953:33;9950:120;;;9989:79;;:::i;:::-;9950:120;10109:1;10134:53;10179:7;10170:6;10159:9;10155:22;10134:53;:::i;:::-;10124:63;;10080:117;10236:2;10262:52;10306:7;10297:6;10286:9;10282:22;10262:52;:::i;:::-;10252:62;;10207:117;10391:2;10380:9;10376:18;10363:32;10422:18;10414:6;10411:30;10408:117;;;10444:79;;:::i;:::-;10408:117;10557:64;10613:7;10604:6;10593:9;10589:22;10557:64;:::i;:::-;10539:82;;;;10334:297;10670:2;10696:53;10741:7;10732:6;10721:9;10717:22;10696:53;:::i;:::-;10686:63;;10641:118;10798:3;10825:61;10878:7;10869:6;10858:9;10854:22;10825:61;:::i;:::-;10815:71;;10769:127;10935:3;10962:53;11007:7;10998:6;10987:9;10983:22;10962:53;:::i;:::-;10952:63;;10906:119;11092:3;11081:9;11077:19;11064:33;11124:18;11116:6;11113:30;11110:117;;;11146:79;;:::i;:::-;11110:117;11259:64;11315:7;11306:6;11295:9;11291:22;11259:64;:::i;:::-;11241:82;;;;11035:298;9727:1613;;;;;;;;;;;:::o;11346:117::-;11455:1;11452;11445:12;11469:102;11510:6;11561:2;11557:7;11552:2;11545:5;11541:14;11537:28;11527:38;;11469:102;;;:::o;11577:180::-;11625:77;11622:1;11615:88;11722:4;11719:1;11712:15;11746:4;11743:1;11736:15;11763:281;11846:27;11868:4;11846:27;:::i;:::-;11838:6;11834:40;11976:6;11964:10;11961:22;11940:18;11928:10;11925:34;11922:62;11919:88;;;11987:18;;:::i;:::-;11919:88;12027:10;12023:2;12016:22;11806:238;11763:281;;:::o;12050:129::-;12084:6;12111:20;;:::i;:::-;12101:30;;12140:33;12168:4;12160:6;12140:33;:::i;:::-;12050:129;;;:::o;12185:307::-;12246:4;12336:18;12328:6;12325:30;12322:56;;;12358:18;;:::i;:::-;12322:56;12396:29;12418:6;12396:29;:::i;:::-;12388:37;;12480:4;12474;12470:15;12462:23;;12185:307;;;:::o;12498:146::-;12595:6;12590:3;12585;12572:30;12636:1;12627:6;12622:3;12618:16;12611:27;12498:146;;;:::o;12650:423::-;12727:5;12752:65;12768:48;12809:6;12768:48;:::i;:::-;12752:65;:::i;:::-;12743:74;;12840:6;12833:5;12826:21;12878:4;12871:5;12867:16;12916:3;12907:6;12902:3;12898:16;12895:25;12892:112;;;12923:79;;:::i;:::-;12892:112;13013:54;13060:6;13055:3;13050;13013:54;:::i;:::-;12733:340;12650:423;;;;;:::o;13092:338::-;13147:5;13196:3;13189:4;13181:6;13177:17;13173:27;13163:122;;13204:79;;:::i;:::-;13163:122;13321:6;13308:20;13346:78;13420:3;13412:6;13405:4;13397:6;13393:17;13346:78;:::i;:::-;13337:87;;13153:277;13092:338;;;;:::o;13436:793::-;13520:6;13528;13536;13585:2;13573:9;13564:7;13560:23;13556:32;13553:119;;;13591:79;;:::i;:::-;13553:119;13711:1;13736:52;13780:7;13771:6;13760:9;13756:22;13736:52;:::i;:::-;13726:62;;13682:116;13865:2;13854:9;13850:18;13837:32;13896:18;13888:6;13885:30;13882:117;;;13918:79;;:::i;:::-;13882:117;14023:62;14077:7;14068:6;14057:9;14053:22;14023:62;:::i;:::-;14013:72;;13808:287;14134:2;14160:52;14204:7;14195:6;14184:9;14180:22;14160:52;:::i;:::-;14150:62;;14105:117;13436:793;;;;;:::o;14235:77::-;14272:7;14301:5;14290:16;;14235:77;;;:::o;14318:118::-;14405:24;14423:5;14405:24;:::i;:::-;14400:3;14393:37;14318:118;;:::o;14442:222::-;14535:4;14573:2;14562:9;14558:18;14550:26;;14586:71;14654:1;14643:9;14639:17;14630:6;14586:71;:::i;:::-;14442:222;;;;:::o;14670:98::-;14721:6;14755:5;14749:12;14739:22;;14670:98;;;:::o;14774:168::-;14857:11;14891:6;14886:3;14879:19;14931:4;14926:3;14922:14;14907:29;;14774:168;;;;:::o;14948:246::-;15029:1;15039:113;15053:6;15050:1;15047:13;15039:113;;;15138:1;15133:3;15129:11;15123:18;15119:1;15114:3;15110:11;15103:39;15075:2;15072:1;15068:10;15063:15;;15039:113;;;15186:1;15177:6;15172:3;15168:16;15161:27;15010:184;14948:246;;;:::o;15200:373::-;15286:3;15314:38;15346:5;15314:38;:::i;:::-;15368:70;15431:6;15426:3;15368:70;:::i;:::-;15361:77;;15447:65;15505:6;15500:3;15493:4;15486:5;15482:16;15447:65;:::i;:::-;15537:29;15559:6;15537:29;:::i;:::-;15532:3;15528:39;15521:46;;15290:283;15200:373;;;;:::o;15579:309::-;15690:4;15728:2;15717:9;15713:18;15705:26;;15777:9;15771:4;15767:20;15763:1;15752:9;15748:17;15741:47;15805:76;15876:4;15867:6;15805:76;:::i;:::-;15797:84;;15579:309;;;;:::o;15894:470::-;15960:6;15968;16017:2;16005:9;15996:7;15992:23;15988:32;15985:119;;;16023:79;;:::i;:::-;15985:119;16143:1;16168:52;16212:7;16203:6;16192:9;16188:22;16168:52;:::i;:::-;16158:62;;16114:116;16269:2;16295:52;16339:7;16330:6;16319:9;16315:22;16295:52;:::i;:::-;16285:62;;16240:117;15894:470;;;;;:::o;16370:118::-;16457:24;16475:5;16457:24;:::i;:::-;16452:3;16445:37;16370:118;;:::o;16494:222::-;16587:4;16625:2;16614:9;16610:18;16602:26;;16638:71;16706:1;16695:9;16691:17;16682:6;16638:71;:::i;:::-;16494:222;;;;:::o;16722:60::-;16750:3;16771:5;16764:12;;16722:60;;;:::o;16788:142::-;16838:9;16871:53;16889:34;16898:24;16916:5;16898:24;:::i;:::-;16889:34;:::i;:::-;16871:53;:::i;:::-;16858:66;;16788:142;;;:::o;16936:126::-;16986:9;17019:37;17050:5;17019:37;:::i;:::-;17006:50;;16936:126;;;:::o;17068:153::-;17145:9;17178:37;17209:5;17178:37;:::i;:::-;17165:50;;17068:153;;;:::o;17227:185::-;17341:64;17399:5;17341:64;:::i;:::-;17336:3;17329:77;17227:185;;:::o;17418:276::-;17538:4;17576:2;17565:9;17561:18;17553:26;;17589:98;17684:1;17673:9;17669:17;17660:6;17589:98;:::i;:::-;17418:276;;;;:::o;17700:329::-;17759:6;17808:2;17796:9;17787:7;17783:23;17779:32;17776:119;;;17814:79;;:::i;:::-;17776:119;17934:1;17959:53;18004:7;17995:6;17984:9;17980:22;17959:53;:::i;:::-;17949:63;;17905:117;17700:329;;;;:::o;18035:959::-;18130:6;18138;18146;18154;18162;18211:3;18199:9;18190:7;18186:23;18182:33;18179:120;;;18218:79;;:::i;:::-;18179:120;18338:1;18363:52;18407:7;18398:6;18387:9;18383:22;18363:52;:::i;:::-;18353:62;;18309:116;18464:2;18490:52;18534:7;18525:6;18514:9;18510:22;18490:52;:::i;:::-;18480:62;;18435:117;18591:2;18617:53;18662:7;18653:6;18642:9;18638:22;18617:53;:::i;:::-;18607:63;;18562:118;18747:2;18736:9;18732:18;18719:32;18778:18;18770:6;18767:30;18764:117;;;18800:79;;:::i;:::-;18764:117;18913:64;18969:7;18960:6;18949:9;18945:22;18913:64;:::i;:::-;18895:82;;;;18690:297;18035:959;;;;;;;;:::o;19000:615::-;19075:6;19083;19091;19140:2;19128:9;19119:7;19115:23;19111:32;19108:119;;;19146:79;;:::i;:::-;19108:119;19266:1;19291:52;19335:7;19326:6;19315:9;19311:22;19291:52;:::i;:::-;19281:62;;19237:116;19392:2;19418:52;19462:7;19453:6;19442:9;19438:22;19418:52;:::i;:::-;19408:62;;19363:117;19519:2;19545:53;19590:7;19581:6;19570:9;19566:22;19545:53;:::i;:::-;19535:63;;19490:118;19000:615;;;;;:::o;19621:323::-;19677:6;19726:2;19714:9;19705:7;19701:23;19697:32;19694:119;;;19732:79;;:::i;:::-;19694:119;19852:1;19877:50;19919:7;19910:6;19899:9;19895:22;19877:50;:::i;:::-;19867:60;;19823:114;19621:323;;;;:::o;19950:761::-;20034:6;20042;20050;20058;20107:3;20095:9;20086:7;20082:23;20078:33;20075:120;;;20114:79;;:::i;:::-;20075:120;20234:1;20259:52;20303:7;20294:6;20283:9;20279:22;20259:52;:::i;:::-;20249:62;;20205:116;20360:2;20386:52;20430:7;20421:6;20410:9;20406:22;20386:52;:::i;:::-;20376:62;;20331:117;20487:2;20513:53;20558:7;20549:6;20538:9;20534:22;20513:53;:::i;:::-;20503:63;;20458:118;20615:2;20641:53;20686:7;20677:6;20666:9;20662:22;20641:53;:::i;:::-;20631:63;;20586:118;19950:761;;;;;;;:::o;20717:169::-;20801:11;20835:6;20830:3;20823:19;20875:4;20870:3;20866:14;20851:29;;20717:169;;;;:::o;20892:180::-;21032:32;21028:1;21020:6;21016:14;21009:56;20892:180;:::o;21078:366::-;21220:3;21241:67;21305:2;21300:3;21241:67;:::i;:::-;21234:74;;21317:93;21406:3;21317:93;:::i;:::-;21435:2;21430:3;21426:12;21419:19;;21078:366;;;:::o;21450:419::-;21616:4;21654:2;21643:9;21639:18;21631:26;;21703:9;21697:4;21693:20;21689:1;21678:9;21674:17;21667:47;21731:131;21857:4;21731:131;:::i;:::-;21723:139;;21450:419;;;:::o;21875:180::-;21923:77;21920:1;21913:88;22020:4;22017:1;22010:15;22044:4;22041:1;22034:15;22061:320;22105:6;22142:1;22136:4;22132:12;22122:22;;22189:1;22183:4;22179:12;22210:18;22200:81;;22266:4;22258:6;22254:17;22244:27;;22200:81;22328:2;22320:6;22317:14;22297:18;22294:38;22291:84;;22347:18;;:::i;:::-;22291:84;22112:269;22061:320;;;:::o;22387:147::-;22488:11;22525:3;22510:18;;22387:147;;;;:::o;22562:327::-;22676:3;22697:88;22778:6;22773:3;22697:88;:::i;:::-;22690:95;;22795:56;22844:6;22839:3;22832:5;22795:56;:::i;:::-;22876:6;22871:3;22867:16;22860:23;;22562:327;;;;;:::o;22895:291::-;23035:3;23057:103;23156:3;23147:6;23139;23057:103;:::i;:::-;23050:110;;23177:3;23170:10;;22895:291;;;;;:::o;23192:225::-;23332:34;23328:1;23320:6;23316:14;23309:58;23401:8;23396:2;23388:6;23384:15;23377:33;23192:225;:::o;23423:366::-;23565:3;23586:67;23650:2;23645:3;23586:67;:::i;:::-;23579:74;;23662:93;23751:3;23662:93;:::i;:::-;23780:2;23775:3;23771:12;23764:19;;23423:366;;;:::o;23795:419::-;23961:4;23999:2;23988:9;23984:18;23976:26;;24048:9;24042:4;24038:20;24034:1;24023:9;24019:17;24012:47;24076:131;24202:4;24076:131;:::i;:::-;24068:139;;23795:419;;;:::o;24242:314::-;24338:3;24359:70;24422:6;24417:3;24359:70;:::i;:::-;24352:77;;24439:56;24488:6;24483:3;24476:5;24439:56;:::i;:::-;24520:29;24542:6;24520:29;:::i;:::-;24515:3;24511:39;24504:46;;24242:314;;;;;:::o;24562:545::-;24737:4;24775:2;24764:9;24760:18;24752:26;;24788:69;24854:1;24843:9;24839:17;24830:6;24788:69;:::i;:::-;24904:9;24898:4;24894:20;24889:2;24878:9;24874:18;24867:48;24932:86;25013:4;25004:6;24996;24932:86;:::i;:::-;24924:94;;25028:72;25096:2;25085:9;25081:18;25072:6;25028:72;:::i;:::-;24562:545;;;;;;;:::o;25113:842::-;25356:4;25394:3;25383:9;25379:19;25371:27;;25408:69;25474:1;25463:9;25459:17;25450:6;25408:69;:::i;:::-;25487:72;25555:2;25544:9;25540:18;25531:6;25487:72;:::i;:::-;25606:9;25600:4;25596:20;25591:2;25580:9;25576:18;25569:48;25634:76;25705:4;25696:6;25634:76;:::i;:::-;25626:84;;25720:66;25782:2;25771:9;25767:18;25758:6;25720:66;:::i;:::-;25834:9;25828:4;25824:20;25818:3;25807:9;25803:19;25796:49;25862:86;25943:4;25934:6;25926;25862:86;:::i;:::-;25854:94;;25113:842;;;;;;;;;:::o;25961:143::-;26018:5;26049:6;26043:13;26034:22;;26065:33;26092:5;26065:33;:::i;:::-;25961:143;;;;:::o;26110:507::-;26189:6;26197;26246:2;26234:9;26225:7;26221:23;26217:32;26214:119;;;26252:79;;:::i;:::-;26214:119;26372:1;26397:64;26453:7;26444:6;26433:9;26429:22;26397:64;:::i;:::-;26387:74;;26343:128;26510:2;26536:64;26592:7;26583:6;26572:9;26568:22;26536:64;:::i;:::-;26526:74;;26481:129;26110:507;;;;;:::o;26623:435::-;26770:4;26808:2;26797:9;26793:18;26785:26;;26821:69;26887:1;26876:9;26872:17;26863:6;26821:69;:::i;:::-;26937:9;26931:4;26927:20;26922:2;26911:9;26907:18;26900:48;26965:86;27046:4;27037:6;27029;26965:86;:::i;:::-;26957:94;;26623:435;;;;;;:::o;27064:225::-;27204:34;27200:1;27192:6;27188:14;27181:58;27273:8;27268:2;27260:6;27256:15;27249:33;27064:225;:::o;27295:366::-;27437:3;27458:67;27522:2;27517:3;27458:67;:::i;:::-;27451:74;;27534:93;27623:3;27534:93;:::i;:::-;27652:2;27647:3;27643:12;27636:19;;27295:366;;;:::o;27667:419::-;27833:4;27871:2;27860:9;27856:18;27848:26;;27920:9;27914:4;27910:20;27906:1;27895:9;27891:17;27884:47;27948:131;28074:4;27948:131;:::i;:::-;27940:139;;27667:419;;;:::o;28092:351::-;28162:6;28211:2;28199:9;28190:7;28186:23;28182:32;28179:119;;;28217:79;;:::i;:::-;28179:119;28337:1;28362:64;28418:7;28409:6;28398:9;28394:22;28362:64;:::i;:::-;28352:74;;28308:128;28092:351;;;;:::o;28449:179::-;28589:31;28585:1;28577:6;28573:14;28566:55;28449:179;:::o;28634:366::-;28776:3;28797:67;28861:2;28856:3;28797:67;:::i;:::-;28790:74;;28873:93;28962:3;28873:93;:::i;:::-;28991:2;28986:3;28982:12;28975:19;;28634:366;;;:::o;29006:419::-;29172:4;29210:2;29199:9;29195:18;29187:26;;29259:9;29253:4;29249:20;29245:1;29234:9;29230:17;29223:47;29287:131;29413:4;29287:131;:::i;:::-;29279:139;;29006:419;;;:::o;29431:180::-;29479:77;29476:1;29469:88;29576:4;29573:1;29566:15;29600:4;29597:1;29590:15;29617:194;29657:4;29677:20;29695:1;29677:20;:::i;:::-;29672:25;;29711:20;29729:1;29711:20;:::i;:::-;29706:25;;29755:1;29752;29748:9;29740:17;;29779:1;29773:4;29770:11;29767:37;;;29784:18;;:::i;:::-;29767:37;29617:194;;;;:::o;29817:94::-;29850:8;29898:5;29894:2;29890:14;29869:35;;29817:94;;;:::o;29917:::-;29956:7;29985:20;29999:5;29985:20;:::i;:::-;29974:31;;29917:94;;;:::o;30017:100::-;30056:7;30085:26;30105:5;30085:26;:::i;:::-;30074:37;;30017:100;;;:::o;30123:157::-;30228:45;30248:24;30266:5;30248:24;:::i;:::-;30228:45;:::i;:::-;30223:3;30216:58;30123:157;;:::o;30286:432::-;30454:3;30476:103;30575:3;30566:6;30558;30476:103;:::i;:::-;30469:110;;30589:75;30660:3;30651:6;30589:75;:::i;:::-;30689:2;30684:3;30680:12;30673:19;;30709:3;30702:10;;30286:432;;;;;;:::o;30724:140::-;30772:4;30795:3;30787:11;;30818:3;30815:1;30808:14;30852:4;30849:1;30839:18;30831:26;;30724:140;;;:::o;30870:93::-;30907:6;30954:2;30949;30942:5;30938:14;30934:23;30924:33;;30870:93;;;:::o;30969:107::-;31013:8;31063:5;31057:4;31053:16;31032:37;;30969:107;;;;:::o;31082:393::-;31151:6;31201:1;31189:10;31185:18;31224:97;31254:66;31243:9;31224:97;:::i;:::-;31342:39;31372:8;31361:9;31342:39;:::i;:::-;31330:51;;31414:4;31410:9;31403:5;31399:21;31390:30;;31463:4;31453:8;31449:19;31442:5;31439:30;31429:40;;31158:317;;31082:393;;;;;:::o;31481:142::-;31531:9;31564:53;31582:34;31591:24;31609:5;31591:24;:::i;:::-;31582:34;:::i;:::-;31564:53;:::i;:::-;31551:66;;31481:142;;;:::o;31629:75::-;31672:3;31693:5;31686:12;;31629:75;;;:::o;31710:269::-;31820:39;31851:7;31820:39;:::i;:::-;31881:91;31930:41;31954:16;31930:41;:::i;:::-;31922:6;31915:4;31909:11;31881:91;:::i;:::-;31875:4;31868:105;31786:193;31710:269;;;:::o;31985:73::-;32030:3;31985:73;:::o;32064:189::-;32141:32;;:::i;:::-;32182:65;32240:6;32232;32226:4;32182:65;:::i;:::-;32117:136;32064:189;;:::o;32259:186::-;32319:120;32336:3;32329:5;32326:14;32319:120;;;32390:39;32427:1;32420:5;32390:39;:::i;:::-;32363:1;32356:5;32352:13;32343:22;;32319:120;;;32259:186;;:::o;32451:541::-;32551:2;32546:3;32543:11;32540:445;;;32585:37;32616:5;32585:37;:::i;:::-;32668:29;32686:10;32668:29;:::i;:::-;32658:8;32654:44;32851:2;32839:10;32836:18;32833:49;;;32872:8;32857:23;;32833:49;32895:80;32951:22;32969:3;32951:22;:::i;:::-;32941:8;32937:37;32924:11;32895:80;:::i;:::-;32555:430;;32540:445;32451:541;;;:::o;32998:117::-;33052:8;33102:5;33096:4;33092:16;33071:37;;32998:117;;;;:::o;33121:169::-;33165:6;33198:51;33246:1;33242:6;33234:5;33231:1;33227:13;33198:51;:::i;:::-;33194:56;33279:4;33273;33269:15;33259:25;;33172:118;33121:169;;;;:::o;33295:295::-;33371:4;33517:29;33542:3;33536:4;33517:29;:::i;:::-;33509:37;;33579:3;33576:1;33572:11;33566:4;33563:21;33555:29;;33295:295;;;;:::o;33595:1390::-;33710:36;33742:3;33710:36;:::i;:::-;33811:18;33803:6;33800:30;33797:56;;;33833:18;;:::i;:::-;33797:56;33877:38;33909:4;33903:11;33877:38;:::i;:::-;33962:66;34021:6;34013;34007:4;33962:66;:::i;:::-;34055:1;34079:4;34066:17;;34111:2;34103:6;34100:14;34128:1;34123:617;;;;34784:1;34801:6;34798:77;;;34850:9;34845:3;34841:19;34835:26;34826:35;;34798:77;34901:67;34961:6;34954:5;34901:67;:::i;:::-;34895:4;34888:81;34757:222;34093:886;;34123:617;34175:4;34171:9;34163:6;34159:22;34209:36;34240:4;34209:36;:::i;:::-;34267:1;34281:208;34295:7;34292:1;34289:14;34281:208;;;34374:9;34369:3;34365:19;34359:26;34351:6;34344:42;34425:1;34417:6;34413:14;34403:24;;34472:2;34461:9;34457:18;34444:31;;34318:4;34315:1;34311:12;34306:17;;34281:208;;;34517:6;34508:7;34505:19;34502:179;;;34575:9;34570:3;34566:19;34560:26;34618:48;34660:4;34652:6;34648:17;34637:9;34618:48;:::i;:::-;34610:6;34603:64;34525:156;34502:179;34727:1;34723;34715:6;34711:14;34707:22;34701:4;34694:36;34130:610;;;34093:886;;33685:1300;;;33595:1390;;:::o;34991:652::-;35192:4;35230:3;35219:9;35215:19;35207:27;;35244:69;35310:1;35299:9;35295:17;35286:6;35244:69;:::i;:::-;35323:70;35389:2;35378:9;35374:18;35365:6;35323:70;:::i;:::-;35403:72;35471:2;35460:9;35456:18;35447:6;35403:72;:::i;:::-;35522:9;35516:4;35512:20;35507:2;35496:9;35492:18;35485:48;35550:86;35631:4;35622:6;35614;35550:86;:::i;:::-;35542:94;;34991:652;;;;;;;;:::o;35649:222::-;35789:34;35785:1;35777:6;35773:14;35766:58;35858:5;35853:2;35845:6;35841:15;35834:30;35649:222;:::o;35877:366::-;36019:3;36040:67;36104:2;36099:3;36040:67;:::i;:::-;36033:74;;36116:93;36205:3;36116:93;:::i;:::-;36234:2;36229:3;36225:12;36218:19;;35877:366;;;:::o;36249:419::-;36415:4;36453:2;36442:9;36438:18;36430:26;;36502:9;36496:4;36492:20;36488:1;36477:9;36473:17;36466:47;36530:131;36656:4;36530:131;:::i;:::-;36522:139;;36249:419;;;:::o;36674:220::-;36814:34;36810:1;36802:6;36798:14;36791:58;36883:3;36878:2;36870:6;36866:15;36859:28;36674:220;:::o;36900:366::-;37042:3;37063:67;37127:2;37122:3;37063:67;:::i;:::-;37056:74;;37139:93;37228:3;37139:93;:::i;:::-;37257:2;37252:3;37248:12;37241:19;;36900:366;;;:::o;37272:419::-;37438:4;37476:2;37465:9;37461:18;37453:26;;37525:9;37519:4;37515:20;37511:1;37500:9;37496:17;37489:47;37553:131;37679:4;37553:131;:::i;:::-;37545:139;;37272:419;;;:::o;37697:115::-;37782:23;37799:5;37782:23;:::i;:::-;37777:3;37770:36;37697:115;;:::o;37818:652::-;38019:4;38057:3;38046:9;38042:19;38034:27;;38071:69;38137:1;38126:9;38122:17;38113:6;38071:69;:::i;:::-;38187:9;38181:4;38177:20;38172:2;38161:9;38157:18;38150:48;38215:86;38296:4;38287:6;38279;38215:86;:::i;:::-;38207:94;;38311:70;38377:2;38366:9;38362:18;38353:6;38311:70;:::i;:::-;38391:72;38459:2;38448:9;38444:18;38435:6;38391:72;:::i;:::-;37818:652;;;;;;;;:::o;38476:434::-;38621:4;38659:2;38648:9;38644:18;38636:26;;38672:69;38738:1;38727:9;38723:17;38714:6;38672:69;:::i;:::-;38751:70;38817:2;38806:9;38802:18;38793:6;38751:70;:::i;:::-;38831:72;38899:2;38888:9;38884:18;38875:6;38831:72;:::i;:::-;38476:434;;;;;;:::o;38916:96::-;38974:6;39002:3;38992:13;;38916:96;;;;:::o;39018:1398::-;39140:43;39179:3;39174;39140:43;:::i;:::-;39248:18;39240:6;39237:30;39234:56;;;39270:18;;:::i;:::-;39234:56;39314:38;39346:4;39340:11;39314:38;:::i;:::-;39399:66;39458:6;39450;39444:4;39399:66;:::i;:::-;39492:1;39521:2;39513:6;39510:14;39538:1;39533:631;;;;40208:1;40225:6;40222:84;;;40281:9;40276:3;40272:19;40259:33;40250:42;;40222:84;40332:67;40392:6;40385:5;40332:67;:::i;:::-;40326:4;40319:81;40181:229;39503:907;;39533:631;39585:4;39581:9;39573:6;39569:22;39619:36;39650:4;39619:36;:::i;:::-;39677:1;39691:215;39705:7;39702:1;39699:14;39691:215;;;39791:9;39786:3;39782:19;39769:33;39761:6;39754:49;39842:1;39834:6;39830:14;39820:24;;39889:2;39878:9;39874:18;39861:31;;39728:4;39725:1;39721:12;39716:17;;39691:215;;;39934:6;39925:7;39922:19;39919:186;;;39999:9;39994:3;39990:19;39977:33;40042:48;40084:4;40076:6;40072:17;40061:9;40042:48;:::i;:::-;40034:6;40027:64;39942:163;39919:186;40151:1;40147;40139:6;40135:14;40131:22;40125:4;40118:36;39540:624;;;39503:907;;39115:1301;;;39018:1398;;;:::o;40422:545::-;40595:4;40633:3;40622:9;40618:19;40610:27;;40647:69;40713:1;40702:9;40698:17;40689:6;40647:69;:::i;:::-;40726:70;40792:2;40781:9;40777:18;40768:6;40726:70;:::i;:::-;40806:72;40874:2;40863:9;40859:18;40850:6;40806:72;:::i;:::-;40888;40956:2;40945:9;40941:18;40932:6;40888:72;:::i;:::-;40422:545;;;;;;;:::o;40973:432::-;41061:5;41086:65;41102:48;41143:6;41102:48;:::i;:::-;41086:65;:::i;:::-;41077:74;;41174:6;41167:5;41160:21;41212:4;41205:5;41201:16;41250:3;41241:6;41236:3;41232:16;41229:25;41226:112;;;41257:79;;:::i;:::-;41226:112;41347:52;41392:6;41387:3;41382;41347:52;:::i;:::-;41067:338;40973:432;;;;;:::o;41424:353::-;41490:5;41539:3;41532:4;41524:6;41520:17;41516:27;41506:122;;41547:79;;:::i;:::-;41506:122;41657:6;41651:13;41682:89;41767:3;41759:6;41752:4;41744:6;41740:17;41682:89;:::i;:::-;41673:98;;41496:281;41424:353;;;;:::o;41783:522::-;41862:6;41911:2;41899:9;41890:7;41886:23;41882:32;41879:119;;;41917:79;;:::i;:::-;41879:119;42058:1;42047:9;42043:17;42037:24;42088:18;42080:6;42077:30;42074:117;;;42110:79;;:::i;:::-;42074:117;42215:73;42280:7;42271:6;42260:9;42256:22;42215:73;:::i;:::-;42205:83;;42008:290;41783:522;;;;:::o;42311:719::-;42520:4;42558:3;42547:9;42543:19;42535:27;;42572:69;42638:1;42627:9;42623:17;42614:6;42572:69;:::i;:::-;42688:9;42682:4;42678:20;42673:2;42662:9;42658:18;42651:48;42716:76;42787:4;42778:6;42716:76;:::i;:::-;42708:84;;42802:70;42868:2;42857:9;42853:18;42844:6;42802:70;:::i;:::-;42919:9;42913:4;42909:20;42904:2;42893:9;42889:18;42882:48;42947:76;43018:4;43009:6;42947:76;:::i;:::-;42939:84;;42311:719;;;;;;;:::o;43036:525::-;43201:4;43239:2;43228:9;43224:18;43216:26;;43252:69;43318:1;43307:9;43303:17;43294:6;43252:69;:::i;:::-;43368:9;43362:4;43358:20;43353:2;43342:9;43338:18;43331:48;43396:76;43467:4;43458:6;43396:76;:::i;:::-;43388:84;;43482:72;43550:2;43539:9;43535:18;43526:6;43482:72;:::i;:::-;43036:525;;;;;;:::o;43567:419::-;43706:4;43744:2;43733:9;43729:18;43721:26;;43793:9;43787:4;43783:20;43779:1;43768:9;43764:17;43757:47;43821:76;43892:4;43883:6;43821:76;:::i;:::-;43813:84;;43907:72;43975:2;43964:9;43960:18;43951:6;43907:72;:::i;:::-;43567:419;;;;;:::o;43992:178::-;44132:30;44128:1;44120:6;44116:14;44109:54;43992:178;:::o;44176:366::-;44318:3;44339:67;44403:2;44398:3;44339:67;:::i;:::-;44332:74;;44415:93;44504:3;44415:93;:::i;:::-;44533:2;44528:3;44524:12;44517:19;;44176:366;;;:::o;44548:419::-;44714:4;44752:2;44741:9;44737:18;44729:26;;44801:9;44795:4;44791:20;44787:1;44776:9;44772:17;44765:47;44829:131;44955:4;44829:131;:::i;:::-;44821:139;;44548:419;;;:::o;44973:191::-;45013:3;45032:20;45050:1;45032:20;:::i;:::-;45027:25;;45066:20;45084:1;45066:20;:::i;:::-;45061:25;;45109:1;45106;45102:9;45095:16;;45130:3;45127:1;45124:10;45121:36;;;45137:18;;:::i;:::-;45121:36;44973:191;;;;:::o;45170:164::-;45310:16;45306:1;45298:6;45294:14;45287:40;45170:164;:::o;45340:366::-;45482:3;45503:67;45567:2;45562:3;45503:67;:::i;:::-;45496:74;;45579:93;45668:3;45579:93;:::i;:::-;45697:2;45692:3;45688:12;45681:19;;45340:366;;;:::o;45712:419::-;45878:4;45916:2;45905:9;45901:18;45893:26;;45965:9;45959:4;45955:20;45951:1;45940:9;45936:17;45929:47;45993:131;46119:4;45993:131;:::i;:::-;45985:139;;45712:419;;;:::o;46137:167::-;46277:19;46273:1;46265:6;46261:14;46254:43;46137:167;:::o;46310:366::-;46452:3;46473:67;46537:2;46532:3;46473:67;:::i;:::-;46466:74;;46549:93;46638:3;46549:93;:::i;:::-;46667:2;46662:3;46658:12;46651:19;;46310:366;;;:::o;46682:419::-;46848:4;46886:2;46875:9;46871:18;46863:26;;46935:9;46929:4;46925:20;46921:1;46910:9;46906:17;46899:47;46963:131;47089:4;46963:131;:::i;:::-;46955:139;;46682:419;;;:::o;47107:386::-;47211:3;47239:38;47271:5;47239:38;:::i;:::-;47293:88;47374:6;47369:3;47293:88;:::i;:::-;47286:95;;47390:65;47448:6;47443:3;47436:4;47429:5;47425:16;47390:65;:::i;:::-;47480:6;47475:3;47471:16;47464:23;;47215:278;47107:386;;;;:::o;47499:271::-;47629:3;47651:93;47740:3;47731:6;47651:93;:::i;:::-;47644:100;;47761:3;47754:10;;47499:271;;;;:::o;47776:917::-;48031:4;48069:3;48058:9;48054:19;48046:27;;48083:69;48149:1;48138:9;48134:17;48125:6;48083:69;:::i;:::-;48199:9;48193:4;48189:20;48184:2;48173:9;48169:18;48162:48;48227:76;48298:4;48289:6;48227:76;:::i;:::-;48219:84;;48313:70;48379:2;48368:9;48364:18;48355:6;48313:70;:::i;:::-;48430:9;48424:4;48420:20;48415:2;48404:9;48400:18;48393:48;48458:76;48529:4;48520:6;48458:76;:::i;:::-;48450:84;;48582:9;48576:4;48572:20;48566:3;48555:9;48551:19;48544:49;48610:76;48681:4;48672:6;48610:76;:::i;:::-;48602:84;;47776:917;;;;;;;;:::o;48699:225::-;48839:34;48835:1;48827:6;48823:14;48816:58;48908:8;48903:2;48895:6;48891:15;48884:33;48699:225;:::o;48930:366::-;49072:3;49093:67;49157:2;49152:3;49093:67;:::i;:::-;49086:74;;49169:93;49258:3;49169:93;:::i;:::-;49287:2;49282:3;49278:12;49271:19;;48930:366;;;:::o;49302:419::-;49468:4;49506:2;49495:9;49491:18;49483:26;;49555:9;49549:4;49545:20;49541:1;49530:9;49526:17;49519:47;49583:131;49709:4;49583:131;:::i;:::-;49575:139;;49302:419;;;:::o;49727:221::-;49867:34;49863:1;49855:6;49851:14;49844:58;49936:4;49931:2;49923:6;49919:15;49912:29;49727:221;:::o;49954:366::-;50096:3;50117:67;50181:2;50176:3;50117:67;:::i;:::-;50110:74;;50193:93;50282:3;50193:93;:::i;:::-;50311:2;50306:3;50302:12;50295:19;;49954:366;;;:::o;50326:419::-;50492:4;50530:2;50519:9;50515:18;50507:26;;50579:9;50573:4;50569:20;50565:1;50554:9;50550:17;50543:47;50607:131;50733:4;50607:131;:::i;:::-;50599:139;;50326:419;;;:::o;50751:235::-;50891:34;50887:1;50879:6;50875:14;50868:58;50960:18;50955:2;50947:6;50943:15;50936:43;50751:235;:::o;50992:366::-;51134:3;51155:67;51219:2;51214:3;51155:67;:::i;:::-;51148:74;;51231:93;51320:3;51231:93;:::i;:::-;51349:2;51344:3;51340:12;51333:19;;50992:366;;;:::o;51364:419::-;51530:4;51568:2;51557:9;51553:18;51545:26;;51617:9;51611:4;51607:20;51603:1;51592:9;51588:17;51581:47;51645:131;51771:4;51645:131;:::i;:::-;51637:139;;51364:419;;;:::o;51789:142::-;51892:32;51918:5;51892:32;:::i;:::-;51887:3;51880:45;51789:142;;:::o;51937:1064::-;52238:4;52276:3;52265:9;52261:19;52253:27;;52290:69;52356:1;52345:9;52341:17;52332:6;52290:69;:::i;:::-;52406:9;52400:4;52396:20;52391:2;52380:9;52376:18;52369:48;52434:76;52505:4;52496:6;52434:76;:::i;:::-;52426:84;;52557:9;52551:4;52547:20;52542:2;52531:9;52527:18;52520:48;52585:76;52656:4;52647:6;52585:76;:::i;:::-;52577:84;;52671:88;52755:2;52744:9;52740:18;52731:6;52671:88;:::i;:::-;52769:73;52837:3;52826:9;52822:19;52813:6;52769:73;:::i;:::-;52890:9;52884:4;52880:20;52874:3;52863:9;52859:19;52852:49;52918:76;52989:4;52980:6;52918:76;:::i;:::-;52910:84;;51937:1064;;;;;;;;;:::o;53007:141::-;53063:5;53094:6;53088:13;53079:22;;53110:32;53136:5;53110:32;:::i;:::-;53007:141;;;;:::o;53154:832::-;53250:6;53258;53266;53315:2;53303:9;53294:7;53290:23;53286:32;53283:119;;;53321:79;;:::i;:::-;53283:119;53441:1;53466:63;53521:7;53512:6;53501:9;53497:22;53466:63;:::i;:::-;53456:73;;53412:127;53599:2;53588:9;53584:18;53578:25;53630:18;53622:6;53619:30;53616:117;;;53652:79;;:::i;:::-;53616:117;53757:73;53822:7;53813:6;53802:9;53798:22;53757:73;:::i;:::-;53747:83;;53549:291;53879:2;53905:64;53961:7;53952:6;53941:9;53937:22;53905:64;:::i;:::-;53895:74;;53850:129;53154:832;;;;;:::o;53992:176::-;54132:28;54128:1;54120:6;54116:14;54109:52;53992:176;:::o;54174:366::-;54316:3;54337:67;54401:2;54396:3;54337:67;:::i;:::-;54330:74;;54413:93;54502:3;54413:93;:::i;:::-;54531:2;54526:3;54522:12;54515:19;;54174:366;;;:::o;54546:419::-;54712:4;54750:2;54739:9;54735:18;54727:26;;54799:9;54793:4;54789:20;54785:1;54774:9;54770:17;54763:47;54827:131;54953:4;54827:131;:::i;:::-;54819:139;;54546:419;;;:::o;54971:177::-;55111:29;55107:1;55099:6;55095:14;55088:53;54971:177;:::o;55154:366::-;55296:3;55317:67;55381:2;55376:3;55317:67;:::i;:::-;55310:74;;55393:93;55482:3;55393:93;:::i;:::-;55511:2;55506:3;55502:12;55495:19;;55154:366;;;:::o;55526:419::-;55692:4;55730:2;55719:9;55715:18;55707:26;;55779:9;55773:4;55769:20;55765:1;55754:9;55750:17;55743:47;55807:131;55933:4;55807:131;:::i;:::-;55799:139;;55526:419;;;:::o;55951:442::-;56100:4;56138:2;56127:9;56123:18;56115:26;;56151:71;56219:1;56208:9;56204:17;56195:6;56151:71;:::i;:::-;56232:72;56300:2;56289:9;56285:18;56276:6;56232:72;:::i;:::-;56314;56382:2;56371:9;56367:18;56358:6;56314:72;:::i;:::-;55951:442;;;;;;:::o;56399:182::-;56539:34;56535:1;56527:6;56523:14;56516:58;56399:182;:::o;56587:366::-;56729:3;56750:67;56814:2;56809:3;56750:67;:::i;:::-;56743:74;;56826:93;56915:3;56826:93;:::i;:::-;56944:2;56939:3;56935:12;56928:19;;56587:366;;;:::o;56959:419::-;57125:4;57163:2;57152:9;57148:18;57140:26;;57212:9;57206:4;57202:20;57198:1;57187:9;57183:17;57176:47;57240:131;57366:4;57240:131;:::i;:::-;57232:139;;56959:419;;;:::o;57384:171::-;57524:23;57520:1;57512:6;57508:14;57501:47;57384:171;:::o;57561:366::-;57703:3;57724:67;57788:2;57783:3;57724:67;:::i;:::-;57717:74;;57800:93;57889:3;57800:93;:::i;:::-;57918:2;57913:3;57909:12;57902:19;;57561:366;;;:::o;57933:419::-;58099:4;58137:2;58126:9;58122:18;58114:26;;58186:9;58180:4;58176:20;58172:1;58161:9;58157:17;58150:47;58214:131;58340:4;58214:131;:::i;:::-;58206:139;;57933:419;;;:::o;58358:178::-;58498:30;58494:1;58486:6;58482:14;58475:54;58358:178;:::o;58542:366::-;58684:3;58705:67;58769:2;58764:3;58705:67;:::i;:::-;58698:74;;58781:93;58870:3;58781:93;:::i;:::-;58899:2;58894:3;58890:12;58883:19;;58542:366;;;:::o;58914:419::-;59080:4;59118:2;59107:9;59103:18;59095:26;;59167:9;59161:4;59157:20;59153:1;59142:9;59138:17;59131:47;59195:131;59321:4;59195:131;:::i;:::-;59187:139;;58914:419;;;:::o;59339:137::-;59393:5;59424:6;59418:13;59409:22;;59440:30;59464:5;59440:30;:::i;:::-;59339:137;;;;:::o;59482:345::-;59549:6;59598:2;59586:9;59577:7;59573:23;59569:32;59566:119;;;59604:79;;:::i;:::-;59566:119;59724:1;59749:61;59802:7;59793:6;59782:9;59778:22;59749:61;:::i;:::-;59739:71;;59695:125;59482:345;;;;:::o;59833:229::-;59973:34;59969:1;59961:6;59957:14;59950:58;60042:12;60037:2;60029:6;60025:15;60018:37;59833:229;:::o;60068:366::-;60210:3;60231:67;60295:2;60290:3;60231:67;:::i;:::-;60224:74;;60307:93;60396:3;60307:93;:::i;:::-;60425:2;60420:3;60416:12;60409:19;;60068:366;;;:::o;60440:419::-;60606:4;60644:2;60633:9;60629:18;60621:26;;60693:9;60687:4;60683:20;60679:1;60668:9;60664:17;60657:47;60721:131;60847:4;60721:131;:::i;:::-;60713:139;;60440:419;;;:::o;60865:332::-;60986:4;61024:2;61013:9;61009:18;61001:26;;61037:71;61105:1;61094:9;61090:17;61081:6;61037:71;:::i;:::-;61118:72;61186:2;61175:9;61171:18;61162:6;61118:72;:::i;:::-;60865:332;;;;;:::o;61203:225::-;61343:34;61339:1;61331:6;61327:14;61320:58;61412:8;61407:2;61399:6;61395:15;61388:33;61203:225;:::o;61434:366::-;61576:3;61597:67;61661:2;61656:3;61597:67;:::i;:::-;61590:74;;61673:93;61762:3;61673:93;:::i;:::-;61791:2;61786:3;61782:12;61775:19;;61434:366;;;:::o;61806:419::-;61972:4;62010:2;61999:9;61995:18;61987:26;;62059:9;62053:4;62049:20;62045:1;62034:9;62030:17;62023:47;62087:131;62213:4;62087:131;:::i;:::-;62079:139;;61806:419;;;:::o;62231:179::-;62371:31;62367:1;62359:6;62355:14;62348:55;62231:179;:::o;62416:366::-;62558:3;62579:67;62643:2;62638:3;62579:67;:::i;:::-;62572:74;;62655:93;62744:3;62655:93;:::i;:::-;62773:2;62768:3;62764:12;62757:19;;62416:366;;;:::o;62788:419::-;62954:4;62992:2;62981:9;62977:18;62969:26;;63041:9;63035:4;63031:20;63027:1;63016:9;63012:17;63005:47;63069:131;63195:4;63069:131;:::i;:::-;63061:139;;62788:419;;;:::o;63213:99::-;63265:6;63299:5;63293:12;63283:22;;63213:99;;;:::o;63318:377::-;63406:3;63434:39;63467:5;63434:39;:::i;:::-;63489:71;63553:6;63548:3;63489:71;:::i;:::-;63482:78;;63569:65;63627:6;63622:3;63615:4;63608:5;63604:16;63569:65;:::i;:::-;63659:29;63681:6;63659:29;:::i;:::-;63654:3;63650:39;63643:46;;63410:285;63318:377;;;;:::o;63701:313::-;63814:4;63852:2;63841:9;63837:18;63829:26;;63901:9;63895:4;63891:20;63887:1;63876:9;63872:17;63865:47;63929:78;64002:4;63993:6;63929:78;:::i;:::-;63921:86;;63701:313;;;;:::o
Swarm Source
ipfs://5a5013f9946bb61821701dc4e2229291d48998842f1cc445c228ce162cce2056
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.