Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
UltraLightNode
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; import "./Ownable.sol"; import "./SafeMath.sol"; import "./ReentrancyGuard.sol"; import "./IERC20.sol"; import "./SafeERC20.sol"; import "./ILayerZeroValidationLibrary.sol"; import "./ILayerZeroMessagingLibrary.sol"; import "./ILayerZeroReceiver.sol"; import "./ILayerZeroRelayer.sol"; import "./ILayerZeroTreasury.sol"; import "./ILayerZeroOracle.sol"; import "./ILayerZeroUltraLightNodeV1.sol"; import "./ILayerZeroEndpoint.sol"; contract UltraLightNode is ILayerZeroMessagingLibrary, ILayerZeroUltraLightNodeV1, ReentrancyGuard, Ownable { using SafeERC20 for IERC20; using SafeMath for uint; struct BlockData { uint confirmations; bytes32 data; } // Application config uint public constant CONFIG_TYPE_INBOUND_PROOF_LIBRARY_VERSION = 1; uint public constant CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS = 2; uint public constant CONFIG_TYPE_RELAYER = 3; uint public constant CONFIG_TYPE_OUTBOUND_PROOF_TYPE = 4; uint public constant CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS = 5; uint public constant CONFIG_TYPE_ORACLE = 6; struct ApplicationConfiguration { uint16 inboundProofLibraryVersion; uint64 inboundBlockConfirmations; address relayer; uint16 outboundProofType; uint64 outboundBlockConfirmations; address oracle; } // Token and Contracts IERC20 public layerZeroToken; ILayerZeroTreasury public treasuryContract; // Fee management uint public constant BP_DENOMINATOR = 10000; // treasury and relayer share the protocol fee, either in native token or ZRO uint8 public constant WITHDRAW_TYPE_TREASURY_PROTOCOL_FEES = 0; uint8 public constant WITHDRAW_TYPE_ORACLE_QUOTED_FEES = 1; // quoted fee refers to the fee in block relaying uint8 public constant WITHDRAW_TYPE_RELAYER_QUOTED_FEES = 2; //quoted fee refers the fee in msg relaying mapping(address => uint) public oracleQuotedFees; mapping(address => uint) public relayerQuotedFees; uint public treasuryNativeFees; uint public treasuryZROFees; // User Application mapping(address => mapping(uint16 => ApplicationConfiguration)) public appConfig; // app address => chainId => config mapping(uint16 => ApplicationConfiguration) public defaultAppConfig; // default UA settings if no version specified mapping(uint16 => mapping(uint16 => bytes)) public defaultAdapterParams; // Validation mapping(uint16 => mapping(uint16 => address)) public inboundProofLibrary; // chainId => library Id => inboundProofLibrary contract mapping(uint16 => uint16) public maxInboundProofLibrary; // chainId => inboundProofLibrary mapping(uint16 => mapping(uint16 => bool)) public supportedOutboundProof; // chainId => outboundProofType => enabled mapping(uint16 => uint) public chainAddressSizeMap; mapping(address => mapping(uint16 => mapping(bytes32 => BlockData))) public hashLookup; mapping(uint16 => bytes32) public ulnLookup; // remote ulns ILayerZeroEndpoint public immutable endpoint; // Events event AppConfigUpdated(address userApplication, uint configType, bytes newConfig); event AddInboundProofLibraryForChain(uint16 chainId, address lib); event EnableSupportedOutboundProof(uint16 chainId, uint16 proofType); event HashReceived(uint16 srcChainId, address oracle, uint confirmations, bytes32 blockhash); event Packet(uint16 chainId, bytes payload); event RelayerParams(uint16 chainId, uint64 nonce, uint16 outboundProofType, bytes adapterParams); event SetChainAddressSize(uint16 chainId, uint size); event SetDefaultConfigForChainId(uint16 chainId, uint16 inboundProofLib, uint64 inboundBlockConfirm, address relayer, uint16 outboundProofType, uint16 outboundBlockConfirm, address oracle); event SetDefaultAdapterParamsForChainId(uint16 chainId, uint16 proofType, bytes adapterParams); event SetLayerZeroToken(address tokenAddress); event SetRelayerFeeContract(address relayerFeeContract); event SetRemoteUln(uint16 chainId, bytes32 uln); event SetTreasury(address treasuryAddress); event WithdrawZRO(address _msgSender, address _to, uint _amount); event WithdrawNative(uint8 _type, address _owner, address _msgSender, address _to, uint _amount); constructor(address _endpoint) { require(_endpoint != address(0x0), "LayerZero: endpoint cannot be zero address"); endpoint = ILayerZeroEndpoint(_endpoint); } // only the endpoint can call SEND() and setConfig() modifier onlyEndpoint() { require(address(endpoint) == msg.sender, "LayerZero: only endpoint"); _; } //---------------------------------------------------------------------------------- // PROTOCOL // This function completes delivery of a LayerZero message. // // In order to deliver the message, this function: // (a) takes the _transactionProof submitted by UA's relayer, and // (b) retrieve UA's validation library // (c) takes the _blockData submitted by the UA's oracle given the their configuration (and blockConfirmations), // (d) decodes using UA's validation library using (a) and (c) // then, this functions asserts that // (e) the payload originated from the known Ultra Light Node from source chain, and // (f) the _dstAddress the specified destination contract function validateTransactionProof(uint16 _srcChainId, address _dstAddress, uint _gasLimit, bytes32 _lookupHash, bytes calldata _transactionProof) external override { // retrieve UA's configuration using the _dstAddress from arguments. ApplicationConfiguration memory uaConfig = getAppConfig(_srcChainId, _dstAddress); // (a) assert that the caller == UA's relayer require(uaConfig.relayer == msg.sender, "LayerZero: invalid relayer"); LayerZeroPacket.Packet memory _packet; { // (b) retrieve UA's validation library address inboundProofLib = inboundProofLibrary[_srcChainId][uaConfig.inboundProofLibraryVersion]; // (c) assert that the data submitted by UA's oracle have no fewer confirmations than UA's configuration BlockData storage blockData = hashLookup[uaConfig.oracle][_srcChainId][_lookupHash]; require(blockData.confirmations >= uaConfig.inboundBlockConfirmations, "LayerZero: not enough block confirmations"); // (d) decode uint remoteAddressSize = chainAddressSizeMap[_srcChainId]; _packet = ILayerZeroValidationLibrary(inboundProofLib).validateProof(blockData.data, _transactionProof, remoteAddressSize); } // (e) assert that the packet was emitted by the source ultra light node require(ulnLookup[_srcChainId] == _packet.ulnAddress, "LayerZero: _packet.ulnAddress is invalid"); // (f) assert that the _packet._dstAddress == the _dstAddress specified by the UAs message require(_packet.dstAddress == _dstAddress, "LayerZero: invalid dst address"); // publish the payload and _gasLimit to the endpoint for calling lzReceive at _dstAddress endpoint.receivePayload(_packet.srcChainId, _packet.srcAddress, _packet.dstAddress, _packet.nonce, _gasLimit, _packet.payload); } // Called (by the Endpoint) with the information required to send a LayerZero message for a User Application. // This function: // (a) pays the protocol (native token or ZRO), oracle (native token) and relayer (native token) for their roles in sending the message. // (b) generates the message payload and emits events of the message and adapterParams // (c) notifies the oracle function send(address _ua, uint64 _nonce, uint16 _chainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable override onlyEndpoint { ApplicationConfiguration memory uaConfig = getAppConfig(_chainId, _ua); address ua = _ua; uint64 nonce = _nonce; uint16 chainId = _chainId; require(ulnLookup[chainId] != bytes32(0), "LayerZero: chainId does not exist"); uint totalNativeFee; { uint oracleFee; // (a - 1), pay the oracle { oracleFee = ILayerZeroOracle(uaConfig.oracle).getPrice(chainId, uaConfig.outboundProofType); oracleQuotedFees[uaConfig.oracle] = oracleQuotedFees[uaConfig.oracle].add(oracleFee); } // (a - 2), pay the relayer { uint payloadSize = _payload.length; ILayerZeroRelayer relayer = ILayerZeroRelayer(uaConfig.relayer); if (_adapterParams.length == 0) { bytes memory defaultAdaptorParam = defaultAdapterParams[chainId][uaConfig.outboundProofType]; totalNativeFee = relayer.getPrice(chainId, uaConfig.outboundProofType, ua, payloadSize, defaultAdaptorParam); relayer.notifyRelayer(chainId, uaConfig.outboundProofType, defaultAdaptorParam); } else { totalNativeFee = relayer.getPrice(chainId, uaConfig.outboundProofType, ua, payloadSize, _adapterParams); relayer.notifyRelayer(chainId, uaConfig.outboundProofType, _adapterParams); } relayerQuotedFees[uaConfig.relayer] = relayerQuotedFees[uaConfig.relayer].add(totalNativeFee); // totalNativeFee == relayerFee here // emit the param events emit RelayerParams(chainId, nonce, uaConfig.outboundProofType, _adapterParams); } // (a - 3), pay the protocol { // if no ZRO token or not specifying a payment address, pay in native token bool payInNative = _zroPaymentAddress == address(0x0) || address(layerZeroToken) == address(0x0); uint protocolFee = treasuryContract.getFees(!payInNative, totalNativeFee, oracleFee); // totalNativeFee == relayerFee here if (protocolFee > 0) { if (payInNative) { treasuryNativeFees = treasuryNativeFees.add(protocolFee); totalNativeFee = totalNativeFee.add(protocolFee); } else { // zro payment address must equal the _ua or the tx.origin otherwise the transaction reverts require(_zroPaymentAddress == ua || _zroPaymentAddress == tx.origin, "LayerZero: must be paid by sender or origin"); // transfer the LayerZero token to this contract from the payee layerZeroToken.safeTransferFrom(_zroPaymentAddress, address(this), protocolFee); treasuryZROFees = treasuryZROFees.add(protocolFee); } } } totalNativeFee = totalNativeFee.add(oracleFee); } // (b) emit payload and the adapterParams if any { bytes memory encodedPayload = abi.encodePacked(nonce, ua, _destination, _payload); emit Packet(chainId, encodedPayload); // (c) notify the oracle ILayerZeroOracle(uaConfig.oracle).notifyOracle(chainId, uaConfig.outboundProofType, uaConfig.outboundBlockConfirmations); } require(totalNativeFee <= msg.value, "LayerZero: not enough native for fees"); // refund if they send too much uint amount = msg.value.sub(totalNativeFee); if (amount > 0) { (bool success, ) = _refundAddress.call{value: amount}(""); require(success, "LayerZero: failed to refund"); } } // Can be called by any address to update a block header // can only upload new block data or the same block data with more confirmations function updateHash(uint16 _srcChainId, bytes32 _lookupHash, uint _confirmations, bytes32 _data) external override { // this function may revert with a default message if the oracle address is not an ILayerZeroOracle BlockData storage bd = hashLookup[msg.sender][_srcChainId][_lookupHash]; // if it has a record, requires a larger confirmation. require(bd.confirmations < _confirmations, "LayerZero: oracle data can only update if it has more confirmations"); // set the new information into storage bd.confirmations = _confirmations; bd.data = _data; emit HashReceived(_srcChainId, msg.sender, _confirmations, _lookupHash); } //---------------------------------------------------------------------------------- // Other Library Interfaces // default to DEFAULT setting if ZERO value function getAppConfig(uint16 _chainId, address userApplicationAddress) public view returns (ApplicationConfiguration memory) { ApplicationConfiguration memory config = appConfig[userApplicationAddress][_chainId]; ApplicationConfiguration storage defaultConfig = defaultAppConfig[_chainId]; if (config.inboundProofLibraryVersion == 0) { config.inboundProofLibraryVersion = defaultConfig.inboundProofLibraryVersion; } if (config.inboundBlockConfirmations == 0) { config.inboundBlockConfirmations = defaultConfig.inboundBlockConfirmations; } if (config.relayer == address(0x0)) { config.relayer = defaultConfig.relayer; } if (config.outboundProofType == 0) { config.outboundProofType = defaultConfig.outboundProofType; } if (config.outboundBlockConfirmations == 0) { config.outboundBlockConfirmations = defaultConfig.outboundBlockConfirmations; } if (config.oracle == address(0x0)) { config.oracle = defaultConfig.oracle; } return config; } function setConfig(uint16 chainId, address _ua, uint _configType, bytes calldata _config) external override onlyEndpoint { ApplicationConfiguration storage uaConfig = appConfig[_ua][chainId]; if (_configType == CONFIG_TYPE_INBOUND_PROOF_LIBRARY_VERSION) { uint16 inboundProofLibraryVersion = abi.decode(_config, (uint16)); require(inboundProofLibraryVersion <= maxInboundProofLibrary[chainId], "LayerZero: invalid inbound proof library version"); uaConfig.inboundProofLibraryVersion = inboundProofLibraryVersion; } else if (_configType == CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS) { uint64 blockConfirmations = abi.decode(_config, (uint64)); uaConfig.inboundBlockConfirmations = blockConfirmations; } else if (_configType == CONFIG_TYPE_RELAYER) { address relayer = abi.decode(_config, (address)); uaConfig.relayer = relayer; } else if (_configType == CONFIG_TYPE_OUTBOUND_PROOF_TYPE) { uint16 outboundProofType = abi.decode(_config, (uint16)); require(supportedOutboundProof[chainId][outboundProofType] || outboundProofType == 0, "LayerZero: invalid outbound proof type"); uaConfig.outboundProofType = outboundProofType; } else if (_configType == CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS) { uint64 blockConfirmations = abi.decode(_config, (uint64)); uaConfig.outboundBlockConfirmations = blockConfirmations; } else if (_configType == CONFIG_TYPE_ORACLE) { address oracle = abi.decode(_config, (address)); uaConfig.oracle = oracle; } else { revert("LayerZero: Invalid config type"); } emit AppConfigUpdated(_ua, _configType, _config); } function getConfig(uint16 _chainId, address userApplicationAddress, uint _configType) external view override returns (bytes memory) { ApplicationConfiguration storage uaConfig = appConfig[userApplicationAddress][_chainId]; if (_configType == CONFIG_TYPE_INBOUND_PROOF_LIBRARY_VERSION) { if (uaConfig.inboundProofLibraryVersion == 0) { return abi.encode(defaultAppConfig[_chainId].inboundProofLibraryVersion); } return abi.encode(uaConfig.inboundProofLibraryVersion); } else if (_configType == CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS) { if (uaConfig.inboundBlockConfirmations == 0) { return abi.encode(defaultAppConfig[_chainId].inboundBlockConfirmations); } return abi.encode(uaConfig.inboundBlockConfirmations); } else if (_configType == CONFIG_TYPE_RELAYER) { if (uaConfig.relayer == address(0x0)) { return abi.encode(defaultAppConfig[_chainId].relayer); } return abi.encode(uaConfig.relayer); } else if (_configType == CONFIG_TYPE_OUTBOUND_PROOF_TYPE) { if (uaConfig.outboundProofType == 0) { return abi.encode(defaultAppConfig[_chainId].outboundProofType); } return abi.encode(uaConfig.outboundProofType); } else if (_configType == CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS) { if (uaConfig.outboundBlockConfirmations == 0) { return abi.encode(defaultAppConfig[_chainId].outboundBlockConfirmations); } return abi.encode(uaConfig.outboundBlockConfirmations); } else if (_configType == CONFIG_TYPE_ORACLE) { if (uaConfig.oracle == address(0x0)) { return abi.encode(defaultAppConfig[_chainId].oracle); } return abi.encode(uaConfig.oracle); } else { revert("LayerZero: Invalid config type"); } } // returns the native fee the UA pays to cover fees function estimateFees(uint16 _chainId, address _ua, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParams) external view override returns (uint nativeFee, uint zroFee) { uint16 chainId = _chainId; address ua = _ua; uint payloadSize = _payload.length; bytes memory adapterParam = _adapterParams; ApplicationConfiguration memory uaConfig = getAppConfig(chainId, ua); // Relayer Fee uint relayerFee; { if (adapterParam.length == 0) { bytes memory defaultAdaptorParam = defaultAdapterParams[chainId][uaConfig.outboundProofType]; relayerFee = ILayerZeroRelayer(uaConfig.relayer).getPrice(chainId, uaConfig.outboundProofType, ua, payloadSize, defaultAdaptorParam); } else { relayerFee = ILayerZeroRelayer(uaConfig.relayer).getPrice(chainId, uaConfig.outboundProofType, ua, payloadSize, adapterParam); } } // Oracle Fee uint oracleFee = ILayerZeroOracle(uaConfig.oracle).getPrice(chainId, uaConfig.outboundProofType); // LayerZero Fee { uint protocolFee = treasuryContract.getFees(_payInZRO, relayerFee, oracleFee); _payInZRO ? zroFee = protocolFee : nativeFee = protocolFee; } // return the sum of fees nativeFee = nativeFee.add(relayerFee).add(oracleFee); } //--------------------------------------------------------------------------- // Claim Fees // universal withdraw ZRO token function function withdrawZRO(address _to, uint _amount) external override nonReentrant { require(msg.sender == address(treasuryContract), "LayerZero: only treasury"); treasuryZROFees = treasuryZROFees.sub(_amount); layerZeroToken.safeTransfer(_to, _amount); emit WithdrawZRO(msg.sender, _to, _amount); } // universal withdraw native token function. // the source contract should perform all the authentication control // safemath overflow if the amount is not enough function withdrawNative(uint8 _type, address _owner, address payable _to, uint _amount) external override nonReentrant { if (_type == WITHDRAW_TYPE_TREASURY_PROTOCOL_FEES) { require(msg.sender == address(treasuryContract), "LayerZero:only treasury"); treasuryNativeFees = treasuryNativeFees.sub(_amount); } else if (_type == WITHDRAW_TYPE_ORACLE_QUOTED_FEES) { oracleQuotedFees[msg.sender] = oracleQuotedFees[msg.sender].sub(_amount); } else if (_type == WITHDRAW_TYPE_RELAYER_QUOTED_FEES) { relayerQuotedFees[msg.sender] = relayerQuotedFees[msg.sender].sub(_amount); } else { revert("LayerZero: unsupported withdraw type"); } (bool success, ) = _to.call{value: _amount}(""); require(success, "LayerZero: withdraw failed"); emit WithdrawNative(_type, _owner, msg.sender, _to, _amount); } //--------------------------------------------------------------------------- // Owner calls, configuration only. function setLayerZeroToken(address _layerZeroToken) external onlyOwner { require(_layerZeroToken != address(0x0), "LayerZero: _layerZeroToken cannot be zero address"); layerZeroToken = IERC20(_layerZeroToken); emit SetLayerZeroToken(_layerZeroToken); } function setTreasury(address _treasury) external onlyOwner { require(_treasury != address(0x0), "LayerZero: treasury cannot be zero address"); treasuryContract = ILayerZeroTreasury(_treasury); emit SetTreasury(_treasury); } function addInboundProofLibraryForChain(uint16 _chainId, address _library) external onlyOwner { require(_library != address(0x0), "LayerZero: library cannot be zero address"); require(maxInboundProofLibrary[_chainId] < 65535, "LayerZero: can not add new library"); maxInboundProofLibrary[_chainId]++; inboundProofLibrary[_chainId][maxInboundProofLibrary[_chainId]] = _library; emit AddInboundProofLibraryForChain(_chainId, _library); } function enableSupportedOutboundProof(uint16 _chainId, uint16 _proofType) external onlyOwner { supportedOutboundProof[_chainId][_proofType] = true; emit EnableSupportedOutboundProof(_chainId, _proofType); } function setDefaultConfigForChainId(uint16 _chainId, uint16 _inboundProofLibraryVersion, uint64 _inboundBlockConfirmations, address _relayer, uint16 _outboundProofType, uint16 _outboundBlockConfirmations, address _oracle) external onlyOwner { require(_inboundProofLibraryVersion <= maxInboundProofLibrary[_chainId] && _inboundProofLibraryVersion > 0, "LayerZero: invalid inbound proof library version"); require(_inboundBlockConfirmations > 0, "LayerZero: invalid inbound block confirmation"); require(_relayer != address(0x0), "LayerZero: invalid relayer address"); require(supportedOutboundProof[_chainId][_outboundProofType], "LayerZero: invalid outbound proof type"); require(_outboundBlockConfirmations > 0, "LayerZero: invalid outbound block confirmation"); require(_oracle != address(0x0), "LayerZero: invalid oracle address"); defaultAppConfig[_chainId] = ApplicationConfiguration(_inboundProofLibraryVersion, _inboundBlockConfirmations, _relayer, _outboundProofType, _outboundBlockConfirmations, _oracle); emit SetDefaultConfigForChainId(_chainId, _inboundProofLibraryVersion, _inboundBlockConfirmations, _relayer, _outboundProofType, _outboundBlockConfirmations, _oracle); } function setDefaultAdapterParamsForChainId(uint16 _chainId, uint16 _proofType, bytes calldata _adapterParams) external onlyOwner { defaultAdapterParams[_chainId][_proofType] = _adapterParams; emit SetDefaultAdapterParamsForChainId(_chainId, _proofType, _adapterParams); } function setRemoteUln(uint16 _remoteChainId, bytes32 _remoteUln) external onlyOwner { require(ulnLookup[_remoteChainId] == bytes32(0), "LayerZero: remote uln already set"); ulnLookup[_remoteChainId] = _remoteUln; emit SetRemoteUln(_remoteChainId, _remoteUln); } function setChainAddressSize(uint16 _chainId, uint _size) external onlyOwner { require(chainAddressSizeMap[_chainId] == 0, "LayerZero: remote chain address size already set"); chainAddressSizeMap[_chainId] = _size; emit SetChainAddressSize(_chainId, _size); } //---------------------------------------------------------------------------------- // view functions function getBlockHeaderData(address _oracle, uint16 _remoteChainId, bytes32 _lookupHash) external view returns (BlockData memory blockData) { return hashLookup[_oracle][_remoteChainId][_lookupHash]; } function oracleQuotedAmount(address _oracle) external view override returns (uint) { return oracleQuotedFees[_oracle]; } function relayerQuotedAmount(address _relayer) external view override returns (uint) { return relayerQuotedFees[_relayer]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.7.0; /** * @dev A library for working with mutable byte buffers in Solidity. * * Byte buffers are mutable and expandable, and provide a variety of primitives * for writing to them. At any time you can fetch a bytes object containing the * current contents of the buffer. The bytes object should not be stored between * operations, as it may change due to resizing of the buffer. */ library Buffer { /** * @dev Represents a mutable buffer. Buffers have a current value (buf) and * a capacity. The capacity may be longer than the current value, in * which case it can be extended without the need to allocate more memory. */ struct buffer { bytes buf; uint capacity; } /** * @dev Initializes a buffer with an initial capacity.a co * @param buf The buffer to initialize. * @param capacity The number of bytes of space to allocate the buffer. * @return The buffer, for chaining. */ function init(buffer memory buf, uint capacity) internal pure returns (buffer memory) { if (capacity % 32 != 0) { capacity += 32 - (capacity % 32); } // Allocate space for the buffer data buf.capacity = capacity; assembly { let ptr := mload(0x40) mstore(buf, ptr) mstore(ptr, 0) mstore(0x40, add(32, add(ptr, capacity))) } return buf; } /** * @dev Initializes a new buffer from an existing bytes object. * Changes to the buffer may mutate the original value. * @param b The bytes object to initialize the buffer with. * @return A new buffer. */ function fromBytes(bytes memory b) internal pure returns (buffer memory) { buffer memory buf; buf.buf = b; buf.capacity = b.length; return buf; } function resize(buffer memory buf, uint capacity) private pure { bytes memory oldbuf = buf.buf; init(buf, capacity); append(buf, oldbuf); } function max(uint a, uint b) private pure returns (uint) { if (a > b) { return a; } return b; } /** * @dev Sets buffer length to 0. * @param buf The buffer to truncate. * @return The original buffer, for chaining.. */ function truncate(buffer memory buf) internal pure returns (buffer memory) { assembly { let bufptr := mload(buf) mstore(bufptr, 0) } return buf; } /** * @dev Writes a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The start offset to write to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns (buffer memory) { require(len <= data.length); if (off + len > buf.capacity) { resize(buf, max(buf.capacity, len + off) * 2); } uint dest; uint src; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Start address = buffer address + offset + sizeof(buffer length) dest := add(add(bufptr, 32), off) // Update buffer length if we're extending it if gt(add(len, off), buflen) { mstore(bufptr, add(len, off)) } src := add(data, 32) } // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256**(32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } return buf; } /** * @dev Writes a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The start offset to write to. * @param rawData The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function writeRawBytes(buffer memory buf, uint off, bytes memory rawData, uint offData, uint len) internal pure returns (buffer memory) { if (off + len > buf.capacity) { resize(buf, max(buf.capacity, len + off) * 2); } uint dest; uint src; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Start address = buffer address + offset + sizeof(buffer length) dest := add(add(bufptr, 32), off) // Update buffer length if we're extending it if gt(add(len, off), buflen) { mstore(bufptr, add(len, off)) } src := add(rawData, offData) } // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256**(32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } return buf; } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, len); } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, data.length); } /** * @dev Writes a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write the byte at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns (buffer memory) { if (off >= buf.capacity) { resize(buf, buf.capacity * 2); } assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Address = buffer address + sizeof(buffer length) + off let dest := add(add(bufptr, off), 32) mstore8(dest, data) // Update buffer length if we extended it if eq(off, buflen) { mstore(bufptr, add(buflen, 1)) } } return buf; } /** * @dev Appends a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendUint8(buffer memory buf, uint8 data) internal pure returns (buffer memory) { return writeUint8(buf, buf.buf.length, data); } /** * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (left-aligned). * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns (buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } uint mask = 256**len - 1; // Right-align data data = data >> (8 * (32 - len)); assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + sizeof(buffer length) + off + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) { return write(buf, off, bytes32(data), 20); } /** * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chhaining. */ function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, bytes32(data), 20); } function appendBytes8(buffer memory buf, bytes8 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, bytes32(data), 8); } /** * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, 32); } /** * @dev Writes an integer to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (right-aligned). * @return The original buffer, for chaining. */ function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns (buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } uint mask = 256**len - 1; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + off + sizeof(buffer length) + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Appends a byte to the end of the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer. */ function appendInt(buffer memory buf, uint data, uint len) internal pure returns (buffer memory) { return writeInt(buf, buf.buf.length, data, len); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: BUSL-1.1 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 receiver 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: BUSL-1.1 pragma solidity >=0.7.0; import "./ILayerZeroUserApplicationConfig.sol"; interface ILayerZeroMessagingLibrary { // send(), messages will be inflight. function send(address _userApplication, uint64 _lastNonce, uint16 _chainId, bytes calldata _destination, bytes calldata _payload, address payable refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // estimate native fee at the send side function estimateFees(uint16 _chainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); //--------------------------------------------------------------------------- // setConfig / getConfig are User Application (UA) functions to specify Oracle, Relayer, blockConfirmations, libraryVersion function setConfig(uint16 _chainId, address _userApplication, uint _configType, bytes calldata _config) external; function getConfig(uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.7.0; interface ILayerZeroOracle { // @notice query the oracle price for relaying block information to the destination chain // @param _dstChainId the destination endpoint identifier // @param _outboundProofType the proof type identifier to specify the data to be relayed function getPrice(uint16 _dstChainId, uint16 _outboundProofType) external view returns (uint price); // @notice Ultra-Light Node notifies the Oracle of a new block information relaying request // @param _dstChainId the destination endpoint identifier // @param _outboundProofType the proof type identifier to specify the data to be relayed // @param _outboundBlockConfirmations the number of source chain block confirmation needed function notifyOracle(uint16 _dstChainId, uint16 _outboundProofType, uint64 _outboundBlockConfirmations) external; // @notice query if the address is an approved actor for privileges like data submission and fee withdrawal etc. // @param _address the address to be checked function isApproved(address _address) external view returns (bool approved); }
// SPDX-License-Identifier: BUSL-1.1 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: BUSL-1.1 pragma solidity >=0.7.0; interface ILayerZeroRelayer { // @notice query the relayer price for relaying the payload and its proof to the destination chain // @param _dstChainId - the destination endpoint identifier // @param _outboundProofType - the proof type identifier to specify proof to be relayed // @param _userApplication - the source sending contract address. relayers may apply price discrimination to user apps // @param _payloadSize - the length of the payload. it is an indicator of gas usage for relaying cross-chain messages // @param _adapterParams - optional parameters for extra service plugins, e.g. sending dust tokens at the destination chain function getPrice(uint16 _dstChainId, uint16 _outboundProofType, address _userApplication, uint _payloadSize, bytes calldata _adapterParams) external view returns (uint price); // @notice Ultra-Light Node notifies the Oracle of a new block information relaying request // @param _dstChainId - the destination endpoint identifier // @param _outboundProofType - the proof type identifier to specify the data to be relayed // @param _adapterParams - optional parameters for extra service plugins, e.g. sending dust tokens at the destination chain function notifyRelayer(uint16 _dstChainId, uint16 _outboundProofType, bytes calldata _adapterParams) external; // @notice query if the address is an approved actor for privileges like data submission and fee withdrawal etc. // @param _address - the address to be checked function isApproved(address _address) external view returns (bool approved); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; interface ILayerZeroTreasury { function getFees(bool payInZro, uint relayerFee, uint oracleFee) external view returns (uint); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.7.0; interface ILayerZeroUltraLightNodeV1 { // a Relayer can execute the validateTransactionProof() function validateTransactionProof(uint16 _srcChainId, address _dstAddress, uint _gasLimit, bytes32 _lookupHash, bytes calldata _transactionProof) external; // an Oracle delivers the block data using updateHash() function updateHash(uint16 _remoteChainId, bytes32 _lookupHash, uint _confirmations, bytes32 _data) external; // can only withdraw the receivable of the msg.sender function withdrawNative(uint8 _type, address _owner, address payable _to, uint _amount) external; function withdrawZRO(address _to, uint _amount) external; // view functions function oracleQuotedAmount(address _oracle) external view returns (uint); function relayerQuotedAmount(address _relayer) external view returns (uint); }
// SPDX-License-Identifier: BUSL-1.1 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: BUSL-1.1 pragma solidity >=0.7.0; pragma abicoder v2; import "./LayerZeroPacket.sol"; interface ILayerZeroValidationLibrary { function validateProof(bytes32 blockData, bytes calldata _data, uint _remoteAddressSize) external returns (LayerZeroPacket.Packet memory packet); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; import "./SafeMath.sol"; import "./Buffer.sol"; library LayerZeroPacket { using Buffer for Buffer.buffer; using SafeMath for uint; //--------------------------------------------------------------------------- // packet struct Packet { uint16 srcChainId; uint16 dstChainId; uint64 nonce; address dstAddress; bytes srcAddress; bytes32 ulnAddress; bytes payload; } function getPacket(bytes memory data, uint16 srcChain, uint sizeOfSrcAddress, bytes32 ulnAddress) internal pure returns (Packet memory) { uint16 dstChainId; address dstAddress; uint size; uint64 nonce; // The log consists of the destination chain id and then a bytes payload // 0--------------------------------------------31 // 0 | destination chain id // 32 | defines bytes array // 64 | // 96 | bytes array size // 128 | payload assembly { dstChainId := mload(add(data, 32)) size := mload(add(data, 96)) /// size of the byte array nonce := mload(add(data, 104)) // offset to convert to uint64 128 is index -24 dstAddress := mload(add(data, sub(add(128, sizeOfSrcAddress), 4))) // offset to convert to address 12 -8 } Buffer.buffer memory srcAddressBuffer; srcAddressBuffer.init(sizeOfSrcAddress); srcAddressBuffer.writeRawBytes(0, data, 136, sizeOfSrcAddress); // 128 + 8 uint payloadSize = size.sub(20).sub(sizeOfSrcAddress); Buffer.buffer memory payloadBuffer; payloadBuffer.init(payloadSize); payloadBuffer.writeRawBytes(0, data, sizeOfSrcAddress.add(156), payloadSize); // 148 + 8 return Packet(srcChain, dstChainId, nonce, address(dstAddress), srcAddressBuffer.buf, ulnAddress, payloadBuffer.buf); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Context.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 Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./IERC20.sol"; import "./SafeMath.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"lib","type":"address"}],"name":"AddInboundProofLibraryForChain","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userApplication","type":"address"},{"indexed":false,"internalType":"uint256","name":"configType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newConfig","type":"bytes"}],"name":"AppConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"proofType","type":"uint16"}],"name":"EnableSupportedOutboundProof","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"srcChainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"oracle","type":"address"},{"indexed":false,"internalType":"uint256","name":"confirmations","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"blockhash","type":"bytes32"}],"name":"HashReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"payload","type":"bytes"}],"name":"Packet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"},{"indexed":false,"internalType":"uint16","name":"outboundProofType","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"adapterParams","type":"bytes"}],"name":"RelayerParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"size","type":"uint256"}],"name":"SetChainAddressSize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"proofType","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"adapterParams","type":"bytes"}],"name":"SetDefaultAdapterParamsForChainId","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"inboundProofLib","type":"uint16"},{"indexed":false,"internalType":"uint64","name":"inboundBlockConfirm","type":"uint64"},{"indexed":false,"internalType":"address","name":"relayer","type":"address"},{"indexed":false,"internalType":"uint16","name":"outboundProofType","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"outboundBlockConfirm","type":"uint16"},{"indexed":false,"internalType":"address","name":"oracle","type":"address"}],"name":"SetDefaultConfigForChainId","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"SetLayerZeroToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"relayerFeeContract","type":"address"}],"name":"SetRelayerFeeContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"bytes32","name":"uln","type":"bytes32"}],"name":"SetRemoteUln","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasuryAddress","type":"address"}],"name":"SetTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"_type","type":"uint8"},{"indexed":false,"internalType":"address","name":"_owner","type":"address"},{"indexed":false,"internalType":"address","name":"_msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"WithdrawNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_msgSender","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"WithdrawZRO","type":"event"},{"inputs":[],"name":"BP_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONFIG_TYPE_INBOUND_BLOCK_CONFIRMATIONS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONFIG_TYPE_INBOUND_PROOF_LIBRARY_VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONFIG_TYPE_ORACLE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONFIG_TYPE_OUTBOUND_BLOCK_CONFIRMATIONS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONFIG_TYPE_OUTBOUND_PROOF_TYPE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONFIG_TYPE_RELAYER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_TYPE_ORACLE_QUOTED_FEES","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_TYPE_RELAYER_QUOTED_FEES","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_TYPE_TREASURY_PROTOCOL_FEES","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_library","type":"address"}],"name":"addInboundProofLibraryForChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"appConfig","outputs":[{"internalType":"uint16","name":"inboundProofLibraryVersion","type":"uint16"},{"internalType":"uint64","name":"inboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint16","name":"outboundProofType","type":"uint16"},{"internalType":"uint64","name":"outboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"oracle","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"chainAddressSizeMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"defaultAdapterParams","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"defaultAppConfig","outputs":[{"internalType":"uint16","name":"inboundProofLibraryVersion","type":"uint16"},{"internalType":"uint64","name":"inboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint16","name":"outboundProofType","type":"uint16"},{"internalType":"uint64","name":"outboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"oracle","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint16","name":"_proofType","type":"uint16"}],"name":"enableSupportedOutboundProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_ua","type":"address"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"bool","name":"_payInZRO","type":"bool"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"estimateFees","outputs":[{"internalType":"uint256","name":"nativeFee","type":"uint256"},{"internalType":"uint256","name":"zroFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"userApplicationAddress","type":"address"}],"name":"getAppConfig","outputs":[{"components":[{"internalType":"uint16","name":"inboundProofLibraryVersion","type":"uint16"},{"internalType":"uint64","name":"inboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"relayer","type":"address"},{"internalType":"uint16","name":"outboundProofType","type":"uint16"},{"internalType":"uint64","name":"outboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"oracle","type":"address"}],"internalType":"struct UltraLightNode.ApplicationConfiguration","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes32","name":"_lookupHash","type":"bytes32"}],"name":"getBlockHeaderData","outputs":[{"components":[{"internalType":"uint256","name":"confirmations","type":"uint256"},{"internalType":"bytes32","name":"data","type":"bytes32"}],"internalType":"struct UltraLightNode.BlockData","name":"blockData","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"userApplicationAddress","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"hashLookup","outputs":[{"internalType":"uint256","name":"confirmations","type":"uint256"},{"internalType":"bytes32","name":"data","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"inboundProofLibrary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerZeroToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"maxInboundProofLibrary","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oracle","type":"address"}],"name":"oracleQuotedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"oracleQuotedFees","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":"address","name":"_relayer","type":"address"}],"name":"relayerQuotedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"relayerQuotedFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ua","type":"address"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_destination","type":"bytes"},{"internalType":"bytes","name":"_payload","type":"bytes"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"internalType":"address","name":"_zroPaymentAddress","type":"address"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"setChainAddressSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"chainId","type":"uint16"},{"internalType":"address","name":"_ua","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint16","name":"_proofType","type":"uint16"},{"internalType":"bytes","name":"_adapterParams","type":"bytes"}],"name":"setDefaultAdapterParamsForChainId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint16","name":"_inboundProofLibraryVersion","type":"uint16"},{"internalType":"uint64","name":"_inboundBlockConfirmations","type":"uint64"},{"internalType":"address","name":"_relayer","type":"address"},{"internalType":"uint16","name":"_outboundProofType","type":"uint16"},{"internalType":"uint16","name":"_outboundBlockConfirmations","type":"uint16"},{"internalType":"address","name":"_oracle","type":"address"}],"name":"setDefaultConfigForChainId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_layerZeroToken","type":"address"}],"name":"setLayerZeroToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes32","name":"_remoteUln","type":"bytes32"}],"name":"setRemoteUln","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"name":"supportedOutboundProof","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryContract","outputs":[{"internalType":"contract ILayerZeroTreasury","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryNativeFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryZROFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"ulnLookup","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes32","name":"_lookupHash","type":"bytes32"},{"internalType":"uint256","name":"_confirmations","type":"uint256"},{"internalType":"bytes32","name":"_data","type":"bytes32"}],"name":"updateHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"address","name":"_dstAddress","type":"address"},{"internalType":"uint256","name":"_gasLimit","type":"uint256"},{"internalType":"bytes32","name":"_lookupHash","type":"bytes32"},{"internalType":"bytes","name":"_transactionProof","type":"bytes"}],"name":"validateTransactionProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_type","type":"uint8"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawZRO","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620058d0380380620058d08339810160408190526200003491620000df565b6001600090815562000045620000db565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038116620000c55760405162461bcd60e51b8152600401620000bc906200010f565b60405180910390fd5b60601b6001600160601b03191660805262000159565b3390565b600060208284031215620000f1578081fd5b81516001600160a01b038116811462000108578182fd5b9392505050565b6020808252602a908201527f4c617965725a65726f3a20656e64706f696e742063616e6e6f74206265207a65604082015269726f206164647265737360b01b606082015260800190565b60805160601c61574a62000186600039806114cc5280612591528061260b52806135a7525061574a6000f3fe60806040526004361061031e5760003560e01c80638317814a116101a5578063d56bc64b116100ec578063ebfa08e911610095578063f2fde38b1161006f578063f2fde38b146108a4578063f47a5feb146108c4578063f8e1734c146108d9578063f9dd8e0f146108f95761031e565b8063ebfa08e914610837578063ed28580a14610864578063f0f44260146108845761031e565b8063e6108a82116100c6578063e6108a82146107d7578063ea216c21146107f7578063eb0d4c31146108175761031e565b8063d56bc64b14610777578063db00719b14610797578063ddfdef5a146107b75761031e565b8063a183608c1161014e578063b77d22ad11610128578063b77d22ad14610708578063b8e7e3e01461071d578063d543c7741461074a5761031e565b8063a183608c146106a6578063a4662222146106c6578063abe685cd146106f35761031e565b80638da5cb5b1161017f5780638da5cb5b1461065c578063904d3b8d14610671578063959f5943146106865761031e565b80638317814a146105fc5780638525b7111461061c57806387078f9f1461063c5761031e565b80634d0ca1b4116102695780635e280f1111610212578063715018a6116101ec578063715018a6146105b25780638140666e146105c75780638207f79d146105dc5761031e565b80635e280f111461055d57806361aa19da14610572578063704316e5146105925761031e565b806352d3b5001161024357806352d3b500146105085780635b5a2678146105285780635c0115311461053d5761031e565b80634d0ca1b4146104c05780634d3a0f7c146104d557806352d2871f146104e85761031e565b80632cfacb06116102cb57806331bd2430116102a557806331bd24301461046857806340a7bb101461047d57806349148c37146104ab5761031e565b80632cfacb06146103ff5780632e9959ec146104145780632f813464146104365761031e565b806318da0011116102fc57806318da00111461039d57806322c10776146103b25780632a819bbf146103d25761031e565b806302e72c631461032357806307b9ca7c14610359578063096607f81461037b575b600080fd5b34801561032f57600080fd5b5061034361033e366004614072565b61090e565b60405161035091906148c8565b60405180910390f35b34801561036557600080fd5b5061036e610920565b6040516103509190614813565b34801561038757600080fd5b5061039b6103963660046145e2565b61093c565b005b3480156103a957600080fd5b5061036e610d24565b3480156103be57600080fd5b5061039b6103cd3660046146ab565b610d40565b3480156103de57600080fd5b506103f26103ed366004614562565b610f53565b60405161035091906148fc565b34801561040b57600080fd5b50610343611015565b34801561042057600080fd5b5061042961101a565b60405161035091906155b5565b34801561044257600080fd5b506104566104513660046142fd565b61101f565b60405161035096959493929190615504565b34801561047457600080fd5b506103436110b0565b34801561048957600080fd5b5061049d610498366004614346565b6110b5565b604051610350929190615592565b3480156104b757600080fd5b506103436114c0565b3480156104cc57600080fd5b506104296114c5565b61039b6104e3366004614131565b6114ca565b3480156104f457600080fd5b506103f26105033660046143f1565b611de2565b34801561051457600080fd5b5061039b610523366004614072565b6121a5565b34801561053457600080fd5b506103436122e1565b34801561054957600080fd5b5061039b610558366004614420565b6122e7565b34801561056957600080fd5b5061036e612609565b34801561057e57600080fd5b5061034361058d366004614072565b61262d565b34801561059e57600080fd5b5061039b6105ad366004614528565b612659565b3480156105be57600080fd5b5061039b6126ee565b3480156105d357600080fd5b506103436127eb565b3480156105e857600080fd5b5061039b6105f7366004614319565b6127f0565b34801561060857600080fd5b5061039b61061736600461457f565b6129bc565b34801561062857600080fd5b5061039b610637366004614106565b612ab9565b34801561064857600080fd5b5061039b61065736600461450b565b612bc5565b34801561066857600080fd5b5061036e612ccc565b34801561067d57600080fd5b50610343612ce8565b34801561069257600080fd5b506103436106a13660046142fd565b612ced565b3480156106b257600080fd5b506103436106c1366004614072565b612cff565b3480156106d257600080fd5b506106e66106e1366004614319565b612d11565b60405161035091906151d4565b3480156106ff57600080fd5b50610343612f20565b34801561071457600080fd5b5061034361101a565b34801561072957600080fd5b5061073d6107383660046142fd565b612f26565b6040516103509190615264565b34801561075657600080fd5b5061076a610765366004614562565b612f3c565b60405161035091906148a5565b34801561078357600080fd5b5061049d6107923660046140c6565b612f5c565b3480156107a357600080fd5b5061036e6107b2366004614562565b612f86565b3480156107c357600080fd5b506104566107d236600461408e565b612fb9565b3480156107e357600080fd5b506103436107f2366004614072565b613055565b34801561080357600080fd5b506103436108123660046142fd565b61307d565b34801561082357600080fd5b5061039b610832366004614562565b61308f565b34801561084357600080fd5b506108576108523660046140c6565b613198565b604051610350919061524d565b34801561087057600080fd5b5061039b61087f36600461450b565b6131f9565b34801561089057600080fd5b5061039b61089f366004614072565b613300565b3480156108b057600080fd5b5061039b6108bf366004614072565b613431565b3480156108d057600080fd5b5061034361359f565b3480156108e557600080fd5b5061039b6108f436600461449a565b6135a5565b34801561090557600080fd5b506104296114c0565b60056020526000908152604090205481565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b610944613939565b73ffffffffffffffffffffffffffffffffffffffff16610962612ccc565b73ffffffffffffffffffffffffffffffffffffffff16146109ca576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff8088166000908152600c60205260409020548116908716118015906109f6575060008661ffff16115b610a1b5760405162461bcd60e51b8152600401610a1290614dfb565b60405180910390fd5b60008567ffffffffffffffff1611610a455760405162461bcd60e51b8152600401610a129061511a565b73ffffffffffffffffffffffffffffffffffffffff8416610a785760405162461bcd60e51b8152600401610a1290614acb565b61ffff8088166000908152600d602090815260408083209387168352929052205460ff16610ab85760405162461bcd60e51b8152600401610a129061490f565b60008261ffff1611610adc5760405162461bcd60e51b8152600401610a1290614fa6565b73ffffffffffffffffffffffffffffffffffffffff8116610b0f5760405162461bcd60e51b8152600401610a1290614c19565b6040518060c001604052808761ffff1681526020018667ffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018461ffff1681526020018361ffff1667ffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815250600960008961ffff1661ffff16815260200190815260200160002060008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550604082015181600001600a6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600001601e6101000a81548161ffff021916908361ffff16021790555060808201518160010160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060a08201518160010160086101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050507f45bb8a2b6b05457ff80b84be5bf06f2d05069fa8099fcb9d8e34149654b4d5c287878787878787604051610d1397969594939291906154a7565b60405180910390a150505050505050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60026000541415610d98576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005560ff8416610df15760035473ffffffffffffffffffffffffffffffffffffffff163314610ddc5760405162461bcd60e51b8152600401610a1290614dc4565b600654610de9908261393d565b600655610e7f565b60ff841660011415610e2c5733600090815260046020526040902054610e17908261393d565b33600090815260046020526040902055610e7f565b60ff841660021415610e675733600090815260056020526040902054610e52908261393d565b33600090815260056020526040902055610e7f565b60405162461bcd60e51b8152600401610a1290615003565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610ea590614792565b60006040518083038185875af1925050503d8060008114610ee2576040519150601f19603f3d011682016040523d82523d6000602084013e610ee7565b606091505b5050905080610f085760405162461bcd60e51b8152600401610a12906149da565b7f163adce0473e267e1db8ecb524c0fcdceda62c3e6f231966bbb252e0104325378585338686604051610f3f9594939291906155c3565b60405180910390a150506001600055505050565b600a6020908152600092835260408084208252918352918190208054825160026001831615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190921691909104601f81018590048502820185019093528281529290919083018282801561100d5780601f10610fe25761010080835404028352916020019161100d565b820191906000526020600020905b815481529060010190602001808311610ff057829003601f168201915b505050505081565b600381565b600181565b6009602052600090815260409020805460019091015461ffff8083169267ffffffffffffffff62010000820481169373ffffffffffffffffffffffffffffffffffffffff6a010000000000000000000084048116947e010000000000000000000000000000000000000000000000000000000000009094049093169291811691680100000000000000009091041686565b600681565b604080516020601f840181900481028201810190925282815260009182918a918a918991859190899089908190840183828082843760009201829052509394506111059250879150869050612d11565b905060008251600014156112825761ffff8681166000908152600a60209081526040808320606087015190941683529281528282208054845160026001831615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190921691909104601f8101849004840282018401909552848152929390918301828280156111da5780601f106111af576101008083540402835291602001916111da565b820191906000526020600020905b8154815290600101906020018083116111bd57829003601f168201915b50505050509050826040015173ffffffffffffffffffffffffffffffffffffffff1663e54a22158885606001518989866040518663ffffffff1660e01b815260040161122a9594939291906153de565b60206040518083038186803b15801561124257600080fd5b505afa158015611256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127a9190614677565b91505061131e565b816040015173ffffffffffffffffffffffffffffffffffffffff1663e54a22158784606001518888886040518663ffffffff1660e01b81526004016112cb9594939291906153de565b60206040518083038186803b1580156112e357600080fd5b505afa1580156112f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131b9190614677565b90505b60a082015160608301516040517f0b4d510700000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff1691630b4d51079161137c918b91600401615373565b60206040518083038186803b15801561139457600080fd5b505afa1580156113a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cc9190614677565b90506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635cbbbd758e85856040518463ffffffff1660e01b815260040161142f939291906148b0565b60206040518083038186803b15801561144757600080fd5b505afa15801561145b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147f9190614677565b90508c61148f5780995089611494565b809850885b506114ab9050816114a58b8561399a565b9061399a565b98505050505050505097509795505050505050565b600281565b600081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16331461151f5760405162461bcd60e51b8152600401610a1290614f6f565b600061152b8a8d612d11565b61ffff8b166000908152601060205260409020549091508c908c908c906115645760405162461bcd60e51b8152600401610a1290614bbc565b6000808560a0015173ffffffffffffffffffffffffffffffffffffffff16630b4d51078488606001516040518363ffffffff1660e01b81526004016115aa929190615373565b60206040518083038186803b1580156115c257600080fd5b505afa1580156115d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fa9190614677565b60a087015173ffffffffffffffffffffffffffffffffffffffff16600090815260046020526040902054909150611631908261399a565b60a087015173ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090819020919091558601518b908861187b5761ffff8581166000908152600a6020908152604080832060608d015190941683529281528282208054845160026001831615610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190921691909104601f8101849004840282018401909552848152929390918301828280156117315780601f1061170657610100808354040283529160200191611731565b820191906000526020600020905b81548152906001019060200180831161171457829003601f168201915b5050505060608b01516040517fe54a221500000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff85169263e54a22159250611796918a918d90899088906004016153de565b60206040518083038186803b1580156117ae57600080fd5b505afa1580156117c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e69190614677565b60608a01516040517f3a5fb82a00000000000000000000000000000000000000000000000000000000815291965073ffffffffffffffffffffffffffffffffffffffff841691633a5fb82a91611843918a9190869060040161544f565b600060405180830381600087803b15801561185d57600080fd5b505af1158015611871573d6000803e3d6000fd5b50505050506119a4565b8073ffffffffffffffffffffffffffffffffffffffff1663e54a2215868a606001518a868f8f6040518763ffffffff1660e01b81526004016118c296959493929190615388565b60206040518083038186803b1580156118da57600080fd5b505afa1580156118ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119129190614677565b60608901516040517f3a5fb82a00000000000000000000000000000000000000000000000000000000815291955073ffffffffffffffffffffffffffffffffffffffff831691633a5fb82a91611971918991908f908f90600401615427565b600060405180830381600087803b15801561198b57600080fd5b505af115801561199f573d6000803e3d6000fd5b505050505b60408089015173ffffffffffffffffffffffffffffffffffffffff166000908152600560205220546119d6908561399a565b6040808a015173ffffffffffffffffffffffffffffffffffffffff166000908152600560205281902091909155606089015190517fb8a7262132db1f61626604a31c3de81dc1a5bb0f1511dfa70d626ab1b88b52c291611a3d9188918a918f908f9061555a565b60405180910390a1506000905073ffffffffffffffffffffffffffffffffffffffff8a161580611a83575060025473ffffffffffffffffffffffffffffffffffffffff16155b6003546040517f5cbbbd7500000000000000000000000000000000000000000000000000000000815291925060009173ffffffffffffffffffffffffffffffffffffffff90911690635cbbbd7590611ae490851590889088906004016148b0565b60206040518083038186803b158015611afc57600080fd5b505afa158015611b10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b349190614677565b90508015611c04578115611b6357600654611b4f908261399a565b600655611b5c848261399a565b9350611c04565b8673ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff161480611bb2575073ffffffffffffffffffffffffffffffffffffffff8b1632145b611bce5760405162461bcd60e51b8152600401610a1290614b5f565b600254611bf39073ffffffffffffffffffffffffffffffffffffffff168c30846139f4565b600754611c00908261399a565b6007555b50611c119050828261399a565b915050600083858f8f8f8f604051602001611c3196959493929190614795565b60405160208183030381529060405290507fe8d23d927749ec8e512eb885679c2977d57068839d8cca1a85685dbbea0648f68382604051611c739291906152e8565b60405180910390a160a0860151606087015160808801516040517f6653057900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90931692636653057992611cdd92889260040161547f565b600060405180830381600087803b158015611cf757600080fd5b505af1158015611d0b573d6000803e3d6000fd5b505050505034811115611d305760405162461bcd60e51b8152600401610a1290614a11565b6000611d3c348361393d565b90508015611dcf5760008a73ffffffffffffffffffffffffffffffffffffffff1682604051611d6a90614792565b60006040518083038185875af1925050503d8060008114611da7576040519150601f19603f3d011682016040523d82523d6000602084013e611dac565b606091505b5050905080611dcd5760405162461bcd60e51b8152600401610a1290614b28565b505b5050505050505050505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260086020908152604080832061ffff8716845290915290206060906001831415611e8357805461ffff16611e6d5761ffff808616600090815260096020908152604091829020549151611e5693929092169101615264565b60405160208183030381529060405291505061219e565b8054604051611e569161ffff1690602001615264565b6002831415611ef957805462010000900467ffffffffffffffff16611ed75761ffff8516600090815260096020908152604091829020549151611e569262010000900467ffffffffffffffff1691016155a0565b8054604051611e569162010000900467ffffffffffffffff16906020016155a0565b6003831415611fab5780546a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16611f755761ffff8516600090815260096020908152604091829020549151611e56926a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff169101614813565b8054604051611e56916a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690602001614813565b60048314156120645780547e01000000000000000000000000000000000000000000000000000000000000900461ffff1661202c5761ffff808616600090815260096020908152604091829020549151611e56937e010000000000000000000000000000000000000000000000000000000000009093049092169101615264565b8054604051611e56917e01000000000000000000000000000000000000000000000000000000000000900461ffff1690602001615264565b60058314156120d157600181015467ffffffffffffffff166120b25761ffff8516600090815260096020908152604091829020600101549151611e569267ffffffffffffffff1691016155a0565b6001810154604051611e569167ffffffffffffffff16906020016155a0565b600683141561218657600181015468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1661214f5761ffff8516600090815260096020908152604091829020600101549151611e569268010000000000000000900473ffffffffffffffffffffffffffffffffffffffff169101614813565b6001810154604051611e569168010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690602001614813565b60405162461bcd60e51b8152600401610a12906149a3565b9392505050565b6121ad613939565b73ffffffffffffffffffffffffffffffffffffffff166121cb612ccc565b73ffffffffffffffffffffffffffffffffffffffff1614612233576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166122665760405162461bcd60e51b8152600401610a1290614a6e565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556040517f33d644987381deff4408951d55afa136f124e22a7810b163b2aaa3ebef770f64906122d6908390614813565b60405180910390a150565b60065481565b60006122f38787612d11565b604081015190915073ffffffffffffffffffffffffffffffffffffffff16331461232f5760405162461bcd60e51b8152600401610a1290614cad565b612337613e26565b61ffff8089166000818152600b60209081526040808320875190951683529381528382205460a087015173ffffffffffffffffffffffffffffffffffffffff9081168452600f83528584209484529382528483208a84528252939091209085015181549290931692909167ffffffffffffffff90911611156123cb5760405162461bcd60e51b8152600401610a1290615177565b61ffff8a166000908152600e60205260409081902054600183015491517fb71e0f71000000000000000000000000000000000000000000000000000000008152909173ffffffffffffffffffffffffffffffffffffffff85169163b71e0f719161243d918b908b9087906004016148d1565b600060405180830381600087803b15801561245757600080fd5b505af115801561246b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526124b19190810190614221565b60a081015161ffff8d166000908152601060205260409020549195501492506124ef9150505760405162461bcd60e51b8152600401610a1290615060565b8673ffffffffffffffffffffffffffffffffffffffff16816060015173ffffffffffffffffffffffffffffffffffffffff161461253e5760405162461bcd60e51b8152600401610a1290614c76565b80516080820151606083015160408085015160c086015191517fc2fa481300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169563c2fa4813956125cd959194909391928e9190600401615305565b600060405180830381600087803b1580156125e757600080fd5b505af11580156125fb573d6000803e3d6000fd5b505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600460205260409020545b919050565b336000908152600f6020908152604080832061ffff88168452825280832086845290915290208054831161269f5760405162461bcd60e51b8152600401610a1290614d41565b828155600181018290556040517fc5e97f049604c4d8626704341240f021a22cee0d8b66ec306a45344be67733a0906126df90879033908790899061529d565b60405180910390a15050505050565b6126f6613939565b73ffffffffffffffffffffffffffffffffffffffff16612714612ccc565b73ffffffffffffffffffffffffffffffffffffffff161461277c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600481565b6127f8613939565b73ffffffffffffffffffffffffffffffffffffffff16612816612ccc565b73ffffffffffffffffffffffffffffffffffffffff161461287e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166128b15760405162461bcd60e51b8152600401610a1290614ce4565b61ffff8281166000908152600c60205260409020548116106128e55760405162461bcd60e51b8152600401610a1290614f12565b61ffff8083166000908152600c60209081526040808320805480861660010186167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009091161790819055600b835281842094168352929052819020805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055517f802d55279d51813cb7a9a98e8fd2d7bec5346cb830901c11b85d1650cb857e9a906129b09084908490615273565b60405180910390a15050565b6129c4613939565b73ffffffffffffffffffffffffffffffffffffffff166129e2612ccc565b73ffffffffffffffffffffffffffffffffffffffff1614612a4a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff8085166000908152600a60209081526040808320938716835292905220612a75908383613e64565b507f4a5695eee2a74d548d5f5c485a3de99ace99e3b664c8e30a90f49be6ebb5493284848484604051612aab9493929190615427565b60405180910390a150505050565b60026000541415612b11576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600260005560035473ffffffffffffffffffffffffffffffffffffffff163314612b4d5760405162461bcd60e51b8152600401610a129061496c565b600754612b5a908261393d565b600755600254612b819073ffffffffffffffffffffffffffffffffffffffff168383613a8f565b7f3a20c8c3cd1848485ae8261a52398bb9b26f195b717306b3cf7f058e62c095d5338383604051612bb493929190614834565b60405180910390a150506001600055565b612bcd613939565b73ffffffffffffffffffffffffffffffffffffffff16612beb612ccc565b73ffffffffffffffffffffffffffffffffffffffff1614612c53576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff82166000908152600e602052604090205415612c845760405162461bcd60e51b8152600401610a12906150bd565b61ffff82166000908152600e602052604090819020829055517f0611bb2107e385b79ec826fff8ecc1c1248a7aae3c875c96668f8cfbf1734220906129b090849084906152d4565b60015473ffffffffffffffffffffffffffffffffffffffff1690565b600581565b600e6020526000908152604090205481565b60046020526000908152604090205481565b612d19613f0e565b73ffffffffffffffffffffffffffffffffffffffff808316600090815260086020908152604080832061ffff808916808652918452828520835160c0810185528154808416825267ffffffffffffffff6201000082048116838901526a010000000000000000000082048a16838801527e010000000000000000000000000000000000000000000000000000000000009091048416606083015260019092015491821660808201526801000000000000000090910490961660a087015290845260099092529091208251909116612df357805461ffff1682525b602082015167ffffffffffffffff16612e1e57805462010000900467ffffffffffffffff1660208301525b604082015173ffffffffffffffffffffffffffffffffffffffff16612e695780546a0100000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660408301525b606082015161ffff16612ea45780547e01000000000000000000000000000000000000000000000000000000000000900461ffff1660608301525b608082015167ffffffffffffffff16612ecc57600181015467ffffffffffffffff1660808301525b60a082015173ffffffffffffffffffffffffffffffffffffffff16612f1857600181015468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660a08301525b509392505050565b61271081565b600c6020526000908152604090205461ffff1681565b600d60209081526000928352604080842090915290825290205460ff1681565b600f6020908152600093845260408085208252928452828420905282529020805460019091015482565b600b60209081526000928352604080842090915290825290205473ffffffffffffffffffffffffffffffffffffffff1681565b60086020908152600092835260408084209091529082529020805460019091015461ffff8083169267ffffffffffffffff62010000820481169373ffffffffffffffffffffffffffffffffffffffff6a010000000000000000000084048116947e010000000000000000000000000000000000000000000000000000000000009094049093169291811691680100000000000000009091041686565b73ffffffffffffffffffffffffffffffffffffffff1660009081526005602052604090205490565b60106020526000908152604090205481565b613097613939565b73ffffffffffffffffffffffffffffffffffffffff166130b5612ccc565b73ffffffffffffffffffffffffffffffffffffffff161461311d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff8083166000908152600d60209081526040808320938516835292905281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517fec23bee6f88cfecebb09d6aaaed66f0ce110debc1f61117c8270a7116597df9a906129b09084908490615373565b6131a0613f43565b5073ffffffffffffffffffffffffffffffffffffffff83166000908152600f6020908152604080832061ffff86168452825280832084845282529182902082518084019093528054835260010154908201529392505050565b613201613939565b73ffffffffffffffffffffffffffffffffffffffff1661321f612ccc565b73ffffffffffffffffffffffffffffffffffffffff1614613287576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61ffff8216600090815260106020526040902054156132b85760405162461bcd60e51b8152600401610a1290614eb5565b61ffff821660009081526010602052604090819020829055517f0dad975e1d2fbe771c95cdcc7be9a1e61181de7173abe0a32b8f8f83140873e5906129b090849084906152d4565b613308613939565b73ffffffffffffffffffffffffffffffffffffffff16613326612ccc565b73ffffffffffffffffffffffffffffffffffffffff161461338e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166133c15760405162461bcd60e51b8152600401610a1290614e58565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556040517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef3906122d6908390614813565b613439613939565b73ffffffffffffffffffffffffffffffffffffffff16613457612ccc565b73ffffffffffffffffffffffffffffffffffffffff16146134bf576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166135115760405162461bcd60e51b815260040180806020018281038252602681526020018061569f6026913960400191505060405180910390fd5b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60075481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1633146135fa5760405162461bcd60e51b8152600401610a1290614f6f565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260086020908152604080832061ffff89168452909152902060018414156136b4576000613645838501856142fd565b61ffff8089166000908152600c602052604090205491925090811690821611156136815760405162461bcd60e51b8152600401610a1290614dfb565b81547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff919091161781556138f4565b600284141561370b5760006136cb8385018561468f565b825467ffffffffffffffff90911662010000027fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff909116178255506138f4565b600384141561377657600061372283850185614072565b825473ffffffffffffffffffffffffffffffffffffffff9091166a0100000000000000000000027fffff0000000000000000000000000000000000000000ffffffffffffffffffff909116178255506138f4565b600484141561383057600061378d838501856142fd565b61ffff8089166000908152600d602090815260408083209385168352929052205490915060ff16806137c1575061ffff8116155b6137dd5760405162461bcd60e51b8152600401610a129061490f565b815461ffff9091167e01000000000000000000000000000000000000000000000000000000000000027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091161781556138f4565b60058414156138885760006138478385018561468f565b6001830180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff92909216919091179055506138f4565b600684141561218657600061389f83850185614072565b60018301805473ffffffffffffffffffffffffffffffffffffffff90921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff909216919091179055505b7ffc01bf86212a14151d51d1be5c2ac64d67d5ec823dfc6f53298d7ce3f3d3d252858585856040516139299493929190614865565b60405180910390a1505050505050565b3390565b600082821115613994576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008282018381101561219e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052613a89908590613b21565b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052613b1c908490613b21565b505050565b6000613b83826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613bdf9092919063ffffffff16565b805190915015613b1c57808060200190516020811015613ba257600080fd5b5051613b1c5760405162461bcd60e51b815260040180806020018281038252602a8152602001806156eb602a913960400191505060405180910390fd5b6060613bee8484600085613bf6565b949350505050565b606082471015613c375760405162461bcd60e51b81526004018080602001828103825260268152602001806156c56026913960400191505060405180910390fd5b613c4085613d7c565b613c91576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613cfa57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613cbd565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613d5c576040519150601f19603f3d011682016040523d82523d6000602084013e613d61565b606091505b5091509150613d71828286613d82565b979650505050505050565b3b151590565b60608315613d9157508161219e565b825115613da15782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613deb578181015183820152602001613dd3565b50505050905090810190601f168015613e185780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6040805160e08101825260008082526020820181905291810182905260608082018390526080820181905260a082019290925260c081019190915290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613e9a5760008555613efe565b82601f10613ed1578280017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00823516178555613efe565b82800160010185558215613efe579182015b82811115613efe578235825591602001919060010190613ee3565b50613f0a929150613f5a565b5090565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b604080518082019091526000808252602082015290565b5b80821115613f0a5760008155600101613f5b565b803561265481615653565b805161265481615653565b60008083601f840112613f96578182fd5b50813567ffffffffffffffff811115613fad578182fd5b602083019150836020828501011115613fc557600080fd5b9250929050565b600082601f830112613fdc578081fd5b815167ffffffffffffffff811115613ff057fe5b61402160207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601615603565b818152846020838601011115614035578283fd5b613bee826020830160208701615627565b803561265481615678565b805161265481615678565b803561265481615688565b805161265481615688565b600060208284031215614083578081fd5b813561219e81615653565b600080604083850312156140a0578081fd5b82356140ab81615653565b915060208301356140bb81615678565b809150509250929050565b6000806000606084860312156140da578081fd5b83356140e581615653565b925060208401356140f581615678565b929592945050506040919091013590565b60008060408385031215614118578182fd5b823561412381615653565b946020939093013593505050565b60008060008060008060008060008060006101008c8e031215614152578687fd5b61415b8c613f6f565b9a5061416960208d0161405c565b995061417760408d01614046565b985067ffffffffffffffff8060608e01351115614192578788fd5b6141a28e60608f01358f01613f85565b909950975060808d01358110156141b7578687fd5b6141c78e60808f01358f01613f85565b90975095506141d860a08e01613f6f565b94506141e660c08e01613f6f565b93508060e08e013511156141f8578283fd5b506142098d60e08e01358e01613f85565b81935080925050509295989b509295989b9093969950565b600060208284031215614232578081fd5b815167ffffffffffffffff80821115614249578283fd5b9083019060e0828603121561425c578283fd5b61426660e0615603565b61426f83614051565b815261427d60208401614051565b602082015261428e60408401614067565b604082015261429f60608401613f7a565b60608201526080830151828111156142b5578485fd5b6142c187828601613fcc565b60808301525060a083015160a082015260c0830151828111156142e2578485fd5b6142ee87828601613fcc565b60c08301525095945050505050565b60006020828403121561430e578081fd5b813561219e81615678565b6000806040838503121561432b578182fd5b823561433681615678565b915060208301356140bb81615653565b600080600080600080600060a0888a031215614360578081fd5b873561436b81615678565b9650602088013561437b81615653565b9550604088013567ffffffffffffffff80821115614397578283fd5b6143a38b838c01613f85565b909750955060608a0135915081151582146143bc578283fd5b909350608089013590808211156143d1578283fd5b506143de8a828b01613f85565b989b979a50959850939692959293505050565b600080600060608486031215614405578081fd5b833561441081615678565b925060208401356140f581615653565b60008060008060008060a08789031215614438578384fd5b863561444381615678565b9550602087013561445381615653565b94506040870135935060608701359250608087013567ffffffffffffffff81111561447c578283fd5b61448889828a01613f85565b979a9699509497509295939492505050565b6000806000806000608086880312156144b1578283fd5b85356144bc81615678565b945060208601356144cc81615653565b935060408601359250606086013567ffffffffffffffff8111156144ee578182fd5b6144fa88828901613f85565b969995985093965092949392505050565b6000806040838503121561451d578182fd5b823561412381615678565b6000806000806080858703121561453d578182fd5b843561454881615678565b966020860135965060408601359560600135945092505050565b60008060408385031215614574578182fd5b82356140ab81615678565b60008060008060608587031215614594578182fd5b843561459f81615678565b935060208501356145af81615678565b9250604085013567ffffffffffffffff8111156145ca578283fd5b6145d687828801613f85565b95989497509550505050565b600080600080600080600060e0888a0312156145fc578081fd5b873561460781615678565b9650602088013561461781615678565b9550604088013561462781615688565b9450606088013561463781615653565b9350608088013561464781615678565b925060a088013561465781615678565b915060c088013561466781615653565b8091505092959891949750929550565b600060208284031215614688578081fd5b5051919050565b6000602082840312156146a0578081fd5b813561219e81615688565b600080600080608085870312156146c0578182fd5b843560ff811681146146d0578283fd5b935060208501356146e081615653565b925060408501356146f081615653565b9396929550929360600135925050565b600082845282826020860137806020848601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011685010190509392505050565b60008151808452614760816020860160208601615627565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b90565b60007fffffffffffffffff0000000000000000000000000000000000000000000000008860c01b1682527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008760601b1660088301528486601c840137848201601c81018281528486823750909201601c019182525095945050505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b600073ffffffffffffffffffffffffffffffffffffffff861682528460208301526060604083015261489b606083018486614700565b9695505050505050565b901515815260200190565b92151583526020830191909152604082015260600190565b90815260200190565b6000858252606060208301526148eb606083018587614700565b905082604083015295945050505050565b60006020825261219e6020830184614748565b60208082526026908201527f4c617965725a65726f3a20696e76616c6964206f7574626f756e642070726f6f60408201527f6620747970650000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f4c617965725a65726f3a206f6e6c792074726561737572790000000000000000604082015260600190565b6020808252601e908201527f4c617965725a65726f3a20496e76616c696420636f6e66696720747970650000604082015260600190565b6020808252601a908201527f4c617965725a65726f3a207769746864726177206661696c6564000000000000604082015260600190565b60208082526025908201527f4c617965725a65726f3a206e6f7420656e6f756768206e617469766520666f7260408201527f2066656573000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526031908201527f4c617965725a65726f3a205f6c617965725a65726f546f6b656e2063616e6e6f60408201527f74206265207a65726f2061646472657373000000000000000000000000000000606082015260800190565b60208082526022908201527f4c617965725a65726f3a20696e76616c69642072656c6179657220616464726560408201527f7373000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f4c617965725a65726f3a206661696c656420746f20726566756e640000000000604082015260600190565b6020808252602b908201527f4c617965725a65726f3a206d75737420626520706169642062792073656e646560408201527f72206f72206f726967696e000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4c617965725a65726f3a20636861696e496420646f6573206e6f74206578697360408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4c617965725a65726f3a20696e76616c6964206f7261636c652061646472657360408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601e908201527f4c617965725a65726f3a20696e76616c69642064737420616464726573730000604082015260600190565b6020808252601a908201527f4c617965725a65726f3a20696e76616c69642072656c61796572000000000000604082015260600190565b60208082526029908201527f4c617965725a65726f3a206c6962726172792063616e6e6f74206265207a657260408201527f6f20616464726573730000000000000000000000000000000000000000000000606082015260800190565b60208082526043908201527f4c617965725a65726f3a206f7261636c6520646174612063616e206f6e6c792060408201527f75706461746520696620697420686173206d6f726520636f6e6669726d61746960608201527f6f6e730000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526017908201527f4c617965725a65726f3a6f6e6c79207472656173757279000000000000000000604082015260600190565b60208082526030908201527f4c617965725a65726f3a20696e76616c696420696e626f756e642070726f6f6660408201527f206c6962726172792076657273696f6e00000000000000000000000000000000606082015260800190565b6020808252602a908201527f4c617965725a65726f3a2074726561737572792063616e6e6f74206265207a6560408201527f726f206164647265737300000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4c617965725a65726f3a2072656d6f746520756c6e20616c726561647920736560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f4c617965725a65726f3a2063616e206e6f7420616464206e6577206c6962726160408201527f7279000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f4c617965725a65726f3a206f6e6c7920656e64706f696e740000000000000000604082015260600190565b6020808252602e908201527f4c617965725a65726f3a20696e76616c6964206f7574626f756e6420626c6f6360408201527f6b20636f6e6669726d6174696f6e000000000000000000000000000000000000606082015260800190565b60208082526024908201527f4c617965725a65726f3a20756e737570706f727465642077697468647261772060408201527f7479706500000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526028908201527f4c617965725a65726f3a205f7061636b65742e756c6e4164647265737320697360408201527f20696e76616c6964000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f4c617965725a65726f3a2072656d6f746520636861696e20616464726573732060408201527f73697a6520616c72656164792073657400000000000000000000000000000000606082015260800190565b6020808252602d908201527f4c617965725a65726f3a20696e76616c696420696e626f756e6420626c6f636b60408201527f20636f6e6669726d6174696f6e00000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4c617965725a65726f3a206e6f7420656e6f75676820626c6f636b20636f6e6660408201527f69726d6174696f6e730000000000000000000000000000000000000000000000606082015260800190565b600060c08201905061ffff808451168352602084015167ffffffffffffffff80821660208601526040860151915073ffffffffffffffffffffffffffffffffffffffff80831660408701528360608801511660608701528160808801511660808701528060a08801511660a08701525050505092915050565b815181526020918201519181019190915260400190565b61ffff91909116815260200190565b61ffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b61ffff94909416845273ffffffffffffffffffffffffffffffffffffffff9290921660208401526040830152606082015260800190565b61ffff929092168252602082015260400190565b600061ffff8416825260406020830152613bee6040830184614748565b600061ffff8816825260c0602083015261532260c0830188614748565b73ffffffffffffffffffffffffffffffffffffffff8716604084015267ffffffffffffffff8616606084015284608084015282810360a08401526153668185614748565b9998505050505050505050565b61ffff92831681529116602082015260400190565b600061ffff808916835280881660208401525073ffffffffffffffffffffffffffffffffffffffff8616604083015284606083015260a060808301526153d260a083018486614700565b98975050505050505050565b600061ffff808816835280871660208401525073ffffffffffffffffffffffffffffffffffffffff8516604083015283606083015260a06080830152613d7160a0830184614748565b600061ffff80871683528086166020840152506060604083015261489b606083018486614700565b600061ffff8086168352808516602084015250606060408301526154766060830184614748565b95945050505050565b61ffff938416815291909216602082015267ffffffffffffffff909116604082015260600190565b61ffff9788168152958716602087015267ffffffffffffffff94909416604086015273ffffffffffffffffffffffffffffffffffffffff9283166060860152908516608085015290931660a083015290911660c082015260e00190565b61ffff968716815267ffffffffffffffff958616602082015273ffffffffffffffffffffffffffffffffffffffff948516604082015292909516606083015290921660808301529190911660a082015260c00190565b600061ffff808816835267ffffffffffffffff8716602084015280861660408401525060806060830152613d71608083018486614700565b918252602082015260400190565b67ffffffffffffffff91909116815260200190565b60ff91909116815260200190565b60ff95909516855273ffffffffffffffffffffffffffffffffffffffff938416602086015291831660408501529091166060830152608082015260a00190565b60405181810167ffffffffffffffff8111828210171561561f57fe5b604052919050565b60005b8381101561564257818101518382015260200161562a565b83811115613a895750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461567557600080fd5b50565b61ffff8116811461567557600080fd5b67ffffffffffffffff8116811461567557600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220c4bfc55e84c3d77ca2df7433e929bf0c66f9c72cd7e93453fc448eb8f0bf2c0964736f6c63430007060033000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
-----Decoded View---------------
Arg [0] : _endpoint (address): 0xb6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b6319cc6c8c27a8f5daf0dd3df91ea35c4720dd7
Deployed ByteCode Sourcemap
517:24470:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2039:49;;;;;;;;;;-1:-1:-1;2039:49:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1457:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22239:1252::-;;;;;;;;;;-1:-1:-1;22239:1252:18;;;;;:::i;:::-;;:::i;:::-;;1491:42;;;;;;;;;;;;;:::i;19935:916::-;;;;;;;;;;-1:-1:-1;19935:916:18;;;;;:::i;:::-;;:::i;2430:71::-;;;;;;;;;;-1:-1:-1;2430:71:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;941:44::-;;;;;;;;;;;;;:::i;1761:58::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2310:67::-;;;;;;;;;;-1:-1:-1;2310:67:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;1124:43::-;;;;;;;;;;;;;:::i;17857:1414::-;;;;;;;;;;-1:-1:-1;17857:1414:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;871:64::-;;;;;;;;;;;;;:::i;1693:62::-;;;;;;;;;;;;;:::i;7759:4066::-;;;;;;:::i;:::-;;:::i;15801:1994::-;;;;;;;;;;-1:-1:-1;15801:1994:18;;;;;:::i;:::-;;:::i;20979:280::-;;;;;;;;;;-1:-1:-1;20979:280:18;;;;;:::i;:::-;;:::i;2094:30::-;;;;;;;;;;;;;:::i;5464:1890::-;;;;;;;;;;-1:-1:-1;5464:1890:18;;;;;:::i;:::-;;:::i;3090:44::-;;;;;;;;;;;;;:::i;24711:132::-;;;;;;;;;;-1:-1:-1;24711:132:18;;;;;:::i;:::-;;:::i;11977:696::-;;;;;;;;;;-1:-1:-1;11977:696:18;;;;;:::i;:::-;;:::i;1693:145:14:-;;;;;;;;;;;;;:::i;991:56:18:-;;;;;;;;;;;;;:::i;21522:479::-;;;;;;;;;;-1:-1:-1;21522:479:18;;;;;:::i;:::-;;:::i;23497:291::-;;;;;;;;;;-1:-1:-1;23497:291:18;;;;;:::i;:::-;;:::i;19423:331::-;;;;;;;;;;-1:-1:-1;19423:331:18;;;;;:::i;:::-;;:::i;24089:287::-;;;;;;;;;;-1:-1:-1;24089:287:18;;;;;:::i;:::-;;:::i;1061:85:14:-;;;;;;;;;;;;;:::i;1053:65:18:-;;;;;;;;;;;;;:::i;2877:50::-;;;;;;;;;;-1:-1:-1;2877:50:18;;;;;:::i;:::-;;:::i;1985:48::-;;;;;;;;;;-1:-1:-1;1985:48:18;;;;;:::i;:::-;;:::i;12849:1140::-;;;;;;;;;;-1:-1:-1;12849:1140:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1562:43::-;;;;;;;;;;;;;:::i;799:66::-;;;;;;;;;;;;;:::i;2661:55::-;;;;;;;;;;-1:-1:-1;2661:55:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2756:72::-;;;;;;;;;;-1:-1:-1;2756:72:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2933:86::-;;;;;;;;;;-1:-1:-1;2933:86:18;;;;;:::i;:::-;;:::i;2526:72::-;;;;;;;;;;-1:-1:-1;2526:72:18;;;;;:::i;:::-;;:::i;2188:80::-;;;;;;;;;;-1:-1:-1;2188:80:18;;;;;:::i;:::-;;:::i;24849:136::-;;;;;;;;;;-1:-1:-1;24849:136:18;;;;;:::i;:::-;;:::i;3025:43::-;;;;;;;;;;-1:-1:-1;3025:43:18;;;;;:::i;:::-;;:::i;22007:226::-;;;;;;;;;;-1:-1:-1;22007:226:18;;;;;:::i;:::-;;:::i;24493:212::-;;;;;;;;;;-1:-1:-1;24493:212:18;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23794:289::-;;;;;;;;;;-1:-1:-1;23794:289:18;;;;;:::i;:::-;;:::i;21265:251::-;;;;;;;;;;-1:-1:-1;21265:251:18;;;;;:::i;:::-;;:::i;1987:240:14:-;;;;;;;;;;-1:-1:-1;1987:240:14;;;;;:::i;:::-;;:::i;2130:27:18:-;;;;;;;;;;;;;:::i;13995:1800::-;;;;;;;;;;-1:-1:-1;13995:1800:18;;;;;:::i;:::-;;:::i;1875:59::-;;;;;;;;;;;;;:::i;2039:49::-;;;;;;;;;;;;;:::o;1457:28::-;;;;;;:::o;22239:1252::-;1284:12:14;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22529:32:18::1;::::0;;::::1;;::::0;;;:22:::1;:32;::::0;;;;;;::::1;22498:63:::0;;::::1;;::::0;::::1;::::0;:98:::1;;;22595:1;22565:27;:31;;;22498:98;22490:159;;;;-1:-1:-1::0;;;22490:159:18::1;;;;;;;:::i;:::-;;;;;;;;;22696:1;22667:26;:30;;;22659:88;;;;-1:-1:-1::0;;;22659:88:18::1;;;;;;;:::i;:::-;22765:24;::::0;::::1;22757:71;;;;-1:-1:-1::0;;;22757:71:18::1;;;;;;;:::i;:::-;22846:32;::::0;;::::1;;::::0;;;:22:::1;:32;::::0;;;;;;;:52;;::::1;::::0;;;;;;;::::1;;22838:103;;;;-1:-1:-1::0;;;22838:103:18::1;;;;;;;:::i;:::-;22989:1;22959:27;:31;;;22951:90;;;;-1:-1:-1::0;;;22951:90:18::1;;;;;;;:::i;:::-;23059:23;::::0;::::1;23051:69;;;;-1:-1:-1::0;;;23051:69:18::1;;;;;;;:::i;:::-;23159:149;;;;;;;;23184:27;23159:149;;;;;;23213:26;23159:149;;;;;;23241:8;23159:149;;;;;;23251:18;23159:149;;;;;;23271:27;23159:149;;;;;;;;23300:7;23159:149;;;;::::0;23130:16:::1;:26;23147:8;23130:26;;;;;;;;;;;;;;;:178;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23323:161;23350:8;23360:27;23389:26;23417:8;23427:18;23447:27;23476:7;23323:161;;;;;;;;;;;;:::i;:::-;;;;;;;;22239:1252:::0;;;;;;;:::o;1491:42::-;;;;;;:::o;19935:916::-;1680:1:15;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;1680:1;2390:7;:18;20068:45:18::1;::::0;::::1;20064:597;;20159:16;::::0;::::1;;20137:10;:39;20129:75;;;;-1:-1:-1::0;;;20129:75:18::1;;;;;;;:::i;:::-;20239:18;::::0;:31:::1;::::0;20262:7;20239:22:::1;:31::i;:::-;20218:18;:52:::0;20064:597:::1;;;20291:41;::::0;::::1;1818:1;20291:41;20287:374;;;20396:10;20379:28;::::0;;;:16:::1;:28;::::0;;;;;:41:::1;::::0;20412:7;20379:32:::1;:41::i;:::-;20365:10;20348:28;::::0;;;:16:::1;:28;::::0;;;;:72;20287:374:::1;;;20441:42;::::0;::::1;1933:1;20441:42;20437:224;;;20549:10;20531:29;::::0;;;:17:::1;:29;::::0;;;;;:42:::1;::::0;20565:7;20531:33:::1;:42::i;:::-;20517:10;20499:29;::::0;;;:17:::1;:29;::::0;;;;:74;20437:224:::1;;;20604:46;;-1:-1:-1::0;;;20604:46:18::1;;;;;;;:::i;20437:224::-;20672:12;20690:3;:8;;20706:7;20690:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20671:47;;;20736:7;20728:46;;;;-1:-1:-1::0;;;20728:46:18::1;;;;;;;:::i;:::-;20789:55;20804:5;20811:6;20819:10;20831:3;20836:7;20789:55;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1637:1:15;2563:7;:22;-1:-1:-1;;;19935:916:18:o;2430:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;941:44::-;984:1;941:44;:::o;1761:58::-;1818:1;1761:58;:::o;2310:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1124:43::-;1166:1;1124:43;:::o;17857:1414::-;18157:42;;;;;;;;;;;;;;;;;;;;;;18013:14;;;;18069:8;;18100:3;;18132:8;;18013:14;;18157:42;18185:14;;;;;;18157:42;;18185:14;;;;18157:42;;;;;;;;-1:-1:-1;18157:42:18;;-1:-1:-1;18253:25:18;;-1:-1:-1;18266:7:18;;-1:-1:-1;18275:2:18;;-1:-1:-1;18253:12:18;:25::i;:::-;18210:68;;18312:15;18355:12;:19;18378:1;18355:24;18351:469;;;18434:29;;;;18399:32;18434:29;;;:20;:29;;;;;;;;18464:26;;;;18434:57;;;;;;;;;;;18399:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;18434:57;;18399:92;;18434:57;18399:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18540:8;:16;;;18522:44;;;18567:7;18576:8;:26;;;18604:2;18608:11;18621:19;18522:119;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18509:132;;18351:469;;;;18711:8;:16;;;18693:44;;;18738:7;18747:8;:26;;;18775:2;18779:11;18792:12;18693:112;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18680:125;;18351:469;18896:15;;;;18931:26;;;;18879:79;;;;;18862:14;;18879:42;;;;;:79;;18922:7;;18879:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18862:96;;19008:16;19027;;;;;;;;;;;:24;;;19052:9;19063:10;19075:9;19027:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19008:77;;19099:9;:58;;19146:11;19134:23;;;19099:58;;;19120:11;19111:20;;;19099:58;-1:-1:-1;19224:40:18;;-1:-1:-1;19254:9:18;19224:25;:9;19238:10;19224:13;:25::i;:::-;:29;;:40::i;:::-;19212:52;;17857:1414;;;;;;;;;;;;;;;;;:::o;871:64::-;934:1;871:64;:::o;1693:62::-;1754:1;1693:62;:::o;7759:4066::-;4665:8;4657:31;;4678:10;4657:31;4649:68;;;;-1:-1:-1;;;4649:68:18;;;;;;;:::i;:::-;8012:40:::1;8055:27;8068:8;8078:3;8055:12;:27::i;:::-;8192:18;::::0;::::1;8092:10;8192:18:::0;;;:9:::1;:18;::::0;;;;;8012:70;;-1:-1:-1;8105:3:18;;8133:6;;8166:8;;8184:78:::1;;;;-1:-1:-1::0;;;8184:78:18::1;;;;;;;:::i;:::-;8273:19;8316:14:::0;8430:8:::1;:15;;;8413:42;;;8456:7;8465:8;:26;;;8413:79;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8563:15;::::0;::::1;::::0;8546:33:::1;;;::::0;;;:16:::1;:33;::::0;;;;;8401:91;;-1:-1:-1;8546:48:18::1;::::0;8401:91;8546:37:::1;:48::i;:::-;8527:15;::::0;::::1;::::0;8510:33:::1;;;::::0;;;:16:::1;:33;::::0;;;;;;:84;;;;8779:16;::::1;::::0;8700:8;;8818:26;8814:642:::1;;8903:29;::::0;;::::1;8868:32;8903:29:::0;;;:20:::1;:29;::::0;;;;;;;8933:26:::1;::::0;::::1;::::0;8903:57;;::::1;::::0;;;;;;;;8868:92;;;;::::1;;::::0;::::1;;;;::::0;;;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;:32;;8903:57;;8868:92;::::1;8903:57:::0;8868:92;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;9025:26:18::1;::::0;::::1;::::0;8999:91:::1;::::0;;;;8868:92;;-1:-1:-1;8999:16:18::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;8999:91:18::1;::::0;9016:7;;9053:2;;9057:11;;8868:92;;8999:91:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9143:26;::::0;::::1;::::0;9112:79:::1;::::0;;;;8982:108;;-1:-1:-1;9112:21:18::1;::::0;::::1;::::0;::::1;::::0;:79:::1;::::0;9134:7;;9143:26;9171:19;;9112:79:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8814:642;;;;9255:7;:16;;;9272:7;9281:8;:26;;;9309:2;9313:11;9326:14;;9255:86;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9394:26;::::0;::::1;::::0;9363:74:::1;::::0;;;;9238:103;;-1:-1:-1;9363:21:18::1;::::0;::::1;::::0;::::1;::::0;:74:::1;::::0;9385:7;;9394:26;9422:14;;;;9363:74:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8814:642;9529:16;::::0;;::::1;::::0;9511:35:::1;;;::::0;;;:17:::1;:35;::::0;;;:55:::1;::::0;9551:14;9511:39:::1;:55::i;:::-;9491:16;::::0;;::::1;::::0;9473:35:::1;;;::::0;;;:17:::1;:35;::::0;;;;:93;;;;9698:26:::1;::::0;::::1;::::0;9668:73;;::::1;::::0;::::1;::::0;9682:7;;9691:5;;9726:14;;;;9668:73:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;9921:16:18::1;::::0;-1:-1:-1;9940:34:18::1;::::0;::::1;::::0;;:77:::1;;-1:-1:-1::0;9986:14:18::1;::::0;9978:39:::1;9986:14;9978:39:::0;9940:77:::1;10054:16;::::0;:65:::1;::::0;;;;9921:96;;-1:-1:-1;10035:16:18::1;::::0;10054::::1;::::0;;::::1;::::0;:24:::1;::::0;:65:::1;::::0;10079:12;::::1;::::0;10093:14;;10109:9;;10054:65:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10035:84:::0;-1:-1:-1;10179:15:18;;10175:815:::1;;10222:11;10218:754;;;10282:18;::::0;:35:::1;::::0;10305:11;10282:22:::1;:35::i;:::-;10261:18;:56:::0;10360:31:::1;:14:::0;10379:11;10360:18:::1;:31::i;:::-;10343:48;;10218:754;;;10593:2;10571:24;;:18;:24;;;:59;;;-1:-1:-1::0;10599:31:18::1;::::0;::::1;10621:9;10599:31;10571:59;10563:115;;;;-1:-1:-1::0;;;10563:115:18::1;;;;;;;:::i;:::-;10793:14;::::0;:79:::1;::::0;:14:::1;;10825:18:::0;10853:4:::1;10860:11:::0;10793:31:::1;:79::i;:::-;10917:15;::::0;:32:::1;::::0;10937:11;10917:19:::1;:32::i;:::-;10899:15;:50:::0;10218:754:::1;-1:-1:-1::0;11035:29:18::1;::::0;-1:-1:-1;11035:14:18;11054:9;11035:18:::1;:29::i;:::-;11018:46;;4727:1;11157:27;11204:5;11211:2;11215:12;;11229:8;;11187:51;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;11157:81;;11257:31;11264:7;11273:14;11257:31;;;;;;;:::i;:::-;;;;;;;;11356:15;::::0;::::1;::::0;11395:26:::1;::::0;::::1;::::0;11423:35:::1;::::0;::::1;::::0;11339:120:::1;::::0;;;;:46:::1;::::0;;::::1;::::0;::::1;::::0;:120:::1;::::0;11386:7;;11339:120:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4727:1;11506:9;11488:14;:27;;11480:77;;;;-1:-1:-1::0;;;11480:77:18::1;;;;;;;:::i;:::-;11607:11;11621:29;:9;11635:14:::0;11621:13:::1;:29::i;:::-;11607:43:::0;-1:-1:-1;11664:10:18;;11660:159:::1;;11691:12;11709:14;:19;;11736:6;11709:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11690:57;;;11769:7;11761:47;;;;-1:-1:-1::0;;;11761:47:18::1;;;;;;;:::i;:::-;11660:159;;4727:1;;;;;;7759:4066:::0;;;;;;;;;;;:::o;15801:1994::-;15987:33;;;15943:41;15987:33;;;:9;:33;;;;;;;;:43;;;;;;;;;;15919:12;;864:1;16045:56;;16041:1748;;;16121:35;;;;16117:151;;16199:26;;;;;;;;:16;:26;;;;;;;;;:53;16188:65;;;;16199:53;;;;;16188:65;;:::i;:::-;;;;;;;;;;;;;16181:72;;;;;16117:151;16299:35;;16288:47;;;;16299:35;;;16288:47;;;:::i;16041:1748::-;934:1;16356:11;:54;16352:1437;;;16430:34;;;;;;;16426:149;;16507:26;;;;;;;:16;:26;;;;;;;;;:52;16496:64;;;;16507:52;;;;;;16496:64;;:::i;16426:149::-;16606:34;;16595:46;;;;16606:34;;;;;;16595:46;;;:::i;16352:1437::-;984:1;16662:11;:34;16658:1131;;;16716:16;;;;;:32;:16;16712:124;;16786:26;;;;;;;:16;:26;;;;;;;;;:34;16775:46;;;;16786:34;;;;;;16775:46;;:::i;16712:124::-;16867:16;;16856:28;;;;16867:16;;;;;;16856:28;;;:::i;16658:1131::-;1046:1;16905:11;:46;16901:888;;;16971:26;;;;;;;16967:133;;17040:26;;;;;;;;:16;:26;;;;;;;;;:44;17029:56;;;;17040:44;;;;;;;;17029:56;;:::i;16967:133::-;17131:26;;17120:38;;;;17131:26;;;;;;17120:38;;;:::i;16901:888::-;1117:1;17179:11;:55;17175:614;;;17254:35;;;;;;17250:151;;17332:26;;;;;;;:16;:26;;;;;;;;;:53;;;17321:65;;;;17332:53;;;17321:65;;:::i;17250:151::-;17432:35;;;;17421:47;;;;17432:35;;;17421:47;;;:::i;17175:614::-;1166:1;17489:11;:33;17485:304;;;17542:15;;;;;;;:31;:15;17538:122;;17611:26;;;;;;;:16;:26;;;;;;;;;:33;;;17600:45;;;;17611:33;;;;;;17600:45;;:::i;17538:122::-;17691:15;;;;17680:27;;;;17691:15;;;;;;17680:27;;;:::i;17485:304::-;17738:40;;-1:-1:-1;;;17738:40:18;;;;;;;:::i;15801:1994::-;;;;;;:::o;20979:280::-;1284:12:14;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21068:31:18::1;::::0;::::1;21060:93;;;;-1:-1:-1::0;;;21060:93:18::1;;;;;;;:::i;:::-;21163:14;:40:::0;;;::::1;;::::0;::::1;;::::0;;21218:34:::1;::::0;::::1;::::0;::::1;::::0;21163:40;;21218:34:::1;:::i;:::-;;;;;;;;20979:280:::0;:::o;2094:30::-;;;;:::o;5464:1890::-;5715:40;5758:38;5771:11;5784;5758:12;:38::i;:::-;5869:16;;;;5715:81;;-1:-1:-1;5869:30:18;;5889:10;5869:30;5861:69;;;;-1:-1:-1;;;5861:69:18;;;;;;;:::i;:::-;5941:37;;:::i;:::-;6080:32;;;;6054:23;6080:32;;;:19;:32;;;;;;;;6113:35;;6080:69;;;;;;;;;;;;6322:15;;;;6080:69;6311:27;;;;;:10;:27;;;;;:40;;;;;;;;;:53;;;;;;;;;6413:34;;;;6386:23;;6080:69;;;;;6311:53;;6386:61;;;;-1:-1:-1;6386:61:18;6378:115;;;;-1:-1:-1;;;6378:115:18;;;;;;;:::i;:::-;6559:32;;;6534:22;6559:32;;;:19;:32;;;;;;;;6674:14;;;;6615:112;;;;;6559:32;;6615:58;;;;;;:112;;6690:17;;;;6559:32;;6615:112;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6863:18;;;;6837:22;;;;;;;:9;:22;;;;;;6605:122;;-1:-1:-1;6837:44:18;;-1:-1:-1;6829:97:18;;-1:-1:-1;;6829:97:18;;;-1:-1:-1;;;6829:97:18;;;;;;;:::i;:::-;7066:11;7044:33;;:7;:18;;;:33;;;7036:76;;;;-1:-1:-1;;;7036:76:18;;;;;;;:::i;:::-;7245:18;;7265;;;;7285;;;;7305:13;;;;;7331:15;;;;7221:126;;;;;:23;:8;:23;;;;:126;;7245:18;;7265;;7285;;7320:9;;7331:15;7221:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5464:1890;;;;;;;;:::o;3090:44::-;;;:::o;24711:132::-;24811:25;;;24788:4;24811:25;;;:16;:25;;;;;;24711:132;;;;:::o;11977:696::-;12244:10;12210:20;12233:22;;;:10;:22;;;;;;;;:35;;;;;;;;;;:48;;;;;;;;12362:16;;:33;-1:-1:-1;12354:113:18;;;;-1:-1:-1;;;12354:113:18;;;;;;;:::i;:::-;12526:33;;;12569:7;;;:15;;;12600:66;;;;;;12613:11;;12626:10;;12545:14;;12654:11;;12600:66;:::i;:::-;;;;;;;;11977:696;;;;;:::o;1693:145:14:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1783:6:::1;::::0;1762:40:::1;::::0;1799:1:::1;::::0;1762:40:::1;1783:6;::::0;1762:40:::1;::::0;1799:1;;1762:40:::1;1812:6;:19:::0;;;::::1;::::0;;1693:145::o;991:56:18:-;1046:1;991:56;:::o;21522:479::-;1284:12:14;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21634:24:18::1;::::0;::::1;21626:78;;;;-1:-1:-1::0;;;21626:78:18::1;;;;;;;:::i;:::-;21757:5;21722:32:::0;;::::1;;::::0;;;:22:::1;:32;::::0;;;;;;::::1;:40;21714:87;;;;-1:-1:-1::0;;;21714:87:18::1;;;;;;;:::i;:::-;21811:32;::::0;;::::1;;::::0;;;:22:::1;:32;::::0;;;;;;;:34;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;21855:19:::1;:29:::0;;;;;21885:32;::::1;21855:63:::0;;;;;;;;:74;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;21944:50;::::1;::::0;::::1;::::0;21834:8;;21921;;21944:50:::1;:::i;:::-;;;;;;;;21522:479:::0;;:::o;23497:291::-;1284:12:14;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23636:30:18::1;::::0;;::::1;;::::0;;;:20:::1;:30;::::0;;;;;;;:42;;::::1;::::0;;;;;;:59:::1;::::0;23681:14;;23636:59:::1;:::i;:::-;;23710:71;23744:8;23754:10;23766:14;;23710:71;;;;;;;;;:::i;:::-;;;;;;;;23497:291:::0;;;;:::o;19423:331::-;1680:1:15;2260:7;;:19;;2252:63;;;;;-1:-1:-1;;;2252:63:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;1680:1;2390:7;:18;19542:16:18::1;::::0;::::1;;19520:10;:39;19512:76;;;;-1:-1:-1::0;;;19512:76:18::1;;;;;;;:::i;:::-;19616:15;::::0;:28:::1;::::0;19636:7;19616:19:::1;:28::i;:::-;19598:15;:46:::0;19654:14:::1;::::0;:41:::1;::::0;:14:::1;;19682:3:::0;19687:7;19654:27:::1;:41::i;:::-;19710:37;19722:10;19734:3;19739:7;19710:37;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1637:1:15;2563:7;:22;19423:331:18:o;24089:287::-;1284:12:14;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24184:29:18::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;;:34;24176:95:::1;;;;-1:-1:-1::0;;;24176:95:18::1;;;;;;;:::i;:::-;24281:29;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;;;:37;;;24333:36;::::1;::::0;::::1;::::0;24301:8;;24313:5;;24333:36:::1;:::i;1061:85:14:-:0;1133:6;;;;1061:85;:::o;1053:65:18:-;1117:1;1053:65;:::o;2877:50::-;;;;;;;;;;;;;:::o;1985:48::-;;;;;;;;;;;;;:::o;12849:1140::-;12941:31;;:::i;:::-;13025:33;;;;12984:38;13025:33;;;:9;:33;;;;;;;;:43;;;;;;;;;;;;;12984:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13127:26;;;:16;:26;;;;;;13168:33;;13127:26;;13168:38;13164:145;;13258:40;;;;13222:76;;13164:145;13323:32;;;;:37;;13319:142;;13411:39;;;;;;;13376:32;;;:74;13319:142;13475:14;;;;:30;;13471:99;;13538:21;;;;;;;13521:14;;;:38;13471:99;13584:24;;;;:29;;13580:118;;13656:31;;;;;;;13629:24;;;:58;13580:118;13712:33;;;;:38;;13708:145;;13802:40;;;;;;13766:33;;;:76;13708:145;13867:13;;;;:29;;13863:96;;13928:20;;;;;;;;;13912:13;;;:36;13863:96;-1:-1:-1;13976:6:18;12849:1140;-1:-1:-1;;;12849:1140:18:o;1562:43::-;1600:5;1562:43;:::o;2661:55::-;;;;;;;;;;;;;;;:::o;2756:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2933:86::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2526:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2188:80::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24849:136::-;24951:27;;24928:4;24951:27;;;:17;:27;;;;;;;24849:136::o;3025:43::-;;;;;;;;;;;;;:::o;22007:226::-;1284:12:14;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22110:32:18::1;::::0;;::::1;;::::0;;;:22:::1;:32;::::0;;;;;;;:44;;::::1;::::0;;;;;;;;:51;;;::::1;22157:4;22110:51;::::0;;22176:50;::::1;::::0;::::1;::::0;22133:8;;22143:10;;22176:50:::1;:::i;24493:212::-:0;24605:26;;:::i;:::-;-1:-1:-1;24650:19:18;;;;;;;:10;:19;;;;;;;;:35;;;;;;;;;;:48;;;;;;;;;24643:55;;;;;;;;;;;;;;;;;;;24493:212;;;;;:::o;23794:289::-;1284:12:14;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23896:25:18::1;::::0;::::1;23933:1;23896:25:::0;;;:9:::1;:25;::::0;;;;;:39;23888:85:::1;;;;-1:-1:-1::0;;;23888:85:18::1;;;;;;;:::i;:::-;23983:25;::::0;::::1;;::::0;;;:9:::1;:25;::::0;;;;;;:38;;;24036:40;::::1;::::0;::::1;::::0;23993:14;;24011:10;;24036:40:::1;:::i;21265:251::-:0;1284:12:14;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21342:25:18::1;::::0;::::1;21334:80;;;;-1:-1:-1::0;;;21334:80:18::1;;;;;;;:::i;:::-;21424:16;:48:::0;;;::::1;;::::0;::::1;;::::0;;21487:22:::1;::::0;::::1;::::0;::::1;::::0;21424:48;;21487:22:::1;:::i;1987:240:14:-:0;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;-1:-1:-1;;;1265:68:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2075:22:::1;::::0;::::1;2067:73;;;;-1:-1:-1::0;;;2067:73:14::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2176:6;::::0;2155:38:::1;::::0;::::1;::::0;;::::1;::::0;2176:6:::1;::::0;2155:38:::1;::::0;2176:6:::1;::::0;2155:38:::1;2203:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;1987:240::o;2130:27:18:-;;;;:::o;13995:1800::-;4665:8;4657:31;;4678:10;4657:31;4649:68;;;;-1:-1:-1;;;4649:68:18;;;;;;;:::i;:::-;14170:14:::1;::::0;::::1;14126:41;14170:14:::0;;;:9:::1;:14;::::0;;;;;;;:23:::1;::::0;::::1;::::0;;;;;;;864:1:::1;14207:56:::0;::::1;14203:1527;;;14279:33;14315:29;::::0;;::::1;14326:7:::0;14315:29:::1;:::i;:::-;14396:31;::::0;;::::1;;::::0;;;:22:::1;:31;::::0;;;;;14279:65;;-1:-1:-1;14396:31:18;;::::1;14366:61:::0;;::::1;;;14358:122;;;;-1:-1:-1::0;;;14358:122:18::1;;;;;;;:::i;:::-;14494:64:::0;;;::::1;;::::0;;;::::1;;::::0;;14203:1527:::1;;;934:1;14579:11;:54;14575:1155;;;14649:25;14677:29;::::0;;::::1;14688:7:::0;14677:29:::1;:::i;:::-;14720:55:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;14575:1155:18::1;;;984:1;14796:11;:34;14792:938;;;14846:15;14864:30;::::0;;::::1;14875:7:::0;14864:30:::1;:::i;:::-;14908:26:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;14792:938:18::1;;;1046:1;14955:11;:46;14951:779;;;15017:24;15044:29;::::0;;::::1;15055:7:::0;15044:29:::1;:::i;:::-;15095:31;::::0;;::::1;;::::0;;;:22:::1;:31;::::0;;;;;;;:50;;::::1;::::0;;;;;;;15017:56;;-1:-1:-1;15095:50:18::1;;::::0;:76:::1;;-1:-1:-1::0;15149:22:18::1;::::0;::::1;::::0;15095:76:::1;15087:127;;;;-1:-1:-1::0;;;15087:127:18::1;;;;;;;:::i;:::-;15228:46:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;14951:779:::1;;;1117:1;15295:11;:55;15291:439;;;15366:25;15394:29;::::0;;::::1;15405:7:::0;15394:29:::1;:::i;:::-;15437:35;::::0;::::1;:56:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;15291:439:18::1;;;1166:1;15514:11;:33;15510:220;;;15563:14;15580:30;::::0;;::::1;15591:7:::0;15580:30:::1;:::i;:::-;15624:15;::::0;::::1;:24:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;15510:220:18::1;15745:43;15762:3;15767:11;15780:7;;15745:43;;;;;;;;;:::i;:::-;;;;;;;;4727:1;13995:1800:::0;;;;;:::o;598:104:2:-;685:10;598:104;:::o;3128:155:17:-;3186:7;3218:1;3213;:6;;3205:49;;;;;-1:-1:-1;;;3205:49:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3271:5:17;;;3128:155::o;2682:175::-;2740:7;2771:5;;;2794:6;;;;2786:46;;;;;-1:-1:-1;;;2786:46:17;;;;;;;;;;;;;;;;;;;;;;;;;;;858:203:16;985:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1008:27;985:68;;;958:96;;978:5;;958:19;:96::i;:::-;858:203;;;;:::o;677:175::-;786:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;809:23;786:58;;;759:86;;779:5;;759:19;:86::i;:::-;677:175;;;:::o;2940:751::-;3359:23;3385:69;3413:4;3385:69;;;;;;;;;;;;;;;;;3393:5;3385:27;;;;:69;;;;;:::i;:::-;3468:17;;3359:95;;-1:-1:-1;3468:21:16;3464:221;;3608:10;3597:30;;;;;;;;;;;;;;;-1:-1:-1;3597:30:16;3589:85;;;;-1:-1:-1;;;3589:85:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3573:193:0;3676:12;3707:52;3729:6;3737:4;3743:1;3746:12;3707:21;:52::i;:::-;3700:59;3573:193;-1:-1:-1;;;;3573:193:0:o;4600:523::-;4727:12;4784:5;4759:21;:30;;4751:81;;;;-1:-1:-1;;;4751:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4850:18;4861:6;4850:10;:18::i;:::-;4842:60;;;;;-1:-1:-1;;;4842:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4973:12;4987:23;5014:6;:11;;5034:5;5042:4;5014:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4972:75;;;;5064:52;5082:7;5091:10;5103:12;5064:17;:52::i;:::-;5057:59;4600:523;-1:-1:-1;;;;;;;4600:523:0:o;718:413::-;1078:20;1116:8;;;718:413::o;7083:725::-;7198:12;7226:7;7222:580;;;-1:-1:-1;7256:10:0;7249:17;;7222:580;7367:17;;:21;7363:429;;7625:10;7619:17;7685:15;7672:10;7668:2;7664:19;7657:44;7574:145;7764:12;7757:20;;-1:-1:-1;;;7757:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:138:19;84:20;;113:33;84:20;113:33;:::i;157:142::-;238:13;;260:33;238:13;260:33;:::i;304:377::-;;;421:3;414:4;406:6;402:17;398:27;388:2;;446:8;436;429:26;388:2;-1:-1:-1;476:20:19;;519:18;508:30;;505:2;;;558:8;548;541:26;505:2;602:4;594:6;590:17;578:29;;654:3;647:4;638:6;630;626:19;622:30;619:39;616:2;;;671:1;668;661:12;616:2;378:303;;;;;:::o;686:563::-;;794:3;787:4;779:6;775:17;771:27;761:2;;816:5;809;802:20;761:2;849:6;843:13;875:18;871:2;868:26;865:2;;;897:9;865:2;932:113;1039:4;970:66;963:4;959:2;955:13;951:86;947:97;932:113;:::i;:::-;1070:2;1061:7;1054:19;1116:3;1109:4;1104:2;1096:6;1092:15;1088:26;1085:35;1082:2;;;1137:5;1130;1123:20;1082:2;1154:64;1215:2;1208:4;1199:7;1195:18;1188:4;1180:6;1176:17;1154:64;:::i;1254:136::-;1323:20;;1352:32;1323:20;1352:32;:::i;1395:140::-;1475:13;;1497:32;1475:13;1497:32;:::i;1540:136::-;1609:20;;1638:32;1609:20;1638:32;:::i;1681:140::-;1761:13;;1783:32;1761:13;1783:32;:::i;1826:259::-;;1938:2;1926:9;1917:7;1913:23;1909:32;1906:2;;;1959:6;1951;1944:22;1906:2;2003:9;1990:23;2022:33;2049:5;2022:33;:::i;2362:400::-;;;2490:2;2478:9;2469:7;2465:23;2461:32;2458:2;;;2511:6;2503;2496:22;2458:2;2555:9;2542:23;2574:33;2601:5;2574:33;:::i;:::-;2626:5;-1:-1:-1;2683:2:19;2668:18;;2655:32;2696:34;2655:32;2696:34;:::i;:::-;2749:7;2739:17;;;2448:314;;;;;:::o;2767:468::-;;;;2912:2;2900:9;2891:7;2887:23;2883:32;2880:2;;;2933:6;2925;2918:22;2880:2;2977:9;2964:23;2996:33;3023:5;2996:33;:::i;:::-;3048:5;-1:-1:-1;3105:2:19;3090:18;;3077:32;3118:34;3077:32;3118:34;:::i;:::-;2870:365;;3171:7;;-1:-1:-1;;;3225:2:19;3210:18;;;;3197:32;;2870:365::o;3240:327::-;;;3369:2;3357:9;3348:7;3344:23;3340:32;3337:2;;;3390:6;3382;3375:22;3337:2;3434:9;3421:23;3453:33;3480:5;3453:33;:::i;:::-;3505:5;3557:2;3542:18;;;;3529:32;;-1:-1:-1;;;3327:240:19:o;3572:1424::-;;;;;;;;;;;;3867:3;3855:9;3846:7;3842:23;3838:33;3835:2;;;3889:6;3881;3874:22;3835:2;3917:31;3938:9;3917:31;:::i;:::-;3907:41;;3967:39;4002:2;3991:9;3987:18;3967:39;:::i;:::-;3957:49;;4025:39;4060:2;4049:9;4045:18;4025:39;:::i;:::-;4015:49;;4083:18;4150:2;4144;4133:9;4129:18;4116:32;4113:40;4110:2;;;4171:6;4163;4156:22;4110:2;4215:86;4293:7;4286:2;4275:9;4271:18;4258:32;4247:9;4243:48;4215:86;:::i;:::-;4320:8;;-1:-1:-1;4347:8:19;-1:-1:-1;4398:3:19;4383:19;;4370:33;4367:41;-1:-1:-1;4364:2:19;;;4426:6;4418;4411:22;4364:2;4470:87;4549:7;4541:3;4530:9;4526:19;4513:33;4502:9;4498:49;4470:87;:::i;:::-;4576:8;;-1:-1:-1;4603:8:19;-1:-1:-1;4630:41:19;4666:3;4651:19;;4630:41;:::i;:::-;4620:51;;4690:41;4726:3;4715:9;4711:19;4690:41;:::i;:::-;4680:51;;4781:2;4774:3;4763:9;4759:19;4746:33;4743:41;4740:2;;;4802:6;4794;4787:22;4740:2;;4847:87;4926:7;4918:3;4907:9;4903:19;4890:33;4879:9;4875:49;4847:87;:::i;:::-;4953:8;4943:18;;4981:9;4970:20;;;;3825:1171;;;;;;;;;;;;;;:::o;5001:1205::-;;5148:2;5136:9;5127:7;5123:23;5119:32;5116:2;;;5169:6;5161;5154:22;5116:2;5207:9;5201:16;5236:18;5277:2;5269:6;5266:14;5263:2;;;5298:6;5290;5283:22;5263:2;5326:22;;;;5382:4;5364:16;;;5360:27;5357:2;;;5405:6;5397;5390:22;5357:2;5436:20;5451:4;5436:20;:::i;:::-;5479:34;5510:2;5479:34;:::i;:::-;5472:5;5465:49;5546:43;5585:2;5581;5577:11;5546:43;:::i;:::-;5541:2;5534:5;5530:14;5523:67;5622:43;5661:2;5657;5653:11;5622:43;:::i;:::-;5617:2;5610:5;5606:14;5599:67;5698:44;5738:2;5734;5730:11;5698:44;:::i;:::-;5693:2;5686:5;5682:14;5675:68;5782:3;5778:2;5774:12;5768:19;5812:2;5802:8;5799:16;5796:2;;;5833:6;5825;5818:22;5796:2;5875:57;5924:7;5913:8;5909:2;5905:17;5875:57;:::i;:::-;5869:3;5862:5;5858:15;5851:82;;5980:3;5976:2;5972:12;5966:19;5960:3;5953:5;5949:15;5942:44;6025:3;6021:2;6017:12;6011:19;6055:2;6045:8;6042:16;6039:2;;;6076:6;6068;6061:22;6039:2;6118:57;6167:7;6156:8;6152:2;6148:17;6118:57;:::i;:::-;6112:3;6101:15;;6094:82;-1:-1:-1;6105:5:19;5106:1100;-1:-1:-1;;;;;5106:1100:19:o;6211:257::-;;6322:2;6310:9;6301:7;6297:23;6293:32;6290:2;;;6343:6;6335;6328:22;6290:2;6387:9;6374:23;6406:32;6432:5;6406:32;:::i;6473:400::-;;;6601:2;6589:9;6580:7;6576:23;6572:32;6569:2;;;6622:6;6614;6607:22;6569:2;6666:9;6653:23;6685:32;6711:5;6685:32;:::i;:::-;6736:5;-1:-1:-1;6793:2:19;6778:18;;6765:32;6806:35;6765:32;6806:35;:::i;6878:1210::-;;;;;;;;7092:3;7080:9;7071:7;7067:23;7063:33;7060:2;;;7114:6;7106;7099:22;7060:2;7158:9;7145:23;7177:32;7203:5;7177:32;:::i;:::-;7228:5;-1:-1:-1;7285:2:19;7270:18;;7257:32;7298:35;7257:32;7298:35;:::i;:::-;7352:7;-1:-1:-1;7410:2:19;7395:18;;7382:32;7433:18;7463:14;;;7460:2;;;7495:6;7487;7480:22;7460:2;7539:60;7591:7;7582:6;7571:9;7567:22;7539:60;:::i;:::-;7618:8;;-1:-1:-1;7513:86:19;-1:-1:-1;7705:2:19;7690:18;;7677:32;;-1:-1:-1;7747:15:19;;7740:23;7728:36;;7718:2;;7783:6;7775;7768:22;7718:2;7811:7;;-1:-1:-1;7871:3:19;7856:19;;7843:33;;7888:16;;;7885:2;;;7922:6;7914;7907:22;7885:2;;7966:62;8020:7;8009:8;7998:9;7994:24;7966:62;:::i;:::-;7050:1038;;;;-1:-1:-1;7050:1038:19;;-1:-1:-1;7050:1038:19;;;;7940:88;;-1:-1:-1;;;7050:1038:19:o;8093:468::-;;;;8238:2;8226:9;8217:7;8213:23;8209:32;8206:2;;;8259:6;8251;8244:22;8206:2;8303:9;8290:23;8322:32;8348:5;8322:32;:::i;:::-;8373:5;-1:-1:-1;8430:2:19;8415:18;;8402:32;8443:35;8402:32;8443:35;:::i;8566:847::-;;;;;;;8764:3;8752:9;8743:7;8739:23;8735:33;8732:2;;;8786:6;8778;8771:22;8732:2;8830:9;8817:23;8849:32;8875:5;8849:32;:::i;:::-;8900:5;-1:-1:-1;8957:2:19;8942:18;;8929:32;8970:35;8929:32;8970:35;:::i;:::-;9024:7;-1:-1:-1;9078:2:19;9063:18;;9050:32;;-1:-1:-1;9129:2:19;9114:18;;9101:32;;-1:-1:-1;9184:3:19;9169:19;;9156:33;9212:18;9201:30;;9198:2;;;9249:6;9241;9234:22;9198:2;9293:60;9345:7;9336:6;9325:9;9321:22;9293:60;:::i;:::-;8722:691;;;;-1:-1:-1;8722:691:19;;-1:-1:-1;8722:691:19;;9372:8;;8722:691;-1:-1:-1;;;8722:691:19:o;9418:778::-;;;;;;9599:3;9587:9;9578:7;9574:23;9570:33;9567:2;;;9621:6;9613;9606:22;9567:2;9665:9;9652:23;9684:32;9710:5;9684:32;:::i;:::-;9735:5;-1:-1:-1;9792:2:19;9777:18;;9764:32;9805:35;9764:32;9805:35;:::i;:::-;9859:7;-1:-1:-1;9913:2:19;9898:18;;9885:32;;-1:-1:-1;9968:2:19;9953:18;;9940:32;9995:18;9984:30;;9981:2;;;10032:6;10024;10017:22;9981:2;10076:60;10128:7;10119:6;10108:9;10104:22;10076:60;:::i;:::-;9557:639;;;;-1:-1:-1;9557:639:19;;-1:-1:-1;10155:8:19;;10050:86;9557:639;-1:-1:-1;;;9557:639:19:o;10201:325::-;;;10329:2;10317:9;10308:7;10304:23;10300:32;10297:2;;;10350:6;10342;10335:22;10297:2;10394:9;10381:23;10413:32;10439:5;10413:32;:::i;10531:462::-;;;;;10693:3;10681:9;10672:7;10668:23;10664:33;10661:2;;;10715:6;10707;10700:22;10661:2;10759:9;10746:23;10778:32;10804:5;10778:32;:::i;:::-;10829:5;10881:2;10866:18;;10853:32;;-1:-1:-1;10932:2:19;10917:18;;10904:32;;10983:2;10968:18;10955:32;;-1:-1:-1;10651:342:19;-1:-1:-1;;;10651:342:19:o;10998:398::-;;;11125:2;11113:9;11104:7;11100:23;11096:32;11093:2;;;11146:6;11138;11131:22;11093:2;11190:9;11177:23;11209:32;11235:5;11209:32;:::i;11401:707::-;;;;;11564:2;11552:9;11543:7;11539:23;11535:32;11532:2;;;11585:6;11577;11570:22;11532:2;11629:9;11616:23;11648:32;11674:5;11648:32;:::i;:::-;11699:5;-1:-1:-1;11756:2:19;11741:18;;11728:32;11769:34;11728:32;11769:34;:::i;:::-;11822:7;-1:-1:-1;11880:2:19;11865:18;;11852:32;11907:18;11896:30;;11893:2;;;11944:6;11936;11929:22;11893:2;11988:60;12040:7;12031:6;12020:9;12016:22;11988:60;:::i;:::-;11522:586;;;;-1:-1:-1;12067:8:19;-1:-1:-1;;;;11522:586:19:o;12113:1111::-;;;;;;;;12322:3;12310:9;12301:7;12297:23;12293:33;12290:2;;;12344:6;12336;12329:22;12290:2;12388:9;12375:23;12407:32;12433:5;12407:32;:::i;:::-;12458:5;-1:-1:-1;12515:2:19;12500:18;;12487:32;12528:34;12487:32;12528:34;:::i;:::-;12581:7;-1:-1:-1;12640:2:19;12625:18;;12612:32;12653:34;12612:32;12653:34;:::i;:::-;12706:7;-1:-1:-1;12765:2:19;12750:18;;12737:32;12778:35;12737:32;12778:35;:::i;:::-;12832:7;-1:-1:-1;12891:3:19;12876:19;;12863:33;12905:34;12863:33;12905:34;:::i;:::-;12958:7;-1:-1:-1;13017:3:19;13002:19;;12989:33;13031:34;12989:33;13031:34;:::i;:::-;13084:7;-1:-1:-1;13143:3:19;13128:19;;13115:33;13157:35;13115:33;13157:35;:::i;:::-;13211:7;13201:17;;;12280:944;;;;;;;;;;:::o;13559:194::-;;13682:2;13670:9;13661:7;13657:23;13653:32;13650:2;;;13703:6;13695;13688:22;13650:2;-1:-1:-1;13731:16:19;;13640:113;-1:-1:-1;13640:113:19:o;13758:257::-;;13869:2;13857:9;13848:7;13844:23;13840:32;13837:2;;;13890:6;13882;13875:22;13837:2;13934:9;13921:23;13953:32;13979:5;13953:32;:::i;14020:652::-;;;;;14189:3;14177:9;14168:7;14164:23;14160:33;14157:2;;;14211:6;14203;14196:22;14157:2;14255:9;14242:23;14305:4;14298:5;14294:16;14287:5;14284:27;14274:2;;14330:6;14322;14315:22;14274:2;14358:5;-1:-1:-1;14415:2:19;14400:18;;14387:32;14428:35;14387:32;14428:35;:::i;:::-;14482:7;-1:-1:-1;14541:2:19;14526:18;;14513:32;14554:35;14513:32;14554:35;:::i;:::-;14147:525;;;;-1:-1:-1;14608:7:19;;14662:2;14647:18;14634:32;;-1:-1:-1;;14147:525:19:o;14677:329::-;;14767:6;14762:3;14755:19;14819:6;14812:5;14805:4;14800:3;14796:14;14783:43;14871:3;14864:4;14855:6;14850:3;14846:16;14842:27;14835:40;14995:4;14925:66;14920:2;14912:6;14908:15;14904:88;14899:3;14895:98;14891:109;14884:116;;14745:261;;;;;:::o;15011:318::-;;15092:5;15086:12;15119:6;15114:3;15107:19;15135:63;15191:6;15184:4;15179:3;15175:14;15168:4;15161:5;15157:16;15135:63;:::i;:::-;15243:2;15231:15;15248:66;15227:88;15218:98;;;;15318:4;15214:109;;15062:267;-1:-1:-1;;15062:267:19:o;15334:205::-;15534:3;15525:14::o;15544:759::-;;15845:66;15836:6;15831:3;15827:16;15823:89;15818:3;15811:102;15963:66;15954:6;15950:2;15946:15;15942:88;15938:1;15933:3;15929:11;15922:109;16075:6;16067;16062:2;16057:3;16053:12;16040:42;16110:6;16105:3;16101:16;16144:2;16140;16136:11;16167:3;16163:2;16156:15;16205:6;16197;16193:2;16180:32;-1:-1:-1;16235:15:19;;;16252:2;16231:24;16264:15;;;-1:-1:-1;16231:24:19;15801:502;-1:-1:-1;;;;;15801:502:19:o;16308:226::-;16484:42;16472:55;;;;16454:74;;16442:2;16427:18;;16409:125::o;16539:406::-;16759:42;16828:15;;;16810:34;;16880:15;;;;16875:2;16860:18;;16853:43;16927:2;16912:18;;16905:34;;;;16737:2;16722:18;;16704:241::o;16950:437::-;;17175:42;17167:6;17163:55;17152:9;17145:74;17255:6;17250:2;17239:9;17235:18;17228:34;17298:2;17293;17282:9;17278:18;17271:30;17318:63;17377:2;17366:9;17362:18;17354:6;17346;17318:63;:::i;:::-;17310:71;17135:252;-1:-1:-1;;;;;;17135:252:19:o;17392:187::-;17557:14;;17550:22;17532:41;;17520:2;17505:18;;17487:92::o;17584:329::-;17805:14;;17798:22;17780:41;;17852:2;17837:18;;17830:34;;;;17895:2;17880:18;;17873:34;17768:2;17753:18;;17735:178::o;17918:177::-;18064:25;;;18052:2;18037:18;;18019:76::o;18100:388::-;;18313:6;18302:9;18295:25;18356:2;18351;18340:9;18336:18;18329:30;18376:63;18435:2;18424:9;18420:18;18412:6;18404;18376:63;:::i;:::-;18368:71;;18475:6;18470:2;18459:9;18455:18;18448:34;18285:203;;;;;;;:::o;18493:219::-;;18640:2;18629:9;18622:21;18660:46;18702:2;18691:9;18687:18;18679:6;18660:46;:::i;19478:402::-;19680:2;19662:21;;;19719:2;19699:18;;;19692:30;19758:34;19753:2;19738:18;;19731:62;19829:8;19824:2;19809:18;;19802:36;19870:3;19855:19;;19652:228::o;19885:348::-;20087:2;20069:21;;;20126:2;20106:18;;;20099:30;20165:26;20160:2;20145:18;;20138:54;20224:2;20209:18;;20059:174::o;20238:354::-;20440:2;20422:21;;;20479:2;20459:18;;;20452:30;20518:32;20513:2;20498:18;;20491:60;20583:2;20568:18;;20412:180::o;20597:350::-;20799:2;20781:21;;;20838:2;20818:18;;;20811:30;20877:28;20872:2;20857:18;;20850:56;20938:2;20923:18;;20771:176::o;20952:401::-;21154:2;21136:21;;;21193:2;21173:18;;;21166:30;21232:34;21227:2;21212:18;;21205:62;21303:7;21298:2;21283:18;;21276:35;21343:3;21328:19;;21126:227::o;21358:413::-;21560:2;21542:21;;;21599:2;21579:18;;;21572:30;21638:34;21633:2;21618:18;;21611:62;21709:19;21704:2;21689:18;;21682:47;21761:3;21746:19;;21532:239::o;21776:398::-;21978:2;21960:21;;;22017:2;21997:18;;;21990:30;22056:34;22051:2;22036:18;;22029:62;22127:4;22122:2;22107:18;;22100:32;22164:3;22149:19;;21950:224::o;22179:351::-;22381:2;22363:21;;;22420:2;22400:18;;;22393:30;22459:29;22454:2;22439:18;;22432:57;22521:2;22506:18;;22353:177::o;22535:407::-;22737:2;22719:21;;;22776:2;22756:18;;;22749:30;22815:34;22810:2;22795:18;;22788:62;22886:13;22881:2;22866:18;;22859:41;22932:3;22917:19;;22709:233::o;22947:397::-;23149:2;23131:21;;;23188:2;23168:18;;;23161:30;23227:34;23222:2;23207:18;;23200:62;23298:3;23293:2;23278:18;;23271:31;23334:3;23319:19;;23121:223::o;23349:397::-;23551:2;23533:21;;;23590:2;23570:18;;;23563:30;23629:34;23624:2;23609:18;;23602:62;23700:3;23695:2;23680:18;;23673:31;23736:3;23721:19;;23523:223::o;23751:354::-;23953:2;23935:21;;;23992:2;23972:18;;;23965:30;24031:32;24026:2;24011:18;;24004:60;24096:2;24081:18;;23925:180::o;24110:350::-;24312:2;24294:21;;;24351:2;24331:18;;;24324:30;24390:28;24385:2;24370:18;;24363:56;24451:2;24436:18;;24284:176::o;24465:405::-;24667:2;24649:21;;;24706:2;24686:18;;;24679:30;24745:34;24740:2;24725:18;;24718:62;24816:11;24811:2;24796:18;;24789:39;24860:3;24845:19;;24639:231::o;24875:471::-;25077:2;25059:21;;;25116:2;25096:18;;;25089:30;25155:34;25150:2;25135:18;;25128:62;25226:34;25221:2;25206:18;;25199:62;25298:5;25292:3;25277:19;;25270:34;25336:3;25321:19;;25049:297::o;25351:347::-;25553:2;25535:21;;;25592:2;25572:18;;;25565:30;25631:25;25626:2;25611:18;;25604:53;25689:2;25674:18;;25525:173::o;25703:412::-;25905:2;25887:21;;;25944:2;25924:18;;;25917:30;25983:34;25978:2;25963:18;;25956:62;26054:18;26049:2;26034:18;;26027:46;26105:3;26090:19;;25877:238::o;26120:406::-;26322:2;26304:21;;;26361:2;26341:18;;;26334:30;26400:34;26395:2;26380:18;;26373:62;26471:12;26466:2;26451:18;;26444:40;26516:3;26501:19;;26294:232::o;26531:397::-;26733:2;26715:21;;;26772:2;26752:18;;;26745:30;26811:34;26806:2;26791:18;;26784:62;26882:3;26877:2;26862:18;;26855:31;26918:3;26903:19;;26705:223::o;26933:398::-;27135:2;27117:21;;;27174:2;27154:18;;;27147:30;27213:34;27208:2;27193:18;;27186:62;27284:4;27279:2;27264:18;;27257:32;27321:3;27306:19;;27107:224::o;27336:348::-;27538:2;27520:21;;;27577:2;27557:18;;;27550:30;27616:26;27611:2;27596:18;;27589:54;27675:2;27660:18;;27510:174::o;27689:410::-;27891:2;27873:21;;;27930:2;27910:18;;;27903:30;27969:34;27964:2;27949:18;;27942:62;28040:16;28035:2;28020:18;;28013:44;28089:3;28074:19;;27863:236::o;28104:400::-;28306:2;28288:21;;;28345:2;28325:18;;;28318:30;28384:34;28379:2;28364:18;;28357:62;28455:6;28450:2;28435:18;;28428:34;28494:3;28479:19;;28278:226::o;28509:404::-;28711:2;28693:21;;;28750:2;28730:18;;;28723:30;28789:34;28784:2;28769:18;;28762:62;28860:10;28855:2;28840:18;;28833:38;28903:3;28888:19;;28683:230::o;28918:412::-;29120:2;29102:21;;;29159:2;29139:18;;;29132:30;29198:34;29193:2;29178:18;;29171:62;29269:18;29264:2;29249:18;;29242:46;29320:3;29305:19;;29092:238::o;29335:409::-;29537:2;29519:21;;;29576:2;29556:18;;;29549:30;29615:34;29610:2;29595:18;;29588:62;29686:15;29681:2;29666:18;;29659:43;29734:3;29719:19;;29509:235::o;29749:405::-;29951:2;29933:21;;;29990:2;29970:18;;;29963:30;30029:34;30024:2;30009:18;;30002:62;30100:11;30095:2;30080:18;;30073:39;30144:3;30129:19;;29923:231::o;30159:847::-;;30377:3;30366:9;30362:19;30354:27;;30400:6;30452:2;30443:6;30437:13;30433:22;30422:9;30415:41;30503:4;30495:6;30491:17;30485:24;30528:18;30602:2;30588:12;30584:21;30577:4;30566:9;30562:20;30555:51;30655:4;30647:6;30643:17;30637:24;30615:46;;30680:42;30780:2;30764:14;30760:23;30753:4;30742:9;30738:20;30731:53;30852:2;30844:4;30836:6;30832:17;30826:24;30822:33;30815:4;30804:9;30800:20;30793:63;30924:2;30916:4;30908:6;30904:17;30898:24;30894:33;30887:4;30876:9;30872:20;30865:63;30996:2;30988:4;30980:6;30976:17;30970:24;30966:33;30959:4;30948:9;30944:20;30937:63;;;;;30344:662;;;;:::o;31011:301::-;31229:13;;31211:32;;31299:4;31287:17;;;31281:24;31259:20;;;31252:54;;;;31199:2;31184:18;;31166:146::o;31317:188::-;31491:6;31479:19;;;;31461:38;;31449:2;31434:18;;31416:89::o;31510:308::-;31712:6;31700:19;;;;31682:38;;31768:42;31756:55;31751:2;31736:18;;31729:83;31670:2;31655:18;;31637:181::o;31823:459::-;32090:6;32078:19;;;;32060:38;;32146:42;32134:55;;;;32129:2;32114:18;;32107:83;32221:2;32206:18;;32199:34;32264:2;32249:18;;32242:34;32047:3;32032:19;;32014:268::o;32287:259::-;32489:6;32477:19;;;;32459:38;;32528:2;32513:18;;32506:34;32447:2;32432:18;;32414:132::o;32551:301::-;;32736:6;32728;32724:19;32713:9;32706:38;32780:2;32775;32764:9;32760:18;32753:30;32800:46;32842:2;32831:9;32827:18;32819:6;32800:46;:::i;32857:752::-;;33170:6;33162;33158:19;33147:9;33140:38;33214:3;33209:2;33198:9;33194:18;33187:31;33241:47;33283:3;33272:9;33268:19;33260:6;33241:47;:::i;:::-;33336:42;33328:6;33324:55;33319:2;33308:9;33304:18;33297:83;33428:18;33420:6;33416:31;33411:2;33400:9;33396:18;33389:59;33485:6;33479:3;33468:9;33464:19;33457:35;33541:9;33533:6;33529:22;33523:3;33512:9;33508:19;33501:51;33569:34;33596:6;33588;33569:34;:::i;:::-;33561:42;33130:479;-1:-1:-1;;;;;;;;;33130:479:19:o;33614:287::-;33794:6;33827:15;;;33809:34;;33879:15;;33874:2;33859:18;;33852:43;33772:2;33757:18;;33739:162::o;33906:621::-;;34163:6;34208:2;34200:6;34196:15;34185:9;34178:34;34260:2;34252:6;34248:15;34243:2;34232:9;34228:18;34221:43;;34312:42;34304:6;34300:55;34295:2;34284:9;34280:18;34273:83;34392:6;34387:2;34376:9;34372:18;34365:34;34436:3;34430;34419:9;34415:19;34408:32;34457:64;34516:3;34505:9;34501:19;34493:6;34485;34457:64;:::i;:::-;34449:72;34143:384;-1:-1:-1;;;;;;;;34143:384:19:o;34532:594::-;;34779:6;34824:2;34816:6;34812:15;34801:9;34794:34;34876:2;34868:6;34864:15;34859:2;34848:9;34844:18;34837:43;;34928:42;34920:6;34916:55;34911:2;34900:9;34896:18;34889:83;35008:6;35003:2;34992:9;34988:18;34981:34;35052:3;35046;35035:9;35031:19;35024:32;35073:47;35115:3;35104:9;35100:19;35092:6;35073:47;:::i;35131:427::-;;35332:6;35377:2;35369:6;35365:15;35354:9;35347:34;35429:2;35421:6;35417:15;35412:2;35401:9;35397:18;35390:43;;35469:2;35464;35453:9;35449:18;35442:30;35489:63;35548:2;35537:9;35533:18;35525:6;35517;35489:63;:::i;35563:400::-;;35754:6;35799:2;35791:6;35787:15;35776:9;35769:34;35851:2;35843:6;35839:15;35834:2;35823:9;35819:18;35812:43;;35891:2;35886;35875:9;35871:18;35864:30;35911:46;35953:2;35942:9;35938:18;35930:6;35911:46;:::i;:::-;35903:54;35734:229;-1:-1:-1;;;;;35734:229:19:o;35968:381::-;36174:6;36207:15;;;36189:34;;36259:15;;;;36254:2;36239:18;;36232:43;36323:18;36311:31;;;36306:2;36291:18;;36284:59;36152:2;36137:18;;36119:230::o;36354:762::-;36669:6;36702:15;;;36684:34;;36754:15;;;36749:2;36734:18;;36727:43;36818:18;36806:31;;;;36801:2;36786:18;;36779:59;36857:42;36935:15;;;36930:2;36915:18;;36908:43;36988:15;;;36982:3;36967:19;;36960:44;37041:15;;;37035:3;37020:19;;37013:44;37094:15;;;37088:3;37073:19;;37066:44;36646:3;36631:19;;36613:503::o;37385:704::-;37674:6;37707:15;;;37689:34;;37742:18;37796:15;;;37791:2;37776:18;;37769:43;37831:42;37909:15;;;37904:2;37889:18;;37882:43;37961:15;;;;37956:2;37941:18;;37934:43;38014:15;;;38008:3;37993:19;;37986:44;38067:15;;;;38061:3;38046:19;;38039:44;37651:3;37636:19;;37618:471::o;38094:523::-;;38321:6;38366:2;38358:6;38354:15;38343:9;38336:34;38418:18;38410:6;38406:31;38401:2;38390:9;38386:18;38379:59;38486:2;38478:6;38474:15;38469:2;38458:9;38454:18;38447:43;;38526:3;38521:2;38510:9;38506:18;38499:31;38547:64;38606:3;38595:9;38591:19;38583:6;38575;38547:64;:::i;38804:248::-;38978:25;;;39034:2;39019:18;;39012:34;38966:2;38951:18;;38933:119::o;39310:200::-;39484:18;39472:31;;;;39454:50;;39442:2;39427:18;;39409:101::o;39515:184::-;39687:4;39675:17;;;;39657:36;;39645:2;39630:18;;39612:87::o;39704:574::-;40005:4;39993:17;;;;39975:36;;40030:42;40108:15;;;40103:2;40088:18;;40081:43;40160:15;;;40155:2;40140:18;;40133:43;40212:15;;;40207:2;40192:18;;40185:43;40259:3;40244:19;;40237:35;39962:3;39947:19;;39929:349::o;40283:242::-;40353:2;40347:9;40383:17;;;40430:18;40415:34;;40451:22;;;40412:62;40409:2;;;40477:9;40409:2;40504;40497:22;40327:198;;-1:-1:-1;40327:198:19:o;40530:258::-;40602:1;40612:113;40626:6;40623:1;40620:13;40612:113;;;40702:11;;;40696:18;40683:11;;;40676:39;40648:2;40641:10;40612:113;;;40743:6;40740:1;40737:13;40734:2;;;-1:-1:-1;;40778:1:19;40760:16;;40753:27;40583:205::o;40793:156::-;40881:42;40874:5;40870:54;40863:5;40860:65;40850:2;;40939:1;40936;40929:12;40850:2;40840:109;:::o;40954:119::-;41041:6;41034:5;41030:18;41023:5;41020:29;41010:2;;41063:1;41060;41053:12;41078:131;41165:18;41158:5;41154:30;41147:5;41144:41;41134:2;;41199:1;41196;41189:12
Swarm Source
ipfs://c4bfc55e84c3d77ca2df7433e929bf0c66f9c72cd7e93453fc448eb8f0bf2c09
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.