Source Code
Overview
S Balance
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
23687473 | 7 days ago | 0.3182001 S | ||||
8347701 | 67 days ago | 0.4 S | ||||
8173231 | 68 days ago | 200 S | ||||
7392608 | 70 days ago | 5 S | ||||
7093279 | 71 days ago | 0 S | ||||
7093279 | 71 days ago | 0 S | ||||
7087139 | 71 days ago | 0.4 S | ||||
7086758 | 71 days ago | 0.5 S | ||||
6910120 | 72 days ago | 0.5 S | ||||
6827355 | 72 days ago | 0.5 S | ||||
6769881 | 73 days ago | 1 S | ||||
6762719 | 73 days ago | 1 S | ||||
5088782 | 79 days ago | 0.5 S | ||||
5088752 | 79 days ago | 0 S | ||||
5088716 | 79 days ago | 0 S | ||||
5088683 | 79 days ago | 0 S | ||||
5088653 | 79 days ago | 0 S | ||||
5088627 | 79 days ago | 0 S | ||||
5088591 | 79 days ago | 0 S | ||||
5088563 | 79 days ago | 0 S | ||||
5088532 | 79 days ago | 0 S | ||||
5088509 | 79 days ago | 0 S | ||||
5088483 | 79 days ago | 0 S | ||||
5088442 | 79 days ago | 0 S | ||||
5088410 | 79 days ago | 0 S |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
CrossChainRelayUpgradeable
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "./interface/IOrderlyCrossChain.sol"; import "./utils/OrderlyCrossChainMessage.sol"; import "./layerzero/lzApp/LzAppUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // Datalayout for the Cross Chain Relay contract CrossChainRelayDataLayout { // A mapping to track trusted callers mapping(address => uint8) public _callers; // Raw chain id to layerzero chain id mapping mapping(uint256 => uint16) public _chainIdMapping; // layerzero chain id to raw chain id mapping mapping(uint16 => uint256) public _lzChainIdMapping; // chain id to cross chain manager contract address mapping(uint256 => address) public _crossChainManagerMapping; // chain id to cross chain relay contract address mapping(uint256 => address) public _crossChainRelayMapping; // flow to gas limit mapping mapping(uint8 => uint256) public _flowGasLimitMapping; // The Current Chain ID uint256 public _currentChainId; // the manager address address public _managerAddress; } contract CrossChainRelayUpgradeable is IOrderlyCrossChain, Initializable, OwnableUpgradeable, LzAppUpgradeable, UUPSUpgradeable, CrossChainRelayDataLayout { event MsgReceived(uint8); event Ping(); event Pong(); using OrderlyCrossChainMessage for OrderlyCrossChainMessage.MessageV1; constructor() { _disableInitializers(); } /// @dev Throws if called by any account other than the owner. modifier onlyCaller() { require(_callers[msg.sender] == 1, "It is not a trusted caller."); _; } /// @notice initialize the contract with the endpoint address /// @param _endpoint the endpoint address function initialize(address _endpoint) public initializer { __Ownable_init(); __UUPSUpgradeable_init(); __LzApp_init(_endpoint); _callers[msg.sender] = 1; _callers[_endpoint] = 1; } /// @notice update the endpoint address /// @param _endpoint the endpoint address function updateEndpoint(address _endpoint) external onlyOwner { lzEndpoint = ILayerZeroEndpoint(_endpoint); _callers[_endpoint] = 1; } function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} function upgradeTo(address newImplementation) public override onlyOwner onlyProxy { _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } // for receive native token receive() external payable {} /// @notice withdraw native token /// @param to the receiver address /// @param amount the amount to withdraw function withdrawNativeToken(address payable to, uint256 amount) external onlyOwner { to.transfer(amount); } /// @notice withdraw ERC20 token /// @param token the token address /// @param to the receiver address function withdrawToken(address token, address to, uint256 amount) external onlyOwner { IERC20(token).transfer(to, amount); } /// @notice set the current chain id /// @param chainId the current chain id function setSrcChainId(uint256 chainId) external onlyOwner { _currentChainId = chainId; } /// @notice set the trusted caller /// @param caller the caller address function addCaller(address caller) external onlyOwner { _callers[caller] = 1; } /// @notice remove the trusted caller /// @param caller the caller address function removeCaller(address caller) external onlyOwner { _callers[caller] = 0; } /// @notice add chain ids mapping to layerzero chain ids /// @param chainId the raw chain id /// @param lzChainId the layerzero chain id function addChainIdMapping(uint256 chainId, uint16 lzChainId) external onlyOwner { _chainIdMapping[chainId] = lzChainId; _lzChainIdMapping[lzChainId] = chainId; } /// @notice set the cross chain manager address /// deprecated no need to set cross chain manager address /// @param chainId the chain id /// @param crossChainManager the cross chain manager address function addCrossChainManagerMapping(uint256 chainId, address crossChainManager) external onlyOwner { _crossChainManagerMapping[chainId] = crossChainManager; } /// @notice set the cross chain relay address /// deprecated no need to set cross chain relay address /// @param chainId the chain id /// @param crossChainRelay the cross chain relay address function addCrossChainRelayMapping(uint256 chainId, address crossChainRelay) external onlyOwner { _crossChainRelayMapping[chainId] = crossChainRelay; } /// @notice set the manager address /// @param _address the manager address function setManagerAddress(address _address) external onlyOwner { _managerAddress = _address; _callers[_address] = 1; } /// @notice set the flow gas limit mapping /// @param flow the flow id /// @param gasLimit the gas limit function addFlowGasLimitMapping(uint8 flow, uint256 gasLimit) external onlyOwner { _flowGasLimitMapping[flow] = gasLimit; } /// @notice estimate gas fee for a center message /// @param data the cross chain meta message /// @param payload the payload /// @return the gas fee function estimateGasFee(OrderlyCrossChainMessage.MessageV1 memory data, bytes memory payload) public view override returns (uint256) { uint16 lzDstChainId = _chainIdMapping[data.dstChainId]; bytes memory lzPayload = data.encodeMessageV1AndPayload(payload); require(lzDstChainId != 0, "CrossChainRelay: invalid dst chain id"); uint16 version = 1; uint256 gasLimit = _flowGasLimitMapping[data.method]; if (gasLimit == 0) { gasLimit = 3000000; } bytes memory adapterParams = abi.encodePacked(version, gasLimit); (uint256 nativeFee,) = lzEndpoint.estimateFees(lzDstChainId, address(this), lzPayload, false, adapterParams); return nativeFee; } /// @notice send cross-chain message /// @param data the cross chain meta message /// @param payload the payload function sendMessage(OrderlyCrossChainMessage.MessageV1 memory data, bytes memory payload) public payable override onlyCaller { bytes memory lzPayload = data.encodeMessageV1AndPayload(payload); uint16 lzDstChainId = _chainIdMapping[data.dstChainId]; require(lzDstChainId != 0, "CrossChainRelay: invalid dst chain id"); uint16 version = 1; uint256 gasLimit = _flowGasLimitMapping[data.method]; if (gasLimit == 0) { gasLimit = 3000000; } bytes memory adapterParams = abi.encodePacked(version, gasLimit); (uint256 nativeFee,) = lzEndpoint.estimateFees(lzDstChainId, address(this), lzPayload, false, adapterParams); _lzSend(lzDstChainId, lzPayload, payable(address(this)), address(0), adapterParams, nativeFee); emit MessageSent(data, payload); } /// @notice send cross-chain message with fee /// @param data the cross chain meta message /// @param payload the payload function sendMessageWithFee(OrderlyCrossChainMessage.MessageV1 memory data, bytes memory payload) public payable override onlyCaller { bytes memory lzPayload = data.encodeMessageV1AndPayload(payload); uint16 lzDstChainId = _chainIdMapping[data.dstChainId]; require(lzDstChainId != 0, "CrossChainRelay: invalid dst chain id"); uint16 version = 1; uint256 gasLimit = _flowGasLimitMapping[data.method]; if (gasLimit == 0) { gasLimit = 3000000; } bytes memory adapterParams = abi.encodePacked(version, gasLimit); _lzSend(lzDstChainId, lzPayload, payable(address(this)), address(0), adapterParams, msg.value); emit MessageSent(data, payload); } /// @notice send cross-chain message with fee /// @param refundReceiver the receiver address for the lz fee refund /// @param data the cross chain meta message /// @param payload the payload function sendMessageWithFeeRefund( address refundReceiver, OrderlyCrossChainMessage.MessageV1 memory data, bytes memory payload ) public payable override onlyCaller { bytes memory lzPayload = data.encodeMessageV1AndPayload(payload); uint16 lzDstChainId = _chainIdMapping[data.dstChainId]; require(lzDstChainId != 0, "CrossChainRelay: invalid dst chain id"); uint16 version = 1; uint256 gasLimit = _flowGasLimitMapping[data.method]; if (gasLimit == 0) { gasLimit = 3000000; } bytes memory adapterParams = abi.encodePacked(version, gasLimit); _lzSend(lzDstChainId, lzPayload, payable(refundReceiver), address(0), adapterParams, msg.value); emit MessageSent(data, payload); } /// @notice test function, send ping to another chain /// @param dstChainId the destination chain id function ping(uint256 dstChainId) internal { OrderlyCrossChainMessage.MessageV1 memory data = OrderlyCrossChainMessage.MessageV1({ method: uint8(OrderlyCrossChainMessage.CrossChainMethod.Ping), option: 0, payloadDataType: 0, srcCrossChainManager: address(0), dstCrossChainManager: address(0), srcChainId: _currentChainId, dstChainId: dstChainId }); sendMessage(data, bytes("")); } /// @notice test function, send ping to another chain and expect pong back /// @param dstChainId the destination chain id function pingPong(uint256 dstChainId) external onlyOwner { OrderlyCrossChainMessage.MessageV1 memory data = OrderlyCrossChainMessage.MessageV1({ method: uint8(OrderlyCrossChainMessage.CrossChainMethod.PingPong), option: 0, payloadDataType: 0, srcCrossChainManager: address(0), dstCrossChainManager: address(0), srcChainId: _currentChainId, dstChainId: dstChainId }); sendMessage(data, bytes("")); } /// @notice receive cross-chain message /// @param data the cross chain meta message /// @param payload the payload function receiveMessage(OrderlyCrossChainMessage.MessageV1 memory data, bytes memory payload) public payable override onlyCaller { emit MessageReceived(data, payload); if (data.method == uint8(OrderlyCrossChainMessage.CrossChainMethod.PingPong)) { // send pong back; ping(data.srcChainId); emit Pong(); } else if (data.method == uint8(OrderlyCrossChainMessage.CrossChainMethod.Ping)) { emit Ping(); } else { IOrderlyCrossChainReceiver(_managerAddress).receiveMessage(data, payload); } } /// @notice receive cross-chain message from layzero endpoint /// @param _srcChainId the source chain id /// @param _payload the payload function _blockingLzReceive(uint16 _srcChainId, bytes memory, uint64, bytes memory _payload) internal virtual override { uint256 rawSrcChainId = _lzChainIdMapping[_srcChainId]; require(rawSrcChainId != 0, "CrossChainRelay: invalid src chain id"); (OrderlyCrossChainMessage.MessageV1 memory message, bytes memory payload) = OrderlyCrossChainMessage.decodeMessageV1AndPayload(_payload); emit MsgReceived(message.method); receiveMessage(message, payload); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "../utils/OrderlyCrossChainMessage.sol"; // Interface for the Cross Chain Operations interface IOrderlyCrossChain { // Event to be emitted when a message is sent event MessageSent(OrderlyCrossChainMessage.MessageV1 message, bytes payload); // Event to be emitted when a message is received event MessageReceived(OrderlyCrossChainMessage.MessageV1 message, bytes payload); /// @notice estimate gas fee /// @param data message data /// @param payload payload function estimateGasFee(OrderlyCrossChainMessage.MessageV1 memory data, bytes memory payload) external view returns (uint256); /// @notice send message /// @param message message /// @param payload payload function sendMessage(OrderlyCrossChainMessage.MessageV1 memory message, bytes memory payload) external payable; /// @notice send message with fee, so no estimate gas fee will not run /// @param message message /// @param payload payload function sendMessageWithFee(OrderlyCrossChainMessage.MessageV1 memory message, bytes memory payload) external payable; /// @notice send message with fee, so no estimate gas fee will not run /// @param refundReceiver receiver of the refund /// @param message message /// @param payload payload function sendMessageWithFeeRefund( address refundReceiver, OrderlyCrossChainMessage.MessageV1 memory message, bytes memory payload ) external payable; /// @notice receive message after decoding the message /// @param message message /// @param payload payload function receiveMessage(OrderlyCrossChainMessage.MessageV1 memory message, bytes memory payload) external payable; } // Interface for the Cross Chain Receiver interface IOrderlyCrossChainReceiver { /// @notice receive message from relay, relay will call this function to send messages /// @param message message /// @param payload payload function receiveMessage(OrderlyCrossChainMessage.MessageV1 memory message, bytes memory payload) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; // Library to handle the conversion of the message structure to bytes array and vice versa library OrderlyCrossChainMessage { // List of methods that can be called cross-chain enum CrossChainOption {LayerZero} enum CrossChainMethod { Deposit, // from vault to ledger Withdraw, // from ledger to vault WithdrawFinish, // from vault to ledger Ping, // for message testing PingPong, // ABA message testing RebalanceBurn, // burn request from ledger to vault RebalanceBurnFinish, // burn request finish from vault to ledger RebalanceMint, // mint request from ledger to vault RebalanceMintFinish // mint request finish from vault to ledger } enum PayloadDataType { EventTypesWithdrawData, AccountTypesAccountDeposit, AccountTypesAccountWithdraw, VaultTypesVaultDeposit, VaultTypesVaultWithdraw, RebalanceBurnCCData, RebalanceBurnCCFinishData, RebalanceMintCCData, RebalanceMintCCFinishData } // The structure of the message struct MessageV1 { uint8 method; // enum CrossChainMethod to uint8 uint8 option; // enum CrossChainOption to uint8 uint8 payloadDataType; // enum PayloadDataType to uint8 address srcCrossChainManager; // Source cross-chain manager address address dstCrossChainManager; // Target cross-chain manager address uint256 srcChainId; // Source blockchain ID uint256 dstChainId; // Target blockchain ID } // Encode the message structure to bytes array function encodeMessageV1AndPayload(MessageV1 memory message, bytes memory payload) internal pure returns (bytes memory) { return abi.encode(message, payload); } // Decode the bytes array to message structure function decodeMessageV1AndPayload(bytes memory data) internal pure returns (MessageV1 memory, bytes memory) { (MessageV1 memory message, bytes memory payload) = abi.decode(data, (MessageV1, bytes)); return (message, payload); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "../interfaces/ILayerZeroReceiver.sol"; import "../interfaces/ILayerZeroUserApplicationConfig.sol"; import "../interfaces/ILayerZeroEndpoint.sol"; import "../util/BytesLib.sol"; /* * a generic LzReceiver implementation */ abstract contract LzAppUpgradeable is ILayerZeroReceiver, ILayerZeroUserApplicationConfig, Initializable, OwnableUpgradeable { using BytesLib for bytes; // ua can not send payload larger than this by default, but it can be changed by the ua owner uint256 public constant DEFAULT_PAYLOAD_SIZE_LIMIT = 10000; ILayerZeroEndpoint public lzEndpoint; mapping(uint16 => bytes) public trustedRemoteLookup; mapping(uint16 => mapping(uint16 => uint256)) public minDstGasLookup; mapping(uint16 => uint256) 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, uint256 _minDstGas); function __LzApp_init(address _endpoint) internal onlyInitializing { 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, uint256 _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, uint256 _extraGas) internal view virtual { uint256 providedGasLimit = _getGasLimit(_adapterParams); uint256 minGasLimit = minDstGasLookup[_dstChainId][_type] + _extraGas; require(minGasLimit > 0, "LzApp: minGasLimit not set"); require(providedGasLimit >= minGasLimit, "LzApp: gas limit is too low"); } function _getGasLimit(bytes memory _adapterParams) internal pure virtual returns (uint256 gasLimit) { require(_adapterParams.length >= 34, "LzApp: invalid adapterParams"); assembly { gasLimit := mload(add(_adapterParams, 34)) } } function _checkPayloadSize(uint16 _dstChainId, uint256 _payloadSize) internal view virtual { uint256 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, uint256 _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, uint256 _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 _srcChainId, bytes calldata _path) external onlyOwner { trustedRemoteLookup[_srcChainId] = _path; emit SetTrustedRemote(_srcChainId, _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, uint256 _minGas) external onlyOwner { require(_minGas > 0, "LzApp: invalid minGas"); minDstGasLookup[_dstChainId][_packetType] = _minGas; emit SetMinDstGas(_dstChainId, _packetType, _minGas); } // if the size is 0, it means default size limit function setPayloadSizeLimit(uint16 _dstChainId, uint256 _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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[20] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/utils/Initializable.sol"; /** * @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. * * By default, the owner account will be the one that deploys the contract. 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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../ERC1967/ERC1967UpgradeUpgradeable.sol"; import "./Initializable.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeTo(address newImplementation) public virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: setting the version to 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT 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; }
// SPDX-License-Identifier: MIT 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; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0; import "./ILayerZeroUserApplicationConfig.sol"; 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); }
// SPDX-License-Identifier: Unlicense /* * @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, uint256 _start, uint256 _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, uint256 _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, uint256 _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, uint256 _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, uint256 _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, uint256 _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, uint256 _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, uint256 _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, uint256 _start) internal pure returns (uint256) { require(_bytes.length >= _start + 32, "toUint256_outOfBounds"); uint256 tempUint; assembly { tempUint := mload(add(add(_bytes, 0x20), _start)) } return tempUint; } function toBytes32(bytes memory _bytes, uint256 _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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; import "../beacon/IBeaconUpgradeable.sol"; import "../../interfaces/IERC1967Upgradeable.sol"; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/StorageSlotUpgradeable.sol"; import "../utils/Initializable.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ */ abstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol) pragma solidity ^0.8.0; /** * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC. * * _Available since v4.8.3._ */ interface IERC1967Upgradeable { /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol) // This file was procedurally generated from scripts/generate/templates/StorageSlot.js. pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._ * _Available since v4.9 for `string`, `bytes`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } }
{ "remappings": [ "@openzeppelin/=node_modules/@openzeppelin/", "ds-test/=lib/forge-std/lib/ds-test/src/", "eth-gas-reporter/=node_modules/eth-gas-reporter/", "forge-std/=lib/forge-std/src/", "hardhat-deploy/=node_modules/hardhat-deploy/", "hardhat/=node_modules/hardhat/", "contract-evm/=lib/contract-evm/", "evm-cross-chain/=/", "safe/=lib/safe-contracts/contracts/", "@axelar-network/=node_modules/@axelar-network/", "erc4626-tests/=lib/contract-evm/lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "openzeppelin-contracts-upgradeable/=lib/contract-evm/lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/contract-evm/lib/openzeppelin-contracts/", "openzeppelin/=lib/contract-evm/lib/openzeppelin-contracts-upgradeable/contracts/", "safe-contracts/=lib/safe-contracts/" ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "paris", "viaIR": false, "libraries": {} }
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint8","name":"method","type":"uint8"},{"internalType":"uint8","name":"option","type":"uint8"},{"internalType":"uint8","name":"payloadDataType","type":"uint8"},{"internalType":"address","name":"srcCrossChainManager","type":"address"},{"internalType":"address","name":"dstCrossChainManager","type":"address"},{"internalType":"uint256","name":"srcChainId","type":"uint256"},{"internalType":"uint256","name":"dstChainId","type":"uint256"}],"indexed":false,"internalType":"struct OrderlyCrossChainMessage.MessageV1","name":"message","type":"tuple"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"}],"name":"MessageReceived","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint8","name":"method","type":"uint8"},{"internalType":"uint8","name":"option","type":"uint8"},{"internalType":"uint8","name":"payloadDataType","type":"uint8"},{"internalType":"address","name":"srcCrossChainManager","type":"address"},{"internalType":"address","name":"dstCrossChainManager","type":"address"},{"internalType":"uint256","name":"srcChainId","type":"uint256"},{"internalType":"uint256","name":"dstChainId","type":"uint256"}],"indexed":false,"internalType":"struct OrderlyCrossChainMessage.MessageV1","name":"message","type":"tuple"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"}],"name":"MessageSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"","type":"uint8"}],"name":"MsgReceived","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":[],"name":"Ping","type":"event"},{"anonymous":false,"inputs":[],"name":"Pong","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":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"DEFAULT_PAYLOAD_SIZE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_callers","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_chainIdMapping","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_crossChainManagerMapping","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_crossChainRelayMapping","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_currentChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"_flowGasLimitMapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"_lzChainIdMapping","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_managerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"addCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"uint16","name":"lzChainId","type":"uint16"}],"name":"addChainIdMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"crossChainManager","type":"address"}],"name":"addCrossChainManagerMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"crossChainRelay","type":"address"}],"name":"addCrossChainRelayMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"flow","type":"uint8"},{"internalType":"uint256","name":"gasLimit","type":"uint256"}],"name":"addFlowGasLimitMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"method","type":"uint8"},{"internalType":"uint8","name":"option","type":"uint8"},{"internalType":"uint8","name":"payloadDataType","type":"uint8"},{"internalType":"address","name":"srcCrossChainManager","type":"address"},{"internalType":"address","name":"dstCrossChainManager","type":"address"},{"internalType":"uint256","name":"srcChainId","type":"uint256"},{"internalType":"uint256","name":"dstChainId","type":"uint256"}],"internalType":"struct OrderlyCrossChainMessage.MessageV1","name":"data","type":"tuple"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"estimateGasFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"_endpoint","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"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":[{"internalType":"uint256","name":"dstChainId","type":"uint256"}],"name":"pingPong","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"precrime","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"method","type":"uint8"},{"internalType":"uint8","name":"option","type":"uint8"},{"internalType":"uint8","name":"payloadDataType","type":"uint8"},{"internalType":"address","name":"srcCrossChainManager","type":"address"},{"internalType":"address","name":"dstCrossChainManager","type":"address"},{"internalType":"uint256","name":"srcChainId","type":"uint256"},{"internalType":"uint256","name":"dstChainId","type":"uint256"}],"internalType":"struct OrderlyCrossChainMessage.MessageV1","name":"data","type":"tuple"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"receiveMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"removeCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"method","type":"uint8"},{"internalType":"uint8","name":"option","type":"uint8"},{"internalType":"uint8","name":"payloadDataType","type":"uint8"},{"internalType":"address","name":"srcCrossChainManager","type":"address"},{"internalType":"address","name":"dstCrossChainManager","type":"address"},{"internalType":"uint256","name":"srcChainId","type":"uint256"},{"internalType":"uint256","name":"dstChainId","type":"uint256"}],"internalType":"struct OrderlyCrossChainMessage.MessageV1","name":"data","type":"tuple"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"method","type":"uint8"},{"internalType":"uint8","name":"option","type":"uint8"},{"internalType":"uint8","name":"payloadDataType","type":"uint8"},{"internalType":"address","name":"srcCrossChainManager","type":"address"},{"internalType":"address","name":"dstCrossChainManager","type":"address"},{"internalType":"uint256","name":"srcChainId","type":"uint256"},{"internalType":"uint256","name":"dstChainId","type":"uint256"}],"internalType":"struct OrderlyCrossChainMessage.MessageV1","name":"data","type":"tuple"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"sendMessageWithFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"refundReceiver","type":"address"},{"components":[{"internalType":"uint8","name":"method","type":"uint8"},{"internalType":"uint8","name":"option","type":"uint8"},{"internalType":"uint8","name":"payloadDataType","type":"uint8"},{"internalType":"address","name":"srcCrossChainManager","type":"address"},{"internalType":"address","name":"dstCrossChainManager","type":"address"},{"internalType":"uint256","name":"srcChainId","type":"uint256"},{"internalType":"uint256","name":"dstChainId","type":"uint256"}],"internalType":"struct OrderlyCrossChainMessage.MessageV1","name":"data","type":"tuple"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"sendMessageWithFeeRefund","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":"address","name":"_address","type":"address"}],"name":"setManagerAddress","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":"uint256","name":"chainId","type":"uint256"}],"name":"setSrcChainId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","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":"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":[{"internalType":"address","name":"_endpoint","type":"address"}],"name":"updateEndpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawNativeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e7565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e5576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60805161382b6200011f60003960008181610d5401528181610d94015281816110230152818161106301526110f2015261382b6000f3fe6080604052600436106102e75760003560e01c80638da5cb5b11610190578063c4461834116100dc578063e107adec11610095578063eef21cd21161006f578063eef21cd21461096a578063f2fde38b1461098a578063f5a4fff5146109aa578063f5ecbdbc146109bd57600080fd5b8063e107adec146108f4578063e3c9674514610914578063eb8d72b71461094a57600080fd5b8063c446183414610806578063c4d66de81461081c578063c9696b9a1461083c578063cbed8b9c1461087e578063d53371821461089e578063df2a5b3b146108d457600080fd5b8063a6c3d16511610149578063ac3aeeb711610123578063ac3aeeb714610790578063b353aaa7146107a6578063ba858117146107c6578063baf3292d146107e657600080fd5b8063a6c3d16514610730578063a7170d4814610750578063a9b574291461077057600080fd5b80638da5cb5b1461066b578063950c8a741461069d5780639a86da78146106bd5780639f38369a146106dd578063a1e3a4bd146106fd578063a3b58f081461071057600080fd5b80634a51e1071161024f578063715018a6116102085780637533d788116101e25780637533d788146105af5780637dcb155d146105dc578063884fd85e146106205780638cfd8f5c1461063357600080fd5b8063715018a61461056757806371b3dcb31461057c578063747293fb1461058f57600080fd5b80634a51e107146104bf5780634f1ef286146104df57806352d1902d146104f2578063536c6bfa14610507578063641df3f9146105275780636451d2fc1461054757600080fd5b80632c34b3e5116102a15780632c34b3e5146103d55780633659cfe6146104025780633d8b38f6146104225780633f1f4fa414610452578063414319081461047f57806342d65a8d1461049f57600080fd5b80621d3567146102f357806301e336671461031557806307e0db17146103355780630b840e57146103555780630df374831461039557806310ddb137146103b557600080fd5b366102ee57005b600080fd5b3480156102ff57600080fd5b5061031361030e3660046129e7565b6109dd565b005b34801561032157600080fd5b50610313610330366004612a95565b610bf9565b34801561034157600080fd5b50610313610350366004612ad6565b610c7a565b34801561036157600080fd5b50610382610370366004612ad6565b60e46020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156103a157600080fd5b506103136103b0366004612af1565b610ce7565b3480156103c157600080fd5b506103136103d0366004612ad6565b610d06565b3480156103e157600080fd5b506103826103f0366004612b2a565b60e76020526000908152604090205481565b34801561040e57600080fd5b5061031361041d366004612b47565b610d42565b34801561042e57600080fd5b5061044261043d366004612b64565b610e20565b604051901515815260200161038c565b34801561045e57600080fd5b5061038261046d366004612ad6565b60686020526000908152604090205481565b34801561048b57600080fd5b5061031361049a366004612b47565b610eec565b3480156104ab57600080fd5b506103136104ba366004612b64565b610f2e565b3480156104cb57600080fd5b506103136104da366004612bb6565b610f98565b6103136104ed366004612cba565b611019565b3480156104fe57600080fd5b506103826110e5565b34801561051357600080fd5b50610313610522366004612d09565b611198565b34801561053357600080fd5b50610382610542366004612db8565b6111db565b34801561055357600080fd5b50610313610562366004612df1565b6112f9565b34801561057357600080fd5b50610313611330565b61031361058a366004612db8565b611344565b34801561059b57600080fd5b506103136105aa366004612b47565b611498565b3480156105bb57600080fd5b506105cf6105ca366004612ad6565b6114c4565b60405161038c9190612e6d565b3480156105e857600080fd5b5061060d6105f7366004612bb6565b60e36020526000908152604090205461ffff1681565b60405161ffff909116815260200161038c565b61031361062e366004612db8565b61155e565b34801561063f57600080fd5b5061038261064e366004612e80565b606760209081526000928352604080842090915290825290205481565b34801561067757600080fd5b506033546001600160a01b03165b6040516001600160a01b03909116815260200161038c565b3480156106a957600080fd5b50606954610685906001600160a01b031681565b3480156106c957600080fd5b5060e954610685906001600160a01b031681565b3480156106e957600080fd5b506105cf6106f8366004612ad6565b6116f3565b61031361070b366004612db8565b611809565b34801561071c57600080fd5b5061031361072b366004612eaa565b61191f565b34801561073c57600080fd5b5061031361074b366004612b64565b61193d565b34801561075c57600080fd5b5061031361076b366004612b47565b6119c6565b34801561077c57600080fd5b5061031361078b366004612ec8565b611a08565b34801561079c57600080fd5b5061038260e85481565b3480156107b257600080fd5b50606554610685906001600160a01b031681565b3480156107d257600080fd5b506103136107e1366004612ec8565b611a3e565b3480156107f257600080fd5b50610313610801366004612b47565b611a74565b34801561081257600080fd5b5061038261271081565b34801561082857600080fd5b50610313610837366004612b47565b611ad0565b34801561084857600080fd5b5061086c610857366004612b47565b60e26020526000908152604090205460ff1681565b60405160ff909116815260200161038c565b34801561088a57600080fd5b50610313610899366004612ef8565b611c2b565b3480156108aa57600080fd5b506106856108b9366004612bb6565b60e6602052600090815260409020546001600160a01b031681565b3480156108e057600080fd5b506103136108ef366004612f66565b611ca4565b34801561090057600080fd5b5061031361090f366004612bb6565b611d56565b34801561092057600080fd5b5061068561092f366004612bb6565b60e5602052600090815260409020546001600160a01b031681565b34801561095657600080fd5b50610313610965366004612b64565b611d63565b34801561097657600080fd5b50610313610985366004612b47565b611dbd565b34801561099657600080fd5b506103136109a5366004612b47565b611de6565b6103136109b8366004612fa2565b611e5c565b3480156109c957600080fd5b506105cf6109d8366004613004565b611f61565b6065546001600160a01b0316336001600160a01b031614610a455760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff861660009081526066602052604081208054610a6390613051565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8f90613051565b8015610adc5780601f10610ab157610100808354040283529160200191610adc565b820191906000526020600020905b815481529060010190602001808311610abf57829003601f168201915b50505050509050805186869050148015610af7575060008151115b8015610b1f575080516020820120604051610b15908890889061308b565b6040518091039020145b610b7a5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610a3c565b610bf08787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611ff692505050565b50505050505050565b610c016120bc565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015610c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c74919061309b565b50505050565b610c826120bc565b6065546040516307e0db1760e01b815261ffff831660048201526001600160a01b03909116906307e0db17906024015b600060405180830381600087803b158015610ccc57600080fd5b505af1158015610ce0573d6000803e3d6000fd5b5050505050565b610cef6120bc565b61ffff909116600090815260686020526040902055565b610d0e6120bc565b6065546040516310ddb13760e01b815261ffff831660048201526001600160a01b03909116906310ddb13790602401610cb2565b610d4a6120bc565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610d925760405162461bcd60e51b8152600401610a3c906130bd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610ddb6000805160206137af833981519152546001600160a01b031690565b6001600160a01b031614610e015760405162461bcd60e51b8152600401610a3c90613109565b60408051600080825260208201909252610e1d91839190612116565b50565b61ffff831660009081526066602052604081208054829190610e4190613051565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6d90613051565b8015610eba5780601f10610e8f57610100808354040283529160200191610eba565b820191906000526020600020905b815481529060010190602001808311610e9d57829003601f168201915b505050505090508383604051610ed192919061308b565b60405180910390208180519060200120149150509392505050565b610ef46120bc565b60e980546001600160a01b039092166001600160a01b031990921682179055600090815260e260205260409020805460ff19166001179055565b610f366120bc565b6065546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d90610f6a9086908690869060040161317e565b600060405180830381600087803b158015610f8457600080fd5b505af1158015610bf0573d6000803e3d6000fd5b610fa06120bc565b6040805160e081019091526000908060045b60ff168152602001600060ff168152602001600060ff16815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160e8548152602001838152509050611015816040518060200160405280600081525061155e565b5050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036110615760405162461bcd60e51b8152600401610a3c906130bd565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110aa6000805160206137af833981519152546001600160a01b031690565b6001600160a01b0316146110d05760405162461bcd60e51b8152600401610a3c90613109565b6110d982612281565b61101582826001612116565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111855760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a3c565b506000805160206137af83398151915290565b6111a06120bc565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156111d6573d6000803e3d6000fd5b505050565b60c0820151600090815260e3602052604081205461ffff16816111fe8585612289565b90508161ffff166000036112245760405162461bcd60e51b8152600401610a3c9061319c565b845160ff16600090815260e760205260408120546001918190036112485750622dc6c05b6000828260405160200161125d9291906131e1565b60408051601f198184030181529082905260655463040a7bb160e41b83529092506000916001600160a01b03909116906340a7bb10906112a990899030908a90879089906004016131fe565b6040805180830381865afa1580156112c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e99190613252565b5096505050505050505b92915050565b6113016120bc565b600082815260e360209081526040808320805461ffff90951661ffff199095168517905592825260e490522055565b6113386120bc565b61134260006122b5565b565b33600090815260e2602052604090205460ff166001146113765760405162461bcd60e51b8152600401610a3c90613276565b7fe9bfff0ce8cf616f88426fbf0d63e946ca8b38be00435b3a5f231d98c24988ca82826040516113a79291906132ad565b60405180910390a1815160ff16600319016113f6576113c98260a00151612307565b6040517f4d015fcc2a20c24d7be893b3a525eac864b5a53a5f88ef7201a600465c73314e90600090a15050565b815160ff1660021901611430576040517fca6e822df923f741dfe968d15d80a18abd25bd1e748bcb9ad81fea5bbb7386af90600090a15050565b60e9546040516371b3dcb360e01b81526001600160a01b03909116906371b3dcb39061146290859085906004016132ad565b600060405180830381600087803b15801561147c57600080fd5b505af1158015611490573d6000803e3d6000fd5b505050505050565b6114a06120bc565b6001600160a01b0316600090815260e260205260409020805460ff19166001179055565b606660205260009081526040902080546114dd90613051565b80601f016020809104026020016040519081016040528092919081815260200182805461150990613051565b80156115565780601f1061152b57610100808354040283529160200191611556565b820191906000526020600020905b81548152906001019060200180831161153957829003601f168201915b505050505081565b33600090815260e2602052604090205460ff166001146115905760405162461bcd60e51b8152600401610a3c90613276565b600061159c8383612289565b60c0840151600090815260e3602052604081205491925061ffff909116908190036115d95760405162461bcd60e51b8152600401610a3c9061319c565b835160ff16600090815260e760205260408120546001918190036115fd5750622dc6c05b600082826040516020016116129291906131e1565b60408051601f198184030181529082905260655463040a7bb160e41b83529092506000916001600160a01b03909116906340a7bb109061165e90889030908b90879089906004016131fe565b6040805180830381865afa15801561167a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169e9190613252565b5090506116b08587306000868661231d565b7fc48902bcedcd43e775943404128335d3d202897bed101087f8b7bebf26bb790388886040516116e19291906132ad565b60405180910390a15050505050505050565b61ffff811660009081526066602052604081208054606092919061171690613051565b80601f016020809104026020016040519081016040528092919081815260200182805461174290613051565b801561178f5780601f106117645761010080835404028352916020019161178f565b820191906000526020600020905b81548152906001019060200180831161177257829003601f168201915b5050505050905080516000036117e75760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610a3c565b6118026000601483516117fa919061333a565b8391906124a6565b9392505050565b33600090815260e2602052604090205460ff1660011461183b5760405162461bcd60e51b8152600401610a3c90613276565b60006118478383612289565b60c0840151600090815260e3602052604081205491925061ffff909116908190036118845760405162461bcd60e51b8152600401610a3c9061319c565b835160ff16600090815260e760205260408120546001918190036118a85750622dc6c05b600082826040516020016118bd9291906131e1565b60405160208183030381529060405290506118dd8486306000853461231d565b7fc48902bcedcd43e775943404128335d3d202897bed101087f8b7bebf26bb7903878760405161190e9291906132ad565b60405180910390a150505050505050565b6119276120bc565b60ff909116600090815260e76020526040902055565b6119456120bc565b81813060405160200161195a9392919061334d565b60408051601f1981840301815291815261ffff851660009081526066602052209061198590826133b9565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce8383836040516119b99392919061317e565b60405180910390a1505050565b6119ce6120bc565b606580546001600160a01b039092166001600160a01b031990921682179055600090815260e260205260409020805460ff19166001179055565b611a106120bc565b600091825260e6602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b611a466120bc565b600091825260e5602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b611a7c6120bc565b606980546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b600054610100900460ff1615808015611af05750600054600160ff909116105b80611b0a5750303b158015611b0a575060005460ff166001145b611b6d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a3c565b6000805460ff191660011790558015611b90576000805461ff0019166101001790555b611b986125b3565b611ba06125e2565b611ba982612609565b33600090815260e260205260408082208054600160ff1991821681179092556001600160a01b038616845291909220805490911690911790558015611015576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b611c336120bc565b6065546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c90611c6b9088908890889088908890600401613478565b600060405180830381600087803b158015611c8557600080fd5b505af1158015611c99573d6000803e3d6000fd5b505050505050505050565b611cac6120bc565b60008111611cf45760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610a3c565b61ffff83811660008181526067602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0906060016119b9565b611d5e6120bc565b60e855565b611d6b6120bc565b61ffff83166000908152606660205260409020611d898284836134b1565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab8383836040516119b99392919061317e565b611dc56120bc565b6001600160a01b0316600090815260e260205260409020805460ff19169055565b611dee6120bc565b6001600160a01b038116611e535760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3c565b610e1d816122b5565b33600090815260e2602052604090205460ff16600114611e8e5760405162461bcd60e51b8152600401610a3c90613276565b6000611e9a8383612289565b60c0840151600090815260e3602052604081205491925061ffff90911690819003611ed75760405162461bcd60e51b8152600401610a3c9061319c565b835160ff16600090815260e76020526040812054600191819003611efb5750622dc6c05b60008282604051602001611f109291906131e1565b6040516020818303038152906040529050611f3084868a6000853461231d565b7fc48902bcedcd43e775943404128335d3d202897bed101087f8b7bebf26bb790387876040516116e19291906132ad565b606554604051633d7b2f6f60e21b815261ffff808716600483015285166024820152306044820152606481018390526060916001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015611fc3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611feb91908101906135b5565b90505b949350505050565b61ffff8416600090815260e46020526040812054908190036120685760405162461bcd60e51b815260206004820152602560248201527f43726f7373436861696e52656c61793a20696e76616c696420737263206368616044820152641a5b881a5960da1b6064820152608401610a3c565b60008061207484612652565b815160405160ff909116815291935091507faa94d9569e3433bf82e1bc5e7538f0daf5888f56b8a72f11b46bdd1389f9e8c69060200160405180910390a1610bf08282611344565b6033546001600160a01b031633146113425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a3c565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612149576111d6836126b0565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156121a3575060408051601f3d908101601f191682019092526121a0918101906135e9565b60015b6122065760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610a3c565b6000805160206137af83398151915281146122755760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610a3c565b506111d683838361274c565b610e1d6120bc565b6060828260405160200161229e9291906132ad565b604051602081830303815290604052905092915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160e08101909152600090806003610fb2565b61ffff86166000908152606660205260408120805461233b90613051565b80601f016020809104026020016040519081016040528092919081815260200182805461236790613051565b80156123b45780601f10612389576101008083540402835291602001916123b4565b820191906000526020600020905b81548152906001019060200180831161239757829003601f168201915b5050505050905080516000036124255760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610a3c565b612430878751612771565b60655460405162c5803160e81b81526001600160a01b039091169063c580310090849061246b908b9086908c908c908c908c90600401613602565b6000604051808303818588803b15801561248457600080fd5b505af1158015612498573d6000803e3d6000fd5b505050505050505050505050565b6060816124b481601f613669565b10156124f35760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610a3c565b6124fd8284613669565b845110156125415760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610a3c565b60608215801561256057604051915060008252602082016040526125aa565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612599578051835260209283019201612581565b5050858452601f01601f1916604052505b50949350505050565b600054610100900460ff166125da5760405162461bcd60e51b8152600401610a3c9061367c565b6113426127e2565b600054610100900460ff166113425760405162461bcd60e51b8152600401610a3c9061367c565b600054610100900460ff166126305760405162461bcd60e51b8152600401610a3c9061367c565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526060600080848060200190518101906126a491906136d2565b90969095509350505050565b6001600160a01b0381163b61271d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610a3c565b6000805160206137af83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61275583612812565b6000825111806127625750805b156111d657610c748383612852565b61ffff82166000908152606860205260408120549081900361279257506127105b808211156111d65760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610a3c565b600054610100900460ff166128095760405162461bcd60e51b8152600401610a3c9061367c565b611342336122b5565b61281b816126b0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061180283836040518060600160405280602781526020016137cf602791396060600080856001600160a01b03168560405161288f9190613792565b600060405180830381855af49150503d80600081146128ca576040519150601f19603f3d011682016040523d82523d6000602084013e6128cf565b606091505b50915091506128e0868383876128ea565b9695505050505050565b60608315612959578251600003612952576001600160a01b0385163b6129525760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a3c565b5081611fee565b611fee838381511561296e5781518083602001fd5b8060405162461bcd60e51b8152600401610a3c9190612e6d565b803561ffff8116811461299a57600080fd5b919050565b60008083601f8401126129b157600080fd5b5081356001600160401b038111156129c857600080fd5b6020830191508360208285010111156129e057600080fd5b9250929050565b60008060008060008060808789031215612a0057600080fd5b612a0987612988565b955060208701356001600160401b0380821115612a2557600080fd5b612a318a838b0161299f565b9097509550604089013591508082168214612a4b57600080fd5b90935060608801359080821115612a6157600080fd5b50612a6e89828a0161299f565b979a9699509497509295939492505050565b6001600160a01b0381168114610e1d57600080fd5b600080600060608486031215612aaa57600080fd5b8335612ab581612a80565b92506020840135612ac581612a80565b929592945050506040919091013590565b600060208284031215612ae857600080fd5b61180282612988565b60008060408385031215612b0457600080fd5b612b0d83612988565b946020939093013593505050565b60ff81168114610e1d57600080fd5b600060208284031215612b3c57600080fd5b813561180281612b1b565b600060208284031215612b5957600080fd5b813561180281612a80565b600080600060408486031215612b7957600080fd5b612b8284612988565b925060208401356001600160401b03811115612b9d57600080fd5b612ba98682870161299f565b9497909650939450505050565b600060208284031215612bc857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715612c0757612c07612bcf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612c3557612c35612bcf565b604052919050565b60006001600160401b03821115612c5657612c56612bcf565b50601f01601f191660200190565b600082601f830112612c7557600080fd5b8135612c88612c8382612c3d565b612c0d565b818152846020838601011115612c9d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215612ccd57600080fd5b8235612cd881612a80565b915060208301356001600160401b03811115612cf357600080fd5b612cff85828601612c64565b9150509250929050565b60008060408385031215612d1c57600080fd5b8235612b0d81612a80565b600060e08284031215612d3957600080fd5b612d41612be5565b90508135612d4e81612b1b565b81526020820135612d5e81612b1b565b60208201526040820135612d7181612b1b565b60408201526060820135612d8481612a80565b60608201526080820135612d9781612a80565b8060808301525060a082013560a082015260c082013560c082015292915050565b6000806101008385031215612dcc57600080fd5b612dd68484612d27565b915060e08301356001600160401b03811115612cf357600080fd5b60008060408385031215612e0457600080fd5b82359150612e1460208401612988565b90509250929050565b60005b83811015612e38578181015183820152602001612e20565b50506000910152565b60008151808452612e59816020860160208601612e1d565b601f01601f19169290920160200192915050565b6020815260006118026020830184612e41565b60008060408385031215612e9357600080fd5b612e9c83612988565b9150612e1460208401612988565b60008060408385031215612ebd57600080fd5b8235612b0d81612b1b565b60008060408385031215612edb57600080fd5b823591506020830135612eed81612a80565b809150509250929050565b600080600080600060808688031215612f1057600080fd5b612f1986612988565b9450612f2760208701612988565b93506040860135925060608601356001600160401b03811115612f4957600080fd5b612f558882890161299f565b969995985093965092949392505050565b600080600060608486031215612f7b57600080fd5b612f8484612988565b9250612f9260208501612988565b9150604084013590509250925092565b60008060006101208486031215612fb857600080fd5b8335612fc381612a80565b9250612fd28560208601612d27565b91506101008401356001600160401b03811115612fee57600080fd5b612ffa86828701612c64565b9150509250925092565b6000806000806080858703121561301a57600080fd5b61302385612988565b935061303160208601612988565b9250604085013561304181612a80565b9396929550929360600135925050565b600181811c9082168061306557607f821691505b60208210810361308557634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b6000602082840312156130ad57600080fd5b8151801515811461180257600080fd5b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000611feb604083018486613155565b60208082526025908201527f43726f7373436861696e52656c61793a20696e76616c696420647374206368616040820152641a5b881a5960da1b606082015260800190565b60f09290921b6001600160f01b0319168252600282015260220190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061322c90830186612e41565b841515606084015282810360808401526132468185612e41565b98975050505050505050565b6000806040838503121561326557600080fd5b505080516020909101519092909150565b6020808252601b908201527f4974206973206e6f74206120747275737465642063616c6c65722e0000000000604082015260600190565b600061010060ff855116835260ff602086015116602084015260ff6040860151166040840152606085015160018060a01b038082166060860152806080880151166080860152505060a085015160a084015260c085015160c08401528060e084015261331b81840185612e41565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112f3576112f3613324565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f8211156111d657600081815260208120601f850160051c8101602086101561339a5750805b601f850160051c820191505b81811015611490578281556001016133a6565b81516001600160401b038111156133d2576133d2612bcf565b6133e6816133e08454613051565b84613373565b602080601f83116001811461341b57600084156134035750858301515b600019600386901b1c1916600185901b178555611490565b600085815260208120601f198616915b8281101561344a5788860151825594840194600190910190840161342b565b50858210156134685787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff8088168352808716602084015250846040830152608060608301526134a6608083018486613155565b979650505050505050565b6001600160401b038311156134c8576134c8612bcf565b6134dc836134d68354613051565b83613373565b6000601f84116001811461351057600085156134f85750838201355b600019600387901b1c1916600186901b178355610ce0565b600083815260209020601f19861690835b828110156135415786850135825560209485019460019092019101613521565b508682101561355e5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600082601f83011261358157600080fd5b815161358f612c8382612c3d565b8181528460208386010111156135a457600080fd5b611fee826020830160208701612e1d565b6000602082840312156135c757600080fd5b81516001600160401b038111156135dd57600080fd5b611fee84828501613570565b6000602082840312156135fb57600080fd5b5051919050565b61ffff8716815260c06020820152600061361f60c0830188612e41565b82810360408401526136318188612e41565b6001600160a01b0387811660608601528616608085015283810360a0850152905061365c8185612e41565b9998505050505050505050565b808201808211156112f3576112f3613324565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b805161299a81612a80565b6000808284036101008112156136e757600080fd5b60e08112156136f557600080fd5b506136fe612be5565b835161370981612b1b565b8152602084015161371981612b1b565b6020820152604084015161372c81612b1b565b6040820152606084015161373f81612a80565b6060820152613750608085016136c7565b608082015260a084015160a082015260c084015160c08201528092505060e08301516001600160401b0381111561378657600080fd5b612cff85828601613570565b600082516137a4818460208701612e1d565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220af62c80b79040e5f9482c0160bb3cfa3c1e385635c118c583d9ebd039a152ad964736f6c63430008130033
Deployed Bytecode
0x6080604052600436106102e75760003560e01c80638da5cb5b11610190578063c4461834116100dc578063e107adec11610095578063eef21cd21161006f578063eef21cd21461096a578063f2fde38b1461098a578063f5a4fff5146109aa578063f5ecbdbc146109bd57600080fd5b8063e107adec146108f4578063e3c9674514610914578063eb8d72b71461094a57600080fd5b8063c446183414610806578063c4d66de81461081c578063c9696b9a1461083c578063cbed8b9c1461087e578063d53371821461089e578063df2a5b3b146108d457600080fd5b8063a6c3d16511610149578063ac3aeeb711610123578063ac3aeeb714610790578063b353aaa7146107a6578063ba858117146107c6578063baf3292d146107e657600080fd5b8063a6c3d16514610730578063a7170d4814610750578063a9b574291461077057600080fd5b80638da5cb5b1461066b578063950c8a741461069d5780639a86da78146106bd5780639f38369a146106dd578063a1e3a4bd146106fd578063a3b58f081461071057600080fd5b80634a51e1071161024f578063715018a6116102085780637533d788116101e25780637533d788146105af5780637dcb155d146105dc578063884fd85e146106205780638cfd8f5c1461063357600080fd5b8063715018a61461056757806371b3dcb31461057c578063747293fb1461058f57600080fd5b80634a51e107146104bf5780634f1ef286146104df57806352d1902d146104f2578063536c6bfa14610507578063641df3f9146105275780636451d2fc1461054757600080fd5b80632c34b3e5116102a15780632c34b3e5146103d55780633659cfe6146104025780633d8b38f6146104225780633f1f4fa414610452578063414319081461047f57806342d65a8d1461049f57600080fd5b80621d3567146102f357806301e336671461031557806307e0db17146103355780630b840e57146103555780630df374831461039557806310ddb137146103b557600080fd5b366102ee57005b600080fd5b3480156102ff57600080fd5b5061031361030e3660046129e7565b6109dd565b005b34801561032157600080fd5b50610313610330366004612a95565b610bf9565b34801561034157600080fd5b50610313610350366004612ad6565b610c7a565b34801561036157600080fd5b50610382610370366004612ad6565b60e46020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156103a157600080fd5b506103136103b0366004612af1565b610ce7565b3480156103c157600080fd5b506103136103d0366004612ad6565b610d06565b3480156103e157600080fd5b506103826103f0366004612b2a565b60e76020526000908152604090205481565b34801561040e57600080fd5b5061031361041d366004612b47565b610d42565b34801561042e57600080fd5b5061044261043d366004612b64565b610e20565b604051901515815260200161038c565b34801561045e57600080fd5b5061038261046d366004612ad6565b60686020526000908152604090205481565b34801561048b57600080fd5b5061031361049a366004612b47565b610eec565b3480156104ab57600080fd5b506103136104ba366004612b64565b610f2e565b3480156104cb57600080fd5b506103136104da366004612bb6565b610f98565b6103136104ed366004612cba565b611019565b3480156104fe57600080fd5b506103826110e5565b34801561051357600080fd5b50610313610522366004612d09565b611198565b34801561053357600080fd5b50610382610542366004612db8565b6111db565b34801561055357600080fd5b50610313610562366004612df1565b6112f9565b34801561057357600080fd5b50610313611330565b61031361058a366004612db8565b611344565b34801561059b57600080fd5b506103136105aa366004612b47565b611498565b3480156105bb57600080fd5b506105cf6105ca366004612ad6565b6114c4565b60405161038c9190612e6d565b3480156105e857600080fd5b5061060d6105f7366004612bb6565b60e36020526000908152604090205461ffff1681565b60405161ffff909116815260200161038c565b61031361062e366004612db8565b61155e565b34801561063f57600080fd5b5061038261064e366004612e80565b606760209081526000928352604080842090915290825290205481565b34801561067757600080fd5b506033546001600160a01b03165b6040516001600160a01b03909116815260200161038c565b3480156106a957600080fd5b50606954610685906001600160a01b031681565b3480156106c957600080fd5b5060e954610685906001600160a01b031681565b3480156106e957600080fd5b506105cf6106f8366004612ad6565b6116f3565b61031361070b366004612db8565b611809565b34801561071c57600080fd5b5061031361072b366004612eaa565b61191f565b34801561073c57600080fd5b5061031361074b366004612b64565b61193d565b34801561075c57600080fd5b5061031361076b366004612b47565b6119c6565b34801561077c57600080fd5b5061031361078b366004612ec8565b611a08565b34801561079c57600080fd5b5061038260e85481565b3480156107b257600080fd5b50606554610685906001600160a01b031681565b3480156107d257600080fd5b506103136107e1366004612ec8565b611a3e565b3480156107f257600080fd5b50610313610801366004612b47565b611a74565b34801561081257600080fd5b5061038261271081565b34801561082857600080fd5b50610313610837366004612b47565b611ad0565b34801561084857600080fd5b5061086c610857366004612b47565b60e26020526000908152604090205460ff1681565b60405160ff909116815260200161038c565b34801561088a57600080fd5b50610313610899366004612ef8565b611c2b565b3480156108aa57600080fd5b506106856108b9366004612bb6565b60e6602052600090815260409020546001600160a01b031681565b3480156108e057600080fd5b506103136108ef366004612f66565b611ca4565b34801561090057600080fd5b5061031361090f366004612bb6565b611d56565b34801561092057600080fd5b5061068561092f366004612bb6565b60e5602052600090815260409020546001600160a01b031681565b34801561095657600080fd5b50610313610965366004612b64565b611d63565b34801561097657600080fd5b50610313610985366004612b47565b611dbd565b34801561099657600080fd5b506103136109a5366004612b47565b611de6565b6103136109b8366004612fa2565b611e5c565b3480156109c957600080fd5b506105cf6109d8366004613004565b611f61565b6065546001600160a01b0316336001600160a01b031614610a455760405162461bcd60e51b815260206004820152601e60248201527f4c7a4170703a20696e76616c696420656e64706f696e742063616c6c6572000060448201526064015b60405180910390fd5b61ffff861660009081526066602052604081208054610a6390613051565b80601f0160208091040260200160405190810160405280929190818152602001828054610a8f90613051565b8015610adc5780601f10610ab157610100808354040283529160200191610adc565b820191906000526020600020905b815481529060010190602001808311610abf57829003601f168201915b50505050509050805186869050148015610af7575060008151115b8015610b1f575080516020820120604051610b15908890889061308b565b6040518091039020145b610b7a5760405162461bcd60e51b815260206004820152602660248201527f4c7a4170703a20696e76616c696420736f757263652073656e64696e6720636f6044820152651b9d1c9858dd60d21b6064820152608401610a3c565b610bf08787878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8a018190048102820181019092528881528a935091508890889081908401838280828437600092019190915250611ff692505050565b50505050505050565b610c016120bc565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af1158015610c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c74919061309b565b50505050565b610c826120bc565b6065546040516307e0db1760e01b815261ffff831660048201526001600160a01b03909116906307e0db17906024015b600060405180830381600087803b158015610ccc57600080fd5b505af1158015610ce0573d6000803e3d6000fd5b5050505050565b610cef6120bc565b61ffff909116600090815260686020526040902055565b610d0e6120bc565b6065546040516310ddb13760e01b815261ffff831660048201526001600160a01b03909116906310ddb13790602401610cb2565b610d4a6120bc565b6001600160a01b037f000000000000000000000000a1645c9d6fb50680a77ccc95b38666ab16af9e4c163003610d925760405162461bcd60e51b8152600401610a3c906130bd565b7f000000000000000000000000a1645c9d6fb50680a77ccc95b38666ab16af9e4c6001600160a01b0316610ddb6000805160206137af833981519152546001600160a01b031690565b6001600160a01b031614610e015760405162461bcd60e51b8152600401610a3c90613109565b60408051600080825260208201909252610e1d91839190612116565b50565b61ffff831660009081526066602052604081208054829190610e4190613051565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6d90613051565b8015610eba5780601f10610e8f57610100808354040283529160200191610eba565b820191906000526020600020905b815481529060010190602001808311610e9d57829003601f168201915b505050505090508383604051610ed192919061308b565b60405180910390208180519060200120149150509392505050565b610ef46120bc565b60e980546001600160a01b039092166001600160a01b031990921682179055600090815260e260205260409020805460ff19166001179055565b610f366120bc565b6065546040516342d65a8d60e01b81526001600160a01b03909116906342d65a8d90610f6a9086908690869060040161317e565b600060405180830381600087803b158015610f8457600080fd5b505af1158015610bf0573d6000803e3d6000fd5b610fa06120bc565b6040805160e081019091526000908060045b60ff168152602001600060ff168152602001600060ff16815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160e8548152602001838152509050611015816040518060200160405280600081525061155e565b5050565b6001600160a01b037f000000000000000000000000a1645c9d6fb50680a77ccc95b38666ab16af9e4c1630036110615760405162461bcd60e51b8152600401610a3c906130bd565b7f000000000000000000000000a1645c9d6fb50680a77ccc95b38666ab16af9e4c6001600160a01b03166110aa6000805160206137af833981519152546001600160a01b031690565b6001600160a01b0316146110d05760405162461bcd60e51b8152600401610a3c90613109565b6110d982612281565b61101582826001612116565b6000306001600160a01b037f000000000000000000000000a1645c9d6fb50680a77ccc95b38666ab16af9e4c16146111855760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610a3c565b506000805160206137af83398151915290565b6111a06120bc565b6040516001600160a01b0383169082156108fc029083906000818181858888f193505050501580156111d6573d6000803e3d6000fd5b505050565b60c0820151600090815260e3602052604081205461ffff16816111fe8585612289565b90508161ffff166000036112245760405162461bcd60e51b8152600401610a3c9061319c565b845160ff16600090815260e760205260408120546001918190036112485750622dc6c05b6000828260405160200161125d9291906131e1565b60408051601f198184030181529082905260655463040a7bb160e41b83529092506000916001600160a01b03909116906340a7bb10906112a990899030908a90879089906004016131fe565b6040805180830381865afa1580156112c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e99190613252565b5096505050505050505b92915050565b6113016120bc565b600082815260e360209081526040808320805461ffff90951661ffff199095168517905592825260e490522055565b6113386120bc565b61134260006122b5565b565b33600090815260e2602052604090205460ff166001146113765760405162461bcd60e51b8152600401610a3c90613276565b7fe9bfff0ce8cf616f88426fbf0d63e946ca8b38be00435b3a5f231d98c24988ca82826040516113a79291906132ad565b60405180910390a1815160ff16600319016113f6576113c98260a00151612307565b6040517f4d015fcc2a20c24d7be893b3a525eac864b5a53a5f88ef7201a600465c73314e90600090a15050565b815160ff1660021901611430576040517fca6e822df923f741dfe968d15d80a18abd25bd1e748bcb9ad81fea5bbb7386af90600090a15050565b60e9546040516371b3dcb360e01b81526001600160a01b03909116906371b3dcb39061146290859085906004016132ad565b600060405180830381600087803b15801561147c57600080fd5b505af1158015611490573d6000803e3d6000fd5b505050505050565b6114a06120bc565b6001600160a01b0316600090815260e260205260409020805460ff19166001179055565b606660205260009081526040902080546114dd90613051565b80601f016020809104026020016040519081016040528092919081815260200182805461150990613051565b80156115565780601f1061152b57610100808354040283529160200191611556565b820191906000526020600020905b81548152906001019060200180831161153957829003601f168201915b505050505081565b33600090815260e2602052604090205460ff166001146115905760405162461bcd60e51b8152600401610a3c90613276565b600061159c8383612289565b60c0840151600090815260e3602052604081205491925061ffff909116908190036115d95760405162461bcd60e51b8152600401610a3c9061319c565b835160ff16600090815260e760205260408120546001918190036115fd5750622dc6c05b600082826040516020016116129291906131e1565b60408051601f198184030181529082905260655463040a7bb160e41b83529092506000916001600160a01b03909116906340a7bb109061165e90889030908b90879089906004016131fe565b6040805180830381865afa15801561167a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169e9190613252565b5090506116b08587306000868661231d565b7fc48902bcedcd43e775943404128335d3d202897bed101087f8b7bebf26bb790388886040516116e19291906132ad565b60405180910390a15050505050505050565b61ffff811660009081526066602052604081208054606092919061171690613051565b80601f016020809104026020016040519081016040528092919081815260200182805461174290613051565b801561178f5780601f106117645761010080835404028352916020019161178f565b820191906000526020600020905b81548152906001019060200180831161177257829003601f168201915b5050505050905080516000036117e75760405162461bcd60e51b815260206004820152601d60248201527f4c7a4170703a206e6f20747275737465642070617468207265636f72640000006044820152606401610a3c565b6118026000601483516117fa919061333a565b8391906124a6565b9392505050565b33600090815260e2602052604090205460ff1660011461183b5760405162461bcd60e51b8152600401610a3c90613276565b60006118478383612289565b60c0840151600090815260e3602052604081205491925061ffff909116908190036118845760405162461bcd60e51b8152600401610a3c9061319c565b835160ff16600090815260e760205260408120546001918190036118a85750622dc6c05b600082826040516020016118bd9291906131e1565b60405160208183030381529060405290506118dd8486306000853461231d565b7fc48902bcedcd43e775943404128335d3d202897bed101087f8b7bebf26bb7903878760405161190e9291906132ad565b60405180910390a150505050505050565b6119276120bc565b60ff909116600090815260e76020526040902055565b6119456120bc565b81813060405160200161195a9392919061334d565b60408051601f1981840301815291815261ffff851660009081526066602052209061198590826133b9565b507f8c0400cfe2d1199b1a725c78960bcc2a344d869b80590d0f2bd005db15a572ce8383836040516119b99392919061317e565b60405180910390a1505050565b6119ce6120bc565b606580546001600160a01b039092166001600160a01b031990921682179055600090815260e260205260409020805460ff19166001179055565b611a106120bc565b600091825260e6602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b611a466120bc565b600091825260e5602052604090912080546001600160a01b0319166001600160a01b03909216919091179055565b611a7c6120bc565b606980546001600160a01b0319166001600160a01b0383169081179091556040519081527f5db758e995a17ec1ad84bdef7e8c3293a0bd6179bcce400dff5d4c3d87db726b9060200160405180910390a150565b600054610100900460ff1615808015611af05750600054600160ff909116105b80611b0a5750303b158015611b0a575060005460ff166001145b611b6d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a3c565b6000805460ff191660011790558015611b90576000805461ff0019166101001790555b611b986125b3565b611ba06125e2565b611ba982612609565b33600090815260e260205260408082208054600160ff1991821681179092556001600160a01b038616845291909220805490911690911790558015611015576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b611c336120bc565b6065546040516332fb62e760e21b81526001600160a01b039091169063cbed8b9c90611c6b9088908890889088908890600401613478565b600060405180830381600087803b158015611c8557600080fd5b505af1158015611c99573d6000803e3d6000fd5b505050505050505050565b611cac6120bc565b60008111611cf45760405162461bcd60e51b81526020600482015260156024820152744c7a4170703a20696e76616c6964206d696e47617360581b6044820152606401610a3c565b61ffff83811660008181526067602090815260408083209487168084529482529182902085905581519283528201929092529081018290527f9d5c7c0b934da8fefa9c7760c98383778a12dfbfc0c3b3106518f43fb9508ac0906060016119b9565b611d5e6120bc565b60e855565b611d6b6120bc565b61ffff83166000908152606660205260409020611d898284836134b1565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab8383836040516119b99392919061317e565b611dc56120bc565b6001600160a01b0316600090815260e260205260409020805460ff19169055565b611dee6120bc565b6001600160a01b038116611e535760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a3c565b610e1d816122b5565b33600090815260e2602052604090205460ff16600114611e8e5760405162461bcd60e51b8152600401610a3c90613276565b6000611e9a8383612289565b60c0840151600090815260e3602052604081205491925061ffff90911690819003611ed75760405162461bcd60e51b8152600401610a3c9061319c565b835160ff16600090815260e76020526040812054600191819003611efb5750622dc6c05b60008282604051602001611f109291906131e1565b6040516020818303038152906040529050611f3084868a6000853461231d565b7fc48902bcedcd43e775943404128335d3d202897bed101087f8b7bebf26bb790387876040516116e19291906132ad565b606554604051633d7b2f6f60e21b815261ffff808716600483015285166024820152306044820152606481018390526060916001600160a01b03169063f5ecbdbc90608401600060405180830381865afa158015611fc3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611feb91908101906135b5565b90505b949350505050565b61ffff8416600090815260e46020526040812054908190036120685760405162461bcd60e51b815260206004820152602560248201527f43726f7373436861696e52656c61793a20696e76616c696420737263206368616044820152641a5b881a5960da1b6064820152608401610a3c565b60008061207484612652565b815160405160ff909116815291935091507faa94d9569e3433bf82e1bc5e7538f0daf5888f56b8a72f11b46bdd1389f9e8c69060200160405180910390a1610bf08282611344565b6033546001600160a01b031633146113425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a3c565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612149576111d6836126b0565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156121a3575060408051601f3d908101601f191682019092526121a0918101906135e9565b60015b6122065760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610a3c565b6000805160206137af83398151915281146122755760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610a3c565b506111d683838361274c565b610e1d6120bc565b6060828260405160200161229e9291906132ad565b604051602081830303815290604052905092915050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160e08101909152600090806003610fb2565b61ffff86166000908152606660205260408120805461233b90613051565b80601f016020809104026020016040519081016040528092919081815260200182805461236790613051565b80156123b45780601f10612389576101008083540402835291602001916123b4565b820191906000526020600020905b81548152906001019060200180831161239757829003601f168201915b5050505050905080516000036124255760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b6064820152608401610a3c565b612430878751612771565b60655460405162c5803160e81b81526001600160a01b039091169063c580310090849061246b908b9086908c908c908c908c90600401613602565b6000604051808303818588803b15801561248457600080fd5b505af1158015612498573d6000803e3d6000fd5b505050505050505050505050565b6060816124b481601f613669565b10156124f35760405162461bcd60e51b815260206004820152600e60248201526d736c6963655f6f766572666c6f7760901b6044820152606401610a3c565b6124fd8284613669565b845110156125415760405162461bcd60e51b8152602060048201526011602482015270736c6963655f6f75744f66426f756e647360781b6044820152606401610a3c565b60608215801561256057604051915060008252602082016040526125aa565b6040519150601f8416801560200281840101858101878315602002848b0101015b81831015612599578051835260209283019201612581565b5050858452601f01601f1916604052505b50949350505050565b600054610100900460ff166125da5760405162461bcd60e51b8152600401610a3c9061367c565b6113426127e2565b600054610100900460ff166113425760405162461bcd60e51b8152600401610a3c9061367c565b600054610100900460ff166126305760405162461bcd60e51b8152600401610a3c9061367c565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526060600080848060200190518101906126a491906136d2565b90969095509350505050565b6001600160a01b0381163b61271d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610a3c565b6000805160206137af83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61275583612812565b6000825111806127625750805b156111d657610c748383612852565b61ffff82166000908152606860205260408120549081900361279257506127105b808211156111d65760405162461bcd60e51b815260206004820181905260248201527f4c7a4170703a207061796c6f61642073697a6520697320746f6f206c617267656044820152606401610a3c565b600054610100900460ff166128095760405162461bcd60e51b8152600401610a3c9061367c565b611342336122b5565b61281b816126b0565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b606061180283836040518060600160405280602781526020016137cf602791396060600080856001600160a01b03168560405161288f9190613792565b600060405180830381855af49150503d80600081146128ca576040519150601f19603f3d011682016040523d82523d6000602084013e6128cf565b606091505b50915091506128e0868383876128ea565b9695505050505050565b60608315612959578251600003612952576001600160a01b0385163b6129525760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a3c565b5081611fee565b611fee838381511561296e5781518083602001fd5b8060405162461bcd60e51b8152600401610a3c9190612e6d565b803561ffff8116811461299a57600080fd5b919050565b60008083601f8401126129b157600080fd5b5081356001600160401b038111156129c857600080fd5b6020830191508360208285010111156129e057600080fd5b9250929050565b60008060008060008060808789031215612a0057600080fd5b612a0987612988565b955060208701356001600160401b0380821115612a2557600080fd5b612a318a838b0161299f565b9097509550604089013591508082168214612a4b57600080fd5b90935060608801359080821115612a6157600080fd5b50612a6e89828a0161299f565b979a9699509497509295939492505050565b6001600160a01b0381168114610e1d57600080fd5b600080600060608486031215612aaa57600080fd5b8335612ab581612a80565b92506020840135612ac581612a80565b929592945050506040919091013590565b600060208284031215612ae857600080fd5b61180282612988565b60008060408385031215612b0457600080fd5b612b0d83612988565b946020939093013593505050565b60ff81168114610e1d57600080fd5b600060208284031215612b3c57600080fd5b813561180281612b1b565b600060208284031215612b5957600080fd5b813561180281612a80565b600080600060408486031215612b7957600080fd5b612b8284612988565b925060208401356001600160401b03811115612b9d57600080fd5b612ba98682870161299f565b9497909650939450505050565b600060208284031215612bc857600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715612c0757612c07612bcf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612c3557612c35612bcf565b604052919050565b60006001600160401b03821115612c5657612c56612bcf565b50601f01601f191660200190565b600082601f830112612c7557600080fd5b8135612c88612c8382612c3d565b612c0d565b818152846020838601011115612c9d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215612ccd57600080fd5b8235612cd881612a80565b915060208301356001600160401b03811115612cf357600080fd5b612cff85828601612c64565b9150509250929050565b60008060408385031215612d1c57600080fd5b8235612b0d81612a80565b600060e08284031215612d3957600080fd5b612d41612be5565b90508135612d4e81612b1b565b81526020820135612d5e81612b1b565b60208201526040820135612d7181612b1b565b60408201526060820135612d8481612a80565b60608201526080820135612d9781612a80565b8060808301525060a082013560a082015260c082013560c082015292915050565b6000806101008385031215612dcc57600080fd5b612dd68484612d27565b915060e08301356001600160401b03811115612cf357600080fd5b60008060408385031215612e0457600080fd5b82359150612e1460208401612988565b90509250929050565b60005b83811015612e38578181015183820152602001612e20565b50506000910152565b60008151808452612e59816020860160208601612e1d565b601f01601f19169290920160200192915050565b6020815260006118026020830184612e41565b60008060408385031215612e9357600080fd5b612e9c83612988565b9150612e1460208401612988565b60008060408385031215612ebd57600080fd5b8235612b0d81612b1b565b60008060408385031215612edb57600080fd5b823591506020830135612eed81612a80565b809150509250929050565b600080600080600060808688031215612f1057600080fd5b612f1986612988565b9450612f2760208701612988565b93506040860135925060608601356001600160401b03811115612f4957600080fd5b612f558882890161299f565b969995985093965092949392505050565b600080600060608486031215612f7b57600080fd5b612f8484612988565b9250612f9260208501612988565b9150604084013590509250925092565b60008060006101208486031215612fb857600080fd5b8335612fc381612a80565b9250612fd28560208601612d27565b91506101008401356001600160401b03811115612fee57600080fd5b612ffa86828701612c64565b9150509250925092565b6000806000806080858703121561301a57600080fd5b61302385612988565b935061303160208601612988565b9250604085013561304181612a80565b9396929550929360600135925050565b600181811c9082168061306557607f821691505b60208210810361308557634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b6000602082840312156130ad57600080fd5b8151801515811461180257600080fd5b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b61ffff84168152604060208201526000611feb604083018486613155565b60208082526025908201527f43726f7373436861696e52656c61793a20696e76616c696420647374206368616040820152641a5b881a5960da1b606082015260800190565b60f09290921b6001600160f01b0319168252600282015260220190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061322c90830186612e41565b841515606084015282810360808401526132468185612e41565b98975050505050505050565b6000806040838503121561326557600080fd5b505080516020909101519092909150565b6020808252601b908201527f4974206973206e6f74206120747275737465642063616c6c65722e0000000000604082015260600190565b600061010060ff855116835260ff602086015116602084015260ff6040860151166040840152606085015160018060a01b038082166060860152806080880151166080860152505060a085015160a084015260c085015160c08401528060e084015261331b81840185612e41565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b818103818111156112f3576112f3613324565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b601f8211156111d657600081815260208120601f850160051c8101602086101561339a5750805b601f850160051c820191505b81811015611490578281556001016133a6565b81516001600160401b038111156133d2576133d2612bcf565b6133e6816133e08454613051565b84613373565b602080601f83116001811461341b57600084156134035750858301515b600019600386901b1c1916600185901b178555611490565b600085815260208120601f198616915b8281101561344a5788860151825594840194600190910190840161342b565b50858210156134685787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600061ffff8088168352808716602084015250846040830152608060608301526134a6608083018486613155565b979650505050505050565b6001600160401b038311156134c8576134c8612bcf565b6134dc836134d68354613051565b83613373565b6000601f84116001811461351057600085156134f85750838201355b600019600387901b1c1916600186901b178355610ce0565b600083815260209020601f19861690835b828110156135415786850135825560209485019460019092019101613521565b508682101561355e5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600082601f83011261358157600080fd5b815161358f612c8382612c3d565b8181528460208386010111156135a457600080fd5b611fee826020830160208701612e1d565b6000602082840312156135c757600080fd5b81516001600160401b038111156135dd57600080fd5b611fee84828501613570565b6000602082840312156135fb57600080fd5b5051919050565b61ffff8716815260c06020820152600061361f60c0830188612e41565b82810360408401526136318188612e41565b6001600160a01b0387811660608601528616608085015283810360a0850152905061365c8185612e41565b9998505050505050505050565b808201808211156112f3576112f3613324565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b805161299a81612a80565b6000808284036101008112156136e757600080fd5b60e08112156136f557600080fd5b506136fe612be5565b835161370981612b1b565b8152602084015161371981612b1b565b6020820152604084015161372c81612b1b565b6040820152606084015161373f81612a80565b6060820152613750608085016136c7565b608082015260a084015160a082015260c084015160c08201528092505060e08301516001600160401b0381111561378657600080fd5b612cff85828601613570565b600082516137a4818460208701612e1d565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220af62c80b79040e5f9482c0160bb3cfa3c1e385635c118c583d9ebd039a152ad964736f6c63430008130033
Deployed Bytecode Sourcemap
1333:10725:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1523:831:5;;;;;;;;;;-1:-1:-1;1523:831:5;;;;;:::i;:::-;;:::i;:::-;;3187:136:0;;;;;;;;;;-1:-1:-1;3187:136:0;;;;;:::i;:::-;;:::i;5061:121:5:-;;;;;;;;;;-1:-1:-1;5061:121:5;;;;;:::i;:::-;;:::i;813:51:0:-;;;;;;;;;;-1:-1:-1;813:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2413:25:19;;;2401:2;2386:18;813:51:0;;;;;;;;6938:143:5;;;;;;;;;;-1:-1:-1;6938:143:5;;;;;:::i;:::-;;:::i;5188:127::-;;;;;;;;;;-1:-1:-1;5188:127:5;;;;;:::i;:::-;;:::i;1146:53:0:-;;;;;;;;;;-1:-1:-1;1146:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;2591:160;;;;;;;;;;-1:-1:-1;2591:160:0;;;;;:::i;:::-;;:::i;7176:247:5:-;;;;;;;;;;-1:-1:-1;7176:247:5;;;;;:::i;:::-;;:::i;:::-;;;3976:14:19;;3969:22;3951:41;;3939:2;3924:18;7176:247:5;3811:187:19;1035:56:5;;;;;;;;;;-1:-1:-1;1035:56:5;;;;;:::i;:::-;;;;;;;;;;;;;;5070:139:0;;;;;;;;;;-1:-1:-1;5070:139:0;;;;;:::i;:::-;;:::i;5321:176:5:-;;;;;;;;;;-1:-1:-1;5321:176:5;;;;;:::i;:::-;;:::i;10091:510:0:-;;;;;;;;;;-1:-1:-1;10091:510:0;;;;;:::i;:::-;;:::i;3901:220:14:-;;;;;;:::i;:::-;;:::i;3006:131::-;;;;;;;;;;;;;:::i;2946:120:0:-;;;;;;;;;;-1:-1:-1;2946:120:0;;;;;:::i;:::-;;:::i;5639:770::-;;;;;;;;;;-1:-1:-1;5639:770:0;;;;;:::i;:::-;;:::i;4030:182::-;;;;;;;;;;-1:-1:-1;4030:182:0;;;;;:::i;:::-;;:::i;2064:101:8:-;;;;;;;;;;;;;:::i;10735:626:0:-;;;;;;:::i;:::-;;:::i;3601:91::-;;;;;;;;;;-1:-1:-1;3601:91:0;;;;;:::i;:::-;;:::i;904:51:5:-;;;;;;;;;;-1:-1:-1;904:51:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;707:49:0:-;;;;;;;;;;-1:-1:-1;707:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9094:6:19;9082:19;;;9064:38;;9052:2;9037:18;707:49:0;8920:188:19;6540:884:0;;;;;;:::i;:::-;;:::i;961:68:5:-;;;;;;;;;;-1:-1:-1;961:68:5;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;1441:85:8;;;;;;;;;;-1:-1:-1;1513:6:8;;-1:-1:-1;;;;;1513:6:8;1441:85;;;-1:-1:-1;;;;;9538:32:19;;;9520:51;;9508:2;9493:18;1441:85:8;9374:203:19;1097:23:5;;;;;;;;;;-1:-1:-1;1097:23:5;;;;-1:-1:-1;;;;;1097:23:5;;;1298:30:0;;;;;;;;;;-1:-1:-1;1298:30:0;;;;-1:-1:-1;;;;;1298:30:0;;;6125:326:5;;;;;;;;;;-1:-1:-1;6125:326:5;;;;;:::i;:::-;;:::i;7564:773:0:-;;;;;;:::i;:::-;;:::i;5332:135::-;;;;;;;;;;-1:-1:-1;5332:135:0;;;;;:::i;:::-;;:::i;5841:278:5:-;;;;;;;;;;-1:-1:-1;5841:278:5;;;;;:::i;:::-;;:::i;2341:154:0:-;;;;;;;;;;-1:-1:-1;2341:154:0;;;;;:::i;:::-;;:::i;4817:163::-;;;;;;;;;;-1:-1:-1;4817:163:0;;;;;:::i;:::-;;:::i;1234:30::-;;;;;;;;;;;;;;;;862:36:5;;;;;;;;;;-1:-1:-1;862:36:5;;;;-1:-1:-1;;;;;862:36:5;;;4433:171:0;;;;;;;;;;-1:-1:-1;4433:171:0;;;;;:::i;:::-;;:::i;6457:133:5:-;;;;;;;;;;-1:-1:-1;6457:133:5;;;;;:::i;:::-;;:::i;797:58::-;;;;;;;;;;;;850:5;797:58;;2020:225:0;;;;;;;;;;-1:-1:-1;2020:225:0;;;;;:::i;:::-;;:::i;609:41::-;;;;;;;;;;-1:-1:-1;609:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10625:4:19;10613:17;;;10595:36;;10583:2;10568:18;609:41:0;10453:184:19;4822:233:5;;;;;;;;;;-1:-1:-1;4822:233:5;;;;;:::i;:::-;;:::i;1048:58:0:-;;;;;;;;;;-1:-1:-1;1048:58:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1048:58:0;;;6596:283:5;;;;;;;;;;-1:-1:-1;6596:283:5;;;;;:::i;:::-;;:::i;3414:101:0:-;;;;;;;;;;-1:-1:-1;3414:101:0;;;;;:::i;:::-;;:::i;927:60::-;;;;;;;;;;-1:-1:-1;927:60:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;927:60:0;;;5640:195:5;;;;;;;;;;-1:-1:-1;5640:195:5;;;;;:::i;:::-;;:::i;3781:94:0:-;;;;;;;;;;-1:-1:-1;3781:94:0;;;;;:::i;:::-;;:::i;2314:198:8:-;;;;;;;;;;-1:-1:-1;2314:198:8;;;;;:::i;:::-;;:::i;8550:798:0:-;;;;;;:::i;:::-;;:::i;4523:240:5:-;;;;;;;;;;-1:-1:-1;4523:240:5;;;;;:::i;:::-;;:::i;1523:831::-;1789:10;;-1:-1:-1;;;;;1789:10:5;929::16;-1:-1:-1;;;;;1765:35:5;;1757:78;;;;-1:-1:-1;;;1757:78:5;;12846:2:19;1757:78:5;;;12828:21:19;12885:2;12865:18;;;12858:30;12924:32;12904:18;;;12897:60;12974:18;;1757:78:5;;;;;;;;;1875:32;;;1846:26;1875:32;;;:19;:32;;;;;1846:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2092:13;:20;2070:11;;:18;;:42;:70;;;;;2139:1;2116:13;:20;:24;2070:70;:140;;;;-1:-1:-1;2186:24:5;;;;;;2160:22;;;;2170:11;;;;2160:22;:::i;:::-;;;;;;;;:50;2070:140;2049:225;;;;-1:-1:-1;;;2049:225:5;;13866:2:19;2049:225:5;;;13848:21:19;13905:2;13885:18;;;13878:30;13944:34;13924:18;;;13917:62;-1:-1:-1;;;13995:18:19;;;13988:36;14041:19;;2049:225:5;13664:402:19;2049:225:5;2285:62;2304:11;2317;;2285:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2285:62:5;;;;;;;;;;;;;;;;;;;;;;2330:6;;-1:-1:-1;2285:62:5;-1:-1:-1;2338:8:5;;;;;;2285:62;;2338:8;;;;2285:62;;;;;;;;;-1:-1:-1;2285:18:5;;-1:-1:-1;;;2285:62:5:i;:::-;1682:672;1523:831;;;;;;:::o;3187:136:0:-;1334:13:8;:11;:13::i;:::-;3282:34:0::1;::::0;-1:-1:-1;;;3282:34:0;;-1:-1:-1;;;;;14263:32:19;;;3282:34:0::1;::::0;::::1;14245:51:19::0;14312:18;;;14305:34;;;3282:22:0;::::1;::::0;::::1;::::0;14218:18:19;;3282:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3187:136:::0;;;:::o;5061:121:5:-;1334:13:8;:11;:13::i;:::-;5140:10:5::1;::::0;:35:::1;::::0;-1:-1:-1;;;5140:35:5;;9094:6:19;9082:19;;5140:35:5::1;::::0;::::1;9064:38:19::0;-1:-1:-1;;;;;5140:10:5;;::::1;::::0;:25:::1;::::0;9037:18:19;;5140:35:5::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;5061:121:::0;:::o;6938:143::-;1334:13:8;:11;:13::i;:::-;7031:35:5::1;::::0;;::::1;;::::0;;;:22:::1;:35;::::0;;;;:43;6938:143::o;5188:127::-;1334:13:8;:11;:13::i;:::-;5270:10:5::1;::::0;:38:::1;::::0;-1:-1:-1;;;5270:38:5;;9094:6:19;9082:19;;5270:38:5::1;::::0;::::1;9064::19::0;-1:-1:-1;;;;;5270:10:5;;::::1;::::0;:28:::1;::::0;9037:18:19;;5270:38:5::1;8920:188:19::0;2591:160:0;1334:13:8;:11;:13::i;:::-;-1:-1:-1;;;;;1898:6:14::1;1881:23;1889:4;1881:23:::0;1873:80:::1;;;;-1:-1:-1::0;;;1873:80:14::1;;;;;;;:::i;:::-;1995:6;-1:-1:-1::0;;;;;1971:30:14::1;:20;-1:-1:-1::0;;;;;;;;;;;1536:65:11;-1:-1:-1;;;;;1536:65:11;;1457:151;1971:20:14::1;-1:-1:-1::0;;;;;1971:30:14::1;;1963:87;;;;-1:-1:-1::0;;;1963:87:14::1;;;;;;;:::i;:::-;2724:12:0::2;::::0;;2734:1:::2;2724:12:::0;;;::::2;::::0;::::2;::::0;;;2683:61:::2;::::0;2705:17;;2724:12;2683:21:::2;:61::i;:::-;2591:160:::0;:::o;7176:247:5:-;7317:32;;;7272:4;7317:32;;;:19;:32;;;;;7288:61;;7272:4;;7317:32;7288:61;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7404:11;;7394:22;;;;;;;:::i;:::-;;;;;;;;7376:13;7366:24;;;;;;:50;7359:57;;;7176:247;;;;;:::o;5070:139:0:-;1334:13:8;:11;:13::i;:::-;5144:15:0::1;:26:::0;;-1:-1:-1;;;;;5144:26:0;;::::1;-1:-1:-1::0;;;;;;5144:26:0;;::::1;::::0;::::1;::::0;;:15:::1;5180:18:::0;;;:8:::1;:18;::::0;;;;:22;;-1:-1:-1;;5180:22:0::1;5144:26:::0;5180:22:::1;::::0;;5070:139::o;5321:176:5:-;1334:13:8;:11;:13::i;:::-;5435:10:5::1;::::0;:55:::1;::::0;-1:-1:-1;;;5435:55:5;;-1:-1:-1;;;;;5435:10:5;;::::1;::::0;:29:::1;::::0;:55:::1;::::0;5465:11;;5478;;;;5435:55:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;10091:510:0::0;1334:13:8;:11;:13::i;:::-;10207:349:0::1;::::0;;::::1;::::0;::::1;::::0;;;10158:46:::1;::::0;10207:349;10270:50:::1;10264:57;10207:349;;;;;;10343:1;10207:349;;;;;;10375:1;10207:349;;;;;;10420:1;-1:-1:-1::0;;;;;10207:349:0::1;;;;;10466:1;-1:-1:-1::0;;;;;10207:349:0::1;;;;;10494:15;;10207:349;;;;10535:10;10207:349;;::::0;10158:398:::1;;10566:28;10578:4;10584:9;;;;;;;;;;;::::0;10566:11:::1;:28::i;:::-;10148:453;10091:510:::0;:::o;3901:220:14:-;-1:-1:-1;;;;;1898:6:14;1881:23;1889:4;1881:23;1873:80;;;;-1:-1:-1;;;1873:80:14;;;;;;;:::i;:::-;1995:6;-1:-1:-1;;;;;1971:30:14;:20;-1:-1:-1;;;;;;;;;;;1536:65:11;-1:-1:-1;;;;;1536:65:11;;1457:151;1971:20:14;-1:-1:-1;;;;;1971:30:14;;1963:87;;;;-1:-1:-1;;;1963:87:14;;;;;;;:::i;:::-;4016:36:::1;4034:17;4016;:36::i;:::-;4062:52;4084:17;4103:4;4109;4062:21;:52::i;3006:131::-:0;3084:7;2324:4;-1:-1:-1;;;;;2333:6:14;2316:23;;2308:92;;;;-1:-1:-1;;;2308:92:14;;16394:2:19;2308:92:14;;;16376:21:19;16433:2;16413:18;;;16406:30;16472:34;16452:18;;;16445:62;16543:26;16523:18;;;16516:54;16587:19;;2308:92:14;16192:420:19;2308:92:14;-1:-1:-1;;;;;;;;;;;;3006:131:14;:::o;2946:120:0:-;1334:13:8;:11;:13::i;:::-;3040:19:0::1;::::0;-1:-1:-1;;;;;3040:11:0;::::1;::::0;:19;::::1;;;::::0;3052:6;;3040:19:::1;::::0;;;3052:6;3040:11;:19;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;2946:120:::0;;:::o;5639:770::-;5856:15;;;;5795:7;5840:32;;;:15;:32;;;;;;;;5795:7;5907:39;5856:4;5938:7;5907:30;:39::i;:::-;5882:64;;5964:12;:17;;5980:1;5964:17;5956:67;;;;-1:-1:-1;;;5956:67:0;;;;;;;:::i;:::-;6101:11;;6080:33;;6033:14;6080:33;;;:20;:33;;;;;;6050:1;;6127:13;;;6123:62;;-1:-1:-1;6167:7:0;6123:62;6194:26;6240:7;6249:8;6223:35;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;6223:35:0;;;;;;;;;;6291:10;;-1:-1:-1;;;6291:85:0;;6223:35;;-1:-1:-1;6269:17:0;;-1:-1:-1;;;;;6291:10:0;;;;:23;;:85;;6315:12;;6337:4;;6344:9;;6269:17;;6223:35;;6291:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;6268:108:0;-1:-1:-1;;;;;;;5639:770:0;;;;;:::o;4030:182::-;1334:13:8;:11;:13::i;:::-;4121:24:0::1;::::0;;;:15:::1;:24;::::0;;;;;;;:36;;::::1;::::0;;::::1;-1:-1:-1::0;;4121:36:0;;::::1;::::0;::::1;::::0;;4167:28;;;:17:::1;:28:::0;;;:38;4030:182::o;2064:101:8:-;1334:13;:11;:13::i;:::-;2128:30:::1;2155:1;2128:18;:30::i;:::-;2064:101::o:0;10735:626:0:-;1836:10;1827:20;;;;:8;:20;;;;;;;;;:25;1819:65;;;;-1:-1:-1;;;1819:65:0;;;;;;;:::i;:::-;10915:30:::1;10931:4;10937:7;10915:30;;;;;;;:::i;:::-;;;;;;;;10959:11:::0;;:72:::1;;-1:-1:-1::0;;10959:72:0;10955:400:::1;;11078:21;11083:4;:15;;;11078:4;:21::i;:::-;11118:6;::::0;::::1;::::0;;;::::1;10148:453;10091:510:::0;:::o;10955:400::-:1;11145:11:::0;;:68:::1;;-1:-1:-1::0;;11145:68:0;11141:214:::1;;11234:6;::::0;::::1;::::0;;;::::1;10148:453;10091:510:::0;:::o;11141:214::-:1;11298:15;::::0;11271:73:::1;::::0;-1:-1:-1;;;11271:73:0;;-1:-1:-1;;;;;11298:15:0;;::::1;::::0;11271:58:::1;::::0;:73:::1;::::0;11330:4;;11336:7;;11271:73:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10735:626:::0;;:::o;3601:91::-;1334:13:8;:11;:13::i;:::-;-1:-1:-1;;;;;3665:16:0::1;;::::0;;;:8:::1;:16;::::0;;;;:20;;-1:-1:-1;;3665:20:0::1;3684:1;3665:20;::::0;;3601:91::o;904:51:5:-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6540:884:0:-;1836:10;1827:20;;;;:8;:20;;;;;;;;;:25;1819:65;;;;-1:-1:-1;;;1819:65:0;;;;;;;:::i;:::-;6712:22:::1;6737:39;:4:::0;6768:7;6737:30:::1;:39::i;:::-;6824:15;::::0;::::1;::::0;6786:19:::1;6808:32:::0;;;:15:::1;:32;::::0;;;;;6712:64;;-1:-1:-1;6808:32:0::1;::::0;;::::1;::::0;6858:17;;;6850:67:::1;;;;-1:-1:-1::0;;;6850:67:0::1;;;;;;;:::i;:::-;6996:11:::0;;6975:33:::1;;6928:14;6975:33:::0;;;:20:::1;:33;::::0;;;;;6945:1:::1;::::0;7022:13;;;7018:62:::1;;-1:-1:-1::0;7062:7:0::1;7018:62;7089:26;7135:7;7144:8;7118:35;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;7118:35:0;;::::1;::::0;;;;;;;7187:10:::1;::::0;-1:-1:-1;;;7187:85:0;;7118:35;;-1:-1:-1;7165:17:0::1;::::0;-1:-1:-1;;;;;7187:10:0;;::::1;::::0;:23:::1;::::0;:85:::1;::::0;7211:12;;7233:4:::1;::::0;7240:9;;7165:17;;7118:35;;7187:85:::1;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7164:108;;;7282:94;7290:12;7304:9;7331:4;7347:1;7351:13;7366:9;7282:7;:94::i;:::-;7391:26;7403:4;7409:7;7391:26;;;;;;;:::i;:::-;;;;;;;;6702:722;;;;;;6540:884:::0;;:::o;6125:326:5:-;6248:35;;;6228:17;6248:35;;;:19;:35;;;;;6228:55;;6204:12;;6228:17;6248:35;6228:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6301:4;:11;6316:1;6301:16;6293:58;;;;-1:-1:-1;;;6293:58:5;;19642:2:19;6293:58:5;;;19624:21:19;19681:2;19661:18;;;19654:30;19720:31;19700:18;;;19693:59;19769:18;;6293:58:5;19440:353:19;6293:58:5;6368:31;6379:1;6396:2;6382:4;:11;:16;;;;:::i;:::-;6368:4;;:31;:10;:31::i;:::-;6361:38;6125:326;-1:-1:-1;;;6125:326:5:o;7564:773:0:-;1836:10;1827:20;;;;:8;:20;;;;;;;;;:25;1819:65;;;;-1:-1:-1;;;1819:65:0;;;;;;;:::i;:::-;7743:22:::1;7768:39;:4:::0;7799:7;7768:30:::1;:39::i;:::-;7855:15;::::0;::::1;::::0;7817:19:::1;7839:32:::0;;;:15:::1;:32;::::0;;;;;7743:64;;-1:-1:-1;7839:32:0::1;::::0;;::::1;::::0;7889:17;;;7881:67:::1;;;;-1:-1:-1::0;;;7881:67:0::1;;;;;;;:::i;:::-;8027:11:::0;;8006:33:::1;;7959:14;8006:33:::0;;;:20:::1;:33;::::0;;;;;7976:1:::1;::::0;8053:13;;;8049:62:::1;;-1:-1:-1::0;8093:7:0::1;8049:62;8120:26;8166:7;8175:8;8149:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8120:64;;8195:94;8203:12;8217:9;8244:4;8260:1;8264:13;8279:9;8195:7;:94::i;:::-;8304:26;8316:4;8322:7;8304:26;;;;;;;:::i;:::-;;;;;;;;7733:604;;;;;7564:773:::0;;:::o;5332:135::-;1334:13:8;:11;:13::i;:::-;5423:26:0::1;::::0;;::::1;;::::0;;;:20:::1;:26;::::0;;;;:37;5332:135::o;5841:278:5:-;1334:13:8;:11;:13::i;:::-;6012:14:5::1;;6036:4;5995:47;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;5995:47:5;;::::1;::::0;;;;;;5957:35:::1;::::0;::::1;;::::0;;;:19:::1;5995:47;5957:35:::0;;;:85:::1;::::0;:35;:85:::1;:::i;:::-;;6057:55;6081:14;6097;;6057:55;;;;;;;;:::i;:::-;;;;;;;;5841:278:::0;;;:::o;2341:154:0:-;1334:13:8;:11;:13::i;:::-;2413:10:0::1;:42:::0;;-1:-1:-1;;;;;2413:42:0;;::::1;-1:-1:-1::0;;;;;;2413:42:0;;::::1;::::0;::::1;::::0;;:10:::1;2465:19:::0;;;:8:::1;:19;::::0;;;;:23;;-1:-1:-1;;2465:23:0::1;2413:42:::0;2465:23:::1;::::0;;2341:154::o;4817:163::-;1334:13:8;:11;:13::i;:::-;4923:32:0::1;::::0;;;:23:::1;:32;::::0;;;;;:50;;-1:-1:-1;;;;;;4923:50:0::1;-1:-1:-1::0;;;;;4923:50:0;;::::1;::::0;;;::::1;::::0;;4817:163::o;4433:171::-;1334:13:8;:11;:13::i;:::-;4543:34:0::1;::::0;;;:25:::1;:34;::::0;;;;;:54;;-1:-1:-1;;;;;;4543:54:0::1;-1:-1:-1::0;;;;;4543:54:0;;::::1;::::0;;;::::1;::::0;;4433:171::o;6457:133:5:-;1334:13:8;:11;:13::i;:::-;6526:8:5::1;:20:::0;;-1:-1:-1;;;;;;6526:20:5::1;-1:-1:-1::0;;;;;6526:20:5;::::1;::::0;;::::1;::::0;;;6561:22:::1;::::0;9520:51:19;;;6561:22:5::1;::::0;9508:2:19;9493:18;6561:22:5::1;;;;;;;6457:133:::0;:::o;2020:225:0:-;3279:19:13;3302:13;;;;;;3301:14;;3347:34;;;;-1:-1:-1;3365:12:13;;3380:1;3365:12;;;;:16;3347:34;3346:108;;;-1:-1:-1;3426:4:13;1713:19:15;:23;;;3387:66:13;;-1:-1:-1;3436:12:13;;;;;:17;3387:66;3325:201;;;;-1:-1:-1;;;3325:201:13;;22828:2:19;3325:201:13;;;22810:21:19;22867:2;22847:18;;;22840:30;22906:34;22886:18;;;22879:62;-1:-1:-1;;;22957:18:19;;;22950:44;23011:19;;3325:201:13;22626:410:19;3325:201:13;3536:12;:16;;-1:-1:-1;;3536:16:13;3551:1;3536:16;;;3562:65;;;;3596:13;:20;;-1:-1:-1;;3596:20:13;;;;;3562:65;2088:16:0::1;:14;:16::i;:::-;2114:24;:22;:24::i;:::-;2148:23;2161:9;2148:12;:23::i;:::-;2190:10;2181:20;::::0;;;:8:::1;:20;::::0;;;;;:24;;2204:1:::1;-1:-1:-1::0;;2181:24:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;2215:19:0;::::1;::::0;;;;;;:23;;;;::::1;::::0;;::::1;::::0;;3647:99:13;;;;3697:5;3681:21;;-1:-1:-1;;3681:21:13;;;3721:14;;-1:-1:-1;10595:36:19;;3721:14:13;;10583:2:19;10568:18;3721:14:13;;;;;;;3269:483;2020:225:0;:::o;4822:233:5:-;1334:13:8;:11;:13::i;:::-;4986:10:5::1;::::0;:62:::1;::::0;-1:-1:-1;;;4986:62:5;;-1:-1:-1;;;;;4986:10:5;;::::1;::::0;:20:::1;::::0;:62:::1;::::0;5007:8;;5017;;5027:11;;5040:7;;;;4986:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4822:233:::0;;;;;:::o;6596:283::-;1334:13:8;:11;:13::i;:::-;6722:1:5::1;6712:7;:11;6704:45;;;::::0;-1:-1:-1;;;6704:45:5;;23945:2:19;6704:45:5::1;::::0;::::1;23927:21:19::0;23984:2;23964:18;;;23957:30;-1:-1:-1;;;24003:18:19;;;23996:51;24064:18;;6704:45:5::1;23743:345:19::0;6704:45:5::1;6759:28;::::0;;::::1;;::::0;;;:15:::1;:28;::::0;;;;;;;:41;;::::1;::::0;;;;;;;;;;:51;;;6825:47;;24316:34:19;;;24366:18;;24359:43;;;;24418:18;;;24411:34;;;6825:47:5::1;::::0;24279:2:19;24264:18;6825:47:5::1;24093:358:19::0;3414:101:0;1334:13:8;:11;:13::i;:::-;3483:15:0::1;:25:::0;3414:101::o;5640:195:5:-;1334:13:8;:11;:13::i;:::-;5737:32:5::1;::::0;::::1;;::::0;;;:19:::1;:32;::::0;;;;:40:::1;5772:5:::0;;5737:32;:40:::1;:::i;:::-;;5792:36;5809:11;5822:5;;5792:36;;;;;;;;:::i;3781:94:0:-:0;1334:13:8;:11;:13::i;:::-;-1:-1:-1;;;;;3848:16:0::1;3867:1;3848:16:::0;;;:8:::1;:16;::::0;;;;:20;;-1:-1:-1;;3848:20:0::1;::::0;;3781:94::o;2314:198:8:-;1334:13;:11;:13::i;:::-;-1:-1:-1;;;;;2402:22:8;::::1;2394:73;;;::::0;-1:-1:-1;;;2394:73:8;;25865:2:19;2394:73:8::1;::::0;::::1;25847:21:19::0;25904:2;25884:18;;;25877:30;25943:34;25923:18;;;25916:62;-1:-1:-1;;;25994:18:19;;;25987:36;26040:19;;2394:73:8::1;25663:402:19::0;2394:73:8::1;2477:28;2496:8;2477:18;:28::i;8550:798:0:-:0;1836:10;1827:20;;;;:8;:20;;;;;;;;;:25;1819:65;;;;-1:-1:-1;;;1819:65:0;;;;;;;:::i;:::-;8753:22:::1;8778:39;:4:::0;8809:7;8778:30:::1;:39::i;:::-;8865:15;::::0;::::1;::::0;8827:19:::1;8849:32:::0;;;:15:::1;:32;::::0;;;;;8753:64;;-1:-1:-1;8849:32:0::1;::::0;;::::1;::::0;8899:17;;;8891:67:::1;;;;-1:-1:-1::0;;;8891:67:0::1;;;;;;;:::i;:::-;9037:11:::0;;9016:33:::1;;8969:14;9016:33:::0;;;:20:::1;:33;::::0;;;;;8986:1:::1;::::0;9063:13;;;9059:62:::1;;-1:-1:-1::0;9103:7:0::1;9059:62;9130:26;9176:7;9185:8;9159:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9130:64;;9205:95;9213:12;9227:9;9246:14;9271:1;9275:13;9290:9;9205:7;:95::i;:::-;9315:26;9327:4;9333:7;9315:26;;;;;;;:::i;4523:240:5:-:0;4688:10;;:68;;-1:-1:-1;;;4688:68:5;;26307:6:19;26340:15;;;4688:68:5;;;26322:34:19;26392:15;;26372:18;;;26365:43;4737:4:5;26424:18:19;;;26417:60;26493:18;;;26486:34;;;4653:12:5;;-1:-1:-1;;;;;4688:10:5;;:20;;26269:19:19;;4688:68:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4688:68:5;;;;;;;;;;;;:::i;:::-;4681:75;;4523:240;;;;;;;:::o;11516:540:0:-;11697:30;;;11673:21;11697:30;;;:17;:30;;;;;;;11745:18;;;11737:68;;;;-1:-1:-1;;;11737:68:0;;27519:2:19;11737:68:0;;;27501:21:19;27558:2;27538:18;;;27531:30;27597:34;27577:18;;;27570:62;-1:-1:-1;;;27648:18:19;;;27641:35;27693:19;;11737:68:0;27317:401:19;11737:68:0;11816:49;11867:20;11903:60;11954:8;11903:50;:60::i;:::-;11991:14;;11979:27;;10625:4:19;10613:17;;;10595:36;;11815:148:0;;-1:-1:-1;11815:148:0;-1:-1:-1;11979:27:0;;10583:2:19;10568:18;11979:27:0;;;;;;;12017:32;12032:7;12041;12017:14;:32::i;1599:130:8:-;1513:6;;-1:-1:-1;;;;;1513:6:8;929:10:16;1662:23:8;1654:68;;;;-1:-1:-1;;;1654:68:8;;27925:2:19;1654:68:8;;;27907:21:19;;;27944:18;;;27937:30;28003:34;27983:18;;;27976:62;28055:18;;1654:68:8;27723:356:19;2820:944:11;971:66;3236:59;;;3232:526;;;3311:37;3330:17;3311:18;:37::i;3232:526::-;3412:17;-1:-1:-1;;;;;3383:61:11;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3383:63:11;;;;;;;;-1:-1:-1;;3383:63:11;;;;;;;;;;;;:::i;:::-;;;3379:302;;3610:56;;-1:-1:-1;;;3610:56:11;;28475:2:19;3610:56:11;;;28457:21:19;28514:2;28494:18;;;28487:30;28553:34;28533:18;;;28526:62;-1:-1:-1;;;28604:18:19;;;28597:44;28658:19;;3610:56:11;28273:410:19;3379:302:11;-1:-1:-1;;;;;;;;;;;3496:28:11;;3488:82;;;;-1:-1:-1;;;3488:82:11;;28890:2:19;3488:82:11;;;28872:21:19;28929:2;28909:18;;;28902:30;28968:34;28948:18;;;28941:62;-1:-1:-1;;;29019:18:19;;;29012:39;29068:19;;3488:82:11;28688:405:19;3488:82:11;3447:138;3694:53;3712:17;3731:4;3737:9;3694:17;:53::i;2501:84:0:-;1334:13:8;:11;:13::i;1670:200:7:-;1800:12;1846:7;1855;1835:28;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1828:35;;1670:200;;;;:::o;2666:187:8:-;2758:6;;;-1:-1:-1;;;;;2774:17:8;;;-1:-1:-1;;;;;;2774:17:8;;;;;;;2806:40;;2758:6;;;2774:17;2758:6;;2806:40;;2739:16;;2806:40;2729:124;2666:187;:::o;9463:492:0:-;9565:345;;;;;;;;;9516:46;;9565:345;9628:46;9622:53;;2654:627:5;2933:32;;;2904:26;2933:32;;;:19;:32;;;;;2904:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2983:13;:20;3007:1;2983:25;2975:86;;;;-1:-1:-1;;;2975:86:5;;29300:2:19;2975:86:5;;;29282:21:19;29339:2;29319:18;;;29312:30;29378:34;29358:18;;;29351:62;-1:-1:-1;;;29429:18:19;;;29422:46;29485:19;;2975:86:5;29098:412:19;2975:86:5;3071:47;3089:11;3102:8;:15;3071:17;:47::i;:::-;3128:10;;:146;;-1:-1:-1;;;3128:146:5;;-1:-1:-1;;;;;3128:10:5;;;;:15;;3151:10;;3128:146;;3176:11;;3189:13;;3204:8;;3214:14;;3230:18;;3250:14;;3128:146;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2894:387;2654:627;;;;;;:::o;8865:2712:6:-;8999:12;9051:7;9035:12;9051:7;9045:2;9035:12;:::i;:::-;:23;;9027:50;;;;-1:-1:-1;;;9027:50:6;;30689:2:19;9027:50:6;;;30671:21:19;30728:2;30708:18;;;30701:30;-1:-1:-1;;;30747:18:19;;;30740:44;30801:18;;9027:50:6;30487:338:19;9027:50:6;9112:16;9121:7;9112:6;:16;:::i;:::-;9095:6;:13;:33;;9087:63;;;;-1:-1:-1;;;9087:63:6;;31032:2:19;9087:63:6;;;31014:21:19;31071:2;31051:18;;;31044:30;-1:-1:-1;;;31090:18:19;;;31083:47;31147:18;;9087:63:6;30830:341:19;9087:63:6;9161:22;9224:15;;9252:1895;;;;11288:4;11282:11;11269:24;;11466:1;11455:9;11448:20;11514:4;11503:9;11499:20;11493:4;11486:34;9217:2317;;9252:1895;9426:4;9420:11;9407:24;;10053:2;10044:7;10040:16;10419:9;10412:17;10406:4;10402:28;10390:9;10379;10375:25;10371:60;10467:7;10463:2;10459:16;10711:6;10697:9;10690:17;10684:4;10680:28;10668:9;10660:6;10656:22;10652:57;10648:70;10493:417;10744:3;10740:2;10737:11;10493:417;;;10882:9;;10871:21;;10785:4;10777:13;;;;10817;10493:417;;;-1:-1:-1;;10928:26:6;;;11128:2;11111:11;-1:-1:-1;;11107:25:6;11101:4;11094:39;-1:-1:-1;9217:2317:6;-1:-1:-1;11561:9:6;8865:2712;-1:-1:-1;;;;8865:2712:6:o;1003:95:8:-;5374:13:13;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:13;;;;;;;:::i;:::-;1065:26:8::1;:24;:26::i;1042:67:14:-:0;5374:13:13;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:13;;;;;;;:::i;1391:126:5:-;5374:13:13;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:13;;;;;;;:::i;:::-;1468:10:5::1;:42:::0;;-1:-1:-1;;;;;;1468:42:5::1;-1:-1:-1::0;;;;;1468:42:5;;;::::1;::::0;;;::::1;::::0;;1391:126::o;1927:248:7:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2022:12:7;2047:24;2073:20;2108:4;2097:36;;;;;;;;;;;;:::i;:::-;2046:87;;;;-1:-1:-1;1927:248:7;-1:-1:-1;;;;1927:248:7:o;1699:281:11:-;-1:-1:-1;;;;;1713:19:15;;;1772:106:11;;;;-1:-1:-1;;;1772:106:11;;33164:2:19;1772:106:11;;;33146:21:19;33203:2;33183:18;;;33176:30;33242:34;33222:18;;;33215:62;-1:-1:-1;;;33293:18:19;;;33286:43;33346:19;;1772:106:11;32962:409:19;1772:106:11;-1:-1:-1;;;;;;;;;;;1888:85:11;;-1:-1:-1;;;;;;1888:85:11;-1:-1:-1;;;;;1888:85:11;;;;;;;;;;1699:281::o;2372:276::-;2480:29;2491:17;2480:10;:29::i;:::-;2537:1;2523:4;:11;:15;:28;;;;2542:9;2523:28;2519:123;;;2567:64;2607:17;2626:4;2567:39;:64::i;4020:401:5:-;4148:35;;;4121:24;4148:35;;;:22;:35;;;;;;;4197:21;;;4193:135;;-1:-1:-1;850:5:5;4193:135;4361:16;4345:12;:32;;4337:77;;;;-1:-1:-1;;;4337:77:5;;33578:2:19;4337:77:5;;;33560:21:19;;;33597:18;;;33590:30;33656:34;33636:18;;;33629:62;33708:18;;4337:77:5;33376:356:19;1104:111:8;5374:13:13;;;;;;;5366:69;;;;-1:-1:-1;;;5366:69:13;;;;;;;:::i;:::-;1176:32:8::1;929:10:16::0;1176:18:8::1;:32::i;2086:152:11:-:0;2152:37;2171:17;2152:18;:37::i;:::-;2204:27;;-1:-1:-1;;;;;2204:27:11;;;;;;;;2086:152;:::o;6685:198:15:-;6768:12;6799:77;6820:6;6828:4;6799:77;;;;;;;;;;;;;;;;;7210:12;7235;7249:23;7276:6;-1:-1:-1;;;;;7276:19:15;7296:4;7276:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7234:67;;;;7318:69;7345:6;7353:7;7362:10;7374:12;7318:26;:69::i;:::-;7311:76;7069:325;-1:-1:-1;;;;;;7069:325:15:o;7682:628::-;7862:12;7890:7;7886:418;;;7917:10;:17;7938:1;7917:22;7913:286;;-1:-1:-1;;;;;1713:19:15;;;8124:60;;;;-1:-1:-1;;;8124:60:15;;34231:2:19;8124:60:15;;;34213:21:19;34270:2;34250:18;;;34243:30;34309:31;34289:18;;;34282:59;34358:18;;8124:60:15;34029:353:19;8124:60:15;-1:-1:-1;8219:10:15;8212:17;;7886:418;8260:33;8268:10;8280:12;8991:17;;:21;8987:379;;9219:10;9213:17;9275:15;9262:10;9258:2;9254:19;9247:44;8987:379;9342:12;9335:20;;-1:-1:-1;;;9335:20:15;;;;;;;;:::i;14:159:19:-;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:347::-;229:8;239:6;293:3;286:4;278:6;274:17;270:27;260:55;;311:1;308;301:12;260:55;-1:-1:-1;334:20:19;;-1:-1:-1;;;;;366:30:19;;363:50;;;409:1;406;399:12;363:50;446:4;438:6;434:17;422:29;;498:3;491:4;482:6;474;470:19;466:30;463:39;460:59;;;515:1;512;505:12;460:59;178:347;;;;;:::o;530:946::-;636:6;644;652;660;668;676;729:3;717:9;708:7;704:23;700:33;697:53;;;746:1;743;736:12;697:53;769:28;787:9;769:28;:::i;:::-;759:38;;848:2;837:9;833:18;820:32;-1:-1:-1;;;;;912:2:19;904:6;901:14;898:34;;;928:1;925;918:12;898:34;967:58;1017:7;1008:6;997:9;993:22;967:58;:::i;:::-;1044:8;;-1:-1:-1;941:84:19;-1:-1:-1;1129:2:19;1114:18;;1101:32;;-1:-1:-1;1162:14:19;;;1152:25;;1142:53;;1191:1;1188;1181:12;1142:53;1214:5;;-1:-1:-1;1272:2:19;1257:18;;1244:32;;1288:16;;;1285:36;;;1317:1;1314;1307:12;1285:36;;1356:60;1408:7;1397:8;1386:9;1382:24;1356:60;:::i;:::-;530:946;;;;-1:-1:-1;530:946:19;;-1:-1:-1;530:946:19;;1435:8;;530:946;-1:-1:-1;;;530:946:19:o;1481:131::-;-1:-1:-1;;;;;1556:31:19;;1546:42;;1536:70;;1602:1;1599;1592:12;1617:456;1694:6;1702;1710;1763:2;1751:9;1742:7;1738:23;1734:32;1731:52;;;1779:1;1776;1769:12;1731:52;1818:9;1805:23;1837:31;1862:5;1837:31;:::i;:::-;1887:5;-1:-1:-1;1944:2:19;1929:18;;1916:32;1957:33;1916:32;1957:33;:::i;:::-;1617:456;;2009:7;;-1:-1:-1;;;2063:2:19;2048:18;;;;2035:32;;1617:456::o;2078:184::-;2136:6;2189:2;2177:9;2168:7;2164:23;2160:32;2157:52;;;2205:1;2202;2195:12;2157:52;2228:28;2246:9;2228:28;:::i;2449:252::-;2516:6;2524;2577:2;2565:9;2556:7;2552:23;2548:32;2545:52;;;2593:1;2590;2583:12;2545:52;2616:28;2634:9;2616:28;:::i;:::-;2606:38;2691:2;2676:18;;;;2663:32;;-1:-1:-1;;;2449:252:19:o;2706:114::-;2790:4;2783:5;2779:16;2772:5;2769:27;2759:55;;2810:1;2807;2800:12;2825:243;2882:6;2935:2;2923:9;2914:7;2910:23;2906:32;2903:52;;;2951:1;2948;2941:12;2903:52;2990:9;2977:23;3009:29;3032:5;3009:29;:::i;3073:247::-;3132:6;3185:2;3173:9;3164:7;3160:23;3156:32;3153:52;;;3201:1;3198;3191:12;3153:52;3240:9;3227:23;3259:31;3284:5;3259:31;:::i;3325:481::-;3403:6;3411;3419;3472:2;3460:9;3451:7;3447:23;3443:32;3440:52;;;3488:1;3485;3478:12;3440:52;3511:28;3529:9;3511:28;:::i;:::-;3501:38;;3590:2;3579:9;3575:18;3562:32;-1:-1:-1;;;;;3609:6:19;3606:30;3603:50;;;3649:1;3646;3639:12;3603:50;3688:58;3738:7;3729:6;3718:9;3714:22;3688:58;:::i;:::-;3325:481;;3765:8;;-1:-1:-1;3662:84:19;;-1:-1:-1;;;;3325:481:19:o;4003:180::-;4062:6;4115:2;4103:9;4094:7;4090:23;4086:32;4083:52;;;4131:1;4128;4121:12;4083:52;-1:-1:-1;4154:23:19;;4003:180;-1:-1:-1;4003:180:19:o;4188:127::-;4249:10;4244:3;4240:20;4237:1;4230:31;4280:4;4277:1;4270:15;4304:4;4301:1;4294:15;4320:253;4392:2;4386:9;4434:4;4422:17;;-1:-1:-1;;;;;4454:34:19;;4490:22;;;4451:62;4448:88;;;4516:18;;:::i;:::-;4552:2;4545:22;4320:253;:::o;4578:275::-;4649:2;4643:9;4714:2;4695:13;;-1:-1:-1;;4691:27:19;4679:40;;-1:-1:-1;;;;;4734:34:19;;4770:22;;;4731:62;4728:88;;;4796:18;;:::i;:::-;4832:2;4825:22;4578:275;;-1:-1:-1;4578:275:19:o;4858:186::-;4906:4;-1:-1:-1;;;;;4931:6:19;4928:30;4925:56;;;4961:18;;:::i;:::-;-1:-1:-1;5027:2:19;5006:15;-1:-1:-1;;5002:29:19;5033:4;4998:40;;4858:186::o;5049:462::-;5091:5;5144:3;5137:4;5129:6;5125:17;5121:27;5111:55;;5162:1;5159;5152:12;5111:55;5198:6;5185:20;5229:48;5245:31;5273:2;5245:31;:::i;:::-;5229:48;:::i;:::-;5302:2;5293:7;5286:19;5348:3;5341:4;5336:2;5328:6;5324:15;5320:26;5317:35;5314:55;;;5365:1;5362;5355:12;5314:55;5430:2;5423:4;5415:6;5411:17;5404:4;5395:7;5391:18;5378:55;5478:1;5453:16;;;5471:4;5449:27;5442:38;;;;5457:7;5049:462;-1:-1:-1;;;5049:462:19:o;5516:455::-;5593:6;5601;5654:2;5642:9;5633:7;5629:23;5625:32;5622:52;;;5670:1;5667;5660:12;5622:52;5709:9;5696:23;5728:31;5753:5;5728:31;:::i;:::-;5778:5;-1:-1:-1;5834:2:19;5819:18;;5806:32;-1:-1:-1;;;;;5850:30:19;;5847:50;;;5893:1;5890;5883:12;5847:50;5916:49;5957:7;5948:6;5937:9;5933:22;5916:49;:::i;:::-;5906:59;;;5516:455;;;;;:::o;6158:323::-;6234:6;6242;6295:2;6283:9;6274:7;6270:23;6266:32;6263:52;;;6311:1;6308;6301:12;6263:52;6350:9;6337:23;6369:31;6394:5;6369:31;:::i;6486:974::-;6542:5;6590:4;6578:9;6573:3;6569:19;6565:30;6562:50;;;6608:1;6605;6598:12;6562:50;6630:22;;:::i;:::-;6621:31;;6689:9;6676:23;6708:31;6731:7;6708:31;:::i;:::-;6748:22;;6822:2;6807:18;;6794:32;6835:31;6794:32;6835:31;:::i;:::-;6893:2;6882:14;;6875:31;6958:2;6943:18;;6930:32;6971:31;6930:32;6971:31;:::i;:::-;7029:2;7018:14;;7011:31;7094:2;7079:18;;7066:32;7107:33;7066:32;7107:33;:::i;:::-;7167:2;7156:14;;7149:31;7232:3;7217:19;;7204:33;7246;7204;7246;:::i;:::-;7312:7;7306:3;7299:5;7295:15;7288:32;;7381:3;7370:9;7366:19;7353:33;7347:3;7340:5;7336:15;7329:58;7448:3;7437:9;7433:19;7420:33;7414:3;7407:5;7403:15;7396:58;6486:974;;;;:::o;7465:441::-;7569:6;7577;7630:3;7618:9;7609:7;7605:23;7601:33;7598:53;;;7647:1;7644;7637:12;7598:53;7670:47;7709:7;7698:9;7670:47;:::i;:::-;7660:57;;7768:3;7757:9;7753:19;7740:33;-1:-1:-1;;;;;7788:6:19;7785:30;7782:50;;;7828:1;7825;7818:12;7911:252;7978:6;7986;8039:2;8027:9;8018:7;8014:23;8010:32;8007:52;;;8055:1;8052;8045:12;8007:52;8091:9;8078:23;8068:33;;8120:37;8153:2;8142:9;8138:18;8120:37;:::i;:::-;8110:47;;7911:252;;;;;:::o;8168:250::-;8253:1;8263:113;8277:6;8274:1;8271:13;8263:113;;;8353:11;;;8347:18;8334:11;;;8327:39;8299:2;8292:10;8263:113;;;-1:-1:-1;;8410:1:19;8392:16;;8385:27;8168:250::o;8423:270::-;8464:3;8502:5;8496:12;8529:6;8524:3;8517:19;8545:76;8614:6;8607:4;8602:3;8598:14;8591:4;8584:5;8580:16;8545:76;:::i;:::-;8675:2;8654:15;-1:-1:-1;;8650:29:19;8641:39;;;;8682:4;8637:50;;8423:270;-1:-1:-1;;8423:270:19:o;8698:217::-;8845:2;8834:9;8827:21;8808:4;8865:44;8905:2;8894:9;8890:18;8882:6;8865:44;:::i;9113:256::-;9179:6;9187;9240:2;9228:9;9219:7;9215:23;9211:32;9208:52;;;9256:1;9253;9246:12;9208:52;9279:28;9297:9;9279:28;:::i;:::-;9269:38;;9326:37;9359:2;9348:9;9344:18;9326:37;:::i;9582:311::-;9648:6;9656;9709:2;9697:9;9688:7;9684:23;9680:32;9677:52;;;9725:1;9722;9715:12;9677:52;9764:9;9751:23;9783:29;9806:5;9783:29;:::i;9898:315::-;9966:6;9974;10027:2;10015:9;10006:7;10002:23;9998:32;9995:52;;;10043:1;10040;10033:12;9995:52;10079:9;10066:23;10056:33;;10139:2;10128:9;10124:18;10111:32;10152:31;10177:5;10152:31;:::i;:::-;10202:5;10192:15;;;9898:315;;;;;:::o;10642:622::-;10737:6;10745;10753;10761;10769;10822:3;10810:9;10801:7;10797:23;10793:33;10790:53;;;10839:1;10836;10829:12;10790:53;10862:28;10880:9;10862:28;:::i;:::-;10852:38;;10909:37;10942:2;10931:9;10927:18;10909:37;:::i;:::-;10899:47;;10993:2;10982:9;10978:18;10965:32;10955:42;;11048:2;11037:9;11033:18;11020:32;-1:-1:-1;;;;;11067:6:19;11064:30;11061:50;;;11107:1;11104;11097:12;11061:50;11146:58;11196:7;11187:6;11176:9;11172:22;11146:58;:::i;:::-;10642:622;;;;-1:-1:-1;10642:622:19;;-1:-1:-1;11223:8:19;;11120:84;10642:622;-1:-1:-1;;;10642:622:19:o;11269:324::-;11344:6;11352;11360;11413:2;11401:9;11392:7;11388:23;11384:32;11381:52;;;11429:1;11426;11419:12;11381:52;11452:28;11470:9;11452:28;:::i;:::-;11442:38;;11499:37;11532:2;11521:9;11517:18;11499:37;:::i;:::-;11489:47;;11583:2;11572:9;11568:18;11555:32;11545:42;;11269:324;;;;;:::o;11598:576::-;11711:6;11719;11727;11780:3;11768:9;11759:7;11755:23;11751:33;11748:53;;;11797:1;11794;11787:12;11748:53;11836:9;11823:23;11855:31;11880:5;11855:31;:::i;:::-;11905:5;-1:-1:-1;11929:56:19;11977:7;11972:2;11957:18;;11929:56;:::i;:::-;11919:66;;12036:3;12025:9;12021:19;12008:33;-1:-1:-1;;;;;12056:6:19;12053:30;12050:50;;;12096:1;12093;12086:12;12050:50;12119:49;12160:7;12151:6;12140:9;12136:22;12119:49;:::i;:::-;12109:59;;;11598:576;;;;;:::o;12179:460::-;12263:6;12271;12279;12287;12340:3;12328:9;12319:7;12315:23;12311:33;12308:53;;;12357:1;12354;12347:12;12308:53;12380:28;12398:9;12380:28;:::i;:::-;12370:38;;12427:37;12460:2;12449:9;12445:18;12427:37;:::i;:::-;12417:47;;12514:2;12503:9;12499:18;12486:32;12527:31;12552:5;12527:31;:::i;:::-;12179:460;;;;-1:-1:-1;12577:5:19;;12629:2;12614:18;12601:32;;-1:-1:-1;;12179:460:19:o;13003:380::-;13082:1;13078:12;;;;13125;;;13146:61;;13200:4;13192:6;13188:17;13178:27;;13146:61;13253:2;13245:6;13242:14;13222:18;13219:38;13216:161;;13299:10;13294:3;13290:20;13287:1;13280:31;13334:4;13331:1;13324:15;13362:4;13359:1;13352:15;13216:161;;13003:380;;;:::o;13388:271::-;13571:6;13563;13558:3;13545:33;13527:3;13597:16;;13622:13;;;13597:16;13388:271;-1:-1:-1;13388:271:19:o;14350:277::-;14417:6;14470:2;14458:9;14449:7;14445:23;14441:32;14438:52;;;14486:1;14483;14476:12;14438:52;14518:9;14512:16;14571:5;14564:13;14557:21;14550:5;14547:32;14537:60;;14593:1;14590;14583:12;14632:408;14834:2;14816:21;;;14873:2;14853:18;;;14846:30;14912:34;14907:2;14892:18;;14885:62;-1:-1:-1;;;14978:2:19;14963:18;;14956:42;15030:3;15015:19;;14632:408::o;15045:::-;15247:2;15229:21;;;15286:2;15266:18;;;15259:30;15325:34;15320:2;15305:18;;15298:62;-1:-1:-1;;;15391:2:19;15376:18;;15369:42;15443:3;15428:19;;15045:408::o;15458:266::-;15546:6;15541:3;15534:19;15598:6;15591:5;15584:4;15579:3;15575:14;15562:43;-1:-1:-1;15650:1:19;15625:16;;;15643:4;15621:27;;;15614:38;;;;15706:2;15685:15;;;-1:-1:-1;;15681:29:19;15672:39;;;15668:50;;15458:266::o;15729:326::-;15924:6;15916;15912:19;15901:9;15894:38;15968:2;15963;15952:9;15948:18;15941:30;15875:4;15988:61;16045:2;16034:9;16030:18;16022:6;16014;15988:61;:::i;16617:401::-;16819:2;16801:21;;;16858:2;16838:18;;;16831:30;16897:34;16892:2;16877:18;;16870:62;-1:-1:-1;;;16963:2:19;16948:18;;16941:35;17008:3;16993:19;;16617:401::o;17023:276::-;17216:3;17194:16;;;;-1:-1:-1;;;;;;17190:38:19;17178:51;;17254:1;17245:11;;17238:27;17290:2;17281:12;;17023:276::o;17304:640::-;17585:6;17573:19;;17555:38;;-1:-1:-1;;;;;17629:32:19;;17624:2;17609:18;;17602:60;17649:3;17693:2;17678:18;;17671:31;;;-1:-1:-1;;17725:45:19;;17750:19;;17742:6;17725:45;:::i;:::-;17820:6;17813:14;17806:22;17801:2;17790:9;17786:18;17779:50;17878:9;17870:6;17866:22;17860:3;17849:9;17845:19;17838:51;17906:32;17931:6;17923;17906:32;:::i;:::-;17898:40;17304:640;-1:-1:-1;;;;;;;;17304:640:19:o;17949:245::-;18028:6;18036;18089:2;18077:9;18068:7;18064:23;18060:32;18057:52;;;18105:1;18102;18095:12;18057:52;-1:-1:-1;;18128:16:19;;18184:2;18169:18;;;18163:25;18128:16;;18163:25;;-1:-1:-1;17949:245:19:o;18199:351::-;18401:2;18383:21;;;18440:2;18420:18;;;18413:30;18479:29;18474:2;18459:18;;18452:57;18541:2;18526:18;;18199:351::o;18555:880::-;18747:4;18776:3;18825:4;18816:6;18810:13;18806:24;18795:9;18788:43;18899:4;18891;18883:6;18879:17;18873:24;18869:35;18862:4;18851:9;18847:20;18840:65;18973:4;18965;18957:6;18953:17;18947:24;18943:35;18936:4;18925:9;18921:20;18914:65;19026:4;19018:6;19014:17;19008:24;19068:1;19064;19059:3;19055:11;19051:19;19126:2;19112:12;19108:21;19101:4;19090:9;19086:20;19079:51;19198:2;19190:4;19182:6;19178:17;19172:24;19168:33;19161:4;19150:9;19146:20;19139:63;;;19258:4;19250:6;19246:17;19240:24;19233:4;19222:9;19218:20;19211:54;19321:4;19313:6;19309:17;19303:24;19296:4;19285:9;19281:20;19274:54;19365:2;19359:3;19348:9;19344:19;19337:31;19385:44;19425:2;19414:9;19410:18;19402:6;19385:44;:::i;:::-;19377:52;18555:880;-1:-1:-1;;;;;18555:880:19:o;19798:127::-;19859:10;19854:3;19850:20;19847:1;19840:31;19890:4;19887:1;19880:15;19914:4;19911:1;19904:15;19930:128;19997:9;;;20018:11;;;20015:37;;;20032:18;;:::i;20063:360::-;20274:6;20266;20261:3;20248:33;20344:2;20340:15;;;;-1:-1:-1;;20336:53:19;20300:16;;20325:65;;;20414:2;20406:11;;20063:360;-1:-1:-1;20063:360:19:o;20553:544::-;20654:2;20649:3;20646:11;20643:448;;;20690:1;20715:5;20711:2;20704:17;20760:4;20756:2;20746:19;20830:2;20818:10;20814:19;20811:1;20807:27;20801:4;20797:38;20866:4;20854:10;20851:20;20848:47;;;-1:-1:-1;20889:4:19;20848:47;20944:2;20939:3;20935:12;20932:1;20928:20;20922:4;20918:31;20908:41;;20999:82;21017:2;21010:5;21007:13;20999:82;;;21062:17;;;21043:1;21032:13;20999:82;;21273:1348;21397:3;21391:10;-1:-1:-1;;;;;21416:6:19;21413:30;21410:56;;;21446:18;;:::i;:::-;21475:96;21564:6;21524:38;21556:4;21550:11;21524:38;:::i;:::-;21518:4;21475:96;:::i;:::-;21626:4;;21690:2;21679:14;;21707:1;21702:662;;;;22408:1;22425:6;22422:89;;;-1:-1:-1;22477:19:19;;;22471:26;22422:89;-1:-1:-1;;21230:1:19;21226:11;;;21222:24;21218:29;21208:40;21254:1;21250:11;;;21205:57;22524:81;;21672:943;;21702:662;20500:1;20493:14;;;20537:4;20524:18;;-1:-1:-1;;21738:20:19;;;21855:236;21869:7;21866:1;21863:14;21855:236;;;21958:19;;;21952:26;21937:42;;22050:27;;;;22018:1;22006:14;;;;21885:19;;21855:236;;;21859:3;22119:6;22110:7;22107:19;22104:201;;;22180:19;;;22174:26;-1:-1:-1;;22263:1:19;22259:14;;;22275:3;22255:24;22251:37;22247:42;22232:58;22217:74;;22104:201;-1:-1:-1;;;;;22351:1:19;22335:14;;;22331:22;22318:36;;-1:-1:-1;21273:1348:19:o;23240:498::-;23440:4;23469:6;23514:2;23506:6;23502:15;23491:9;23484:34;23566:2;23558:6;23554:15;23549:2;23538:9;23534:18;23527:43;;23606:6;23601:2;23590:9;23586:18;23579:34;23649:3;23644:2;23633:9;23629:18;23622:31;23670:62;23727:3;23716:9;23712:19;23704:6;23696;23670:62;:::i;:::-;23662:70;23240:498;-1:-1:-1;;;;;;;23240:498:19:o;24456:1202::-;-1:-1:-1;;;;;24573:3:19;24570:27;24567:53;;;24600:18;;:::i;:::-;24629:93;24718:3;24678:38;24710:4;24704:11;24678:38;:::i;:::-;24672:4;24629:93;:::i;:::-;24748:1;24773:2;24768:3;24765:11;24790:1;24785:615;;;;25444:1;25461:3;25458:93;;;-1:-1:-1;25517:19:19;;;25504:33;25458:93;-1:-1:-1;;21230:1:19;21226:11;;;21222:24;21218:29;21208:40;21254:1;21250:11;;;21205:57;25564:78;;24758:894;;24785:615;20500:1;20493:14;;;20537:4;20524:18;;-1:-1:-1;;24821:17:19;;;24921:9;24943:229;24957:7;24954:1;24951:14;24943:229;;;25046:19;;;25033:33;25018:49;;25153:4;25138:20;;;;25106:1;25094:14;;;;24973:12;24943:229;;;24947:3;25200;25191:7;25188:16;25185:159;;;25324:1;25320:6;25314:3;25308;25305:1;25301:11;25297:21;25293:34;25289:39;25276:9;25271:3;25267:19;25254:33;25250:79;25242:6;25235:95;25185:159;;;25387:1;25381:3;25378:1;25374:11;25370:19;25364:4;25357:33;24758:894;;24456:1202;;;:::o;26531:441::-;26584:5;26637:3;26630:4;26622:6;26618:17;26614:27;26604:55;;26655:1;26652;26645:12;26604:55;26684:6;26678:13;26715:48;26731:31;26759:2;26731:31;:::i;26715:48::-;26788:2;26779:7;26772:19;26834:3;26827:4;26822:2;26814:6;26810:15;26806:26;26803:35;26800:55;;;26851:1;26848;26841:12;26800:55;26864:77;26938:2;26931:4;26922:7;26918:18;26911:4;26903:6;26899:17;26864:77;:::i;26977:335::-;27056:6;27109:2;27097:9;27088:7;27084:23;27080:32;27077:52;;;27125:1;27122;27115:12;27077:52;27158:9;27152:16;-1:-1:-1;;;;;27183:6:19;27180:30;27177:50;;;27223:1;27220;27213:12;27177:50;27246:60;27298:7;27289:6;27278:9;27274:22;27246:60;:::i;28084:184::-;28154:6;28207:2;28195:9;28186:7;28182:23;28178:32;28175:52;;;28223:1;28220;28213:12;28175:52;-1:-1:-1;28246:16:19;;28084:184;-1:-1:-1;28084:184:19:o;29515:837::-;29864:6;29856;29852:19;29841:9;29834:38;29908:3;29903:2;29892:9;29888:18;29881:31;29815:4;29935:45;29975:3;29964:9;29960:19;29952:6;29935:45;:::i;:::-;30028:9;30020:6;30016:22;30011:2;30000:9;29996:18;29989:50;30062:32;30087:6;30079;30062:32;:::i;:::-;-1:-1:-1;;;;;30168:15:19;;;30163:2;30148:18;;30141:43;30221:15;;30215:3;30200:19;;30193:44;30274:22;;;30121:3;30253:19;;30246:51;30048:46;-1:-1:-1;30314:32:19;30048:46;30331:6;30314:32;:::i;:::-;30306:40;29515:837;-1:-1:-1;;;;;;;;;29515:837:19:o;30357:125::-;30422:9;;;30443:10;;;30440:36;;;30456:18;;:::i;31176:407::-;31378:2;31360:21;;;31417:2;31397:18;;;31390:30;31456:34;31451:2;31436:18;;31429:62;-1:-1:-1;;;31522:2:19;31507:18;;31500:41;31573:3;31558:19;;31176:407::o;31588:138::-;31667:13;;31689:31;31667:13;31689:31;:::i;31731:1226::-;31846:6;31854;31898:9;31889:7;31885:23;31928:3;31924:2;31920:12;31917:32;;;31945:1;31942;31935:12;31917:32;31969:4;31965:2;31961:13;31958:33;;;31987:1;31984;31977:12;31958:33;;32013:22;;:::i;:::-;32065:9;32059:16;32084:31;32107:7;32084:31;:::i;:::-;32124:22;;32191:2;32176:18;;32170:25;32204:31;32170:25;32204:31;:::i;:::-;32262:2;32251:14;;32244:31;32320:2;32305:18;;32299:25;32333:31;32299:25;32333:31;:::i;:::-;32391:2;32380:14;;32373:31;32449:2;32434:18;;32428:25;32462:33;32428:25;32462:33;:::i;:::-;32522:2;32511:14;;32504:31;32568:50;32613:3;32598:19;;32568:50;:::i;:::-;32562:3;32555:5;32551:15;32544:75;32673:3;32662:9;32658:19;32652:26;32646:3;32639:5;32635:15;32628:51;32733:3;32722:9;32718:19;32712:26;32706:3;32699:5;32695:15;32688:51;32758:5;32748:15;;;32807:4;32796:9;32792:20;32786:27;-1:-1:-1;;;;;32828:6:19;32825:30;32822:50;;;32868:1;32865;32858:12;32822:50;32891:60;32943:7;32934:6;32923:9;32919:22;32891:60;:::i;33737:287::-;33866:3;33904:6;33898:13;33920:66;33979:6;33974:3;33967:4;33959:6;33955:17;33920:66;:::i;:::-;34002:16;;;;;33737:287;-1:-1:-1;;33737:287:19:o
Swarm Source
ipfs://af62c80b79040e5f9482c0160bb3cfa3c1e385635c118c583d9ebd039a152ad9
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 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.