Overview
APE Balance
0 APE
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 5 from a total of 5 transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
OFT
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2024-11-15 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ 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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC-20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.20; /** * @dev Standard ERC-20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC-721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC-1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC-20 * applications. */ abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { mapping(address account => uint256) private _balances; mapping(address account => mapping(address spender => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Skips emitting an {Approval} event indicating an allowance update. This is not * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve]. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. _totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. _balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * * ```solidity * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * 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[ERC 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: https://github.com/LayerZero-Labs/endpoint-v1-solidity-examples/blob/main/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/endpoint-v1-solidity-examples/blob/main/contracts/token/oft/v1/interfaces/IOFT.sol pragma solidity >=0.5.0; /** * @dev Interface of the OFT standard */ interface IOFT is IOFTCore, IERC20 { } // 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/endpoint-v1-solidity-examples/blob/main/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: https://github.com/LayerZero-Labs/endpoint-v1-solidity-examples/blob/main/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/endpoint-v1-solidity-examples/blob/main/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/endpoint-v1-solidity-examples/blob/main/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/endpoint-v1-solidity-examples/blob/main/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/endpoint-v1-solidity-examples/blob/main/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/endpoint-v1-solidity-examples/blob/main/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: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC-165 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); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: https://github.com/LayerZero-Labs/endpoint-v1-solidity-examples/blob/main/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: contracts/oftZEN.sol pragma solidity ^0.8.0; // override decimal() function is needed contract OFT is OFTCore, ERC20, IOFT { constructor( address initialOwner, string memory _name, string memory _symbol, address _lzEndpoint ) ERC20(_name, _symbol) OFTCore(_lzEndpoint) Ownable(initialOwner) {} function supportsInterface(bytes4 interfaceId) public view virtual override(OFTCore, IERC165) returns (bool) { return interfaceId == type(IOFT).interfaceId || interfaceId == type(IERC20).interfaceId || super.supportsInterface(interfaceId); } function token() public view virtual override returns (address) { return address(this); } function circulatingSupply() public view virtual override returns (uint) { return totalSupply(); } function _debitFrom( address _from, uint16, bytes memory, uint _amount ) internal virtual override returns (uint) { address spender = _msgSender(); if (_from != spender) _spendAllowance(_from, spender, _amount); _burn(_from, _amount); return _amount; } function _creditTo( uint16, address _toAddress, uint _amount ) internal virtual override returns (uint) { _mint(_toAddress, _amount); return _amount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_lzEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"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":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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
60a060405234801561000f575f80fd5b506040516155f03803806155f083398181016040528101906100319190610381565b8282828080885f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a7575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009e919061042c565b60405180910390fd5b6100b68161011960201b60201c565b508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050505081600a90816100fd9190610652565b5080600b908161010d9190610652565b50505050505050610721565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610214826101eb565b9050919050565b6102248161020a565b811461022e575f80fd5b50565b5f8151905061023f8161021b565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6102938261024d565b810181811067ffffffffffffffff821117156102b2576102b161025d565b5b80604052505050565b5f6102c46101da565b90506102d0828261028a565b919050565b5f67ffffffffffffffff8211156102ef576102ee61025d565b5b6102f88261024d565b9050602081019050919050565b8281835e5f83830152505050565b5f610325610320846102d5565b6102bb565b90508281526020810184848401111561034157610340610249565b5b61034c848285610305565b509392505050565b5f82601f83011261036857610367610245565b5b8151610378848260208601610313565b91505092915050565b5f805f8060808587031215610399576103986101e3565b5b5f6103a687828801610231565b945050602085015167ffffffffffffffff8111156103c7576103c66101e7565b5b6103d387828801610354565b935050604085015167ffffffffffffffff8111156103f4576103f36101e7565b5b61040087828801610354565b925050606061041187828801610231565b91505092959194509250565b6104268161020a565b82525050565b5f60208201905061043f5f83018461041d565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061049357607f821691505b6020821081036104a6576104a561044f565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026105087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826104cd565b61051286836104cd565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61055661055161054c8461052a565b610533565b61052a565b9050919050565b5f819050919050565b61056f8361053c565b61058361057b8261055d565b8484546104d9565b825550505050565b5f90565b61059761058b565b6105a2818484610566565b505050565b5b818110156105c5576105ba5f8261058f565b6001810190506105a8565b5050565b601f82111561060a576105db816104ac565b6105e4846104be565b810160208510156105f3578190505b6106076105ff856104be565b8301826105a7565b50505b505050565b5f82821c905092915050565b5f61062a5f198460080261060f565b1980831691505092915050565b5f610642838361061b565b9150826002028217905092915050565b61065b82610445565b67ffffffffffffffff8111156106745761067361025d565b5b61067e825461047c565b6106898282856105c9565b5f60209050601f8311600181146106ba575f84156106a8578287015190505b6106b28582610637565b865550610719565b601f1984166106c8866104ac565b5f5b828110156106ef578489015182556001820191506020850194506020810190506106ca565b8683101561070c5784890151610708601f89168261061b565b8355505b6001600288020188555050505b505050505050565b608051614e7f6107715f395f8181610a2101528181610dc801528181610ea501528181610f9001528181611136015281816117830152818161183701528181611d650152612bc40152614e7f5ff3fe60806040526004361061025a575f3560e01c80637533d78811610143578063c4461834116100b5578063eab45d9c11610079578063eab45d9c14610917578063eb8d72b71461093f578063ed629c5c14610967578063f2fde38b14610991578063f5ecbdbc146109b9578063fc0c546a146109f55761025a565b8063c446183414610845578063cbed8b9c1461086f578063d1deba1f14610897578063dd62ed3e146108b3578063df2a5b3b146108ef5761025a565b806395d89b411161010757806395d89b41146107295780639f38369a14610753578063a6c3d1651461078f578063a9059cbb146107b7578063b353aaa7146107f3578063baf3292d1461081d5761025a565b80637533d788146106335780638cfd8f5c1461066f5780638da5cb5b146106ab5780639358928b146106d5578063950c8a74146106ff5761025a565b8063313ce567116101dc5780634c42899a116101a05780634c42899a1461053757806351905636146105615780635b8c41e61461057d57806366ad5c8a146105b957806370a08231146105e1578063715018a61461061d5761025a565b8063313ce567146104435780633d8b38f61461046d5780633f1f4fa4146104a957806342d65a8d146104e5578063447705151461050d5761025a565b80630df37483116102235780630df374831461035057806310ddb1371461037857806318160ddd146103a057806323b872dd146103ca5780632a205e3d146104065761025a565b80621d35671461025e57806301ffc9a71461028657806306fdde03146102c257806307e0db17146102ec578063095ea7b314610314575b5f80fd5b348015610269575f80fd5b50610284600480360381019061027f9190613100565b610a1f565b005b348015610291575f80fd5b506102ac60048036038101906102a791906131f8565b610c6d565b6040516102b9919061323d565b60405180910390f35b3480156102cd575f80fd5b506102d6610d2e565b6040516102e391906132c6565b60405180910390f35b3480156102f7575f80fd5b50610312600480360381019061030d91906132e6565b610dbe565b005b34801561031f575f80fd5b5061033a6004803603810190610335919061339e565b610e4f565b604051610347919061323d565b60405180910390f35b34801561035b575f80fd5b50610376600480360381019061037191906133dc565b610e71565b005b348015610383575f80fd5b5061039e600480360381019061039991906132e6565b610e9b565b005b3480156103ab575f80fd5b506103b4610f2c565b6040516103c19190613429565b60405180910390f35b3480156103d5575f80fd5b506103f060048036038101906103eb9190613442565b610f35565b6040516103fd919061323d565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906134bc565b610f63565b60405161043a929190613573565b60405180910390f35b34801561044e575f80fd5b50610457611040565b60405161046491906135b5565b60405180910390f35b348015610478575f80fd5b50610493600480360381019061048e91906135ce565b611048565b6040516104a0919061323d565b60405180910390f35b3480156104b4575f80fd5b506104cf60048036038101906104ca91906132e6565b611117565b6040516104dc9190613429565b60405180910390f35b3480156104f0575f80fd5b5061050b600480360381019061050691906135ce565b61112c565b005b348015610518575f80fd5b506105216111c3565b60405161052e9190613429565b60405180910390f35b348015610542575f80fd5b5061054b6111c7565b604051610558919061363a565b60405180910390f35b61057b6004803603810190610576919061368e565b6111cb565b005b348015610588575f80fd5b506105a3600480360381019061059e9190613892565b61126b565b6040516105b09190613916565b60405180910390f35b3480156105c4575f80fd5b506105df60048036038101906105da9190613100565b6112ae565b005b3480156105ec575f80fd5b506106076004803603810190610602919061392f565b6113bd565b6040516106149190613429565b60405180910390f35b348015610628575f80fd5b50610631611403565b005b34801561063e575f80fd5b50610659600480360381019061065491906132e6565b611416565b60405161066691906139ac565b60405180910390f35b34801561067a575f80fd5b50610695600480360381019061069091906139cc565b6114b1565b6040516106a29190613429565b60405180910390f35b3480156106b6575f80fd5b506106bf6114d1565b6040516106cc9190613a19565b60405180910390f35b3480156106e0575f80fd5b506106e96114f8565b6040516106f69190613429565b60405180910390f35b34801561070a575f80fd5b50610713611506565b6040516107209190613a19565b60405180910390f35b348015610734575f80fd5b5061073d61152b565b60405161074a91906132c6565b60405180910390f35b34801561075e575f80fd5b50610779600480360381019061077491906132e6565b6115bb565b60405161078691906139ac565b60405180910390f35b34801561079a575f80fd5b506107b560048036038101906107b091906135ce565b6116cd565b005b3480156107c2575f80fd5b506107dd60048036038101906107d8919061339e565b61175f565b6040516107ea919061323d565b60405180910390f35b3480156107fe575f80fd5b50610807611781565b6040516108149190613a8d565b60405180910390f35b348015610828575f80fd5b50610843600480360381019061083e919061392f565b6117a5565b005b348015610850575f80fd5b50610859611827565b6040516108669190613429565b60405180910390f35b34801561087a575f80fd5b5061089560048036038101906108909190613aa6565b61182d565b005b6108b160048036038101906108ac9190613100565b6118ca565b005b3480156108be575f80fd5b506108d960048036038101906108d49190613b2a565b611b00565b6040516108e69190613429565b60405180910390f35b3480156108fa575f80fd5b5061091560048036038101906109109190613b68565b611b82565b005b348015610922575f80fd5b5061093d60048036038101906109389190613bb8565b611bff565b005b34801561094a575f80fd5b50610965600480360381019061096091906135ce565b611c5a565b005b348015610972575f80fd5b5061097b611ccb565b604051610988919061323d565b60405180910390f35b34801561099c575f80fd5b506109b760048036038101906109b2919061392f565b611cdd565b005b3480156109c4575f80fd5b506109df60048036038101906109da9190613be3565b611d61565b6040516109ec91906139ac565b60405180910390f35b348015610a00575f80fd5b50610a09611e0e565b604051610a169190613a19565b60405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610a5e611e15565b73ffffffffffffffffffffffffffffffffffffffff1614610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90613c91565b60405180910390fd5b5f60015f8861ffff1661ffff1681526020019081526020015f208054610ad990613cdc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0590613cdc565b8015610b505780601f10610b2757610100808354040283529160200191610b50565b820191905f5260205f20905b815481529060010190602001808311610b3357829003601f168201915b50505050509050805186869050148015610b6a57505f8151115b8015610b93575080805190602001208686604051610b89929190613d3a565b6040518091039020145b610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990613dc2565b60405180910390fd5b610c648787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611e1c565b50505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d1757507f36372b07000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d275750610d2682611ee6565b5b9050919050565b6060600a8054610d3d90613cdc565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6990613cdc565b8015610db45780601f10610d8b57610100808354040283529160200191610db4565b820191905f5260205f20905b815481529060010190602001808311610d9757829003601f168201915b5050505050905090565b610dc6611f5f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610e1f919061363a565b5f604051808303815f87803b158015610e36575f80fd5b505af1158015610e48573d5f803e3d5ffd5b5050505050565b5f80610e59611e15565b9050610e66818585611fe6565b600191505092915050565b610e79611f5f565b8060035f8461ffff1661ffff1681526020019081526020015f20819055505050565b610ea3611f5f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610efc919061363a565b5f604051808303815f87803b158015610f13575f80fd5b505af1158015610f25573d5f803e3d5ffd5b5050505050565b5f600954905090565b5f80610f3f611e15565b9050610f4c858285611ff8565b610f5785858561208a565b60019150509392505050565b5f805f80898989604051602001610f7d9493929190613e0c565b60405160208183030381529060405290507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166340a7bb108b30848a8a8a6040518763ffffffff1660e01b8152600401610ff196959493929190613e4a565b6040805180830381865afa15801561100b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102f9190613ebf565b925092505097509795505050505050565b5f6012905090565b5f8060015f8661ffff1661ffff1681526020019081526020015f20805461106e90613cdc565b80601f016020809104026020016040519081016040528092919081815260200182805461109a90613cdc565b80156110e55780601f106110bc576101008083540402835291602001916110e5565b820191905f5260205f20905b8154815290600101906020018083116110c857829003601f168201915b5050505050905083836040516110fc929190613d3a565b60405180910390208180519060200120149150509392505050565b6003602052805f5260405f205f915090505481565b611134611f5f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b815260040161119193929190613efd565b5f604051808303815f87803b1580156111a8575f80fd5b505af11580156111ba573d5f803e3d5ffd5b50505050505050565b5f81565b5f81565b611260898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505088888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061217a565b505050505050505050565b6005602052825f5260405f2082805160208101820180518482526020830160208501208183528095505050505050602052805f5260405f205f9250925050505481565b3073ffffffffffffffffffffffffffffffffffffffff166112cd611e15565b73ffffffffffffffffffffffffffffffffffffffff1614611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a90613f9d565b60405180910390fd5b6113b58686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061222a565b505050505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61140b611f5f565b6114145f612294565b565b6001602052805f5260405f205f91509050805461143290613cdc565b80601f016020809104026020016040519081016040528092919081815260200182805461145e90613cdc565b80156114a95780601f10611480576101008083540402835291602001916114a9565b820191905f5260205f20905b81548152906001019060200180831161148c57829003601f168201915b505050505081565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f611501610f2c565b905090565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600b805461153a90613cdc565b80601f016020809104026020016040519081016040528092919081815260200182805461156690613cdc565b80156115b15780601f10611588576101008083540402835291602001916115b1565b820191905f5260205f20905b81548152906001019060200180831161159457829003601f168201915b5050505050905090565b60605f60015f8461ffff1661ffff1681526020019081526020015f2080546115e290613cdc565b80601f016020809104026020016040519081016040528092919081815260200182805461160e90613cdc565b80156116595780601f1061163057610100808354040283529160200191611659565b820191905f5260205f20905b81548152906001019060200180831161163c57829003601f168201915b505050505090505f8151036116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90614005565b60405180910390fd5b6116c55f601483516116b59190614050565b836123559092919063ffffffff16565b915050919050565b6116d5611f5f565b8181306040516020016116ea939291906140c8565b60405160208183030381529060405260015f8561ffff1661ffff1681526020019081526020015f20908161171e9190614285565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161175293929190613efd565b60405180910390a1505050565b5f80611769611e15565b905061177681858561208a565b600191505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6117ad611f5f565b8060045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b8160405161181c9190613a19565b60405180910390a150565b61271081565b611835611f5f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b8152600401611896959493929190614354565b5f604051808303815f87803b1580156118ad575f80fd5b505af11580156118bf573d5f803e3d5ffd5b505050505050505050565b5f60055f8861ffff1661ffff1681526020019081526020015f2086866040516118f4929190613d3a565b90815260200160405180910390205f8567ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205490505f801b810361196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196390614410565b60405180910390fd5b80838360405161197d929190613d3a565b6040518091039020146119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc9061449e565b60405180910390fd5b5f801b60055f8961ffff1661ffff1681526020019081526020015f2087876040516119f1929190613d3a565b90815260200160405180910390205f8667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f2081905550611ab88787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061222a565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611aef9594939291906144cb565b60405180910390a150505050505050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611b8a611f5f565b8060025f8561ffff1661ffff1681526020019081526020015f205f8461ffff1661ffff1681526020019081526020015f20819055507f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0838383604051611bf293929190614517565b60405180910390a1505050565b611c07611f5f565b8060065f6101000a81548160ff0219169083151502179055507f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a481604051611c4f919061323d565b60405180910390a150565b611c62611f5f565b818160015f8661ffff1661ffff1681526020019081526020015f209182611c8a929190614556565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611cbe93929190613efd565b60405180910390a1505050565b60065f9054906101000a900460ff1681565b611ce5611f5f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d55575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611d4c9190613a19565b60405180910390fd5b611d5e81612294565b50565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b8152600401611dc29493929190614623565b5f60405180830381865afa158015611ddc573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611e0491906146d4565b9050949350505050565b5f30905090565b5f33905090565b5f80611ec75a60966366ad5c8a60e01b89898989604051602401611e43949392919061471b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050503073ffffffffffffffffffffffffffffffffffffffff16612471909392919063ffffffff16565b9150915081611ede57611edd8686868685612503565b5b505050505050565b5f7f14e4ceea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f585750611f57826125ad565b5b9050919050565b611f67611e15565b73ffffffffffffffffffffffffffffffffffffffff16611f856114d1565b73ffffffffffffffffffffffffffffffffffffffff1614611fe457611fa8611e15565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611fdb9190613a19565b60405180910390fd5b565b611ff38383836001612616565b505050565b5f6120038484611b00565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120845781811015612075578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161206c9392919061476c565b60405180910390fd5b61208384848484035f612616565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120fa575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016120f19190613a19565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361216a575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016121619190613a19565b60405180910390fd5b6121758383836127e5565b505050565b612186865f835f612a01565b5f61219388888888612a70565b90505f8087836040516020016121ab939291906147a1565b60405160208183030381529060405290506121ca888287878734612ad1565b8873ffffffffffffffffffffffffffffffffffffffff168861ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d089856040516122179291906147dd565b60405180910390a3505050505050505050565b5f602082015190505f61ffff168161ffff16036122525761224d85858585612c5d565b61228d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228490614855565b60405180910390fd5b5050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606081601f836123659190614873565b10156123a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239d906148f0565b60405180910390fd5b81836123b29190614873565b845110156123f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ec90614958565b60405180910390fd5b606082155f81146124145760405191505f825260208201604052612465565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156124525780518352602083019250602081019050612435565b50868552601f19601f8301166040525050505b50809150509392505050565b5f60605f805f8661ffff1667ffffffffffffffff8111156124955761249461376e565b5b6040519080825280601f01601f1916602001820160405280156124c75781602001600182028036833780820191505090505b5090505f808751602089015f8d8df191503d9250868311156124e7578692505b828152825f602083013e81819450945050505094509492505050565b818051906020012060055f8761ffff1661ffff1681526020019081526020015f208560405161253291906149a6565b90815260200160405180910390205f8567ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f20819055507fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c858585858560405161259e9594939291906149bc565b60405180910390a15050505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612686575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161267d9190613a19565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126f6575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016126ed9190613a19565b60405180910390fd5b8160085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156127df578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516127d69190613429565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612835578060095f8282546128299190614873565b92505081905550612905565b5f60075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156128bf578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016128b69392919061476c565b60405180910390fd5b81810360075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361294c578060095f8282540392505081905550612997565b8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129f49190613429565b60405180910390a3505050565b60065f9054906101000a900460ff1615612a2657612a2184848484612cf7565b612a6a565b5f825114612a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6090614a92565b60405180910390fd5b5b50505050565b5f80612a7a611e15565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612abb57612aba868285611ff8565b5b612ac58684612dcf565b82915050949350505050565b5f60015f8861ffff1661ffff1681526020019081526020015f208054612af690613cdc565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2290613cdc565b8015612b6d5780601f10612b4457610100808354040283529160200191612b6d565b820191905f5260205f20905b815481529060010190602001808311612b5057829003601f168201915b505050505090505f815103612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90614b20565b60405180910390fd5b612bc2878751612e4e565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c58031008389848a8a8a8a6040518863ffffffff1660e01b8152600401612c2696959493929190614b4d565b5f604051808303818588803b158015612c3d575f80fd5b505af1158015612c4f573d5f803e3d5ffd5b505050505050505050505050565b5f8082806020019051810190612c739190614bd5565b92509250505f612c8c5f84612ec090919063ffffffff16565b9050612c99878284612f34565b91508073ffffffffffffffffffffffffffffffffffffffff168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf84604051612ce69190613429565b60405180910390a350505050505050565b5f612d0183612f49565b90505f60025f8761ffff1661ffff1681526020019081526020015f205f8661ffff1661ffff1681526020019081526020015f205490505f8111612d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7090614c8b565b60405180910390fd5b8281612d859190614873565b821015612dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbe90614cf3565b60405180910390fd5b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e3f575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612e369190613a19565b60405180910390fd5b612e4a825f836127e5565b5050565b5f60035f8461ffff1661ffff1681526020019081526020015f205490505f8103612e785761271090505b80821115612ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb290614d5b565b60405180910390fd5b505050565b5f601482612ece9190614873565b83511015612f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0890614dc3565b60405180910390fd5b5f6c01000000000000000000000000836020860101510490508091505092915050565b5f612f3f8383612f9b565b8190509392505050565b5f602282511015612f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8690614e2b565b60405180910390fd5b60228201519050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361300b575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016130029190613a19565b60405180910390fd5b6130165f83836127e5565b5050565b5f604051905090565b5f80fd5b5f80fd5b5f61ffff82169050919050565b6130418161302b565b811461304b575f80fd5b50565b5f8135905061305c81613038565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261308357613082613062565b5b8235905067ffffffffffffffff8111156130a05761309f613066565b5b6020830191508360018202830111156130bc576130bb61306a565b5b9250929050565b5f67ffffffffffffffff82169050919050565b6130df816130c3565b81146130e9575f80fd5b50565b5f813590506130fa816130d6565b92915050565b5f805f805f806080878903121561311a57613119613023565b5b5f61312789828a0161304e565b965050602087013567ffffffffffffffff81111561314857613147613027565b5b61315489828a0161306e565b9550955050604061316789828a016130ec565b935050606087013567ffffffffffffffff81111561318857613187613027565b5b61319489828a0161306e565b92509250509295509295509295565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131d7816131a3565b81146131e1575f80fd5b50565b5f813590506131f2816131ce565b92915050565b5f6020828403121561320d5761320c613023565b5b5f61321a848285016131e4565b91505092915050565b5f8115159050919050565b61323781613223565b82525050565b5f6020820190506132505f83018461322e565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61329882613256565b6132a28185613260565b93506132b2818560208601613270565b6132bb8161327e565b840191505092915050565b5f6020820190508181035f8301526132de818461328e565b905092915050565b5f602082840312156132fb576132fa613023565b5b5f6133088482850161304e565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61333a82613311565b9050919050565b61334a81613330565b8114613354575f80fd5b50565b5f8135905061336581613341565b92915050565b5f819050919050565b61337d8161336b565b8114613387575f80fd5b50565b5f8135905061339881613374565b92915050565b5f80604083850312156133b4576133b3613023565b5b5f6133c185828601613357565b92505060206133d28582860161338a565b9150509250929050565b5f80604083850312156133f2576133f1613023565b5b5f6133ff8582860161304e565b92505060206134108582860161338a565b9150509250929050565b6134238161336b565b82525050565b5f60208201905061343c5f83018461341a565b92915050565b5f805f6060848603121561345957613458613023565b5b5f61346686828701613357565b935050602061347786828701613357565b92505060406134888682870161338a565b9150509250925092565b61349b81613223565b81146134a5575f80fd5b50565b5f813590506134b681613492565b92915050565b5f805f805f805f60a0888a0312156134d7576134d6613023565b5b5f6134e48a828b0161304e565b975050602088013567ffffffffffffffff81111561350557613504613027565b5b6135118a828b0161306e565b965096505060406135248a828b0161338a565b94505060606135358a828b016134a8565b935050608088013567ffffffffffffffff81111561355657613555613027565b5b6135628a828b0161306e565b925092505092959891949750929550565b5f6040820190506135865f83018561341a565b613593602083018461341a565b9392505050565b5f60ff82169050919050565b6135af8161359a565b82525050565b5f6020820190506135c85f8301846135a6565b92915050565b5f805f604084860312156135e5576135e4613023565b5b5f6135f28682870161304e565b935050602084013567ffffffffffffffff81111561361357613612613027565b5b61361f8682870161306e565b92509250509250925092565b6136348161302b565b82525050565b5f60208201905061364d5f83018461362b565b92915050565b5f61365d82613311565b9050919050565b61366d81613653565b8114613677575f80fd5b50565b5f8135905061368881613664565b92915050565b5f805f805f805f805f60e08a8c0312156136ab576136aa613023565b5b5f6136b88c828d01613357565b99505060206136c98c828d0161304e565b98505060408a013567ffffffffffffffff8111156136ea576136e9613027565b5b6136f68c828d0161306e565b975097505060606137098c828d0161338a565b955050608061371a8c828d0161367a565b94505060a061372b8c828d01613357565b93505060c08a013567ffffffffffffffff81111561374c5761374b613027565b5b6137588c828d0161306e565b92509250509295985092959850929598565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6137a48261327e565b810181811067ffffffffffffffff821117156137c3576137c261376e565b5b80604052505050565b5f6137d561301a565b90506137e1828261379b565b919050565b5f67ffffffffffffffff821115613800576137ff61376e565b5b6138098261327e565b9050602081019050919050565b828183375f83830152505050565b5f613836613831846137e6565b6137cc565b9050828152602081018484840111156138525761385161376a565b5b61385d848285613816565b509392505050565b5f82601f83011261387957613878613062565b5b8135613889848260208601613824565b91505092915050565b5f805f606084860312156138a9576138a8613023565b5b5f6138b68682870161304e565b935050602084013567ffffffffffffffff8111156138d7576138d6613027565b5b6138e386828701613865565b92505060406138f4868287016130ec565b9150509250925092565b5f819050919050565b613910816138fe565b82525050565b5f6020820190506139295f830184613907565b92915050565b5f6020828403121561394457613943613023565b5b5f61395184828501613357565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f61397e8261395a565b6139888185613964565b9350613998818560208601613270565b6139a18161327e565b840191505092915050565b5f6020820190508181035f8301526139c48184613974565b905092915050565b5f80604083850312156139e2576139e1613023565b5b5f6139ef8582860161304e565b9250506020613a008582860161304e565b9150509250929050565b613a1381613330565b82525050565b5f602082019050613a2c5f830184613a0a565b92915050565b5f819050919050565b5f613a55613a50613a4b84613311565b613a32565b613311565b9050919050565b5f613a6682613a3b565b9050919050565b5f613a7782613a5c565b9050919050565b613a8781613a6d565b82525050565b5f602082019050613aa05f830184613a7e565b92915050565b5f805f805f60808688031215613abf57613abe613023565b5b5f613acc8882890161304e565b9550506020613add8882890161304e565b9450506040613aee8882890161338a565b935050606086013567ffffffffffffffff811115613b0f57613b0e613027565b5b613b1b8882890161306e565b92509250509295509295909350565b5f8060408385031215613b4057613b3f613023565b5b5f613b4d85828601613357565b9250506020613b5e85828601613357565b9150509250929050565b5f805f60608486031215613b7f57613b7e613023565b5b5f613b8c8682870161304e565b9350506020613b9d8682870161304e565b9250506040613bae8682870161338a565b9150509250925092565b5f60208284031215613bcd57613bcc613023565b5b5f613bda848285016134a8565b91505092915050565b5f805f8060808587031215613bfb57613bfa613023565b5b5f613c088782880161304e565b9450506020613c198782880161304e565b9350506040613c2a87828801613357565b9250506060613c3b8782880161338a565b91505092959194509250565b7f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c657200005f82015250565b5f613c7b601e83613260565b9150613c8682613c47565b602082019050919050565b5f6020820190508181035f830152613ca881613c6f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613cf357607f821691505b602082108103613d0657613d05613caf565b5b50919050565b5f81905092915050565b5f613d218385613d0c565b9350613d2e838584613816565b82840190509392505050565b5f613d46828486613d16565b91508190509392505050565b7f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f5f8201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b5f613dac602683613260565b9150613db782613d52565b604082019050919050565b5f6020820190508181035f830152613dd981613da0565b9050919050565b5f613deb8385613964565b9350613df8838584613816565b613e018361327e565b840190509392505050565b5f606082019050613e1f5f83018761362b565b8181036020830152613e32818587613de0565b9050613e41604083018461341a565b95945050505050565b5f60a082019050613e5d5f83018961362b565b613e6a6020830188613a0a565b8181036040830152613e7c8187613974565b9050613e8b606083018661322e565b8181036080830152613e9e818486613de0565b9050979650505050505050565b5f81519050613eb981613374565b92915050565b5f8060408385031215613ed557613ed4613023565b5b5f613ee285828601613eab565b9250506020613ef385828601613eab565b9150509250929050565b5f604082019050613f105f83018661362b565b8181036020830152613f23818486613de0565b9050949350505050565b7f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062655f8201527f204c7a4170700000000000000000000000000000000000000000000000000000602082015250565b5f613f87602683613260565b9150613f9282613f2d565b604082019050919050565b5f6020820190508181035f830152613fb481613f7b565b9050919050565b7f4c7a4170703a206e6f20747275737465642070617468207265636f72640000005f82015250565b5f613fef601d83613260565b9150613ffa82613fbb565b602082019050919050565b5f6020820190508181035f83015261401c81613fe3565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61405a8261336b565b91506140658361336b565b925082820390508181111561407d5761407c614023565b5b92915050565b5f8160601b9050919050565b5f61409982614083565b9050919050565b5f6140aa8261408f565b9050919050565b6140c26140bd82613330565b6140a0565b82525050565b5f6140d4828587613d16565b91506140e082846140b1565b601482019150819050949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261414d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614112565b6141578683614112565b95508019841693508086168417925050509392505050565b5f61418961418461417f8461336b565b613a32565b61336b565b9050919050565b5f819050919050565b6141a28361416f565b6141b66141ae82614190565b84845461411e565b825550505050565b5f90565b6141ca6141be565b6141d5818484614199565b505050565b5b818110156141f8576141ed5f826141c2565b6001810190506141db565b5050565b601f82111561423d5761420e816140f1565b61421784614103565b81016020851015614226578190505b61423a61423285614103565b8301826141da565b50505b505050565b5f82821c905092915050565b5f61425d5f1984600802614242565b1980831691505092915050565b5f614275838361424e565b9150826002028217905092915050565b61428e8261395a565b67ffffffffffffffff8111156142a7576142a661376e565b5b6142b18254613cdc565b6142bc8282856141fc565b5f60209050601f8311600181146142ed575f84156142db578287015190505b6142e5858261426a565b86555061434c565b601f1984166142fb866140f1565b5f5b82811015614322578489015182556001820191506020850194506020810190506142fd565b8683101561433f578489015161433b601f89168261424e565b8355505b6001600288020188555050505b505050505050565b5f6080820190506143675f83018861362b565b614374602083018761362b565b614381604083018661341a565b8181036060830152614394818486613de0565b90509695505050505050565b7f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d6573735f8201527f6167650000000000000000000000000000000000000000000000000000000000602082015250565b5f6143fa602383613260565b9150614405826143a0565b604082019050919050565b5f6020820190508181035f830152614427816143ee565b9050919050565b7f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f615f8201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b5f614488602183613260565b91506144938261442e565b604082019050919050565b5f6020820190508181035f8301526144b58161447c565b9050919050565b6144c5816130c3565b82525050565b5f6080820190506144de5f83018861362b565b81810360208301526144f1818688613de0565b905061450060408301856144bc565b61450d6060830184613907565b9695505050505050565b5f60608201905061452a5f83018661362b565b614537602083018561362b565b614544604083018461341a565b949350505050565b5f82905092915050565b614560838361454c565b67ffffffffffffffff8111156145795761457861376e565b5b6145838254613cdc565b61458e8282856141fc565b5f601f8311600181146145bb575f84156145a9578287013590505b6145b3858261426a565b86555061461a565b601f1984166145c9866140f1565b5f5b828110156145f0578489013582556001820191506020850194506020810190506145cb565b8683101561460d5784890135614609601f89168261424e565b8355505b6001600288020188555050505b50505050505050565b5f6080820190506146365f83018761362b565b614643602083018661362b565b6146506040830185613a0a565b61465d606083018461341a565b95945050505050565b5f614678614673846137e6565b6137cc565b9050828152602081018484840111156146945761469361376a565b5b61469f848285613270565b509392505050565b5f82601f8301126146bb576146ba613062565b5b81516146cb848260208601614666565b91505092915050565b5f602082840312156146e9576146e8613023565b5b5f82015167ffffffffffffffff81111561470657614705613027565b5b614712848285016146a7565b91505092915050565b5f60808201905061472e5f83018761362b565b81810360208301526147408186613974565b905061474f60408301856144bc565b81810360608301526147618184613974565b905095945050505050565b5f60608201905061477f5f830186613a0a565b61478c602083018561341a565b614799604083018461341a565b949350505050565b5f6060820190506147b45f83018661362b565b81810360208301526147c68185613974565b90506147d5604083018461341a565b949350505050565b5f6040820190508181035f8301526147f58185613974565b9050614804602083018461341a565b9392505050565b7f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000005f82015250565b5f61483f601c83613260565b915061484a8261480b565b602082019050919050565b5f6020820190508181035f83015261486c81614833565b9050919050565b5f61487d8261336b565b91506148888361336b565b92508282019050808211156148a05761489f614023565b5b92915050565b7f736c6963655f6f766572666c6f770000000000000000000000000000000000005f82015250565b5f6148da600e83613260565b91506148e5826148a6565b602082019050919050565b5f6020820190508181035f830152614907816148ce565b9050919050565b7f736c6963655f6f75744f66426f756e64730000000000000000000000000000005f82015250565b5f614942601183613260565b915061494d8261490e565b602082019050919050565b5f6020820190508181035f83015261496f81614936565b9050919050565b5f6149808261395a565b61498a8185613d0c565b935061499a818560208601613270565b80840191505092915050565b5f6149b18284614976565b915081905092915050565b5f60a0820190506149cf5f83018861362b565b81810360208301526149e18187613974565b90506149f060408301866144bc565b8181036060830152614a028185613974565b90508181036080830152614a168184613974565b90509695505050505050565b7f4f4654436f72653a205f61646170746572506172616d73206d757374206265205f8201527f656d7074792e0000000000000000000000000000000000000000000000000000602082015250565b5f614a7c602683613260565b9150614a8782614a22565b604082019050919050565b5f6020820190508181035f830152614aa981614a70565b9050919050565b7f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f74205f8201527f61207472757374656420736f7572636500000000000000000000000000000000602082015250565b5f614b0a603083613260565b9150614b1582614ab0565b604082019050919050565b5f6020820190508181035f830152614b3781614afe565b9050919050565b614b4781613653565b82525050565b5f60c082019050614b605f83018961362b565b8181036020830152614b728188613974565b90508181036040830152614b868187613974565b9050614b956060830186614b3e565b614ba26080830185613a0a565b81810360a0830152614bb48184613974565b9050979650505050505050565b5f81519050614bcf81613038565b92915050565b5f805f60608486031215614bec57614beb613023565b5b5f614bf986828701614bc1565b935050602084015167ffffffffffffffff811115614c1a57614c19613027565b5b614c26868287016146a7565b9250506040614c3786828701613eab565b9150509250925092565b7f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000005f82015250565b5f614c75601a83613260565b9150614c8082614c41565b602082019050919050565b5f6020820190508181035f830152614ca281614c69565b9050919050565b7f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000005f82015250565b5f614cdd601b83613260565b9150614ce882614ca9565b602082019050919050565b5f6020820190508181035f830152614d0a81614cd1565b9050919050565b7f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267655f82015250565b5f614d45602083613260565b9150614d5082614d11565b602082019050919050565b5f6020820190508181035f830152614d7281614d39565b9050919050565b7f746f416464726573735f6f75744f66426f756e647300000000000000000000005f82015250565b5f614dad601583613260565b9150614db882614d79565b602082019050919050565b5f6020820190508181035f830152614dda81614da1565b9050919050565b7f4c7a4170703a20696e76616c69642061646170746572506172616d73000000005f82015250565b5f614e15601c83613260565b9150614e2082614de1565b602082019050919050565b5f6020820190508181035f830152614e4281614e09565b905091905056fea2646970667358221220cadcc41bc35985b6a1824e85aa28b938d04c555a04c58094c15eb2fecf26b1da64736f6c634300081900330000000000000000000000007dddad13e81e41905ea49ce66474d930caa24aec000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd70000000000000000000000000000000000000000000000000000000000000007486f72697a656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035a454e0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061025a575f3560e01c80637533d78811610143578063c4461834116100b5578063eab45d9c11610079578063eab45d9c14610917578063eb8d72b71461093f578063ed629c5c14610967578063f2fde38b14610991578063f5ecbdbc146109b9578063fc0c546a146109f55761025a565b8063c446183414610845578063cbed8b9c1461086f578063d1deba1f14610897578063dd62ed3e146108b3578063df2a5b3b146108ef5761025a565b806395d89b411161010757806395d89b41146107295780639f38369a14610753578063a6c3d1651461078f578063a9059cbb146107b7578063b353aaa7146107f3578063baf3292d1461081d5761025a565b80637533d788146106335780638cfd8f5c1461066f5780638da5cb5b146106ab5780639358928b146106d5578063950c8a74146106ff5761025a565b8063313ce567116101dc5780634c42899a116101a05780634c42899a1461053757806351905636146105615780635b8c41e61461057d57806366ad5c8a146105b957806370a08231146105e1578063715018a61461061d5761025a565b8063313ce567146104435780633d8b38f61461046d5780633f1f4fa4146104a957806342d65a8d146104e5578063447705151461050d5761025a565b80630df37483116102235780630df374831461035057806310ddb1371461037857806318160ddd146103a057806323b872dd146103ca5780632a205e3d146104065761025a565b80621d35671461025e57806301ffc9a71461028657806306fdde03146102c257806307e0db17146102ec578063095ea7b314610314575b5f80fd5b348015610269575f80fd5b50610284600480360381019061027f9190613100565b610a1f565b005b348015610291575f80fd5b506102ac60048036038101906102a791906131f8565b610c6d565b6040516102b9919061323d565b60405180910390f35b3480156102cd575f80fd5b506102d6610d2e565b6040516102e391906132c6565b60405180910390f35b3480156102f7575f80fd5b50610312600480360381019061030d91906132e6565b610dbe565b005b34801561031f575f80fd5b5061033a6004803603810190610335919061339e565b610e4f565b604051610347919061323d565b60405180910390f35b34801561035b575f80fd5b50610376600480360381019061037191906133dc565b610e71565b005b348015610383575f80fd5b5061039e600480360381019061039991906132e6565b610e9b565b005b3480156103ab575f80fd5b506103b4610f2c565b6040516103c19190613429565b60405180910390f35b3480156103d5575f80fd5b506103f060048036038101906103eb9190613442565b610f35565b6040516103fd919061323d565b60405180910390f35b348015610411575f80fd5b5061042c600480360381019061042791906134bc565b610f63565b60405161043a929190613573565b60405180910390f35b34801561044e575f80fd5b50610457611040565b60405161046491906135b5565b60405180910390f35b348015610478575f80fd5b50610493600480360381019061048e91906135ce565b611048565b6040516104a0919061323d565b60405180910390f35b3480156104b4575f80fd5b506104cf60048036038101906104ca91906132e6565b611117565b6040516104dc9190613429565b60405180910390f35b3480156104f0575f80fd5b5061050b600480360381019061050691906135ce565b61112c565b005b348015610518575f80fd5b506105216111c3565b60405161052e9190613429565b60405180910390f35b348015610542575f80fd5b5061054b6111c7565b604051610558919061363a565b60405180910390f35b61057b6004803603810190610576919061368e565b6111cb565b005b348015610588575f80fd5b506105a3600480360381019061059e9190613892565b61126b565b6040516105b09190613916565b60405180910390f35b3480156105c4575f80fd5b506105df60048036038101906105da9190613100565b6112ae565b005b3480156105ec575f80fd5b506106076004803603810190610602919061392f565b6113bd565b6040516106149190613429565b60405180910390f35b348015610628575f80fd5b50610631611403565b005b34801561063e575f80fd5b50610659600480360381019061065491906132e6565b611416565b60405161066691906139ac565b60405180910390f35b34801561067a575f80fd5b50610695600480360381019061069091906139cc565b6114b1565b6040516106a29190613429565b60405180910390f35b3480156106b6575f80fd5b506106bf6114d1565b6040516106cc9190613a19565b60405180910390f35b3480156106e0575f80fd5b506106e96114f8565b6040516106f69190613429565b60405180910390f35b34801561070a575f80fd5b50610713611506565b6040516107209190613a19565b60405180910390f35b348015610734575f80fd5b5061073d61152b565b60405161074a91906132c6565b60405180910390f35b34801561075e575f80fd5b50610779600480360381019061077491906132e6565b6115bb565b60405161078691906139ac565b60405180910390f35b34801561079a575f80fd5b506107b560048036038101906107b091906135ce565b6116cd565b005b3480156107c2575f80fd5b506107dd60048036038101906107d8919061339e565b61175f565b6040516107ea919061323d565b60405180910390f35b3480156107fe575f80fd5b50610807611781565b6040516108149190613a8d565b60405180910390f35b348015610828575f80fd5b50610843600480360381019061083e919061392f565b6117a5565b005b348015610850575f80fd5b50610859611827565b6040516108669190613429565b60405180910390f35b34801561087a575f80fd5b5061089560048036038101906108909190613aa6565b61182d565b005b6108b160048036038101906108ac9190613100565b6118ca565b005b3480156108be575f80fd5b506108d960048036038101906108d49190613b2a565b611b00565b6040516108e69190613429565b60405180910390f35b3480156108fa575f80fd5b5061091560048036038101906109109190613b68565b611b82565b005b348015610922575f80fd5b5061093d60048036038101906109389190613bb8565b611bff565b005b34801561094a575f80fd5b50610965600480360381019061096091906135ce565b611c5a565b005b348015610972575f80fd5b5061097b611ccb565b604051610988919061323d565b60405180910390f35b34801561099c575f80fd5b506109b760048036038101906109b2919061392f565b611cdd565b005b3480156109c4575f80fd5b506109df60048036038101906109da9190613be3565b611d61565b6040516109ec91906139ac565b60405180910390f35b348015610a00575f80fd5b50610a09611e0e565b604051610a169190613a19565b60405180910390f35b7f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd773ffffffffffffffffffffffffffffffffffffffff16610a5e611e15565b73ffffffffffffffffffffffffffffffffffffffff1614610ab4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aab90613c91565b60405180910390fd5b5f60015f8861ffff1661ffff1681526020019081526020015f208054610ad990613cdc565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0590613cdc565b8015610b505780601f10610b2757610100808354040283529160200191610b50565b820191905f5260205f20905b815481529060010190602001808311610b3357829003601f168201915b50505050509050805186869050148015610b6a57505f8151115b8015610b93575080805190602001208686604051610b89929190613d3a565b6040518091039020145b610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990613dc2565b60405180910390fd5b610c648787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050611e1c565b50505050505050565b5f807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d1757507f36372b07000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d275750610d2682611ee6565b5b9050919050565b6060600a8054610d3d90613cdc565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6990613cdc565b8015610db45780601f10610d8b57610100808354040283529160200191610db4565b820191905f5260205f20905b815481529060010190602001808311610d9757829003601f168201915b5050505050905090565b610dc6611f5f565b7f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd773ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610e1f919061363a565b5f604051808303815f87803b158015610e36575f80fd5b505af1158015610e48573d5f803e3d5ffd5b5050505050565b5f80610e59611e15565b9050610e66818585611fe6565b600191505092915050565b610e79611f5f565b8060035f8461ffff1661ffff1681526020019081526020015f20819055505050565b610ea3611f5f565b7f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd773ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610efc919061363a565b5f604051808303815f87803b158015610f13575f80fd5b505af1158015610f25573d5f803e3d5ffd5b5050505050565b5f600954905090565b5f80610f3f611e15565b9050610f4c858285611ff8565b610f5785858561208a565b60019150509392505050565b5f805f80898989604051602001610f7d9493929190613e0c565b60405160208183030381529060405290507f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd773ffffffffffffffffffffffffffffffffffffffff166340a7bb108b30848a8a8a6040518763ffffffff1660e01b8152600401610ff196959493929190613e4a565b6040805180830381865afa15801561100b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102f9190613ebf565b925092505097509795505050505050565b5f6012905090565b5f8060015f8661ffff1661ffff1681526020019081526020015f20805461106e90613cdc565b80601f016020809104026020016040519081016040528092919081815260200182805461109a90613cdc565b80156110e55780601f106110bc576101008083540402835291602001916110e5565b820191905f5260205f20905b8154815290600101906020018083116110c857829003601f168201915b5050505050905083836040516110fc929190613d3a565b60405180910390208180519060200120149150509392505050565b6003602052805f5260405f205f915090505481565b611134611f5f565b7f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd773ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b815260040161119193929190613efd565b5f604051808303815f87803b1580156111a8575f80fd5b505af11580156111ba573d5f803e3d5ffd5b50505050505050565b5f81565b5f81565b611260898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505088888888888080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061217a565b505050505050505050565b6005602052825f5260405f2082805160208101820180518482526020830160208501208183528095505050505050602052805f5260405f205f9250925050505481565b3073ffffffffffffffffffffffffffffffffffffffff166112cd611e15565b73ffffffffffffffffffffffffffffffffffffffff1614611323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131a90613f9d565b60405180910390fd5b6113b58686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061222a565b505050505050565b5f60075f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b61140b611f5f565b6114145f612294565b565b6001602052805f5260405f205f91509050805461143290613cdc565b80601f016020809104026020016040519081016040528092919081815260200182805461145e90613cdc565b80156114a95780601f10611480576101008083540402835291602001916114a9565b820191905f5260205f20905b81548152906001019060200180831161148c57829003601f168201915b505050505081565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f611501610f2c565b905090565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600b805461153a90613cdc565b80601f016020809104026020016040519081016040528092919081815260200182805461156690613cdc565b80156115b15780601f10611588576101008083540402835291602001916115b1565b820191905f5260205f20905b81548152906001019060200180831161159457829003601f168201915b5050505050905090565b60605f60015f8461ffff1661ffff1681526020019081526020015f2080546115e290613cdc565b80601f016020809104026020016040519081016040528092919081815260200182805461160e90613cdc565b80156116595780601f1061163057610100808354040283529160200191611659565b820191905f5260205f20905b81548152906001019060200180831161163c57829003601f168201915b505050505090505f8151036116a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169a90614005565b60405180910390fd5b6116c55f601483516116b59190614050565b836123559092919063ffffffff16565b915050919050565b6116d5611f5f565b8181306040516020016116ea939291906140c8565b60405160208183030381529060405260015f8561ffff1661ffff1681526020019081526020015f20908161171e9190614285565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce83838360405161175293929190613efd565b60405180910390a1505050565b5f80611769611e15565b905061177681858561208a565b600191505092915050565b7f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd781565b6117ad611f5f565b8060045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b8160405161181c9190613a19565b60405180910390a150565b61271081565b611835611f5f565b7f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd773ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b8152600401611896959493929190614354565b5f604051808303815f87803b1580156118ad575f80fd5b505af11580156118bf573d5f803e3d5ffd5b505050505050505050565b5f60055f8861ffff1661ffff1681526020019081526020015f2086866040516118f4929190613d3a565b90815260200160405180910390205f8567ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f205490505f801b810361196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196390614410565b60405180910390fd5b80838360405161197d929190613d3a565b6040518091039020146119c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bc9061449e565b60405180910390fd5b5f801b60055f8961ffff1661ffff1681526020019081526020015f2087876040516119f1929190613d3a565b90815260200160405180910390205f8667ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f2081905550611ab88787878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050508686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505061222a565b7fc264d91f3adc5588250e1551f547752ca0cfa8f6b530d243b9f9f4cab10ea8e58787878785604051611aef9594939291906144cb565b60405180910390a150505050505050565b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611b8a611f5f565b8060025f8561ffff1661ffff1681526020019081526020015f205f8461ffff1661ffff1681526020019081526020015f20819055507f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0838383604051611bf293929190614517565b60405180910390a1505050565b611c07611f5f565b8060065f6101000a81548160ff0219169083151502179055507f1584ad594a70cbe1e6515592e1272a987d922b097ead875069cebe8b40c004a481604051611c4f919061323d565b60405180910390a150565b611c62611f5f565b818160015f8661ffff1661ffff1681526020019081526020015f209182611c8a929190614556565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab838383604051611cbe93929190613efd565b60405180910390a1505050565b60065f9054906101000a900460ff1681565b611ce5611f5f565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d55575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611d4c9190613a19565b60405180910390fd5b611d5e81612294565b50565b60607f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd773ffffffffffffffffffffffffffffffffffffffff1663f5ecbdbc868630866040518563ffffffff1660e01b8152600401611dc29493929190614623565b5f60405180830381865afa158015611ddc573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611e0491906146d4565b9050949350505050565b5f30905090565b5f33905090565b5f80611ec75a60966366ad5c8a60e01b89898989604051602401611e43949392919061471b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050503073ffffffffffffffffffffffffffffffffffffffff16612471909392919063ffffffff16565b9150915081611ede57611edd8686868685612503565b5b505050505050565b5f7f14e4ceea000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f585750611f57826125ad565b5b9050919050565b611f67611e15565b73ffffffffffffffffffffffffffffffffffffffff16611f856114d1565b73ffffffffffffffffffffffffffffffffffffffff1614611fe457611fa8611e15565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611fdb9190613a19565b60405180910390fd5b565b611ff38383836001612616565b505050565b5f6120038484611b00565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120845781811015612075578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161206c9392919061476c565b60405180910390fd5b61208384848484035f612616565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120fa575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016120f19190613a19565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361216a575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016121619190613a19565b60405180910390fd5b6121758383836127e5565b505050565b612186865f835f612a01565b5f61219388888888612a70565b90505f8087836040516020016121ab939291906147a1565b60405160208183030381529060405290506121ca888287878734612ad1565b8873ffffffffffffffffffffffffffffffffffffffff168861ffff167f39a4c66499bcf4b56d79f0dde8ed7a9d4925a0df55825206b2b8531e202be0d089856040516122179291906147dd565b60405180910390a3505050505050505050565b5f602082015190505f61ffff168161ffff16036122525761224d85858585612c5d565b61228d565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228490614855565b60405180910390fd5b5050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606081601f836123659190614873565b10156123a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239d906148f0565b60405180910390fd5b81836123b29190614873565b845110156123f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ec90614958565b60405180910390fd5b606082155f81146124145760405191505f825260208201604052612465565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156124525780518352602083019250602081019050612435565b50868552601f19601f8301166040525050505b50809150509392505050565b5f60605f805f8661ffff1667ffffffffffffffff8111156124955761249461376e565b5b6040519080825280601f01601f1916602001820160405280156124c75781602001600182028036833780820191505090505b5090505f808751602089015f8d8df191503d9250868311156124e7578692505b828152825f602083013e81819450945050505094509492505050565b818051906020012060055f8761ffff1661ffff1681526020019081526020015f208560405161253291906149a6565b90815260200160405180910390205f8567ffffffffffffffff1667ffffffffffffffff1681526020019081526020015f20819055507fe183f33de2837795525b4792ca4cd60535bd77c53b7e7030060bfcf5734d6b0c858585858560405161259e9594939291906149bc565b60405180910390a15050505050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612686575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161267d9190613a19565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036126f6575f6040517f94280d620000000000000000000000000000000000000000000000000000000081526004016126ed9190613a19565b60405180910390fd5b8160085f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080156127df578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516127d69190613429565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612835578060095f8282546128299190614873565b92505081905550612905565b5f60075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156128bf578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016128b69392919061476c565b60405180910390fd5b81810360075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361294c578060095f8282540392505081905550612997565b8060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516129f49190613429565b60405180910390a3505050565b60065f9054906101000a900460ff1615612a2657612a2184848484612cf7565b612a6a565b5f825114612a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6090614a92565b60405180910390fd5b5b50505050565b5f80612a7a611e15565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612abb57612aba868285611ff8565b5b612ac58684612dcf565b82915050949350505050565b5f60015f8861ffff1661ffff1681526020019081526020015f208054612af690613cdc565b80601f0160208091040260200160405190810160405280929190818152602001828054612b2290613cdc565b8015612b6d5780601f10612b4457610100808354040283529160200191612b6d565b820191905f5260205f20905b815481529060010190602001808311612b5057829003601f168201915b505050505090505f815103612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90614b20565b60405180910390fd5b612bc2878751612e4e565b7f000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd773ffffffffffffffffffffffffffffffffffffffff1663c58031008389848a8a8a8a6040518863ffffffff1660e01b8152600401612c2696959493929190614b4d565b5f604051808303818588803b158015612c3d575f80fd5b505af1158015612c4f573d5f803e3d5ffd5b505050505050505050505050565b5f8082806020019051810190612c739190614bd5565b92509250505f612c8c5f84612ec090919063ffffffff16565b9050612c99878284612f34565b91508073ffffffffffffffffffffffffffffffffffffffff168761ffff167fbf551ec93859b170f9b2141bd9298bf3f64322c6f7beb2543a0cb669834118bf84604051612ce69190613429565b60405180910390a350505050505050565b5f612d0183612f49565b90505f60025f8761ffff1661ffff1681526020019081526020015f205f8661ffff1661ffff1681526020019081526020015f205490505f8111612d79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7090614c8b565b60405180910390fd5b8281612d859190614873565b821015612dc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dbe90614cf3565b60405180910390fd5b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e3f575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612e369190613a19565b60405180910390fd5b612e4a825f836127e5565b5050565b5f60035f8461ffff1661ffff1681526020019081526020015f205490505f8103612e785761271090505b80821115612ebb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb290614d5b565b60405180910390fd5b505050565b5f601482612ece9190614873565b83511015612f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0890614dc3565b60405180910390fd5b5f6c01000000000000000000000000836020860101510490508091505092915050565b5f612f3f8383612f9b565b8190509392505050565b5f602282511015612f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8690614e2b565b60405180910390fd5b60228201519050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361300b575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016130029190613a19565b60405180910390fd5b6130165f83836127e5565b5050565b5f604051905090565b5f80fd5b5f80fd5b5f61ffff82169050919050565b6130418161302b565b811461304b575f80fd5b50565b5f8135905061305c81613038565b92915050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261308357613082613062565b5b8235905067ffffffffffffffff8111156130a05761309f613066565b5b6020830191508360018202830111156130bc576130bb61306a565b5b9250929050565b5f67ffffffffffffffff82169050919050565b6130df816130c3565b81146130e9575f80fd5b50565b5f813590506130fa816130d6565b92915050565b5f805f805f806080878903121561311a57613119613023565b5b5f61312789828a0161304e565b965050602087013567ffffffffffffffff81111561314857613147613027565b5b61315489828a0161306e565b9550955050604061316789828a016130ec565b935050606087013567ffffffffffffffff81111561318857613187613027565b5b61319489828a0161306e565b92509250509295509295509295565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6131d7816131a3565b81146131e1575f80fd5b50565b5f813590506131f2816131ce565b92915050565b5f6020828403121561320d5761320c613023565b5b5f61321a848285016131e4565b91505092915050565b5f8115159050919050565b61323781613223565b82525050565b5f6020820190506132505f83018461322e565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f61329882613256565b6132a28185613260565b93506132b2818560208601613270565b6132bb8161327e565b840191505092915050565b5f6020820190508181035f8301526132de818461328e565b905092915050565b5f602082840312156132fb576132fa613023565b5b5f6133088482850161304e565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61333a82613311565b9050919050565b61334a81613330565b8114613354575f80fd5b50565b5f8135905061336581613341565b92915050565b5f819050919050565b61337d8161336b565b8114613387575f80fd5b50565b5f8135905061339881613374565b92915050565b5f80604083850312156133b4576133b3613023565b5b5f6133c185828601613357565b92505060206133d28582860161338a565b9150509250929050565b5f80604083850312156133f2576133f1613023565b5b5f6133ff8582860161304e565b92505060206134108582860161338a565b9150509250929050565b6134238161336b565b82525050565b5f60208201905061343c5f83018461341a565b92915050565b5f805f6060848603121561345957613458613023565b5b5f61346686828701613357565b935050602061347786828701613357565b92505060406134888682870161338a565b9150509250925092565b61349b81613223565b81146134a5575f80fd5b50565b5f813590506134b681613492565b92915050565b5f805f805f805f60a0888a0312156134d7576134d6613023565b5b5f6134e48a828b0161304e565b975050602088013567ffffffffffffffff81111561350557613504613027565b5b6135118a828b0161306e565b965096505060406135248a828b0161338a565b94505060606135358a828b016134a8565b935050608088013567ffffffffffffffff81111561355657613555613027565b5b6135628a828b0161306e565b925092505092959891949750929550565b5f6040820190506135865f83018561341a565b613593602083018461341a565b9392505050565b5f60ff82169050919050565b6135af8161359a565b82525050565b5f6020820190506135c85f8301846135a6565b92915050565b5f805f604084860312156135e5576135e4613023565b5b5f6135f28682870161304e565b935050602084013567ffffffffffffffff81111561361357613612613027565b5b61361f8682870161306e565b92509250509250925092565b6136348161302b565b82525050565b5f60208201905061364d5f83018461362b565b92915050565b5f61365d82613311565b9050919050565b61366d81613653565b8114613677575f80fd5b50565b5f8135905061368881613664565b92915050565b5f805f805f805f805f60e08a8c0312156136ab576136aa613023565b5b5f6136b88c828d01613357565b99505060206136c98c828d0161304e565b98505060408a013567ffffffffffffffff8111156136ea576136e9613027565b5b6136f68c828d0161306e565b975097505060606137098c828d0161338a565b955050608061371a8c828d0161367a565b94505060a061372b8c828d01613357565b93505060c08a013567ffffffffffffffff81111561374c5761374b613027565b5b6137588c828d0161306e565b92509250509295985092959850929598565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6137a48261327e565b810181811067ffffffffffffffff821117156137c3576137c261376e565b5b80604052505050565b5f6137d561301a565b90506137e1828261379b565b919050565b5f67ffffffffffffffff821115613800576137ff61376e565b5b6138098261327e565b9050602081019050919050565b828183375f83830152505050565b5f613836613831846137e6565b6137cc565b9050828152602081018484840111156138525761385161376a565b5b61385d848285613816565b509392505050565b5f82601f83011261387957613878613062565b5b8135613889848260208601613824565b91505092915050565b5f805f606084860312156138a9576138a8613023565b5b5f6138b68682870161304e565b935050602084013567ffffffffffffffff8111156138d7576138d6613027565b5b6138e386828701613865565b92505060406138f4868287016130ec565b9150509250925092565b5f819050919050565b613910816138fe565b82525050565b5f6020820190506139295f830184613907565b92915050565b5f6020828403121561394457613943613023565b5b5f61395184828501613357565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f61397e8261395a565b6139888185613964565b9350613998818560208601613270565b6139a18161327e565b840191505092915050565b5f6020820190508181035f8301526139c48184613974565b905092915050565b5f80604083850312156139e2576139e1613023565b5b5f6139ef8582860161304e565b9250506020613a008582860161304e565b9150509250929050565b613a1381613330565b82525050565b5f602082019050613a2c5f830184613a0a565b92915050565b5f819050919050565b5f613a55613a50613a4b84613311565b613a32565b613311565b9050919050565b5f613a6682613a3b565b9050919050565b5f613a7782613a5c565b9050919050565b613a8781613a6d565b82525050565b5f602082019050613aa05f830184613a7e565b92915050565b5f805f805f60808688031215613abf57613abe613023565b5b5f613acc8882890161304e565b9550506020613add8882890161304e565b9450506040613aee8882890161338a565b935050606086013567ffffffffffffffff811115613b0f57613b0e613027565b5b613b1b8882890161306e565b92509250509295509295909350565b5f8060408385031215613b4057613b3f613023565b5b5f613b4d85828601613357565b9250506020613b5e85828601613357565b9150509250929050565b5f805f60608486031215613b7f57613b7e613023565b5b5f613b8c8682870161304e565b9350506020613b9d8682870161304e565b9250506040613bae8682870161338a565b9150509250925092565b5f60208284031215613bcd57613bcc613023565b5b5f613bda848285016134a8565b91505092915050565b5f805f8060808587031215613bfb57613bfa613023565b5b5f613c088782880161304e565b9450506020613c198782880161304e565b9350506040613c2a87828801613357565b9250506060613c3b8782880161338a565b91505092959194509250565b7f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c657200005f82015250565b5f613c7b601e83613260565b9150613c8682613c47565b602082019050919050565b5f6020820190508181035f830152613ca881613c6f565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680613cf357607f821691505b602082108103613d0657613d05613caf565b5b50919050565b5f81905092915050565b5f613d218385613d0c565b9350613d2e838584613816565b82840190509392505050565b5f613d46828486613d16565b91508190509392505050565b7f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f5f8201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b5f613dac602683613260565b9150613db782613d52565b604082019050919050565b5f6020820190508181035f830152613dd981613da0565b9050919050565b5f613deb8385613964565b9350613df8838584613816565b613e018361327e565b840190509392505050565b5f606082019050613e1f5f83018761362b565b8181036020830152613e32818587613de0565b9050613e41604083018461341a565b95945050505050565b5f60a082019050613e5d5f83018961362b565b613e6a6020830188613a0a565b8181036040830152613e7c8187613974565b9050613e8b606083018661322e565b8181036080830152613e9e818486613de0565b9050979650505050505050565b5f81519050613eb981613374565b92915050565b5f8060408385031215613ed557613ed4613023565b5b5f613ee285828601613eab565b9250506020613ef385828601613eab565b9150509250929050565b5f604082019050613f105f83018661362b565b8181036020830152613f23818486613de0565b9050949350505050565b7f4e6f6e626c6f636b696e674c7a4170703a2063616c6c6572206d7573742062655f8201527f204c7a4170700000000000000000000000000000000000000000000000000000602082015250565b5f613f87602683613260565b9150613f9282613f2d565b604082019050919050565b5f6020820190508181035f830152613fb481613f7b565b9050919050565b7f4c7a4170703a206e6f20747275737465642070617468207265636f72640000005f82015250565b5f613fef601d83613260565b9150613ffa82613fbb565b602082019050919050565b5f6020820190508181035f83015261401c81613fe3565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61405a8261336b565b91506140658361336b565b925082820390508181111561407d5761407c614023565b5b92915050565b5f8160601b9050919050565b5f61409982614083565b9050919050565b5f6140aa8261408f565b9050919050565b6140c26140bd82613330565b6140a0565b82525050565b5f6140d4828587613d16565b91506140e082846140b1565b601482019150819050949350505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261414d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614112565b6141578683614112565b95508019841693508086168417925050509392505050565b5f61418961418461417f8461336b565b613a32565b61336b565b9050919050565b5f819050919050565b6141a28361416f565b6141b66141ae82614190565b84845461411e565b825550505050565b5f90565b6141ca6141be565b6141d5818484614199565b505050565b5b818110156141f8576141ed5f826141c2565b6001810190506141db565b5050565b601f82111561423d5761420e816140f1565b61421784614103565b81016020851015614226578190505b61423a61423285614103565b8301826141da565b50505b505050565b5f82821c905092915050565b5f61425d5f1984600802614242565b1980831691505092915050565b5f614275838361424e565b9150826002028217905092915050565b61428e8261395a565b67ffffffffffffffff8111156142a7576142a661376e565b5b6142b18254613cdc565b6142bc8282856141fc565b5f60209050601f8311600181146142ed575f84156142db578287015190505b6142e5858261426a565b86555061434c565b601f1984166142fb866140f1565b5f5b82811015614322578489015182556001820191506020850194506020810190506142fd565b8683101561433f578489015161433b601f89168261424e565b8355505b6001600288020188555050505b505050505050565b5f6080820190506143675f83018861362b565b614374602083018761362b565b614381604083018661341a565b8181036060830152614394818486613de0565b90509695505050505050565b7f4e6f6e626c6f636b696e674c7a4170703a206e6f2073746f726564206d6573735f8201527f6167650000000000000000000000000000000000000000000000000000000000602082015250565b5f6143fa602383613260565b9150614405826143a0565b604082019050919050565b5f6020820190508181035f830152614427816143ee565b9050919050565b7f4e6f6e626c6f636b696e674c7a4170703a20696e76616c6964207061796c6f615f8201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b5f614488602183613260565b91506144938261442e565b604082019050919050565b5f6020820190508181035f8301526144b58161447c565b9050919050565b6144c5816130c3565b82525050565b5f6080820190506144de5f83018861362b565b81810360208301526144f1818688613de0565b905061450060408301856144bc565b61450d6060830184613907565b9695505050505050565b5f60608201905061452a5f83018661362b565b614537602083018561362b565b614544604083018461341a565b949350505050565b5f82905092915050565b614560838361454c565b67ffffffffffffffff8111156145795761457861376e565b5b6145838254613cdc565b61458e8282856141fc565b5f601f8311600181146145bb575f84156145a9578287013590505b6145b3858261426a565b86555061461a565b601f1984166145c9866140f1565b5f5b828110156145f0578489013582556001820191506020850194506020810190506145cb565b8683101561460d5784890135614609601f89168261424e565b8355505b6001600288020188555050505b50505050505050565b5f6080820190506146365f83018761362b565b614643602083018661362b565b6146506040830185613a0a565b61465d606083018461341a565b95945050505050565b5f614678614673846137e6565b6137cc565b9050828152602081018484840111156146945761469361376a565b5b61469f848285613270565b509392505050565b5f82601f8301126146bb576146ba613062565b5b81516146cb848260208601614666565b91505092915050565b5f602082840312156146e9576146e8613023565b5b5f82015167ffffffffffffffff81111561470657614705613027565b5b614712848285016146a7565b91505092915050565b5f60808201905061472e5f83018761362b565b81810360208301526147408186613974565b905061474f60408301856144bc565b81810360608301526147618184613974565b905095945050505050565b5f60608201905061477f5f830186613a0a565b61478c602083018561341a565b614799604083018461341a565b949350505050565b5f6060820190506147b45f83018661362b565b81810360208301526147c68185613974565b90506147d5604083018461341a565b949350505050565b5f6040820190508181035f8301526147f58185613974565b9050614804602083018461341a565b9392505050565b7f4f4654436f72653a20756e6b6e6f776e207061636b65742074797065000000005f82015250565b5f61483f601c83613260565b915061484a8261480b565b602082019050919050565b5f6020820190508181035f83015261486c81614833565b9050919050565b5f61487d8261336b565b91506148888361336b565b92508282019050808211156148a05761489f614023565b5b92915050565b7f736c6963655f6f766572666c6f770000000000000000000000000000000000005f82015250565b5f6148da600e83613260565b91506148e5826148a6565b602082019050919050565b5f6020820190508181035f830152614907816148ce565b9050919050565b7f736c6963655f6f75744f66426f756e64730000000000000000000000000000005f82015250565b5f614942601183613260565b915061494d8261490e565b602082019050919050565b5f6020820190508181035f83015261496f81614936565b9050919050565b5f6149808261395a565b61498a8185613d0c565b935061499a818560208601613270565b80840191505092915050565b5f6149b18284614976565b915081905092915050565b5f60a0820190506149cf5f83018861362b565b81810360208301526149e18187613974565b90506149f060408301866144bc565b8181036060830152614a028185613974565b90508181036080830152614a168184613974565b90509695505050505050565b7f4f4654436f72653a205f61646170746572506172616d73206d757374206265205f8201527f656d7074792e0000000000000000000000000000000000000000000000000000602082015250565b5f614a7c602683613260565b9150614a8782614a22565b604082019050919050565b5f6020820190508181035f830152614aa981614a70565b9050919050565b7f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f74205f8201527f61207472757374656420736f7572636500000000000000000000000000000000602082015250565b5f614b0a603083613260565b9150614b1582614ab0565b604082019050919050565b5f6020820190508181035f830152614b3781614afe565b9050919050565b614b4781613653565b82525050565b5f60c082019050614b605f83018961362b565b8181036020830152614b728188613974565b90508181036040830152614b868187613974565b9050614b956060830186614b3e565b614ba26080830185613a0a565b81810360a0830152614bb48184613974565b9050979650505050505050565b5f81519050614bcf81613038565b92915050565b5f805f60608486031215614bec57614beb613023565b5b5f614bf986828701614bc1565b935050602084015167ffffffffffffffff811115614c1a57614c19613027565b5b614c26868287016146a7565b9250506040614c3786828701613eab565b9150509250925092565b7f4c7a4170703a206d696e4761734c696d6974206e6f74207365740000000000005f82015250565b5f614c75601a83613260565b9150614c8082614c41565b602082019050919050565b5f6020820190508181035f830152614ca281614c69565b9050919050565b7f4c7a4170703a20676173206c696d697420697320746f6f206c6f7700000000005f82015250565b5f614cdd601b83613260565b9150614ce882614ca9565b602082019050919050565b5f6020820190508181035f830152614d0a81614cd1565b9050919050565b7f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267655f82015250565b5f614d45602083613260565b9150614d5082614d11565b602082019050919050565b5f6020820190508181035f830152614d7281614d39565b9050919050565b7f746f416464726573735f6f75744f66426f756e647300000000000000000000005f82015250565b5f614dad601583613260565b9150614db882614d79565b602082019050919050565b5f6020820190508181035f830152614dda81614da1565b9050919050565b7f4c7a4170703a20696e76616c69642061646170746572506172616d73000000005f82015250565b5f614e15601c83613260565b9150614e2082614de1565b602082019050919050565b5f6020820190508181035f830152614e4281614e09565b905091905056fea2646970667358221220cadcc41bc35985b6a1824e85aa28b938d04c555a04c58094c15eb2fecf26b1da64736f6c63430008190033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007dddad13e81e41905ea49ce66474d930caa24aec000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd70000000000000000000000000000000000000000000000000000000000000007486f72697a656e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035a454e0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : initialOwner (address): 0x7dDDAd13e81e41905eA49ce66474D930caa24Aec
Arg [1] : _name (string): Horizen
Arg [2] : _symbol (string): ZEN
Arg [3] : _lzEndpoint (address): 0xb6319cC6c8c27A8F5dAF0dD3DF91EA35C4720dd7
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000007dddad13e81e41905ea49ce66474d930caa24aec
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [5] : 486f72697a656e00000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 5a454e0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
78820:1306:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58441:842;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79081:255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13005:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62065:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15298:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63968:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62196:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14107:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16098:249;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75211:479;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;13958:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64208:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57983:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62333:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74763:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74829:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75698:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70806:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72129:389;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14269:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28519:103;;;;;;;;;;;;;:::i;:::-;;57853:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57911:65;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27844:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79455:112;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58043:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13215:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63162:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62873:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14592:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57800:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63500:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57736:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61810:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72747:810;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14837:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63644:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76110:223;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62658:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74872:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28777:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61494:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79344:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58441:842;58724:10;58700:35;;:12;:10;:12::i;:::-;:35;;;58692:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;58783:26;58812:19;:32;58832:11;58812:32;;;;;;;;;;;;;;;58783:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59032:13;:20;59010:11;;:18;;:42;:70;;;;;59079:1;59056:13;:20;:24;59010:70;:124;;;;;59120:13;59110:24;;;;;;59094:11;;59084:22;;;;;;;:::i;:::-;;;;;;;;:50;59010:124;58988:212;;;;;;;;;;;;:::i;:::-;;;;;;;;;59213:62;59232:11;59245;;59213:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59258:6;59266:8;;59213:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:62::i;:::-;58615:668;58441:842;;;;;;:::o;79081:255::-;79184:4;79223:22;79208:37;;;:11;:37;;;;:80;;;;79264:24;79249:39;;;:11;:39;;;;79208:80;:120;;;;79292:36;79316:11;79292:23;:36::i;:::-;79208:120;79201:127;;79081:255;;;:::o;13005:91::-;13050:13;13083:5;13076:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13005:91;:::o;62065:123::-;27730:13;:11;:13::i;:::-;62145:10:::1;:25;;;62171:8;62145:35;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;62065:123:::0;:::o;15298:190::-;15371:4;15388:13;15404:12;:10;:12::i;:::-;15388:28;;15427:31;15436:5;15443:7;15452:5;15427:8;:31::i;:::-;15476:4;15469:11;;;15298:190;;;;:::o;63968:142::-;27730:13;:11;:13::i;:::-;64097:5:::1;64059:22;:35;64082:11;64059:35;;;;;;;;;;;;;;;:43;;;;63968:142:::0;;:::o;62196:129::-;27730:13;:11;:13::i;:::-;62279:10:::1;:28;;;62308:8;62279:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;62196:129:::0;:::o;14107:99::-;14159:7;14186:12;;14179:19;;14107:99;:::o;16098:249::-;16185:4;16202:15;16220:12;:10;:12::i;:::-;16202:30;;16243:37;16259:4;16265:7;16274:5;16243:15;:37::i;:::-;16291:26;16301:4;16307:2;16311:5;16291:9;:26::i;:::-;16335:4;16328:11;;;16098:249;;;;;:::o;75211:479::-;75432:14;75448:11;75516:20;74862:1;75559:10;;75571:7;75539:40;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;75516:63;;75597:10;:23;;;75621:11;75642:4;75649:7;75658;75667:14;;75597:85;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75590:92;;;;;75211:479;;;;;;;;;;:::o;13958:84::-;14007:5;14032:2;14025:9;;13958:84;:::o;64208:250::-;64304:4;64321:26;64350:19;:32;64370:11;64350:32;;;;;;;;;;;;;;;64321:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64438:11;;64428:22;;;;;;;:::i;:::-;;;;;;;;64410:13;64400:24;;;;;;:50;64393:57;;;64208:250;;;;;:::o;57983:53::-;;;;;;;;;;;;;;;;;:::o;62333:178::-;27730:13;:11;:13::i;:::-;62448:10:::1;:29;;;62478:11;62491;;62448:55;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;62333:178:::0;;;:::o;74763:37::-;74799:1;74763:37;:::o;74829:34::-;74862:1;74829:34;:::o;75698:404::-;75996:98;76002:5;76009:11;76022:10;;75996:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76034:7;76043:14;76059:18;76079:14;;75996:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:98::i;:::-;75698:404;;;;;;;;;:::o;70806:85::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72129:389::-;72386:4;72362:29;;:12;:10;:12::i;:::-;:29;;;72354:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;72445:65;72467:11;72480;;72445:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72493:6;72501:8;;72445:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:65::i;:::-;72129:389;;;;;;:::o;14269:118::-;14334:7;14361:9;:18;14371:7;14361:18;;;;;;;;;;;;;;;;14354:25;;14269:118;;;:::o;28519:103::-;27730:13;:11;:13::i;:::-;28584:30:::1;28611:1;28584:18;:30::i;:::-;28519:103::o:0;57853:51::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57911:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27844:87::-;27890:7;27917:6;;;;;;;;;;;27910:13;;27844:87;:::o;79455:112::-;79522:4;79546:13;:11;:13::i;:::-;79539:20;;79455:112;:::o;58043:23::-;;;;;;;;;;;;;:::o;13215:95::-;13262:13;13295:7;13288:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13215:95;:::o;63162:330::-;63241:12;63266:17;63286:19;:35;63306:14;63286:35;;;;;;;;;;;;;;;63266:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63355:1;63340:4;:11;:16;63332:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63408:31;63419:1;63436:2;63422:4;:11;:16;;;;:::i;:::-;63408:4;:10;;:31;;;;;:::i;:::-;63401:38;;;63162:330;;;:::o;62873:281::-;27730:13;:11;:13::i;:::-;63045:14:::1;;63069:4;63028:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62990:19;:35;63010:14;62990:35;;;;;;;;;;;;;;;:85;;;;;;:::i;:::-;;63091:55;63115:14;63131;;63091:55;;;;;;;;:::i;:::-;;;;;;;;62873:281:::0;;;:::o;14592:182::-;14661:4;14678:13;14694:12;:10;:12::i;:::-;14678:28;;14717:27;14727:5;14734:2;14738:5;14717:9;:27::i;:::-;14762:4;14755:11;;;14592:182;;;;:::o;57800:46::-;;;:::o;63500:136::-;27730:13;:11;:13::i;:::-;63581:9:::1;63570:8;;:20;;;;;;;;;;;;;;;;;;63606:22;63618:9;63606:22;;;;;;:::i;:::-;;;;;;;;63500:136:::0;:::o;57736:55::-;57786:5;57736:55;:::o;61810:247::-;27730:13;:11;:13::i;:::-;61987:10:::1;:20;;;62008:8;62018;62028:11;62041:7;;61987:62;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;61810:247:::0;;;;;:::o;72747:810::-;72979:19;73001:14;:27;73016:11;73001:27;;;;;;;;;;;;;;;73029:11;;73001:40;;;;;;;:::i;:::-;;;;;;;;;;;;;:48;73042:6;73001:48;;;;;;;;;;;;;;;;72979:70;;73091:1;73083:10;;73068:11;:25;73060:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;73175:11;73162:8;;73152:19;;;;;;;:::i;:::-;;;;;;;;:34;73144:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;73331:1;73323:10;;73272:14;:27;73287:11;73272:27;;;;;;;;;;;;;;;73300:11;;73272:40;;;;;;;:::i;:::-;;;;;;;;;;;;;:48;73313:6;73272:48;;;;;;;;;;;;;;;:61;;;;73402:65;73424:11;73437;;73402:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73450:6;73458:8;;73402:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:65::i;:::-;73483:66;73503:11;73516;;73529:6;73537:11;73483:66;;;;;;;;;;:::i;:::-;;;;;;;;72923:634;72747:810;;;;;;:::o;14837:142::-;14917:7;14944:11;:18;14956:5;14944:18;;;;;;;;;;;;;;;:27;14963:7;14944:27;;;;;;;;;;;;;;;;14937:34;;14837:142;;;;:::o;63644:262::-;27730:13;:11;:13::i;:::-;63828:7:::1;63784:15;:28;63800:11;63784:28;;;;;;;;;;;;;;;:41;63813:11;63784:41;;;;;;;;;;;;;;;:51;;;;63851:47;63864:11;63877;63890:7;63851:47;;;;;;;;:::i;:::-;;;;;;;;63644:262:::0;;;:::o;76110:223::-;27730:13;:11;:13::i;:::-;76236:23:::1;76211:22;;:48;;;;;;;;;;;;;;;;;;76275:50;76301:23;76275:50;;;;;;:::i;:::-;;;;;;;;76110:223:::0;:::o;62658:207::-;27730:13;:11;:13::i;:::-;62797:5:::1;;62759:19;:35;62779:14;62759:35;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;62818:39;62835:14;62851:5;;62818:39;;;;;;;;:::i;:::-;;;;;;;;62658:207:::0;;;:::o;74872:34::-;;;;;;;;;;;;;:::o;28777:220::-;27730:13;:11;:13::i;:::-;28882:1:::1;28862:22;;:8;:22;;::::0;28858:93:::1;;28936:1;28908:31;;;;;;;;;;;:::i;:::-;;;;;;;;28858:93;28961:28;28980:8;28961:18;:28::i;:::-;28777:220:::0;:::o;61494:254::-;61640:12;61672:10;:20;;;61693:8;61703;61721:4;61728:11;61672:68;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61665:75;;61494:254;;;;;;:::o;79344:103::-;79399:7;79434:4;79419:20;;79344:103;:::o;4304:98::-;4357:7;4384:10;4377:17;;4304:98;:::o;71175:563::-;71368:12;71382:19;71405:203;71453:9;71477:3;71518:34;;;71554:11;71567;71580:6;71588:8;71495:102;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71413:4;71405:33;;;;:203;;;;;;:::i;:::-;71367:241;;;;71624:7;71619:112;;71648:71;71668:11;71681;71694:6;71702:8;71712:6;71648:19;:71::i;:::-;71619:112;71356:382;;71175:563;;;;:::o;74988:215::-;75090:4;75129:26;75114:41;;;:11;:41;;;;:81;;;;75159:36;75183:11;75159:23;:36::i;:::-;75114:81;75107:88;;74988:215;;;:::o;28009:166::-;28080:12;:10;:12::i;:::-;28069:23;;:7;:5;:7::i;:::-;:23;;;28065:103;;28143:12;:10;:12::i;:::-;28116:40;;;;;;;;;;;:::i;:::-;;;;;;;;28065:103;28009:166::o;20157:130::-;20242:37;20251:5;20258:7;20267:5;20274:4;20242:8;:37::i;:::-;20157:130;;;:::o;21889:487::-;21989:24;22016:25;22026:5;22033:7;22016:9;:25::i;:::-;21989:52;;22076:17;22056:16;:37;22052:317;;22133:5;22114:16;:24;22110:132;;;22193:7;22202:16;22220:5;22166:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;22110:132;22285:57;22294:5;22301:7;22329:5;22310:16;:24;22336:5;22285:8;:57::i;:::-;22052:317;21978:398;21889:487;;;:::o;16732:308::-;16832:1;16816:18;;:4;:18;;;16812:88;;16885:1;16858:30;;;;;;;;;;;:::i;:::-;;;;;;;;16812:88;16928:1;16914:16;;:2;:16;;;16910:88;;16983:1;16954:32;;;;;;;;;;;:::i;:::-;;;;;;;;16910:88;17008:24;17016:4;17022:2;17026:5;17008:7;:24::i;:::-;16732:308;;;:::o;76841:684::-;77117:71;77137:11;74862:1;77159:14;74799:1;77117:19;:71::i;:::-;77201:11;77215:51;77226:5;77233:11;77246:10;77258:7;77215:10;:51::i;:::-;77201:65;;77279:22;74862:1;77324:10;77336:6;77304:39;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77279:64;;77354:94;77362:11;77375:9;77386:14;77402:18;77422:14;77438:9;77354:7;:94::i;:::-;77491:5;77466:51;;77478:11;77466:51;;;77498:10;77510:6;77466:51;;;;;;;:::i;:::-;;;;;;;;77106:419;;76841:684;;;;;;;:::o;76341:492::-;76536:17;76622:2;76612:8;76608:17;76602:24;76588:38;;74862:1;76653:21;;:10;:21;;;76649:177;;76691:52;76700:11;76713;76726:6;76734:8;76691;:52::i;:::-;76649:177;;;76776:38;;;;;;;;;;:::i;:::-;;;;;;;;76649:177;76525:308;76341:492;;;;:::o;29157:191::-;29231:16;29250:6;;;;;;;;;;;29231:25;;29276:8;29267:6;;:17;;;;;;;;;;;;;;;;;;29331:8;29300:40;;29321:8;29300:40;;;;;;;;;;;;29220:128;29157:191;:::o;47297:2833::-;47417:12;47466:7;47460:2;47450:7;:12;;;;:::i;:::-;:23;;47442:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;47537:7;47528:6;:16;;;;:::i;:::-;47511:6;:13;:33;;47503:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;47579:22;47652:7;47645:15;47679:1;47674:2005;;;;49823:4;49817:11;49804:24;;50012:1;50001:9;49994:20;50062:4;50051:9;50047:20;50041:4;50034:34;47638:2445;;47674:2005;47859:4;47853:11;47840:24;;48528:2;48519:7;48515:16;48916:9;48909:17;48903:4;48899:28;48887:9;48876;48872:25;48868:60;48965:7;48961:2;48957:16;49222:6;49208:9;49201:17;49195:4;49191:28;49179:9;49171:6;49167:22;49163:57;49159:70;48993:434;49256:3;49252:2;49249:11;48993:434;;;49404:2;49398:9;49394:2;49387:21;49298:4;49294:2;49290:13;49284:19;;49339:4;49335:2;49331:13;49325:19;;48993:434;;;48997:251;49465:7;49454:9;49447:26;49659:2;49655:7;49650:2;49646;49642:11;49638:25;49632:4;49625:39;47681:1998;;;47638:2445;;50113:9;50106:16;;;47297:2833;;;;;:::o;65682:1309::-;65841:4;65847:12;65909;65932:13;65956:24;65993:8;65983:19;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65956:46;;66512:1;66482;66444:9;66438:16;66405:4;66394:9;66390:20;66355:1;66316:7;66286:4;66263:275;66251:287;;66607:16;66596:27;;66652:8;66643:7;66640:21;66637:78;;;66692:8;66681:19;;66637:78;66802:7;66789:11;66782:28;66924:7;66921:1;66914:4;66901:11;66897:22;66882:50;66961:8;66971:11;66953:30;;;;;;;65682:1309;;;;;;;:::o;71746:375::-;72022:8;72012:19;;;;;;71961:14;:27;71976:11;71961:27;;;;;;;;;;;;;;;71989:11;71961:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;72002:6;71961:48;;;;;;;;;;;;;;;:70;;;;72047:66;72061:11;72074;72087:6;72095:8;72105:7;72047:66;;;;;;;;;;:::i;:::-;;;;;;;;71746:375;;;;;:::o;74346:148::-;74422:4;74461:25;74446:40;;;:11;:40;;;;74439:47;;74346:148;;;:::o;21154:443::-;21284:1;21267:19;;:5;:19;;;21263:91;;21339:1;21310:32;;;;;;;;;;;:::i;:::-;;;;;;;;21263:91;21387:1;21368:21;;:7;:21;;;21364:92;;21441:1;21413:31;;;;;;;;;;;:::i;:::-;;;;;;;;21364:92;21496:5;21466:11;:18;21478:5;21466:18;;;;;;;;;;;;;;;:27;21485:7;21466:27;;;;;;;;;;;;;;;:35;;;;21516:9;21512:78;;;21563:7;21547:31;;21556:5;21547:31;;;21572:5;21547:31;;;;;;:::i;:::-;;;;;;;;21512:78;21154:443;;;;:::o;17364:1135::-;17470:1;17454:18;;:4;:18;;;17450:552;;17608:5;17592:12;;:21;;;;;;;:::i;:::-;;;;;;;;17450:552;;;17646:19;17668:9;:15;17678:4;17668:15;;;;;;;;;;;;;;;;17646:37;;17716:5;17702:11;:19;17698:117;;;17774:4;17780:11;17793:5;17749:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;17698:117;17970:5;17956:11;:19;17938:9;:15;17948:4;17938:15;;;;;;;;;;;;;;;:37;;;;17631:371;17450:552;18032:1;18018:16;;:2;:16;;;18014:435;;18200:5;18184:12;;:21;;;;;;;;;;;18014:435;;;18417:5;18400:9;:13;18410:2;18400:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;18014:435;18481:2;18466:25;;18475:4;18466:25;;;18485:5;18466:25;;;;;;:::i;:::-;;;;;;;;17364:1135;;;:::o;77959:416::-;78144:22;;;;;;;;;;;78140:228;;;78183:63;78198:11;78211:7;78220:14;78236:9;78183:14;:63::i;:::-;78140:228;;;78312:1;78287:14;:21;:26;78279:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;78140:228;77959:416;;;;:::o;79575:334::-;79724:4;79741:15;79759:12;:10;:12::i;:::-;79741:30;;79795:7;79786:16;;:5;:16;;;79782:62;;79804:40;79820:5;79827:7;79836;79804:15;:40::i;:::-;79782:62;79855:21;79861:5;79868:7;79855:5;:21::i;:::-;79894:7;79887:14;;;79575:334;;;;;;:::o;59615:614::-;59870:26;59899:19;:32;59919:11;59899:32;;;;;;;;;;;;;;;59870:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59974:1;59950:13;:20;:25;59942:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;60039:47;60057:11;60070:8;:15;60039:17;:47::i;:::-;60097:10;:15;;;60120:10;60132:11;60145:13;60160:8;60170:14;60186:18;60206:14;60097:124;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59859:370;59615:614;;;;;;:::o;77533:418::-;77690:27;77719:11;77745:8;77734:43;;;;;;;;;;;;:::i;:::-;77687:90;;;;;77790:10;77803:27;77828:1;77803:14;:24;;:27;;;;:::i;:::-;77790:40;;77852:34;77862:11;77875:2;77879:6;77852:9;:34::i;:::-;77843:43;;77932:2;77902:41;;77919:11;77902:41;;;77936:6;77902:41;;;;;;:::i;:::-;;;;;;;;77676:275;;;77533:418;;;;:::o;60237:463::-;60416:21;60440:28;60453:14;60440:12;:28::i;:::-;60416:52;;60479:16;60498:15;:28;60514:11;60498:28;;;;;;;;;;;;;;;:35;60527:5;60498:35;;;;;;;;;;;;;;;;60479:54;;60566:1;60552:11;:15;60544:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;60651:9;60637:11;:23;;;;:::i;:::-;60617:16;:43;;60609:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;60405:295;;60237:463;;;;:::o;19393:211::-;19483:1;19464:21;;:7;:21;;;19460:91;;19536:1;19509:30;;;;;;;;;;;:::i;:::-;;;;;;;;19460:91;19561:35;19569:7;19586:1;19590:5;19561:7;:35::i;:::-;19393:211;;:::o;60987:402::-;61086:21;61110:22;:35;61133:11;61110:35;;;;;;;;;;;;;;;;61086:59;;61180:1;61160:16;:21;61156:138;;57786:5;61237:45;;61156:138;61328:16;61312:12;:32;;61304:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;61075:314;60987:402;;:::o;50138:360::-;50214:7;50268:2;50259:6;:11;;;;:::i;:::-;50242:6;:13;:28;;50234:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50307:19;50421:27;50411:6;50404:4;50396:6;50392:17;50388:30;50382:37;50378:71;50363:86;;50479:11;50472:18;;;50138:360;;;;:::o;79917:206::-;80047:4;80064:26;80070:10;80082:7;80064:5;:26::i;:::-;80108:7;80101:14;;79917:206;;;;;:::o;60708:271::-;60790:13;60849:2;60824:14;:21;:27;;60816:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60957:2;60941:14;60937:23;60931:30;60919:42;;60708:271;;;:::o;18852:213::-;18942:1;18923:21;;:7;:21;;;18919:93;;18997:1;18968:32;;;;;;;;;;;:::i;:::-;;;;;;;;18919:93;19022:35;19038:1;19042:7;19051:5;19022:7;:35::i;:::-;18852:213;;:::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:99::-;4413:6;4447:5;4441:12;4431:22;;4361:99;;;:::o;4466:169::-;4550:11;4584:6;4579:3;4572:19;4624:4;4619:3;4615:14;4600:29;;4466:169;;;;:::o;4641:139::-;4730:6;4725:3;4720;4714:23;4771:1;4762:6;4757:3;4753:16;4746:27;4641:139;;;:::o;4786:102::-;4827:6;4878:2;4874:7;4869:2;4862:5;4858:14;4854:28;4844:38;;4786:102;;;:::o;4894:377::-;4982:3;5010:39;5043:5;5010:39;:::i;:::-;5065:71;5129:6;5124:3;5065:71;:::i;:::-;5058:78;;5145:65;5203:6;5198:3;5191:4;5184:5;5180:16;5145:65;:::i;:::-;5235:29;5257:6;5235:29;:::i;:::-;5230:3;5226:39;5219:46;;4986:285;4894:377;;;;:::o;5277:313::-;5390:4;5428:2;5417:9;5413:18;5405:26;;5477:9;5471:4;5467:20;5463:1;5452:9;5448:17;5441:47;5505:78;5578:4;5569:6;5505:78;:::i;:::-;5497:86;;5277:313;;;;:::o;5596:327::-;5654:6;5703:2;5691:9;5682:7;5678:23;5674:32;5671:119;;;5709:79;;:::i;:::-;5671:119;5829:1;5854:52;5898:7;5889:6;5878:9;5874:22;5854:52;:::i;:::-;5844:62;;5800:116;5596:327;;;;:::o;5929:126::-;5966:7;6006:42;5999:5;5995:54;5984:65;;5929:126;;;:::o;6061:96::-;6098:7;6127:24;6145:5;6127:24;:::i;:::-;6116:35;;6061:96;;;:::o;6163:122::-;6236:24;6254:5;6236:24;:::i;:::-;6229:5;6226:35;6216:63;;6275:1;6272;6265:12;6216:63;6163:122;:::o;6291:139::-;6337:5;6375:6;6362:20;6353:29;;6391:33;6418:5;6391:33;:::i;:::-;6291:139;;;;:::o;6436:77::-;6473:7;6502:5;6491:16;;6436:77;;;:::o;6519:122::-;6592:24;6610:5;6592:24;:::i;:::-;6585:5;6582:35;6572:63;;6631:1;6628;6621:12;6572:63;6519:122;:::o;6647:139::-;6693:5;6731:6;6718:20;6709:29;;6747:33;6774:5;6747:33;:::i;:::-;6647:139;;;;:::o;6792:474::-;6860:6;6868;6917:2;6905:9;6896:7;6892:23;6888:32;6885:119;;;6923:79;;:::i;:::-;6885:119;7043:1;7068:53;7113:7;7104:6;7093:9;7089:22;7068:53;:::i;:::-;7058:63;;7014:117;7170:2;7196:53;7241:7;7232:6;7221:9;7217:22;7196:53;:::i;:::-;7186:63;;7141:118;6792:474;;;;;:::o;7272:472::-;7339:6;7347;7396:2;7384:9;7375:7;7371:23;7367:32;7364:119;;;7402:79;;:::i;:::-;7364:119;7522:1;7547:52;7591:7;7582:6;7571:9;7567:22;7547:52;:::i;:::-;7537:62;;7493:116;7648:2;7674:53;7719:7;7710:6;7699:9;7695:22;7674:53;:::i;:::-;7664:63;;7619:118;7272:472;;;;;:::o;7750:118::-;7837:24;7855:5;7837:24;:::i;:::-;7832:3;7825:37;7750:118;;:::o;7874:222::-;7967:4;8005:2;7994:9;7990:18;7982:26;;8018:71;8086:1;8075:9;8071:17;8062:6;8018:71;:::i;:::-;7874:222;;;;:::o;8102:619::-;8179:6;8187;8195;8244:2;8232:9;8223:7;8219:23;8215:32;8212:119;;;8250:79;;:::i;:::-;8212:119;8370:1;8395:53;8440:7;8431:6;8420:9;8416:22;8395:53;:::i;:::-;8385:63;;8341:117;8497:2;8523:53;8568:7;8559:6;8548:9;8544:22;8523:53;:::i;:::-;8513:63;;8468:118;8625:2;8651:53;8696:7;8687:6;8676:9;8672:22;8651:53;:::i;:::-;8641:63;;8596:118;8102:619;;;;;:::o;8727:116::-;8797:21;8812:5;8797:21;:::i;:::-;8790:5;8787:32;8777:60;;8833:1;8830;8823:12;8777:60;8727:116;:::o;8849:133::-;8892:5;8930:6;8917:20;8908:29;;8946:30;8970:5;8946:30;:::i;:::-;8849:133;;;;:::o;8988:1299::-;9101:6;9109;9117;9125;9133;9141;9149;9198:3;9186:9;9177:7;9173:23;9169:33;9166:120;;;9205:79;;:::i;:::-;9166:120;9325:1;9350:52;9394:7;9385:6;9374:9;9370:22;9350:52;:::i;:::-;9340:62;;9296:116;9479:2;9468:9;9464:18;9451:32;9510:18;9502:6;9499:30;9496:117;;;9532:79;;:::i;:::-;9496:117;9645:64;9701:7;9692:6;9681:9;9677:22;9645:64;:::i;:::-;9627:82;;;;9422:297;9758:2;9784:53;9829:7;9820:6;9809:9;9805:22;9784:53;:::i;:::-;9774:63;;9729:118;9886:2;9912:50;9954:7;9945:6;9934:9;9930:22;9912:50;:::i;:::-;9902:60;;9857:115;10039:3;10028:9;10024:19;10011:33;10071:18;10063:6;10060:30;10057:117;;;10093:79;;:::i;:::-;10057:117;10206:64;10262:7;10253:6;10242:9;10238:22;10206:64;:::i;:::-;10188:82;;;;9982:298;8988:1299;;;;;;;;;;:::o;10293:332::-;10414:4;10452:2;10441:9;10437:18;10429:26;;10465:71;10533:1;10522:9;10518:17;10509:6;10465:71;:::i;:::-;10546:72;10614:2;10603:9;10599:18;10590:6;10546:72;:::i;:::-;10293:332;;;;;:::o;10631:86::-;10666:7;10706:4;10699:5;10695:16;10684:27;;10631:86;;;:::o;10723:112::-;10806:22;10822:5;10806:22;:::i;:::-;10801:3;10794:35;10723:112;;:::o;10841:214::-;10930:4;10968:2;10957:9;10953:18;10945:26;;10981:67;11045:1;11034:9;11030:17;11021:6;10981:67;:::i;:::-;10841:214;;;;:::o;11061:670::-;11139:6;11147;11155;11204:2;11192:9;11183:7;11179:23;11175:32;11172:119;;;11210:79;;:::i;:::-;11172:119;11330:1;11355:52;11399:7;11390:6;11379:9;11375:22;11355:52;:::i;:::-;11345:62;;11301:116;11484:2;11473:9;11469:18;11456:32;11515:18;11507:6;11504:30;11501:117;;;11537:79;;:::i;:::-;11501:117;11650:64;11706:7;11697:6;11686:9;11682:22;11650:64;:::i;:::-;11632:82;;;;11427:297;11061:670;;;;;:::o;11737:115::-;11822:23;11839:5;11822:23;:::i;:::-;11817:3;11810:36;11737:115;;:::o;11858:218::-;11949:4;11987:2;11976:9;11972:18;11964:26;;12000:69;12066:1;12055:9;12051:17;12042:6;12000:69;:::i;:::-;11858:218;;;;:::o;12082:104::-;12127:7;12156:24;12174:5;12156:24;:::i;:::-;12145:35;;12082:104;;;:::o;12192:138::-;12273:32;12299:5;12273:32;:::i;:::-;12266:5;12263:43;12253:71;;12320:1;12317;12310:12;12253:71;12192:138;:::o;12336:155::-;12390:5;12428:6;12415:20;12406:29;;12444:41;12479:5;12444:41;:::i;:::-;12336:155;;;;:::o;12497:1613::-;12639:6;12647;12655;12663;12671;12679;12687;12695;12703;12752:3;12740:9;12731:7;12727:23;12723:33;12720:120;;;12759:79;;:::i;:::-;12720:120;12879:1;12904:53;12949:7;12940:6;12929:9;12925:22;12904:53;:::i;:::-;12894:63;;12850:117;13006:2;13032:52;13076:7;13067:6;13056:9;13052:22;13032:52;:::i;:::-;13022:62;;12977:117;13161:2;13150:9;13146:18;13133:32;13192:18;13184:6;13181:30;13178:117;;;13214:79;;:::i;:::-;13178:117;13327:64;13383:7;13374:6;13363:9;13359:22;13327:64;:::i;:::-;13309:82;;;;13104:297;13440:2;13466:53;13511:7;13502:6;13491:9;13487:22;13466:53;:::i;:::-;13456:63;;13411:118;13568:3;13595:61;13648:7;13639:6;13628:9;13624:22;13595:61;:::i;:::-;13585:71;;13539:127;13705:3;13732:53;13777:7;13768:6;13757:9;13753:22;13732:53;:::i;:::-;13722:63;;13676:119;13862:3;13851:9;13847:19;13834:33;13894:18;13886:6;13883:30;13880:117;;;13916:79;;:::i;:::-;13880:117;14029:64;14085:7;14076:6;14065:9;14061:22;14029:64;:::i;:::-;14011:82;;;;13805:298;12497:1613;;;;;;;;;;;:::o;14116:117::-;14225:1;14222;14215:12;14239:180;14287:77;14284:1;14277:88;14384:4;14381:1;14374:15;14408:4;14405:1;14398:15;14425:281;14508:27;14530:4;14508:27;:::i;:::-;14500:6;14496:40;14638:6;14626:10;14623:22;14602:18;14590:10;14587:34;14584:62;14581:88;;;14649:18;;:::i;:::-;14581:88;14689:10;14685:2;14678:22;14468:238;14425:281;;:::o;14712:129::-;14746:6;14773:20;;:::i;:::-;14763:30;;14802:33;14830:4;14822:6;14802:33;:::i;:::-;14712:129;;;:::o;14847:307::-;14908:4;14998:18;14990:6;14987:30;14984:56;;;15020:18;;:::i;:::-;14984:56;15058:29;15080:6;15058:29;:::i;:::-;15050:37;;15142:4;15136;15132:15;15124:23;;14847:307;;;:::o;15160:148::-;15258:6;15253:3;15248;15235:30;15299:1;15290:6;15285:3;15281:16;15274:27;15160:148;;;:::o;15314:423::-;15391:5;15416:65;15432:48;15473:6;15432:48;:::i;:::-;15416:65;:::i;:::-;15407:74;;15504:6;15497:5;15490:21;15542:4;15535:5;15531:16;15580:3;15571:6;15566:3;15562:16;15559:25;15556:112;;;15587:79;;:::i;:::-;15556:112;15677:54;15724:6;15719:3;15714;15677:54;:::i;:::-;15397:340;15314:423;;;;;:::o;15756:338::-;15811:5;15860:3;15853:4;15845:6;15841:17;15837:27;15827:122;;15868:79;;:::i;:::-;15827:122;15985:6;15972:20;16010:78;16084:3;16076:6;16069:4;16061:6;16057:17;16010:78;:::i;:::-;16001:87;;15817:277;15756:338;;;;:::o;16100:793::-;16184:6;16192;16200;16249:2;16237:9;16228:7;16224:23;16220:32;16217:119;;;16255:79;;:::i;:::-;16217:119;16375:1;16400:52;16444:7;16435:6;16424:9;16420:22;16400:52;:::i;:::-;16390:62;;16346:116;16529:2;16518:9;16514:18;16501:32;16560:18;16552:6;16549:30;16546:117;;;16582:79;;:::i;:::-;16546:117;16687:62;16741:7;16732:6;16721:9;16717:22;16687:62;:::i;:::-;16677:72;;16472:287;16798:2;16824:52;16868:7;16859:6;16848:9;16844:22;16824:52;:::i;:::-;16814:62;;16769:117;16100:793;;;;;:::o;16899:77::-;16936:7;16965:5;16954:16;;16899:77;;;:::o;16982:118::-;17069:24;17087:5;17069:24;:::i;:::-;17064:3;17057:37;16982:118;;:::o;17106:222::-;17199:4;17237:2;17226:9;17222:18;17214:26;;17250:71;17318:1;17307:9;17303:17;17294:6;17250:71;:::i;:::-;17106:222;;;;:::o;17334:329::-;17393:6;17442:2;17430:9;17421:7;17417:23;17413:32;17410:119;;;17448:79;;:::i;:::-;17410:119;17568:1;17593:53;17638:7;17629:6;17618:9;17614:22;17593:53;:::i;:::-;17583:63;;17539:117;17334:329;;;;:::o;17669:98::-;17720:6;17754:5;17748:12;17738:22;;17669:98;;;:::o;17773:168::-;17856:11;17890:6;17885:3;17878:19;17930:4;17925:3;17921:14;17906:29;;17773:168;;;;:::o;17947:373::-;18033:3;18061:38;18093:5;18061:38;:::i;:::-;18115:70;18178:6;18173:3;18115:70;:::i;:::-;18108:77;;18194:65;18252:6;18247:3;18240:4;18233:5;18229:16;18194:65;:::i;:::-;18284:29;18306:6;18284:29;:::i;:::-;18279:3;18275:39;18268:46;;18037:283;17947:373;;;;:::o;18326:309::-;18437:4;18475:2;18464:9;18460:18;18452:26;;18524:9;18518:4;18514:20;18510:1;18499:9;18495:17;18488:47;18552:76;18623:4;18614:6;18552:76;:::i;:::-;18544:84;;18326:309;;;;:::o;18641:470::-;18707:6;18715;18764:2;18752:9;18743:7;18739:23;18735:32;18732:119;;;18770:79;;:::i;:::-;18732:119;18890:1;18915:52;18959:7;18950:6;18939:9;18935:22;18915:52;:::i;:::-;18905:62;;18861:116;19016:2;19042:52;19086:7;19077:6;19066:9;19062:22;19042:52;:::i;:::-;19032:62;;18987:117;18641:470;;;;;:::o;19117:118::-;19204:24;19222:5;19204:24;:::i;:::-;19199:3;19192:37;19117:118;;:::o;19241:222::-;19334:4;19372:2;19361:9;19357:18;19349:26;;19385:71;19453:1;19442:9;19438:17;19429:6;19385:71;:::i;:::-;19241:222;;;;:::o;19469:60::-;19497:3;19518:5;19511:12;;19469:60;;;:::o;19535:142::-;19585:9;19618:53;19636:34;19645:24;19663:5;19645:24;:::i;:::-;19636:34;:::i;:::-;19618:53;:::i;:::-;19605:66;;19535:142;;;:::o;19683:126::-;19733:9;19766:37;19797:5;19766:37;:::i;:::-;19753:50;;19683:126;;;:::o;19815:153::-;19892:9;19925:37;19956:5;19925:37;:::i;:::-;19912:50;;19815:153;;;:::o;19974:185::-;20088:64;20146:5;20088:64;:::i;:::-;20083:3;20076:77;19974:185;;:::o;20165:276::-;20285:4;20323:2;20312:9;20308:18;20300:26;;20336:98;20431:1;20420:9;20416:17;20407:6;20336:98;:::i;:::-;20165:276;;;;:::o;20447:959::-;20542:6;20550;20558;20566;20574;20623:3;20611:9;20602:7;20598:23;20594:33;20591:120;;;20630:79;;:::i;:::-;20591:120;20750:1;20775:52;20819:7;20810:6;20799:9;20795:22;20775:52;:::i;:::-;20765:62;;20721:116;20876:2;20902:52;20946:7;20937:6;20926:9;20922:22;20902:52;:::i;:::-;20892:62;;20847:117;21003:2;21029:53;21074:7;21065:6;21054:9;21050:22;21029:53;:::i;:::-;21019:63;;20974:118;21159:2;21148:9;21144:18;21131:32;21190:18;21182:6;21179:30;21176:117;;;21212:79;;:::i;:::-;21176:117;21325:64;21381:7;21372:6;21361:9;21357:22;21325:64;:::i;:::-;21307:82;;;;21102:297;20447:959;;;;;;;;:::o;21412:474::-;21480:6;21488;21537:2;21525:9;21516:7;21512:23;21508:32;21505:119;;;21543:79;;:::i;:::-;21505:119;21663:1;21688:53;21733:7;21724:6;21713:9;21709:22;21688:53;:::i;:::-;21678:63;;21634:117;21790:2;21816:53;21861:7;21852:6;21841:9;21837:22;21816:53;:::i;:::-;21806:63;;21761:118;21412:474;;;;;:::o;21892:615::-;21967:6;21975;21983;22032:2;22020:9;22011:7;22007:23;22003:32;22000:119;;;22038:79;;:::i;:::-;22000:119;22158:1;22183:52;22227:7;22218:6;22207:9;22203:22;22183:52;:::i;:::-;22173:62;;22129:116;22284:2;22310:52;22354:7;22345:6;22334:9;22330:22;22310:52;:::i;:::-;22300:62;;22255:117;22411:2;22437:53;22482:7;22473:6;22462:9;22458:22;22437:53;:::i;:::-;22427:63;;22382:118;21892:615;;;;;:::o;22513:323::-;22569:6;22618:2;22606:9;22597:7;22593:23;22589:32;22586:119;;;22624:79;;:::i;:::-;22586:119;22744:1;22769:50;22811:7;22802:6;22791:9;22787:22;22769:50;:::i;:::-;22759:60;;22715:114;22513:323;;;;:::o;22842:761::-;22926:6;22934;22942;22950;22999:3;22987:9;22978:7;22974:23;22970:33;22967:120;;;23006:79;;:::i;:::-;22967:120;23126:1;23151:52;23195:7;23186:6;23175:9;23171:22;23151:52;:::i;:::-;23141:62;;23097:116;23252:2;23278:52;23322:7;23313:6;23302:9;23298:22;23278:52;:::i;:::-;23268:62;;23223:117;23379:2;23405:53;23450:7;23441:6;23430:9;23426:22;23405:53;:::i;:::-;23395:63;;23350:118;23507:2;23533:53;23578:7;23569:6;23558:9;23554:22;23533:53;:::i;:::-;23523:63;;23478:118;22842:761;;;;;;;:::o;23609:180::-;23749:32;23745:1;23737:6;23733:14;23726:56;23609:180;:::o;23795:366::-;23937:3;23958:67;24022:2;24017:3;23958:67;:::i;:::-;23951:74;;24034:93;24123:3;24034:93;:::i;:::-;24152:2;24147:3;24143:12;24136:19;;23795:366;;;:::o;24167:419::-;24333:4;24371:2;24360:9;24356:18;24348:26;;24420:9;24414:4;24410:20;24406:1;24395:9;24391:17;24384:47;24448:131;24574:4;24448:131;:::i;:::-;24440:139;;24167:419;;;:::o;24592:180::-;24640:77;24637:1;24630:88;24737:4;24734:1;24727:15;24761:4;24758:1;24751:15;24778:320;24822:6;24859:1;24853:4;24849:12;24839:22;;24906:1;24900:4;24896:12;24927:18;24917:81;;24983:4;24975:6;24971:17;24961:27;;24917:81;25045:2;25037:6;25034:14;25014:18;25011:38;25008:84;;25064:18;;:::i;:::-;25008:84;24829:269;24778:320;;;:::o;25104:147::-;25205:11;25242:3;25227:18;;25104:147;;;;:::o;25279:327::-;25393:3;25414:88;25495:6;25490:3;25414:88;:::i;:::-;25407:95;;25512:56;25561:6;25556:3;25549:5;25512:56;:::i;:::-;25593:6;25588:3;25584:16;25577:23;;25279:327;;;;;:::o;25612:291::-;25752:3;25774:103;25873:3;25864:6;25856;25774:103;:::i;:::-;25767:110;;25894:3;25887:10;;25612:291;;;;;:::o;25909:225::-;26049:34;26045:1;26037:6;26033:14;26026:58;26118:8;26113:2;26105:6;26101:15;26094:33;25909:225;:::o;26140:366::-;26282:3;26303:67;26367:2;26362:3;26303:67;:::i;:::-;26296:74;;26379:93;26468:3;26379:93;:::i;:::-;26497:2;26492:3;26488:12;26481:19;;26140:366;;;:::o;26512:419::-;26678:4;26716:2;26705:9;26701:18;26693:26;;26765:9;26759:4;26755:20;26751:1;26740:9;26736:17;26729:47;26793:131;26919:4;26793:131;:::i;:::-;26785:139;;26512:419;;;:::o;26959:314::-;27055:3;27076:70;27139:6;27134:3;27076:70;:::i;:::-;27069:77;;27156:56;27205:6;27200:3;27193:5;27156:56;:::i;:::-;27237:29;27259:6;27237:29;:::i;:::-;27232:3;27228:39;27221:46;;26959:314;;;;;:::o;27279:545::-;27454:4;27492:2;27481:9;27477:18;27469:26;;27505:69;27571:1;27560:9;27556:17;27547:6;27505:69;:::i;:::-;27621:9;27615:4;27611:20;27606:2;27595:9;27591:18;27584:48;27649:86;27730:4;27721:6;27713;27649:86;:::i;:::-;27641:94;;27745:72;27813:2;27802:9;27798:18;27789:6;27745:72;:::i;:::-;27279:545;;;;;;;:::o;27830:842::-;28073:4;28111:3;28100:9;28096:19;28088:27;;28125:69;28191:1;28180:9;28176:17;28167:6;28125:69;:::i;:::-;28204:72;28272:2;28261:9;28257:18;28248:6;28204:72;:::i;:::-;28323:9;28317:4;28313:20;28308:2;28297:9;28293:18;28286:48;28351:76;28422:4;28413:6;28351:76;:::i;:::-;28343:84;;28437:66;28499:2;28488:9;28484:18;28475:6;28437:66;:::i;:::-;28551:9;28545:4;28541:20;28535:3;28524:9;28520:19;28513:49;28579:86;28660:4;28651:6;28643;28579:86;:::i;:::-;28571:94;;27830:842;;;;;;;;;:::o;28678:143::-;28735:5;28766:6;28760:13;28751:22;;28782:33;28809:5;28782:33;:::i;:::-;28678:143;;;;:::o;28827:507::-;28906:6;28914;28963:2;28951:9;28942:7;28938:23;28934:32;28931:119;;;28969:79;;:::i;:::-;28931:119;29089:1;29114:64;29170:7;29161:6;29150:9;29146:22;29114:64;:::i;:::-;29104:74;;29060:128;29227:2;29253:64;29309:7;29300:6;29289:9;29285:22;29253:64;:::i;:::-;29243:74;;29198:129;28827:507;;;;;:::o;29340:435::-;29487:4;29525:2;29514:9;29510:18;29502:26;;29538:69;29604:1;29593:9;29589:17;29580:6;29538:69;:::i;:::-;29654:9;29648:4;29644:20;29639:2;29628:9;29624:18;29617:48;29682:86;29763:4;29754:6;29746;29682:86;:::i;:::-;29674:94;;29340:435;;;;;;:::o;29781:225::-;29921:34;29917:1;29909:6;29905:14;29898:58;29990:8;29985:2;29977:6;29973:15;29966:33;29781:225;:::o;30012:366::-;30154:3;30175:67;30239:2;30234:3;30175:67;:::i;:::-;30168:74;;30251:93;30340:3;30251:93;:::i;:::-;30369:2;30364:3;30360:12;30353:19;;30012:366;;;:::o;30384:419::-;30550:4;30588:2;30577:9;30573:18;30565:26;;30637:9;30631:4;30627:20;30623:1;30612:9;30608:17;30601:47;30665:131;30791:4;30665:131;:::i;:::-;30657:139;;30384:419;;;:::o;30809:179::-;30949:31;30945:1;30937:6;30933:14;30926:55;30809:179;:::o;30994:366::-;31136:3;31157:67;31221:2;31216:3;31157:67;:::i;:::-;31150:74;;31233:93;31322:3;31233:93;:::i;:::-;31351:2;31346:3;31342:12;31335:19;;30994:366;;;:::o;31366:419::-;31532:4;31570:2;31559:9;31555:18;31547:26;;31619:9;31613:4;31609:20;31605:1;31594:9;31590:17;31583:47;31647:131;31773:4;31647:131;:::i;:::-;31639:139;;31366:419;;;:::o;31791:180::-;31839:77;31836:1;31829:88;31936:4;31933:1;31926:15;31960:4;31957:1;31950:15;31977:194;32017:4;32037:20;32055:1;32037:20;:::i;:::-;32032:25;;32071:20;32089:1;32071:20;:::i;:::-;32066:25;;32115:1;32112;32108:9;32100:17;;32139:1;32133:4;32130:11;32127:37;;;32144:18;;:::i;:::-;32127:37;31977:194;;;;:::o;32177:94::-;32210:8;32258:5;32254:2;32250:14;32229:35;;32177:94;;;:::o;32277:::-;32316:7;32345:20;32359:5;32345:20;:::i;:::-;32334:31;;32277:94;;;:::o;32377:100::-;32416:7;32445:26;32465:5;32445:26;:::i;:::-;32434:37;;32377:100;;;:::o;32483:157::-;32588:45;32608:24;32626:5;32608:24;:::i;:::-;32588:45;:::i;:::-;32583:3;32576:58;32483:157;;:::o;32646:432::-;32814:3;32836:103;32935:3;32926:6;32918;32836:103;:::i;:::-;32829:110;;32949:75;33020:3;33011:6;32949:75;:::i;:::-;33049:2;33044:3;33040:12;33033:19;;33069:3;33062:10;;32646:432;;;;;;:::o;33084:140::-;33132:4;33155:3;33147:11;;33178:3;33175:1;33168:14;33212:4;33209:1;33199:18;33191:26;;33084:140;;;:::o;33230:93::-;33267:6;33314:2;33309;33302:5;33298:14;33294:23;33284:33;;33230:93;;;:::o;33329:107::-;33373:8;33423:5;33417:4;33413:16;33392:37;;33329:107;;;;:::o;33442:393::-;33511:6;33561:1;33549:10;33545:18;33584:97;33614:66;33603:9;33584:97;:::i;:::-;33702:39;33732:8;33721:9;33702:39;:::i;:::-;33690:51;;33774:4;33770:9;33763:5;33759:21;33750:30;;33823:4;33813:8;33809:19;33802:5;33799:30;33789:40;;33518:317;;33442:393;;;;;:::o;33841:142::-;33891:9;33924:53;33942:34;33951:24;33969:5;33951:24;:::i;:::-;33942:34;:::i;:::-;33924:53;:::i;:::-;33911:66;;33841:142;;;:::o;33989:75::-;34032:3;34053:5;34046:12;;33989:75;;;:::o;34070:269::-;34180:39;34211:7;34180:39;:::i;:::-;34241:91;34290:41;34314:16;34290:41;:::i;:::-;34282:6;34275:4;34269:11;34241:91;:::i;:::-;34235:4;34228:105;34146:193;34070:269;;;:::o;34345:73::-;34390:3;34345:73;:::o;34424:189::-;34501:32;;:::i;:::-;34542:65;34600:6;34592;34586:4;34542:65;:::i;:::-;34477:136;34424:189;;:::o;34619:186::-;34679:120;34696:3;34689:5;34686:14;34679:120;;;34750:39;34787:1;34780:5;34750:39;:::i;:::-;34723:1;34716:5;34712:13;34703:22;;34679:120;;;34619:186;;:::o;34811:541::-;34911:2;34906:3;34903:11;34900:445;;;34945:37;34976:5;34945:37;:::i;:::-;35028:29;35046:10;35028:29;:::i;:::-;35018:8;35014:44;35211:2;35199:10;35196:18;35193:49;;;35232:8;35217:23;;35193:49;35255:80;35311:22;35329:3;35311:22;:::i;:::-;35301:8;35297:37;35284:11;35255:80;:::i;:::-;34915:430;;34900:445;34811:541;;;:::o;35358:117::-;35412:8;35462:5;35456:4;35452:16;35431:37;;35358:117;;;;:::o;35481:169::-;35525:6;35558:51;35606:1;35602:6;35594:5;35591:1;35587:13;35558:51;:::i;:::-;35554:56;35639:4;35633;35629:15;35619:25;;35532:118;35481:169;;;;:::o;35655:295::-;35731:4;35877:29;35902:3;35896:4;35877:29;:::i;:::-;35869:37;;35939:3;35936:1;35932:11;35926:4;35923:21;35915:29;;35655:295;;;;:::o;35955:1390::-;36070:36;36102:3;36070:36;:::i;:::-;36171:18;36163:6;36160:30;36157:56;;;36193:18;;:::i;:::-;36157:56;36237:38;36269:4;36263:11;36237:38;:::i;:::-;36322:66;36381:6;36373;36367:4;36322:66;:::i;:::-;36415:1;36439:4;36426:17;;36471:2;36463:6;36460:14;36488:1;36483:617;;;;37144:1;37161:6;37158:77;;;37210:9;37205:3;37201:19;37195:26;37186:35;;37158:77;37261:67;37321:6;37314:5;37261:67;:::i;:::-;37255:4;37248:81;37117:222;36453:886;;36483:617;36535:4;36531:9;36523:6;36519:22;36569:36;36600:4;36569:36;:::i;:::-;36627:1;36641:208;36655:7;36652:1;36649:14;36641:208;;;36734:9;36729:3;36725:19;36719:26;36711:6;36704:42;36785:1;36777:6;36773:14;36763:24;;36832:2;36821:9;36817:18;36804:31;;36678:4;36675:1;36671:12;36666:17;;36641:208;;;36877:6;36868:7;36865:19;36862:179;;;36935:9;36930:3;36926:19;36920:26;36978:48;37020:4;37012:6;37008:17;36997:9;36978:48;:::i;:::-;36970:6;36963:64;36885:156;36862:179;37087:1;37083;37075:6;37071:14;37067:22;37061:4;37054:36;36490:610;;;36453:886;;36045:1300;;;35955:1390;;:::o;37351:652::-;37552:4;37590:3;37579:9;37575:19;37567:27;;37604:69;37670:1;37659:9;37655:17;37646:6;37604:69;:::i;:::-;37683:70;37749:2;37738:9;37734:18;37725:6;37683:70;:::i;:::-;37763:72;37831:2;37820:9;37816:18;37807:6;37763:72;:::i;:::-;37882:9;37876:4;37872:20;37867:2;37856:9;37852:18;37845:48;37910:86;37991:4;37982:6;37974;37910:86;:::i;:::-;37902:94;;37351:652;;;;;;;;:::o;38009:222::-;38149:34;38145:1;38137:6;38133:14;38126:58;38218:5;38213:2;38205:6;38201:15;38194:30;38009:222;:::o;38237:366::-;38379:3;38400:67;38464:2;38459:3;38400:67;:::i;:::-;38393:74;;38476:93;38565:3;38476:93;:::i;:::-;38594:2;38589:3;38585:12;38578:19;;38237:366;;;:::o;38609:419::-;38775:4;38813:2;38802:9;38798:18;38790:26;;38862:9;38856:4;38852:20;38848:1;38837:9;38833:17;38826:47;38890:131;39016:4;38890:131;:::i;:::-;38882:139;;38609:419;;;:::o;39034:220::-;39174:34;39170:1;39162:6;39158:14;39151:58;39243:3;39238:2;39230:6;39226:15;39219:28;39034:220;:::o;39260:366::-;39402:3;39423:67;39487:2;39482:3;39423:67;:::i;:::-;39416:74;;39499:93;39588:3;39499:93;:::i;:::-;39617:2;39612:3;39608:12;39601:19;;39260:366;;;:::o;39632:419::-;39798:4;39836:2;39825:9;39821:18;39813:26;;39885:9;39879:4;39875:20;39871:1;39860:9;39856:17;39849:47;39913:131;40039:4;39913:131;:::i;:::-;39905:139;;39632:419;;;:::o;40057:115::-;40142:23;40159:5;40142:23;:::i;:::-;40137:3;40130:36;40057:115;;:::o;40178:652::-;40379:4;40417:3;40406:9;40402:19;40394:27;;40431:69;40497:1;40486:9;40482:17;40473:6;40431:69;:::i;:::-;40547:9;40541:4;40537:20;40532:2;40521:9;40517:18;40510:48;40575:86;40656:4;40647:6;40639;40575:86;:::i;:::-;40567:94;;40671:70;40737:2;40726:9;40722:18;40713:6;40671:70;:::i;:::-;40751:72;40819:2;40808:9;40804:18;40795:6;40751:72;:::i;:::-;40178:652;;;;;;;;:::o;40836:434::-;40981:4;41019:2;41008:9;41004:18;40996:26;;41032:69;41098:1;41087:9;41083:17;41074:6;41032:69;:::i;:::-;41111:70;41177:2;41166:9;41162:18;41153:6;41111:70;:::i;:::-;41191:72;41259:2;41248:9;41244:18;41235:6;41191:72;:::i;:::-;40836:434;;;;;;:::o;41276:96::-;41334:6;41362:3;41352:13;;41276:96;;;;:::o;41378:1398::-;41500:43;41539:3;41534;41500:43;:::i;:::-;41608:18;41600:6;41597:30;41594:56;;;41630:18;;:::i;:::-;41594:56;41674:38;41706:4;41700:11;41674:38;:::i;:::-;41759:66;41818:6;41810;41804:4;41759:66;:::i;:::-;41852:1;41881:2;41873:6;41870:14;41898:1;41893:631;;;;42568:1;42585:6;42582:84;;;42641:9;42636:3;42632:19;42619:33;42610:42;;42582:84;42692:67;42752:6;42745:5;42692:67;:::i;:::-;42686:4;42679:81;42541:229;41863:907;;41893:631;41945:4;41941:9;41933:6;41929:22;41979:36;42010:4;41979:36;:::i;:::-;42037:1;42051:215;42065:7;42062:1;42059:14;42051:215;;;42151:9;42146:3;42142:19;42129:33;42121:6;42114:49;42202:1;42194:6;42190:14;42180:24;;42249:2;42238:9;42234:18;42221:31;;42088:4;42085:1;42081:12;42076:17;;42051:215;;;42294:6;42285:7;42282:19;42279:186;;;42359:9;42354:3;42350:19;42337:33;42402:48;42444:4;42436:6;42432:17;42421:9;42402:48;:::i;:::-;42394:6;42387:64;42302:163;42279:186;42511:1;42507;42499:6;42495:14;42491:22;42485:4;42478:36;41900:624;;;41863:907;;41475:1301;;;41378:1398;;;:::o;42782:545::-;42955:4;42993:3;42982:9;42978:19;42970:27;;43007:69;43073:1;43062:9;43058:17;43049:6;43007:69;:::i;:::-;43086:70;43152:2;43141:9;43137:18;43128:6;43086:70;:::i;:::-;43166:72;43234:2;43223:9;43219:18;43210:6;43166:72;:::i;:::-;43248;43316:2;43305:9;43301:18;43292:6;43248:72;:::i;:::-;42782:545;;;;;;;:::o;43333:432::-;43421:5;43446:65;43462:48;43503:6;43462:48;:::i;:::-;43446:65;:::i;:::-;43437:74;;43534:6;43527:5;43520:21;43572:4;43565:5;43561:16;43610:3;43601:6;43596:3;43592:16;43589:25;43586:112;;;43617:79;;:::i;:::-;43586:112;43707:52;43752:6;43747:3;43742;43707:52;:::i;:::-;43427:338;43333:432;;;;;:::o;43784:353::-;43850:5;43899:3;43892:4;43884:6;43880:17;43876:27;43866:122;;43907:79;;:::i;:::-;43866:122;44017:6;44011:13;44042:89;44127:3;44119:6;44112:4;44104:6;44100:17;44042:89;:::i;:::-;44033:98;;43856:281;43784:353;;;;:::o;44143:522::-;44222:6;44271:2;44259:9;44250:7;44246:23;44242:32;44239:119;;;44277:79;;:::i;:::-;44239:119;44418:1;44407:9;44403:17;44397:24;44448:18;44440:6;44437:30;44434:117;;;44470:79;;:::i;:::-;44434:117;44575:73;44640:7;44631:6;44620:9;44616:22;44575:73;:::i;:::-;44565:83;;44368:290;44143:522;;;;:::o;44671:719::-;44880:4;44918:3;44907:9;44903:19;44895:27;;44932:69;44998:1;44987:9;44983:17;44974:6;44932:69;:::i;:::-;45048:9;45042:4;45038:20;45033:2;45022:9;45018:18;45011:48;45076:76;45147:4;45138:6;45076:76;:::i;:::-;45068:84;;45162:70;45228:2;45217:9;45213:18;45204:6;45162:70;:::i;:::-;45279:9;45273:4;45269:20;45264:2;45253:9;45249:18;45242:48;45307:76;45378:4;45369:6;45307:76;:::i;:::-;45299:84;;44671:719;;;;;;;:::o;45396:442::-;45545:4;45583:2;45572:9;45568:18;45560:26;;45596:71;45664:1;45653:9;45649:17;45640:6;45596:71;:::i;:::-;45677:72;45745:2;45734:9;45730:18;45721:6;45677:72;:::i;:::-;45759;45827:2;45816:9;45812:18;45803:6;45759:72;:::i;:::-;45396:442;;;;;;:::o;45844:525::-;46009:4;46047:2;46036:9;46032:18;46024:26;;46060:69;46126:1;46115:9;46111:17;46102:6;46060:69;:::i;:::-;46176:9;46170:4;46166:20;46161:2;46150:9;46146:18;46139:48;46204:76;46275:4;46266:6;46204:76;:::i;:::-;46196:84;;46290:72;46358:2;46347:9;46343:18;46334:6;46290:72;:::i;:::-;45844:525;;;;;;:::o;46375:419::-;46514:4;46552:2;46541:9;46537:18;46529:26;;46601:9;46595:4;46591:20;46587:1;46576:9;46572:17;46565:47;46629:76;46700:4;46691:6;46629:76;:::i;:::-;46621:84;;46715:72;46783:2;46772:9;46768:18;46759:6;46715:72;:::i;:::-;46375:419;;;;;:::o;46800:178::-;46940:30;46936:1;46928:6;46924:14;46917:54;46800:178;:::o;46984:366::-;47126:3;47147:67;47211:2;47206:3;47147:67;:::i;:::-;47140:74;;47223:93;47312:3;47223:93;:::i;:::-;47341:2;47336:3;47332:12;47325:19;;46984:366;;;:::o;47356:419::-;47522:4;47560:2;47549:9;47545:18;47537:26;;47609:9;47603:4;47599:20;47595:1;47584:9;47580:17;47573:47;47637:131;47763:4;47637:131;:::i;:::-;47629:139;;47356:419;;;:::o;47781:191::-;47821:3;47840:20;47858:1;47840:20;:::i;:::-;47835:25;;47874:20;47892:1;47874:20;:::i;:::-;47869:25;;47917:1;47914;47910:9;47903:16;;47938:3;47935:1;47932:10;47929:36;;;47945:18;;:::i;:::-;47929:36;47781:191;;;;:::o;47978:164::-;48118:16;48114:1;48106:6;48102:14;48095:40;47978:164;:::o;48148:366::-;48290:3;48311:67;48375:2;48370:3;48311:67;:::i;:::-;48304:74;;48387:93;48476:3;48387:93;:::i;:::-;48505:2;48500:3;48496:12;48489:19;;48148:366;;;:::o;48520:419::-;48686:4;48724:2;48713:9;48709:18;48701:26;;48773:9;48767:4;48763:20;48759:1;48748:9;48744:17;48737:47;48801:131;48927:4;48801:131;:::i;:::-;48793:139;;48520:419;;;:::o;48945:167::-;49085:19;49081:1;49073:6;49069:14;49062:43;48945:167;:::o;49118:366::-;49260:3;49281:67;49345:2;49340:3;49281:67;:::i;:::-;49274:74;;49357:93;49446:3;49357:93;:::i;:::-;49475:2;49470:3;49466:12;49459:19;;49118:366;;;:::o;49490:419::-;49656:4;49694:2;49683:9;49679:18;49671:26;;49743:9;49737:4;49733:20;49729:1;49718:9;49714:17;49707:47;49771:131;49897:4;49771:131;:::i;:::-;49763:139;;49490:419;;;:::o;49915:386::-;50019:3;50047:38;50079:5;50047:38;:::i;:::-;50101:88;50182:6;50177:3;50101:88;:::i;:::-;50094:95;;50198:65;50256:6;50251:3;50244:4;50237:5;50233:16;50198:65;:::i;:::-;50288:6;50283:3;50279:16;50272:23;;50023:278;49915:386;;;;:::o;50307:271::-;50437:3;50459:93;50548:3;50539:6;50459:93;:::i;:::-;50452:100;;50569:3;50562:10;;50307:271;;;;:::o;50584:917::-;50839:4;50877:3;50866:9;50862:19;50854:27;;50891:69;50957:1;50946:9;50942:17;50933:6;50891:69;:::i;:::-;51007:9;51001:4;50997:20;50992:2;50981:9;50977:18;50970:48;51035:76;51106:4;51097:6;51035:76;:::i;:::-;51027:84;;51121:70;51187:2;51176:9;51172:18;51163:6;51121:70;:::i;:::-;51238:9;51232:4;51228:20;51223:2;51212:9;51208:18;51201:48;51266:76;51337:4;51328:6;51266:76;:::i;:::-;51258:84;;51390:9;51384:4;51380:20;51374:3;51363:9;51359:19;51352:49;51418:76;51489:4;51480:6;51418:76;:::i;:::-;51410:84;;50584:917;;;;;;;;:::o;51507:225::-;51647:34;51643:1;51635:6;51631:14;51624:58;51716:8;51711:2;51703:6;51699:15;51692:33;51507:225;:::o;51738:366::-;51880:3;51901:67;51965:2;51960:3;51901:67;:::i;:::-;51894:74;;51977:93;52066:3;51977:93;:::i;:::-;52095:2;52090:3;52086:12;52079:19;;51738:366;;;:::o;52110:419::-;52276:4;52314:2;52303:9;52299:18;52291:26;;52363:9;52357:4;52353:20;52349:1;52338:9;52334:17;52327:47;52391:131;52517:4;52391:131;:::i;:::-;52383:139;;52110:419;;;:::o;52535:235::-;52675:34;52671:1;52663:6;52659:14;52652:58;52744:18;52739:2;52731:6;52727:15;52720:43;52535:235;:::o;52776:366::-;52918:3;52939:67;53003:2;52998:3;52939:67;:::i;:::-;52932:74;;53015:93;53104:3;53015:93;:::i;:::-;53133:2;53128:3;53124:12;53117:19;;52776:366;;;:::o;53148:419::-;53314:4;53352:2;53341:9;53337:18;53329:26;;53401:9;53395:4;53391:20;53387:1;53376:9;53372:17;53365:47;53429:131;53555:4;53429:131;:::i;:::-;53421:139;;53148:419;;;:::o;53573:142::-;53676:32;53702:5;53676:32;:::i;:::-;53671:3;53664:45;53573:142;;:::o;53721:1064::-;54022:4;54060:3;54049:9;54045:19;54037:27;;54074:69;54140:1;54129:9;54125:17;54116:6;54074:69;:::i;:::-;54190:9;54184:4;54180:20;54175:2;54164:9;54160:18;54153:48;54218:76;54289:4;54280:6;54218:76;:::i;:::-;54210:84;;54341:9;54335:4;54331:20;54326:2;54315:9;54311:18;54304:48;54369:76;54440:4;54431:6;54369:76;:::i;:::-;54361:84;;54455:88;54539:2;54528:9;54524:18;54515:6;54455:88;:::i;:::-;54553:73;54621:3;54610:9;54606:19;54597:6;54553:73;:::i;:::-;54674:9;54668:4;54664:20;54658:3;54647:9;54643:19;54636:49;54702:76;54773:4;54764:6;54702:76;:::i;:::-;54694:84;;53721:1064;;;;;;;;;:::o;54791:141::-;54847:5;54878:6;54872:13;54863:22;;54894:32;54920:5;54894:32;:::i;:::-;54791:141;;;;:::o;54938:832::-;55034:6;55042;55050;55099:2;55087:9;55078:7;55074:23;55070:32;55067:119;;;55105:79;;:::i;:::-;55067:119;55225:1;55250:63;55305:7;55296:6;55285:9;55281:22;55250:63;:::i;:::-;55240:73;;55196:127;55383:2;55372:9;55368:18;55362:25;55414:18;55406:6;55403:30;55400:117;;;55436:79;;:::i;:::-;55400:117;55541:73;55606:7;55597:6;55586:9;55582:22;55541:73;:::i;:::-;55531:83;;55333:291;55663:2;55689:64;55745:7;55736:6;55725:9;55721:22;55689:64;:::i;:::-;55679:74;;55634:129;54938:832;;;;;:::o;55776:176::-;55916:28;55912:1;55904:6;55900:14;55893:52;55776:176;:::o;55958:366::-;56100:3;56121:67;56185:2;56180:3;56121:67;:::i;:::-;56114:74;;56197:93;56286:3;56197:93;:::i;:::-;56315:2;56310:3;56306:12;56299:19;;55958:366;;;:::o;56330:419::-;56496:4;56534:2;56523:9;56519:18;56511:26;;56583:9;56577:4;56573:20;56569:1;56558:9;56554:17;56547:47;56611:131;56737:4;56611:131;:::i;:::-;56603:139;;56330:419;;;:::o;56755:177::-;56895:29;56891:1;56883:6;56879:14;56872:53;56755:177;:::o;56938:366::-;57080:3;57101:67;57165:2;57160:3;57101:67;:::i;:::-;57094:74;;57177:93;57266:3;57177:93;:::i;:::-;57295:2;57290:3;57286:12;57279:19;;56938:366;;;:::o;57310:419::-;57476:4;57514:2;57503:9;57499:18;57491:26;;57563:9;57557:4;57553:20;57549:1;57538:9;57534:17;57527:47;57591:131;57717:4;57591:131;:::i;:::-;57583:139;;57310:419;;;:::o;57735:182::-;57875:34;57871:1;57863:6;57859:14;57852:58;57735:182;:::o;57923:366::-;58065:3;58086:67;58150:2;58145:3;58086:67;:::i;:::-;58079:74;;58162:93;58251:3;58162:93;:::i;:::-;58280:2;58275:3;58271:12;58264:19;;57923:366;;;:::o;58295:419::-;58461:4;58499:2;58488:9;58484:18;58476:26;;58548:9;58542:4;58538:20;58534:1;58523:9;58519:17;58512:47;58576:131;58702:4;58576:131;:::i;:::-;58568:139;;58295:419;;;:::o;58720:171::-;58860:23;58856:1;58848:6;58844:14;58837:47;58720:171;:::o;58897:366::-;59039:3;59060:67;59124:2;59119:3;59060:67;:::i;:::-;59053:74;;59136:93;59225:3;59136:93;:::i;:::-;59254:2;59249:3;59245:12;59238:19;;58897:366;;;:::o;59269:419::-;59435:4;59473:2;59462:9;59458:18;59450:26;;59522:9;59516:4;59512:20;59508:1;59497:9;59493:17;59486:47;59550:131;59676:4;59550:131;:::i;:::-;59542:139;;59269:419;;;:::o;59694:178::-;59834:30;59830:1;59822:6;59818:14;59811:54;59694:178;:::o;59878:366::-;60020:3;60041:67;60105:2;60100:3;60041:67;:::i;:::-;60034:74;;60117:93;60206:3;60117:93;:::i;:::-;60235:2;60230:3;60226:12;60219:19;;59878:366;;;:::o;60250:419::-;60416:4;60454:2;60443:9;60439:18;60431:26;;60503:9;60497:4;60493:20;60489:1;60478:9;60474:17;60467:47;60531:131;60657:4;60531:131;:::i;:::-;60523:139;;60250:419;;;:::o
Swarm Source
ipfs://cadcc41bc35985b6a1824e85aa28b938d04c555a04c58094c15eb2fecf26b1da
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.