Contract Overview
Balance:
0 ETH
ETH Value:
$0.00
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
MessageBus
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.17; import "./MessageBusSender.sol"; import "./MessageBusReceiver.sol"; contract MessageBus is MessageBusSender, MessageBusReceiver { constructor( ISigsVerifier _sigsVerifier, address _liquidityBridge, address _pegBridge, address _pegVault, address _pegBridgeV2, address _pegVaultV2 ) MessageBusSender(_sigsVerifier) MessageBusReceiver(_liquidityBridge, _pegBridge, _pegVault, _pegBridgeV2, _pegVaultV2) {} // this is only to be called by Proxy via delegateCall as initOwner will require _owner is 0. // so calling init on this contract directly will guarantee to fail function init( address _liquidityBridge, address _pegBridge, address _pegVault, address _pegBridgeV2, address _pegVaultV2 ) external { // MUST manually call ownable init and must only call once initOwner(); // we don't need sender init as _sigsVerifier is immutable so already in the deployed code initReceiver(_liquidityBridge, _pegBridge, _pegVault, _pegBridgeV2, _pegVaultV2); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity 0.8.17; import "../../safeguard/Ownable.sol"; import "../../interfaces/ISigsVerifier.sol"; contract MessageBusSender is Ownable { ISigsVerifier public immutable sigsVerifier; uint256 public feeBase; uint256 public feePerByte; mapping(address => uint256) public withdrawnFees; event Message(address indexed sender, address receiver, uint256 dstChainId, bytes message, uint256 fee); // message to non-evm chain with >20 bytes addr event Message2(address indexed sender, bytes receiver, uint256 dstChainId, bytes message, uint256 fee); event MessageWithTransfer( address indexed sender, address receiver, uint256 dstChainId, address bridge, bytes32 srcTransferId, bytes message, uint256 fee ); event FeeWithdrawn(address receiver, uint256 amount); event FeeBaseUpdated(uint256 feeBase); event FeePerByteUpdated(uint256 feePerByte); constructor(ISigsVerifier _sigsVerifier) { sigsVerifier = _sigsVerifier; } /** * @notice Sends a message to a contract on another chain. * Sender needs to make sure the uniqueness of the message Id, which is computed as * hash(type.MessageOnly, sender, receiver, srcChainId, srcTxHash, dstChainId, message). * If messages with the same Id are sent, only one of them will succeed at dst chain. * A fee is charged in the native gas token. * @param _receiver The address of the destination app contract. * @param _dstChainId The destination chain ID. * @param _message Arbitrary message bytes to be decoded by the destination app contract. */ function sendMessage( address _receiver, uint256 _dstChainId, bytes calldata _message ) external payable { _sendMessage(_dstChainId, _message); emit Message(msg.sender, _receiver, _dstChainId, _message, msg.value); } // Send message to non-evm chain with bytes for receiver address, // otherwise same as above. function sendMessage( bytes calldata _receiver, uint256 _dstChainId, bytes calldata _message ) external payable { _sendMessage(_dstChainId, _message); emit Message2(msg.sender, _receiver, _dstChainId, _message, msg.value); } function _sendMessage(uint256 _dstChainId, bytes calldata _message) private { require(_dstChainId != block.chainid, "Invalid chainId"); uint256 minFee = calcFee(_message); require(msg.value >= minFee, "Insufficient fee"); } /** * @notice Sends a message associated with a transfer to a contract on another chain. * If messages with the same srcTransferId are sent, only one of them will succeed. * A fee is charged in the native token. * @param _receiver The address of the destination app contract. * @param _dstChainId The destination chain ID. * @param _srcBridge The bridge contract to send the transfer with. * @param _srcTransferId The transfer ID. * @param _dstChainId The destination chain ID. * @param _message Arbitrary message bytes to be decoded by the destination app contract. */ function sendMessageWithTransfer( address _receiver, uint256 _dstChainId, address _srcBridge, bytes32 _srcTransferId, bytes calldata _message ) external payable { require(_dstChainId != block.chainid, "Invalid chainId"); uint256 minFee = calcFee(_message); require(msg.value >= minFee, "Insufficient fee"); // SGN needs to verify // 1. msg.sender matches sender of the src transfer // 2. dstChainId matches dstChainId of the src transfer // 3. bridge is either liquidity bridge, peg src vault, or peg dst bridge emit MessageWithTransfer(msg.sender, _receiver, _dstChainId, _srcBridge, _srcTransferId, _message, msg.value); } /** * @notice Withdraws message fee in the form of native gas token. * @param _account The address receiving the fee. * @param _cumulativeFee The cumulative fee credited to the account. Tracked by SGN. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A withdrawal must be * signed-off by +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function withdrawFee( address _account, uint256 _cumulativeFee, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external { bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "withdrawFee")); sigsVerifier.verifySigs(abi.encodePacked(domain, _account, _cumulativeFee), _sigs, _signers, _powers); uint256 amount = _cumulativeFee - withdrawnFees[_account]; require(amount > 0, "No new amount to withdraw"); withdrawnFees[_account] = _cumulativeFee; (bool sent, ) = _account.call{value: amount, gas: 50000}(""); require(sent, "failed to withdraw fee"); emit FeeWithdrawn(_account, amount); } /** * @notice Calculates the required fee for the message. * @param _message Arbitrary message bytes to be decoded by the destination app contract. @ @return The required fee. */ function calcFee(bytes calldata _message) public view returns (uint256) { return feeBase + _message.length * feePerByte; } // -------------------- Admin -------------------- function setFeePerByte(uint256 _fee) external onlyOwner { feePerByte = _fee; emit FeePerByteUpdated(feePerByte); } function setFeeBase(uint256 _fee) external onlyOwner { feeBase = _fee; emit FeeBaseUpdated(feeBase); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.0; /** * @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. * * This adds a normal func that setOwner if _owner is address(0). So we can't allow * renounceOwnership. So we can support Proxy based upgradable contract */ abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(msg.sender); } /** * @dev Only to be called by inherit contracts, in their init func called by Proxy * we require _owner == address(0), which is only possible when it's a delegateCall * because constructor sets _owner in contract state. */ function initOwner() internal { require(_owner == address(0), "owner already set"); _setOwner(msg.sender); } /** * @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() == msg.sender, "Ownable: caller is not the owner"); _; } /** * @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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface ISigsVerifier { /** * @notice Verifies that a message is signed by a quorum among the signers. * @param _msg signed message * @param _sigs list of signatures sorted by signer addresses in ascending order * @param _signers sorted list of current signers * @param _powers powers of current signers */ function verifySigs( bytes memory _msg, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external view; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.9; import "../libraries/MsgDataTypes.sol"; import "../interfaces/IMessageReceiverApp.sol"; import "../../interfaces/IBridge.sol"; import "../../interfaces/IOriginalTokenVault.sol"; import "../../interfaces/IOriginalTokenVaultV2.sol"; import "../../interfaces/IPeggedTokenBridge.sol"; import "../../interfaces/IPeggedTokenBridgeV2.sol"; import "../../safeguard/Ownable.sol"; import "../../libraries/Utils.sol"; contract MessageBusReceiver is Ownable { mapping(bytes32 => MsgDataTypes.TxStatus) public executedMessages; address public liquidityBridge; // liquidity bridge address address public pegBridge; // peg bridge address address public pegVault; // peg original vault address address public pegBridgeV2; // peg bridge address address public pegVaultV2; // peg original vault address // minimum amount of gas needed by this contract before it tries to // deliver a message to the target contract. uint256 public preExecuteMessageGasUsage; event Executed( MsgDataTypes.MsgType msgType, bytes32 msgId, MsgDataTypes.TxStatus status, address indexed receiver, uint64 srcChainId, bytes32 srcTxHash ); event NeedRetry(MsgDataTypes.MsgType msgType, bytes32 msgId, uint64 srcChainId, bytes32 srcTxHash); event CallReverted(string reason); // help debug event LiquidityBridgeUpdated(address liquidityBridge); event PegBridgeUpdated(address pegBridge); event PegVaultUpdated(address pegVault); event PegBridgeV2Updated(address pegBridgeV2); event PegVaultV2Updated(address pegVaultV2); constructor( address _liquidityBridge, address _pegBridge, address _pegVault, address _pegBridgeV2, address _pegVaultV2 ) { liquidityBridge = _liquidityBridge; pegBridge = _pegBridge; pegVault = _pegVault; pegBridgeV2 = _pegBridgeV2; pegVaultV2 = _pegVaultV2; } function initReceiver( address _liquidityBridge, address _pegBridge, address _pegVault, address _pegBridgeV2, address _pegVaultV2 ) internal { require(liquidityBridge == address(0), "liquidityBridge already set"); liquidityBridge = _liquidityBridge; pegBridge = _pegBridge; pegVault = _pegVault; pegBridgeV2 = _pegBridgeV2; pegVaultV2 = _pegVaultV2; } // ============== functions called by executor ============== /** * @notice Execute a message with a successful transfer. * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _transfer The transfer info. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function executeMessageWithTransfer( bytes calldata _message, MsgDataTypes.TransferInfo calldata _transfer, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) public payable { // For message with token transfer, message Id is computed through transfer info // in order to guarantee that each transfer can only be used once. bytes32 messageId = verifyTransfer(_transfer); require(executedMessages[messageId] == MsgDataTypes.TxStatus.Null, "transfer already executed"); executedMessages[messageId] = MsgDataTypes.TxStatus.Pending; bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "MessageWithTransfer")); IBridge(liquidityBridge).verifySigs( abi.encodePacked(domain, messageId, _message, _transfer.srcTxHash), _sigs, _signers, _powers ); MsgDataTypes.TxStatus status; IMessageReceiverApp.ExecutionStatus est = executeMessageWithTransfer(_transfer, _message); if (est == IMessageReceiverApp.ExecutionStatus.Success) { status = MsgDataTypes.TxStatus.Success; } else if (est == IMessageReceiverApp.ExecutionStatus.Retry) { executedMessages[messageId] = MsgDataTypes.TxStatus.Null; emit NeedRetry( MsgDataTypes.MsgType.MessageWithTransfer, messageId, _transfer.srcChainId, _transfer.srcTxHash ); return; } else { est = executeMessageWithTransferFallback(_transfer, _message); if (est == IMessageReceiverApp.ExecutionStatus.Success) { status = MsgDataTypes.TxStatus.Fallback; } else { status = MsgDataTypes.TxStatus.Fail; } } executedMessages[messageId] = status; emitMessageWithTransferExecutedEvent(messageId, status, _transfer); } /** * @notice Execute a message with a refunded transfer. * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _transfer The transfer info. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function executeMessageWithTransferRefund( bytes calldata _message, // the same message associated with the original transfer MsgDataTypes.TransferInfo calldata _transfer, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) public payable { // similar to executeMessageWithTransfer bytes32 messageId = verifyTransfer(_transfer); require(executedMessages[messageId] == MsgDataTypes.TxStatus.Null, "transfer already executed"); executedMessages[messageId] = MsgDataTypes.TxStatus.Pending; bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), "MessageWithTransferRefund")); IBridge(liquidityBridge).verifySigs( abi.encodePacked(domain, messageId, _message, _transfer.srcTxHash), _sigs, _signers, _powers ); MsgDataTypes.TxStatus status; IMessageReceiverApp.ExecutionStatus est = executeMessageWithTransferRefund(_transfer, _message); if (est == IMessageReceiverApp.ExecutionStatus.Success) { status = MsgDataTypes.TxStatus.Success; } else if (est == IMessageReceiverApp.ExecutionStatus.Retry) { executedMessages[messageId] = MsgDataTypes.TxStatus.Null; emit NeedRetry( MsgDataTypes.MsgType.MessageWithTransfer, messageId, _transfer.srcChainId, _transfer.srcTxHash ); return; } else { status = MsgDataTypes.TxStatus.Fail; } executedMessages[messageId] = status; emitMessageWithTransferExecutedEvent(messageId, status, _transfer); } /** * @notice Execute a message not associated with a transfer. * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _route The info about the sender and the receiver. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function executeMessage( bytes calldata _message, MsgDataTypes.RouteInfo calldata _route, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external payable { MsgDataTypes.Route memory route = getRouteInfo(_route); executeMessage(_message, route, _sigs, _signers, _powers, "Message"); } // execute message from non-evm chain with bytes for sender address, // otherwise same as above. function executeMessage( bytes calldata _message, MsgDataTypes.RouteInfo2 calldata _route, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external payable { MsgDataTypes.Route memory route = getRouteInfo(_route); executeMessage(_message, route, _sigs, _signers, _powers, "Message2"); } function executeMessage( bytes calldata _message, MsgDataTypes.Route memory _route, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers, string memory domainName ) private { // For message without associated token transfer, message Id is computed through message info, // in order to guarantee that each message can only be applied once bytes32 messageId = computeMessageOnlyId(_route, _message); require(executedMessages[messageId] == MsgDataTypes.TxStatus.Null, "message already executed"); executedMessages[messageId] = MsgDataTypes.TxStatus.Pending; bytes32 domain = keccak256(abi.encodePacked(block.chainid, address(this), domainName)); IBridge(liquidityBridge).verifySigs(abi.encodePacked(domain, messageId), _sigs, _signers, _powers); MsgDataTypes.TxStatus status; IMessageReceiverApp.ExecutionStatus est = executeMessage(_route, _message); if (est == IMessageReceiverApp.ExecutionStatus.Success) { status = MsgDataTypes.TxStatus.Success; } else if (est == IMessageReceiverApp.ExecutionStatus.Retry) { executedMessages[messageId] = MsgDataTypes.TxStatus.Null; emit NeedRetry(MsgDataTypes.MsgType.MessageOnly, messageId, _route.srcChainId, _route.srcTxHash); return; } else { status = MsgDataTypes.TxStatus.Fail; } executedMessages[messageId] = status; emitMessageOnlyExecutedEvent(messageId, status, _route); } // ================= utils (to avoid stack too deep) ================= function emitMessageWithTransferExecutedEvent( bytes32 _messageId, MsgDataTypes.TxStatus _status, MsgDataTypes.TransferInfo calldata _transfer ) private { emit Executed( MsgDataTypes.MsgType.MessageWithTransfer, _messageId, _status, _transfer.receiver, _transfer.srcChainId, _transfer.srcTxHash ); } function emitMessageOnlyExecutedEvent( bytes32 _messageId, MsgDataTypes.TxStatus _status, MsgDataTypes.Route memory _route ) private { emit Executed( MsgDataTypes.MsgType.MessageOnly, _messageId, _status, _route.receiver, _route.srcChainId, _route.srcTxHash ); } function executeMessageWithTransfer(MsgDataTypes.TransferInfo calldata _transfer, bytes calldata _message) private returns (IMessageReceiverApp.ExecutionStatus) { uint256 gasLeftBeforeExecution = gasleft(); (bool ok, bytes memory res) = address(_transfer.receiver).call{value: msg.value}( abi.encodeWithSelector( IMessageReceiverApp.executeMessageWithTransfer.selector, _transfer.sender, _transfer.token, _transfer.amount, _transfer.srcChainId, _message, msg.sender ) ); if (ok) { return abi.decode((res), (IMessageReceiverApp.ExecutionStatus)); } handleExecutionRevert(gasLeftBeforeExecution, res); return IMessageReceiverApp.ExecutionStatus.Fail; } function executeMessageWithTransferFallback(MsgDataTypes.TransferInfo calldata _transfer, bytes calldata _message) private returns (IMessageReceiverApp.ExecutionStatus) { uint256 gasLeftBeforeExecution = gasleft(); (bool ok, bytes memory res) = address(_transfer.receiver).call{value: msg.value}( abi.encodeWithSelector( IMessageReceiverApp.executeMessageWithTransferFallback.selector, _transfer.sender, _transfer.token, _transfer.amount, _transfer.srcChainId, _message, msg.sender ) ); if (ok) { return abi.decode((res), (IMessageReceiverApp.ExecutionStatus)); } handleExecutionRevert(gasLeftBeforeExecution, res); return IMessageReceiverApp.ExecutionStatus.Fail; } function executeMessageWithTransferRefund(MsgDataTypes.TransferInfo calldata _transfer, bytes calldata _message) private returns (IMessageReceiverApp.ExecutionStatus) { uint256 gasLeftBeforeExecution = gasleft(); (bool ok, bytes memory res) = address(_transfer.receiver).call{value: msg.value}( abi.encodeWithSelector( IMessageReceiverApp.executeMessageWithTransferRefund.selector, _transfer.token, _transfer.amount, _message, msg.sender ) ); if (ok) { return abi.decode((res), (IMessageReceiverApp.ExecutionStatus)); } handleExecutionRevert(gasLeftBeforeExecution, res); return IMessageReceiverApp.ExecutionStatus.Fail; } function verifyTransfer(MsgDataTypes.TransferInfo calldata _transfer) private view returns (bytes32) { bytes32 transferId; address bridgeAddr; if (_transfer.t == MsgDataTypes.TransferType.LqRelay) { transferId = keccak256( abi.encodePacked( _transfer.sender, _transfer.receiver, _transfer.token, _transfer.amount, _transfer.srcChainId, uint64(block.chainid), _transfer.refId ) ); bridgeAddr = liquidityBridge; require(IBridge(bridgeAddr).transfers(transferId) == true, "bridge relay not exist"); } else if (_transfer.t == MsgDataTypes.TransferType.LqWithdraw) { transferId = keccak256( abi.encodePacked( uint64(block.chainid), _transfer.wdseq, _transfer.receiver, _transfer.token, _transfer.amount ) ); bridgeAddr = liquidityBridge; require(IBridge(bridgeAddr).withdraws(transferId) == true, "bridge withdraw not exist"); } else if ( _transfer.t == MsgDataTypes.TransferType.PegMint || _transfer.t == MsgDataTypes.TransferType.PegWithdraw ) { transferId = keccak256( abi.encodePacked( _transfer.receiver, _transfer.token, _transfer.amount, _transfer.sender, _transfer.srcChainId, _transfer.refId ) ); if (_transfer.t == MsgDataTypes.TransferType.PegMint) { bridgeAddr = pegBridge; require(IPeggedTokenBridge(bridgeAddr).records(transferId) == true, "mint record not exist"); } else { // _transfer.t == MsgDataTypes.TransferType.PegWithdraw bridgeAddr = pegVault; require(IOriginalTokenVault(bridgeAddr).records(transferId) == true, "withdraw record not exist"); } } else if ( _transfer.t == MsgDataTypes.TransferType.PegV2Mint || _transfer.t == MsgDataTypes.TransferType.PegV2Withdraw ) { if (_transfer.t == MsgDataTypes.TransferType.PegV2Mint) { bridgeAddr = pegBridgeV2; } else { // MsgDataTypes.TransferType.PegV2Withdraw bridgeAddr = pegVaultV2; } transferId = keccak256( abi.encodePacked( _transfer.receiver, _transfer.token, _transfer.amount, _transfer.sender, _transfer.srcChainId, _transfer.refId, bridgeAddr ) ); if (_transfer.t == MsgDataTypes.TransferType.PegV2Mint) { require(IPeggedTokenBridgeV2(bridgeAddr).records(transferId) == true, "mint record not exist"); } else { // MsgDataTypes.TransferType.PegV2Withdraw require(IOriginalTokenVaultV2(bridgeAddr).records(transferId) == true, "withdraw record not exist"); } } return keccak256(abi.encodePacked(MsgDataTypes.MsgType.MessageWithTransfer, bridgeAddr, transferId)); } function computeMessageOnlyId(MsgDataTypes.Route memory _route, bytes calldata _message) private view returns (bytes32) { bytes memory sender = _route.senderBytes; if (sender.length == 0) { sender = abi.encodePacked(_route.sender); } return keccak256( abi.encodePacked( MsgDataTypes.MsgType.MessageOnly, sender, _route.receiver, _route.srcChainId, _route.srcTxHash, uint64(block.chainid), _message ) ); } function executeMessage(MsgDataTypes.Route memory _route, bytes calldata _message) private returns (IMessageReceiverApp.ExecutionStatus) { uint256 gasLeftBeforeExecution = gasleft(); bool ok; bytes memory res; if (_route.senderBytes.length == 0) { (ok, res) = address(_route.receiver).call{value: msg.value}( abi.encodeWithSelector( bytes4(keccak256(bytes("executeMessage(address,uint64,bytes,address)"))), _route.sender, _route.srcChainId, _message, msg.sender ) ); } else { (ok, res) = address(_route.receiver).call{value: msg.value}( abi.encodeWithSelector( bytes4(keccak256(bytes("executeMessage(bytes,uint64,bytes,address)"))), _route.senderBytes, _route.srcChainId, _message, msg.sender ) ); } if (ok) { return abi.decode((res), (IMessageReceiverApp.ExecutionStatus)); } handleExecutionRevert(gasLeftBeforeExecution, res); return IMessageReceiverApp.ExecutionStatus.Fail; } function handleExecutionRevert(uint256 _gasLeftBeforeExecution, bytes memory _returnData) private { uint256 gasLeftAfterExecution = gasleft(); uint256 maxTargetGasLimit = block.gaslimit - preExecuteMessageGasUsage; if (_gasLeftBeforeExecution < maxTargetGasLimit && gasLeftAfterExecution <= _gasLeftBeforeExecution / 64) { // if this happens, the executor must have not provided sufficient gas limit, // then the tx should revert instead of recording a non-retryable failure status // https://github.com/wolflo/evm-opcodes/blob/main/gas.md#aa-f-gas-to-send-with-call-operations assembly { invalid() } } string memory revertMsg = Utils.getRevertMsg(_returnData); // revert the execution if the revert message has the ABORT prefix checkAbortPrefix(revertMsg); // otherwiase, emit revert message, return and mark the execution as failed (non-retryable) emit CallReverted(revertMsg); } function checkAbortPrefix(string memory _revertMsg) private pure { bytes memory prefixBytes = bytes(MsgDataTypes.ABORT_PREFIX); bytes memory msgBytes = bytes(_revertMsg); if (msgBytes.length >= prefixBytes.length) { for (uint256 i = 0; i < prefixBytes.length; i++) { if (msgBytes[i] != prefixBytes[i]) { return; // prefix not match, return } } revert(_revertMsg); // prefix match, revert } } function getRouteInfo(MsgDataTypes.RouteInfo calldata _route) private pure returns (MsgDataTypes.Route memory) { return MsgDataTypes.Route(_route.sender, "", _route.receiver, _route.srcChainId, _route.srcTxHash); } function getRouteInfo(MsgDataTypes.RouteInfo2 calldata _route) private pure returns (MsgDataTypes.Route memory) { return MsgDataTypes.Route(address(0), _route.sender, _route.receiver, _route.srcChainId, _route.srcTxHash); } // ================= helper functions ===================== /** * @notice combine bridge transfer and msg execution calls into a single tx * @dev caller needs to get the required input params from SGN * @param _transferParams params to call bridge transfer * @param _msgParams params to execute message */ function transferAndExecuteMsg( MsgDataTypes.BridgeTransferParams calldata _transferParams, MsgDataTypes.MsgWithTransferExecutionParams calldata _msgParams ) external { _bridgeTransfer(_msgParams.transfer.t, _transferParams); executeMessageWithTransfer( _msgParams.message, _msgParams.transfer, _msgParams.sigs, _msgParams.signers, _msgParams.powers ); } /** * @notice combine bridge refund and msg execution calls into a single tx * @dev caller needs to get the required input params from SGN * @param _transferParams params to call bridge transfer for refund * @param _msgParams params to execute message for refund */ function refundAndExecuteMsg( MsgDataTypes.BridgeTransferParams calldata _transferParams, MsgDataTypes.MsgWithTransferExecutionParams calldata _msgParams ) external { _bridgeTransfer(_msgParams.transfer.t, _transferParams); executeMessageWithTransferRefund( _msgParams.message, _msgParams.transfer, _msgParams.sigs, _msgParams.signers, _msgParams.powers ); } function _bridgeTransfer(MsgDataTypes.TransferType t, MsgDataTypes.BridgeTransferParams calldata _transferParams) private { if (t == MsgDataTypes.TransferType.LqRelay) { IBridge(liquidityBridge).relay( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } else if (t == MsgDataTypes.TransferType.LqWithdraw) { IBridge(liquidityBridge).withdraw( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } else if (t == MsgDataTypes.TransferType.PegMint) { IPeggedTokenBridge(pegBridge).mint( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } else if (t == MsgDataTypes.TransferType.PegV2Mint) { IPeggedTokenBridgeV2(pegBridgeV2).mint( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } else if (t == MsgDataTypes.TransferType.PegWithdraw) { IOriginalTokenVault(pegVault).withdraw( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } else if (t == MsgDataTypes.TransferType.PegV2Withdraw) { IOriginalTokenVaultV2(pegVaultV2).withdraw( _transferParams.request, _transferParams.sigs, _transferParams.signers, _transferParams.powers ); } } // ================= contract config ================= function setLiquidityBridge(address _addr) public onlyOwner { require(_addr != address(0), "invalid address"); liquidityBridge = _addr; emit LiquidityBridgeUpdated(liquidityBridge); } function setPegBridge(address _addr) public onlyOwner { require(_addr != address(0), "invalid address"); pegBridge = _addr; emit PegBridgeUpdated(pegBridge); } function setPegVault(address _addr) public onlyOwner { require(_addr != address(0), "invalid address"); pegVault = _addr; emit PegVaultUpdated(pegVault); } function setPegBridgeV2(address _addr) public onlyOwner { require(_addr != address(0), "invalid address"); pegBridgeV2 = _addr; emit PegBridgeV2Updated(pegBridgeV2); } function setPegVaultV2(address _addr) public onlyOwner { require(_addr != address(0), "invalid address"); pegVaultV2 = _addr; emit PegVaultV2Updated(pegVaultV2); } function setPreExecuteMessageGasUsage(uint256 _usage) public onlyOwner { preExecuteMessageGasUsage = _usage; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; library MsgDataTypes { string constant ABORT_PREFIX = "MSG::ABORT:"; // bridge operation type at the sender side (src chain) enum BridgeSendType { Null, Liquidity, PegDeposit, PegBurn, PegV2Deposit, PegV2Burn, PegV2BurnFrom } // bridge operation type at the receiver side (dst chain) enum TransferType { Null, LqRelay, // relay through liquidity bridge LqWithdraw, // withdraw from liquidity bridge PegMint, // mint through pegged token bridge PegWithdraw, // withdraw from original token vault PegV2Mint, // mint through pegged token bridge v2 PegV2Withdraw // withdraw from original token vault v2 } enum MsgType { MessageWithTransfer, MessageOnly } enum TxStatus { Null, Success, Fail, Fallback, Pending // transient state within a transaction } struct TransferInfo { TransferType t; address sender; address receiver; address token; uint256 amount; uint64 wdseq; // only needed for LqWithdraw (refund) uint64 srcChainId; bytes32 refId; bytes32 srcTxHash; // src chain msg tx hash } struct RouteInfo { address sender; address receiver; uint64 srcChainId; bytes32 srcTxHash; // src chain msg tx hash } // used for msg from non-evm chains with longer-bytes address struct RouteInfo2 { bytes sender; address receiver; uint64 srcChainId; bytes32 srcTxHash; } // combination of RouteInfo and RouteInfo2 for easier processing struct Route { address sender; // from RouteInfo bytes senderBytes; // from RouteInfo2 address receiver; uint64 srcChainId; bytes32 srcTxHash; } struct MsgWithTransferExecutionParams { bytes message; TransferInfo transfer; bytes[] sigs; address[] signers; uint256[] powers; } struct BridgeTransferParams { bytes request; bytes[] sigs; address[] signers; uint256[] powers; } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface IMessageReceiverApp { enum ExecutionStatus { Fail, // execution failed, finalized Success, // execution succeeded, finalized Retry // execution rejected, can retry later } /** * @notice Called by MessageBus to execute a message * @param _sender The address of the source app contract * @param _srcChainId The source chain ID where the transfer is originated from * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _executor Address who called the MessageBus execution function */ function executeMessage( address _sender, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable returns (ExecutionStatus); // same as above, except that sender is an non-evm chain address, // otherwise same as above. function executeMessage( bytes calldata _sender, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable returns (ExecutionStatus); /** * @notice Called by MessageBus to execute a message with an associated token transfer. * The contract is guaranteed to have received the right amount of tokens before this function is called. * @param _sender The address of the source app contract * @param _token The address of the token that comes out of the bridge * @param _amount The amount of tokens received at this contract through the cross-chain bridge. * @param _srcChainId The source chain ID where the transfer is originated from * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _executor Address who called the MessageBus execution function */ function executeMessageWithTransfer( address _sender, address _token, uint256 _amount, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable returns (ExecutionStatus); /** * @notice Only called by MessageBus if * 1. executeMessageWithTransfer reverts, or * 2. executeMessageWithTransfer returns ExecutionStatus.Fail * The contract is guaranteed to have received the right amount of tokens before this function is called. * @param _sender The address of the source app contract * @param _token The address of the token that comes out of the bridge * @param _amount The amount of tokens received at this contract through the cross-chain bridge. * @param _srcChainId The source chain ID where the transfer is originated from * @param _message Arbitrary message bytes originated from and encoded by the source app contract * @param _executor Address who called the MessageBus execution function */ function executeMessageWithTransferFallback( address _sender, address _token, uint256 _amount, uint64 _srcChainId, bytes calldata _message, address _executor ) external payable returns (ExecutionStatus); /** * @notice Called by MessageBus to process refund of the original transfer from this contract. * The contract is guaranteed to have received the refund before this function is called. * @param _token The token address of the original transfer * @param _amount The amount of the original transfer * @param _message The same message associated with the original transfer * @param _executor Address who called the MessageBus execution function */ function executeMessageWithTransferRefund( address _token, uint256 _amount, bytes calldata _message, address _executor ) external payable returns (ExecutionStatus); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface IBridge { function send( address _receiver, address _token, uint256 _amount, uint64 _dstChainId, uint64 _nonce, uint32 _maxSlippage ) external; function sendNative( address _receiver, uint256 _amount, uint64 _dstChainId, uint64 _nonce, uint32 _maxSlippage ) external payable; function relay( bytes calldata _relayRequest, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external; function transfers(bytes32 transferId) external view returns (bool); function withdraws(bytes32 withdrawId) external view returns (bool); function withdraw( bytes calldata _wdmsg, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external; /** * @notice Verifies that a message is signed by a quorum among the signers. * @param _msg signed message * @param _sigs list of signatures sorted by signer addresses in ascending order * @param _signers sorted list of current signers * @param _powers powers of current signers */ function verifySigs( bytes memory _msg, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external view; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface IOriginalTokenVault { /** * @notice Lock original tokens to trigger mint at a remote chain's PeggedTokenBridge * @param _token local token address * @param _amount locked token amount * @param _mintChainId destination chainId to mint tokens * @param _mintAccount destination account to receive minted tokens * @param _nonce user input to guarantee unique depositId */ function deposit( address _token, uint256 _amount, uint64 _mintChainId, address _mintAccount, uint64 _nonce ) external; /** * @notice Lock native token as original token to trigger mint at a remote chain's PeggedTokenBridge * @param _amount locked token amount * @param _mintChainId destination chainId to mint tokens * @param _mintAccount destination account to receive minted tokens * @param _nonce user input to guarantee unique depositId */ function depositNative( uint256 _amount, uint64 _mintChainId, address _mintAccount, uint64 _nonce ) external payable; /** * @notice Withdraw locked original tokens triggered by a burn at a remote chain's PeggedTokenBridge. * @param _request The serialized Withdraw protobuf. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the bridge's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function withdraw( bytes calldata _request, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external; function records(bytes32 recordId) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface IOriginalTokenVaultV2 { /** * @notice Lock original tokens to trigger mint at a remote chain's PeggedTokenBridge * @param _token local token address * @param _amount locked token amount * @param _mintChainId destination chainId to mint tokens * @param _mintAccount destination account to receive minted tokens * @param _nonce user input to guarantee unique depositId */ function deposit( address _token, uint256 _amount, uint64 _mintChainId, address _mintAccount, uint64 _nonce ) external returns (bytes32); /** * @notice Lock native token as original token to trigger mint at a remote chain's PeggedTokenBridge * @param _amount locked token amount * @param _mintChainId destination chainId to mint tokens * @param _mintAccount destination account to receive minted tokens * @param _nonce user input to guarantee unique depositId */ function depositNative( uint256 _amount, uint64 _mintChainId, address _mintAccount, uint64 _nonce ) external payable returns (bytes32); /** * @notice Withdraw locked original tokens triggered by a burn at a remote chain's PeggedTokenBridge. * @param _request The serialized Withdraw protobuf. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the bridge's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function withdraw( bytes calldata _request, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external returns (bytes32); function records(bytes32 recordId) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface IPeggedTokenBridge { /** * @notice Burn tokens to trigger withdrawal at a remote chain's OriginalTokenVault * @param _token local token address * @param _amount locked token amount * @param _withdrawAccount account who withdraw original tokens on the remote chain * @param _nonce user input to guarantee unique depositId */ function burn( address _token, uint256 _amount, address _withdrawAccount, uint64 _nonce ) external; /** * @notice Mint tokens triggered by deposit at a remote chain's OriginalTokenVault. * @param _request The serialized Mint protobuf. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function mint( bytes calldata _request, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external; function records(bytes32 recordId) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; interface IPeggedTokenBridgeV2 { /** * @notice Burn pegged tokens to trigger a cross-chain withdrawal of the original tokens at a remote chain's * OriginalTokenVault, or mint at another remote chain * @param _token The pegged token address. * @param _amount The amount to burn. * @param _toChainId If zero, withdraw from original vault; otherwise, the remote chain to mint tokens. * @param _toAccount The account to receive tokens on the remote chain * @param _nonce A number to guarantee unique depositId. Can be timestamp in practice. */ function burn( address _token, uint256 _amount, uint64 _toChainId, address _toAccount, uint64 _nonce ) external returns (bytes32); // same with `burn` above, use openzeppelin ERC20Burnable interface function burnFrom( address _token, uint256 _amount, uint64 _toChainId, address _toAccount, uint64 _nonce ) external returns (bytes32); /** * @notice Mint tokens triggered by deposit at a remote chain's OriginalTokenVault. * @param _request The serialized Mint protobuf. * @param _sigs The list of signatures sorted by signing addresses in ascending order. A relay must be signed-off by * +2/3 of the sigsVerifier's current signing power to be delivered. * @param _signers The sorted list of signers. * @param _powers The signing powers of the signers. */ function mint( bytes calldata _request, bytes[] calldata _sigs, address[] calldata _signers, uint256[] calldata _powers ) external returns (bytes32); function records(bytes32 recordId) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.8.0; library Utils { // https://ethereum.stackexchange.com/a/83577 // https://github.com/Uniswap/v3-periphery/blob/v1.0.0/contracts/base/Multicall.sol function getRevertMsg(bytes memory _returnData) internal pure returns (string memory) { // If the _res length is less than 68, then the transaction failed silently (without a revert message) if (_returnData.length < 68) return "Transaction reverted silently"; assembly { // Slice the sighash. _returnData := add(_returnData, 0x04) } return abi.decode(_returnData, (string)); // All that remains is the revert string } }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 800 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
[{"inputs":[{"internalType":"contract ISigsVerifier","name":"_sigsVerifier","type":"address"},{"internalType":"address","name":"_liquidityBridge","type":"address"},{"internalType":"address","name":"_pegBridge","type":"address"},{"internalType":"address","name":"_pegVault","type":"address"},{"internalType":"address","name":"_pegBridgeV2","type":"address"},{"internalType":"address","name":"_pegVaultV2","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"CallReverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum MsgDataTypes.MsgType","name":"msgType","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"msgId","type":"bytes32"},{"indexed":false,"internalType":"enum MsgDataTypes.TxStatus","name":"status","type":"uint8"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint64","name":"srcChainId","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"name":"Executed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeBase","type":"uint256"}],"name":"FeeBaseUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feePerByte","type":"uint256"}],"name":"FeePerByteUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeeWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"liquidityBridge","type":"address"}],"name":"LiquidityBridgeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"dstChainId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Message","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"bytes","name":"receiver","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"dstChainId","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Message2","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"dstChainId","type":"uint256"},{"indexed":false,"internalType":"address","name":"bridge","type":"address"},{"indexed":false,"internalType":"bytes32","name":"srcTransferId","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"MessageWithTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum MsgDataTypes.MsgType","name":"msgType","type":"uint8"},{"indexed":false,"internalType":"bytes32","name":"msgId","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"srcChainId","type":"uint64"},{"indexed":false,"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"name":"NeedRetry","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":"address","name":"pegBridge","type":"address"}],"name":"PegBridgeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pegBridgeV2","type":"address"}],"name":"PegBridgeV2Updated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pegVault","type":"address"}],"name":"PegVaultUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pegVaultV2","type":"address"}],"name":"PegVaultV2Updated","type":"event"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"calcFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"},{"components":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.RouteInfo","name":"_route","type":"tuple"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"executeMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"},{"components":[{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.RouteInfo2","name":"_route","type":"tuple"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"executeMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"},{"components":[{"internalType":"enum MsgDataTypes.TransferType","name":"t","type":"uint8"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"wdseq","type":"uint64"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"refId","type":"bytes32"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.TransferInfo","name":"_transfer","type":"tuple"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"executeMessageWithTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"},{"components":[{"internalType":"enum MsgDataTypes.TransferType","name":"t","type":"uint8"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"wdseq","type":"uint64"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"refId","type":"bytes32"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.TransferInfo","name":"_transfer","type":"tuple"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"executeMessageWithTransferRefund","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"executedMessages","outputs":[{"internalType":"enum MsgDataTypes.TxStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePerByte","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityBridge","type":"address"},{"internalType":"address","name":"_pegBridge","type":"address"},{"internalType":"address","name":"_pegVault","type":"address"},{"internalType":"address","name":"_pegBridgeV2","type":"address"},{"internalType":"address","name":"_pegVaultV2","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidityBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegBridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegBridgeV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pegVaultV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preExecuteMessageGasUsage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"request","type":"bytes"},{"internalType":"bytes[]","name":"sigs","type":"bytes[]"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"}],"internalType":"struct MsgDataTypes.BridgeTransferParams","name":"_transferParams","type":"tuple"},{"components":[{"internalType":"bytes","name":"message","type":"bytes"},{"components":[{"internalType":"enum MsgDataTypes.TransferType","name":"t","type":"uint8"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"wdseq","type":"uint64"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"refId","type":"bytes32"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.TransferInfo","name":"transfer","type":"tuple"},{"internalType":"bytes[]","name":"sigs","type":"bytes[]"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"}],"internalType":"struct MsgDataTypes.MsgWithTransferExecutionParams","name":"_msgParams","type":"tuple"}],"name":"refundAndExecuteMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_receiver","type":"bytes"},{"internalType":"uint256","name":"_dstChainId","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_dstChainId","type":"uint256"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"sendMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_dstChainId","type":"uint256"},{"internalType":"address","name":"_srcBridge","type":"address"},{"internalType":"bytes32","name":"_srcTransferId","type":"bytes32"},{"internalType":"bytes","name":"_message","type":"bytes"}],"name":"sendMessageWithTransfer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFeeBase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFeePerByte","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setLiquidityBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setPegBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setPegBridgeV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setPegVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setPegVaultV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_usage","type":"uint256"}],"name":"setPreExecuteMessageGasUsage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sigsVerifier","outputs":[{"internalType":"contract ISigsVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"request","type":"bytes"},{"internalType":"bytes[]","name":"sigs","type":"bytes[]"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"}],"internalType":"struct MsgDataTypes.BridgeTransferParams","name":"_transferParams","type":"tuple"},{"components":[{"internalType":"bytes","name":"message","type":"bytes"},{"components":[{"internalType":"enum MsgDataTypes.TransferType","name":"t","type":"uint8"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint64","name":"wdseq","type":"uint64"},{"internalType":"uint64","name":"srcChainId","type":"uint64"},{"internalType":"bytes32","name":"refId","type":"bytes32"},{"internalType":"bytes32","name":"srcTxHash","type":"bytes32"}],"internalType":"struct MsgDataTypes.TransferInfo","name":"transfer","type":"tuple"},{"internalType":"bytes[]","name":"sigs","type":"bytes[]"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"}],"internalType":"struct MsgDataTypes.MsgWithTransferExecutionParams","name":"_msgParams","type":"tuple"}],"name":"transferAndExecuteMsg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_cumulativeFee","type":"uint256"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"},{"internalType":"address[]","name":"_signers","type":"address[]"},{"internalType":"uint256[]","name":"_powers","type":"uint256[]"}],"name":"withdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawnFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620041183803806200411883398101604081905262000034916200011d565b84848484848a6200004533620000b4565b6001600160a01b03908116608052600580546001600160a01b0319908116978316979097179055600680548716958216959095179094556007805486169385169390931790925560088054851691841691909117905560098054909316911617905550620001b1945050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146200011a57600080fd5b50565b60008060008060008060c087890312156200013757600080fd5b8651620001448162000104565b6020880151909650620001578162000104565b60408801519095506200016a8162000104565b60608801519094506200017d8162000104565b6080880151909350620001908162000104565b60a0880151909250620001a38162000104565b809150509295509295509295565b608051613f44620001d4600039600081816104eb01526108430152613f446000f3fe6080604052600436106101fe5760003560e01c806382980dc41161011d578063ccf2683b116100b0578063dfa2dbaf1161007f578063f2fde38b11610064578063f2fde38b146105bd578063f60bbe2a146105dd578063f83b0fb9146105f357600080fd5b8063dfa2dbaf1461057d578063e2c1ed251461059d57600080fd5b8063ccf2683b146104d9578063cd2abd661461050d578063d8257d171461054a578063db2c20c81461056a57600080fd5b806395e911a8116100ec57806395e911a8146104705780639b05a775146104865780639f3ce55a146104a6578063c66a9c5a146104b957600080fd5b806382980dc4146103da57806382efd502146104125780638da5cb5b1461043257806395b12c271461045057600080fd5b8063468a2d04116101955780635b3e5f50116101645780635b3e5f5014610367578063723d0a9d146103945780637b80ab20146103b45780637d7a101d146103c757600080fd5b8063468a2d04146102eb5780635335dca2146102fe578063584e45e114610331578063588be02b1461034757600080fd5b80633f395aff116101d15780633f395aff1461028557806340d0d026146102985780634289fbb3146102b85780634586f331146102cb57600080fd5b806303cbfe661461020357806306c28bd6146102255780632ff4c41114610245578063359ef75b14610265575b600080fd5b34801561020f57600080fd5b5061022361021e366004612f40565b610613565b005b34801561023157600080fd5b50610223610240366004612f5b565b61070c565b34801561025157600080fd5b50610223610260366004612fc0565b610798565b34801561027157600080fd5b50610223610280366004613074565b610a33565b61022361029336600461311b565b610a4f565b3480156102a457600080fd5b506102236102b3366004613224565b610d3f565b6102236102c6366004613290565b610d97565b3480156102d757600080fd5b506102236102e6366004612f5b565b610e7f565b6102236102f9366004613308565b610edb565b34801561030a57600080fd5b5061031e6103193660046133cd565b610f3b565b6040519081526020015b60405180910390f35b34801561033d57600080fd5b5061031e600a5481565b34801561035357600080fd5b50610223610362366004612f40565b610f61565b34801561037357600080fd5b5061031e610382366004612f40565b60036020526000908152604090205481565b3480156103a057600080fd5b506102236103af366004613224565b61104e565b6102236103c236600461311b565b61109c565b6102236103d536600461340f565b6112a9565b3480156103e657600080fd5b506005546103fa906001600160a01b031681565b6040516001600160a01b039091168152602001610328565b34801561041e57600080fd5b5061022361042d366004612f40565b611306565b34801561043e57600080fd5b506000546001600160a01b03166103fa565b34801561045c57600080fd5b506008546103fa906001600160a01b031681565b34801561047c57600080fd5b5061031e60015481565b34801561049257600080fd5b506102236104a1366004612f40565b6113f3565b6102236104b4366004613489565b6114e0565b3480156104c557600080fd5b506009546103fa906001600160a01b031681565b3480156104e557600080fd5b506103fa7f000000000000000000000000000000000000000000000000000000000000000081565b34801561051957600080fd5b5061053d610528366004612f5b565b60046020526000908152604090205460ff1681565b604051610328919061350d565b34801561055657600080fd5b506007546103fa906001600160a01b031681565b61022361057836600461351b565b61153a565b34801561058957600080fd5b506006546103fa906001600160a01b031681565b3480156105a957600080fd5b506102236105b8366004612f5b565b61158e565b3480156105c957600080fd5b506102236105d8366004612f40565b61161a565b3480156105e957600080fd5b5061031e60025481565b3480156105ff57600080fd5b5061022361060e366004612f40565b6116f9565b336106266000546001600160a01b031690565b6001600160a01b03161461066f5760405162461bcd60e51b81526020600482018190526024820152600080516020613ec383398151915260448201526064015b60405180910390fd5b6001600160a01b0381166106b75760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527fd60e9ceb4f54f1bfb1741a4b35fc9d806d7ed48200b523203b92248ea38fa17d906020015b60405180910390a150565b3361071f6000546001600160a01b031690565b6001600160a01b0316146107635760405162461bcd60e51b81526020600482018190526024820152600080516020613ec38339815191526044820152606401610666565b60018190556040518181527f892dfdc99ecd3bb4f2f2cb118dca02f0bd16640ff156d3c6459d4282e336a5f290602001610701565b600046306040516020016107e992919091825260601b6001600160601b03191660208201527f77697468647261774665650000000000000000000000000000000000000000006034820152603f0190565b60408051808303601f19018152828252805160209182012090830181905260608c901b6001600160601b0319168383015260548084018c9052825180850390910181526074840192839052633416de1160e11b90925292507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163682dbc229161088a918b908b908b908b908b908b9060780161377f565b60006040518083038186803b1580156108a257600080fd5b505afa1580156108b6573d6000803e3d6000fd5b505050506001600160a01b0389166000908152600360205260408120546108dd908a6137f3565b90506000811161092f5760405162461bcd60e51b815260206004820152601960248201527f4e6f206e657720616d6f756e7420746f207769746864726177000000000000006044820152606401610666565b6001600160a01b038a166000818152600360205260408082208c90555190919061c35090849084818181858888f193505050503d806000811461098e576040519150601f19603f3d011682016040523d82523d6000602084013e610993565b606091505b50509050806109e45760405162461bcd60e51b815260206004820152601660248201527f6661696c656420746f20776974686472617720666565000000000000000000006044820152606401610666565b604080516001600160a01b038d168152602081018490527f78473f3f373f7673597f4f0fa5873cb4d375fea6d4339ad6b56dbd411513cb3f910160405180910390a15050505050505050505050565b610a3b6117e6565b610a48858585858561184a565b5050505050565b6000610a5a88611902565b90506000808281526004602081905260409091205460ff1690811115610a8257610a826134e3565b14610acf5760405162461bcd60e51b815260206004820152601960248201527f7472616e7366657220616c7265616479206578656375746564000000000000006044820152606401610666565b6000818152600460208181526040808420805460ff1916909317909255815146918101919091526001600160601b03193060601b16918101919091527f4d657373616765576974685472616e73666572000000000000000000000000006054820152606701604051602081830303815290604052805190602001209050600560009054906101000a90046001600160a01b03166001600160a01b031663682dbc2282848e8e8e6101000135604051602001610b8e959493929190613806565b6040516020818303038152906040528a8a8a8a8a8a6040518863ffffffff1660e01b8152600401610bc5979695949392919061377f565b60006040518083038186803b158015610bdd57600080fd5b505afa158015610bf1573d6000803e3d6000fd5b50505050600080610c038b8e8e61216b565b90506001816002811115610c1957610c196134e3565b03610c275760019150610cef565b6002816002811115610c3b57610c3b6134e3565b03610cbb576000848152600460205260408120805460ff19166001835b02179055507fe49c2c954d381d1448cf824743aeff9da7a1d82078a7c9e5817269cc359bd26c6000858d60c0016020810190610c949190613828565b8e6101000135604051610caa9493929190613862565b60405180910390a150505050610d34565b610cc68b8e8e6122a6565b90506001816002811115610cdc57610cdc6134e3565b03610cea5760039150610cef565b600291505b60008481526004602081905260409091208054849260ff19909116906001908490811115610d1f57610d1f6134e3565b0217905550610d2f84838d6122e1565b505050505b505050505050505050565b610d58610d526040830160208401613895565b83612353565b610d93610d6582806138b6565b60208401610d776101408601866138fd565b610d856101608801886138fd565b6103c26101808a018a6138fd565b5050565b468503610dd85760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590818da185a5b9259608a1b6044820152606401610666565b6000610de48383610f3b565b905080341015610e295760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610666565b336001600160a01b03167f172762498a59a3bc4fed3f2b63f94f17ea0193cffdc304fe7d3eaf4d342d2f6688888888888834604051610e6e9796959493929190613947565b60405180910390a250505050505050565b33610e926000546001600160a01b031690565b6001600160a01b031614610ed65760405162461bcd60e51b81526020600482018190526024820152600080516020613ec38339815191526044820152606401610666565b600a55565b6000610ee68861259d565b9050610f2f8a8a838a8a8a8a8a8a6040518060400160405280600781526020017f4d65737361676500000000000000000000000000000000000000000000000000815250612654565b50505050505050505050565b600254600090610f4b9083613994565b600154610f5891906139ab565b90505b92915050565b33610f746000546001600160a01b031690565b6001600160a01b031614610fb85760405162461bcd60e51b81526020600482018190526024820152600080516020613ec38339815191526044820152606401610666565b6001600160a01b0381166110005760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fbf9977180dc6e6cff25598c8e59150cecd7f8e448e092633d38ab7ee223ae05890602001610701565b611061610d526040830160208401613895565b610d9361106e82806138b6565b602084016110806101408601866138fd565b61108e6101608801886138fd565b6102936101808a018a6138fd565b60006110a788611902565b90506000808281526004602081905260409091205460ff16908111156110cf576110cf6134e3565b1461111c5760405162461bcd60e51b815260206004820152601960248201527f7472616e7366657220616c7265616479206578656375746564000000000000006044820152606401610666565b6000818152600460208181526040808420805460ff1916909317909255815146918101919091526001600160601b03193060601b16918101919091527f4d657373616765576974685472616e73666572526566756e64000000000000006054820152606d01604051602081830303815290604052805190602001209050600560009054906101000a90046001600160a01b03166001600160a01b031663682dbc2282848e8e8e61010001356040516020016111db959493929190613806565b6040516020818303038152906040528a8a8a8a8a8a6040518863ffffffff1660e01b8152600401611212979695949392919061377f565b60006040518083038186803b15801561122a57600080fd5b505afa15801561123e573d6000803e3d6000fd5b505050506000806112508b8e8e6128a8565b90506001816002811115611266576112666134e3565b036112745760019150610cef565b6002816002811115611288576112886134e3565b03610cea576000848152600460205260408120805460ff1916600183610c58565b6112b48383836128ff565b336001600160a01b03167fe66fbe37d84ca73c589f782ac278844918ea6c56a4917f58707f715588080df28686868686346040516112f7969594939291906139be565b60405180910390a25050505050565b336113196000546001600160a01b031690565b6001600160a01b03161461135d5760405162461bcd60e51b81526020600482018190526024820152600080516020613ec38339815191526044820152606401610666565b6001600160a01b0381166113a55760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600880546001600160a01b0319166001600160a01b0383169081179091556040519081527ffb337a6c76476534518d5816caeb86263972470fedccfd047a35eb1825eaa9e890602001610701565b336114066000546001600160a01b031690565b6001600160a01b03161461144a5760405162461bcd60e51b81526020600482018190526024820152600080516020613ec38339815191526044820152606401610666565b6001600160a01b0381166114925760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600780546001600160a01b0319166001600160a01b0383169081179091556040519081527fa9db0c32d9c6c2f75f3b95047a9e67cc1c010eab792a4e6ca777ce918ad94aad90602001610701565b6114eb8383836128ff565b336001600160a01b03167fce3972bfffe49d317e1d128047a97a3d86b25c94f6f04409f988ef854d25e0e4858585853460405161152c9594939291906139ff565b60405180910390a250505050565b600061154588612997565b9050610f2f8a8a838a8a8a8a8a8a6040518060400160405280600881526020017f4d65737361676532000000000000000000000000000000000000000000000000815250612654565b336115a16000546001600160a01b031690565b6001600160a01b0316146115e55760405162461bcd60e51b81526020600482018190526024820152600080516020613ec38339815191526044820152606401610666565b60028190556040518181527f210d4d5d2d36d571207dac98e383e2441c684684c885fb2d7c54f8d24422074c90602001610701565b3361162d6000546001600160a01b031690565b6001600160a01b0316146116715760405162461bcd60e51b81526020600482018190526024820152600080516020613ec38339815191526044820152606401610666565b6001600160a01b0381166116ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610666565b6116f681612a2d565b50565b3361170c6000546001600160a01b031690565b6001600160a01b0316146117505760405162461bcd60e51b81526020600482018190526024820152600080516020613ec38339815191526044820152606401610666565b6001600160a01b0381166117985760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610666565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527f918a691a2a82482a10e11f43d7b627b2ba220dd08f251cb61933c42560f6fcb590602001610701565b6000546001600160a01b03161561183f5760405162461bcd60e51b815260206004820152601160248201527f6f776e657220616c7265616479207365740000000000000000000000000000006044820152606401610666565b61184833612a2d565b565b6005546001600160a01b0316156118a35760405162461bcd60e51b815260206004820152601b60248201527f6c697175696469747942726964676520616c72656164792073657400000000006044820152606401610666565b600580546001600160a01b03199081166001600160a01b03978816179091556006805482169587169590951790945560078054851693861693909317909255600880548416918516919091179055600980549092169216919091179055565b6000808060016119156020860186613895565b6006811115611926576119266134e3565b03611ab15761193b6040850160208601612f40565b61194b6060860160408701612f40565b61195b6080870160608801612f40565b608087013561197060e0890160c08a01613828565b6040516001600160601b0319606096871b8116602083015294861b851660348201529290941b9092166048820152605c8101919091526001600160c01b031960c092831b8116607c8301524690921b909116608482015260e0850135608c82015260ac0160408051808303601f19018152908290528051602090910120600554633c64f04b60e01b8352600483018290529093506001600160a01b031691508190633c64f04b90602401602060405180830381865afa158015611a37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a5b9190613a3a565b1515600114611aac5760405162461bcd60e51b815260206004820152601660248201527f6272696467652072656c6179206e6f74206578697374000000000000000000006044820152606401610666565b612136565b6002611ac06020860186613895565b6006811115611ad157611ad16134e3565b03611c2e5746611ae760c0860160a08701613828565b611af76060870160408801612f40565b611b076080880160608901612f40565b6040516001600160c01b031960c095861b811660208301529390941b90921660288401526001600160601b0319606091821b8116603085015291901b1660448201526080850135605882015260780160408051808303601f19018152908290528051602090910120600554631c13568560e31b8352600483018290529093506001600160a01b03169150819063e09ab42890602401602060405180830381865afa158015611bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bdd9190613a3a565b1515600114611aac5760405162461bcd60e51b815260206004820152601960248201527f627269646765207769746864726177206e6f74206578697374000000000000006044820152606401610666565b6003611c3d6020860186613895565b6006811115611c4e57611c4e6134e3565b1480611c7757506004611c646020860186613895565b6006811115611c7557611c756134e3565b145b15611eda57611c8c6060850160408601612f40565b611c9c6080860160608701612f40565b6080860135611cb16040880160208901612f40565b611cc160e0890160c08a01613828565b604051606095861b6001600160601b0319908116602083015294861b851660348201526048810193909352931b909116606882015260c09190911b6001600160c01b031916607c82015260e0850135608482015260a40160408051601f19818403018152919052805160209091012091506003611d416020860186613895565b6006811115611d5257611d526134e3565b03611e1957506006546040516301e6472560e01b8152600481018390526001600160a01b039091169081906301e64725906024015b602060405180830381865afa158015611da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc89190613a3a565b1515600114611aac5760405162461bcd60e51b815260206004820152601560248201527f6d696e74207265636f7264206e6f7420657869737400000000000000000000006044820152606401610666565b506007546040516301e6472560e01b8152600481018390526001600160a01b039091169081906301e6472590602401602060405180830381865afa158015611e65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e899190613a3a565b1515600114611aac5760405162461bcd60e51b815260206004820152601960248201527f7769746864726177207265636f7264206e6f74206578697374000000000000006044820152606401610666565b6005611ee96020860186613895565b6006811115611efa57611efa6134e3565b1480611f2357506006611f106020860186613895565b6006811115611f2157611f216134e3565b145b15612136576005611f376020860186613895565b6006811115611f4857611f486134e3565b03611f5f57506008546001600160a01b0316611f6d565b506009546001600160a01b03165b611f7d6060850160408601612f40565b611f8d6080860160608701612f40565b6080860135611fa26040880160208901612f40565b611fb260e0890160c08a01613828565b604051606095861b6001600160601b0319908116602083015294861b85166034820152604881019390935290841b8316606883015260c01b6001600160c01b031916607c82015260e087013560848201529183901b1660a482015260b80160408051601f198184030181529190528051602090910120915060056120396020860186613895565b600681111561204a5761204a6134e3565b0361207c576040516301e6472560e01b8152600481018390526001600160a01b038216906301e6472590602401611d87565b6040516301e6472560e01b8152600481018390526001600160a01b038216906301e6472590602401602060405180830381865afa1580156120c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e59190613a3a565b15156001146121365760405162461bcd60e51b815260206004820152601960248201527f7769746864726177207265636f7264206e6f74206578697374000000000000006044820152606401610666565b6000818360405160200161214c93929190613a73565b6040516020818303038152906040528051906020012092505050919050565b6000805a90506000806121846060880160408901612f40565b6001600160a01b031634631f34afff60e21b6121a660408b0160208c01612f40565b6121b660808c0160608d01612f40565b60808c01356121cb60e08e0160c08f01613828565b8c8c336040516024016121e49796959493929190613a9f565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516122229190613af8565b60006040518083038185875af1925050503d806000811461225f576040519150601f19603f3d011682016040523d82523d6000602084013e612264565b606091505b5091509150811561228d57808060200190518101906122839190613b14565b935050505061229f565b6122978382612a7d565b600093505050505b9392505050565b6000805a90506000806122bf6060880160408901612f40565b6001600160a01b031634632d5bd7e360e11b6121a660408b0160208c01612f40565b6122f16060820160408301612f40565b6001600160a01b03167fa635eb05143f74743822bbd96428928de4c8ee8cc578299749be9425c17bb34d6000858561232f60e0870160c08801613828565b866101000135604051612346959493929190613b35565b60405180910390a2505050565b6001826006811115612367576123676134e3565b03612407576005546001600160a01b031663cdd1b25d61238783806138b6565b61239460208601866138fd565b6123a160408801886138fd565b6123ae60608a018a6138fd565b6040518963ffffffff1660e01b81526004016123d1989796959493929190613b73565b600060405180830381600087803b1580156123eb57600080fd5b505af11580156123ff573d6000803e3d6000fd5b505050505050565b600282600681111561241b5761241b6134e3565b0361243b576005546001600160a01b031663a21a928061238783806138b6565b600382600681111561244f5761244f6134e3565b0361246f576006546001600160a01b031663f873430261238783806138b6565b6005826006811115612483576124836134e3565b03612535576008546001600160a01b031663f87343026124a383806138b6565b6124b060208601866138fd565b6124bd60408801886138fd565b6124ca60608a018a6138fd565b6040518963ffffffff1660e01b81526004016124ed989796959493929190613b73565b6020604051808303816000875af115801561250c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125309190613bd3565b505050565b6004826006811115612549576125496134e3565b03612569576007546001600160a01b031663a21a928061238783806138b6565b600682600681111561257d5761257d6134e3565b03610d93576009546001600160a01b031663a21a92806124a383806138b6565b6040805160a081018252600080825260606020830181905292820181905291810182905260808101919091526040805160a08101909152806125e26020850185612f40565b6001600160a01b031681526020016040518060200160405280600081525081526020018360200160208101906126189190612f40565b6001600160a01b031681526020016126366060850160408601613828565b67ffffffffffffffff16815260200183606001358152509050919050565b6000612661898c8c612b08565b90506000808281526004602081905260409091205460ff1690811115612689576126896134e3565b146126d65760405162461bcd60e51b815260206004820152601860248201527f6d65737361676520616c726561647920657865637574656400000000000000006044820152606401610666565b6000818152600460208181526040808420805460ff191690931790925590516127059146913091879101613bec565b60408051601f1981840301815282825280516020918201206005549184018190528383018690528251808503840181526060850193849052633416de1160e11b90935293506001600160a01b03169163682dbc2291612772918d908d908d908d908d908d9060640161377f565b60006040518083038186803b15801561278a57600080fd5b505afa15801561279e573d6000803e3d6000fd5b505050506000806127b08c8f8f612b9c565b905060018160028111156127c6576127c66134e3565b036127d45760019150612858565b60028160028111156127e8576127e86134e3565b036128535760008481526004602052604090819020805460ff1916905560608d015160808e015191517fe49c2c954d381d1448cf824743aeff9da7a1d82078a7c9e5817269cc359bd26c9261284292600192899290613862565b60405180910390a150505050610f2f565b600291505b60008481526004602081905260409091208054849260ff19909116906001908490811115612888576128886134e3565b021790555061289884838e612d7d565b5050505050505050505050505050565b6000805a90506000806128c16060880160408901612f40565b6001600160a01b0316346305e5a4c160e11b6128e360808b0160608c01612f40565b8a608001358a8a336040516024016121e4959493929190613c2b565b4683036129405760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a590818da185a5b9259608a1b6044820152606401610666565b600061294c8383610f3b565b9050803410156129915760405162461bcd60e51b815260206004820152601060248201526f496e73756666696369656e742066656560801b6044820152606401610666565b50505050565b6040805160a081018252600080825260606020830181905292820181905291810182905260808101919091526040805160a0810190915260008152602081016129e084806138b6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252506020908101906126189060408601908601612f40565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005a90506000600a5445612a9291906137f3565b90508084108015612aad5750612aa9604085613c6a565b8211155b15612ab457fe5b6000612abf84612dcb565b9050612aca81612e2a565b7fffdd6142bbb721f3400e3908b04b86f60649b2e4d191e3f4c50c32c3e6471d2f81604051612af99190613c8c565b60405180910390a15050505050565b60208301518051600091908203612b50578451604051612b3e919060200160609190911b6001600160601b031916815260140190565b60405160208183030381529060405290505b600181866040015187606001518860800151468989604051602001612b7c989796959493929190613c9f565b604051602081830303815290604052805190602001209150509392505050565b6000805a905060006060866020015151600003612c8c5786604001516001600160a01b0316346040518060600160405280602c8152602001613ee3602c91398051602090910120895160608b0151604051612c019291908c908c903390602401613d20565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612c3f9190613af8565b60006040518083038185875af1925050503d8060008114612c7c576040519150601f19603f3d011682016040523d82523d6000602084013e612c81565b606091505b509092509050612d63565b86604001516001600160a01b0316346040518060600160405280602a8152602001613e99602a91398051906020012089602001518a606001518a8a33604051602401612cdc959493929190613d54565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051612d1a9190613af8565b60006040518083038185875af1925050503d8060008114612d57576040519150601f19603f3d011682016040523d82523d6000602084013e612d5c565b606091505b5090925090505b811561228d57808060200190518101906122839190613b14565b80604001516001600160a01b03167fa635eb05143f74743822bbd96428928de4c8ee8cc578299749be9425c17bb34d6001858585606001518660800151604051612346959493929190613b35565b6060604482511015612e1057505060408051808201909152601d81527f5472616e73616374696f6e2072657665727465642073696c656e746c79000000602082015290565b60048201915081806020019051810190610f5b9190613dbc565b60408051808201909152600b8082527f4d53473a3a41424f52543a000000000000000000000000000000000000000000602083015282518391116125305760005b8251811015612f0957828181518110612e8657612e86613e69565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916828281518110612ec557612ec5613e69565b01602001517fff000000000000000000000000000000000000000000000000000000000000001614612ef75750505050565b80612f0181613e7f565b915050612e6b565b508260405162461bcd60e51b81526004016106669190613c8c565b80356001600160a01b0381168114612f3b57600080fd5b919050565b600060208284031215612f5257600080fd5b610f5882612f24565b600060208284031215612f6d57600080fd5b5035919050565b60008083601f840112612f8657600080fd5b50813567ffffffffffffffff811115612f9e57600080fd5b6020830191508360208260051b8501011115612fb957600080fd5b9250929050565b60008060008060008060008060a0898b031215612fdc57600080fd5b612fe589612f24565b975060208901359650604089013567ffffffffffffffff8082111561300957600080fd5b6130158c838d01612f74565b909850965060608b013591508082111561302e57600080fd5b61303a8c838d01612f74565b909650945060808b013591508082111561305357600080fd5b506130608b828c01612f74565b999c989b5096995094979396929594505050565b600080600080600060a0868803121561308c57600080fd5b61309586612f24565b94506130a360208701612f24565b93506130b160408701612f24565b92506130bf60608701612f24565b91506130cd60808701612f24565b90509295509295909350565b60008083601f8401126130eb57600080fd5b50813567ffffffffffffffff81111561310357600080fd5b602083019150836020828501011115612fb957600080fd5b6000806000806000806000806000898b036101a081121561313b57600080fd5b8a3567ffffffffffffffff8082111561315357600080fd5b61315f8e838f016130d9565b909c509a508a9150610120601f198401121561317a57600080fd5b60208d0199506101408d013592508083111561319557600080fd5b6131a18e848f01612f74565b90995097506101608d01359250889150808311156131be57600080fd5b6131ca8e848f01612f74565b90975095506101808d01359250869150808311156131e757600080fd5b50506131f58c828d01612f74565b915080935050809150509295985092959850929598565b60006080828403121561321e57600080fd5b50919050565b6000806040838503121561323757600080fd5b823567ffffffffffffffff8082111561324f57600080fd5b61325b8683870161320c565b9350602085013591508082111561327157600080fd5b5083016101a0818603121561328557600080fd5b809150509250929050565b60008060008060008060a087890312156132a957600080fd5b6132b287612f24565b9550602087013594506132c760408801612f24565b935060608701359250608087013567ffffffffffffffff8111156132ea57600080fd5b6132f689828a016130d9565b979a9699509497509295939492505050565b60008060008060008060008060006101008a8c03121561332757600080fd5b893567ffffffffffffffff8082111561333f57600080fd5b61334b8d838e016130d9565b909b5099508991506133608d60208e0161320c565b985060a08c013591508082111561337657600080fd5b6133828d838e01612f74565b909850965060c08c013591508082111561339b57600080fd5b6133a78d838e01612f74565b909650945060e08c01359150808211156133c057600080fd5b506131f58c828d01612f74565b600080602083850312156133e057600080fd5b823567ffffffffffffffff8111156133f757600080fd5b613403858286016130d9565b90969095509350505050565b60008060008060006060868803121561342757600080fd5b853567ffffffffffffffff8082111561343f57600080fd5b61344b89838a016130d9565b909750955060208801359450604088013591508082111561346b57600080fd5b50613478888289016130d9565b969995985093965092949392505050565b6000806000806060858703121561349f57600080fd5b6134a885612f24565b935060208501359250604085013567ffffffffffffffff8111156134cb57600080fd5b6134d7878288016130d9565b95989497509550505050565b634e487b7160e01b600052602160045260246000fd5b60058110613509576135096134e3565b9052565b60208101610f5b82846134f9565b600080600080600080600080600060a08a8c03121561353957600080fd5b893567ffffffffffffffff8082111561355157600080fd5b61355d8d838e016130d9565b909b50995060208c013591508082111561357657600080fd5b6135828d838e0161320c565b985060408c013591508082111561359857600080fd5b6135a48d838e01612f74565b909850965060608c01359150808211156135bd57600080fd5b6135c98d838e01612f74565b909650945060808c01359150808211156133c057600080fd5b60005b838110156135fd5781810151838201526020016135e5565b50506000910152565b6000815180845261361e8160208601602086016135e2565b601f01601f19169290920160200192915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b810191508460005b878110156136e05782840389528135601e1988360301811261369657600080fd5b8701858101903567ffffffffffffffff8111156136b257600080fd5b8036038213156136c157600080fd5b6136cc868284613632565b9a87019a9550505090840190600101613675565b5091979650505050505050565b8183526000602080850194508260005b85811015613729576001600160a01b0361371683612f24565b16875295820195908201906001016136fd565b509495945050505050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561376657600080fd5b8260051b80836020870137939093016020019392505050565b608081526000613792608083018a613606565b82810360208401526137a581898b61365b565b905082810360408401526137ba8187896136ed565b905082810360608401526137cf818587613734565b9a9950505050505050505050565b634e487b7160e01b600052601160045260246000fd5b81810381811115610f5b57610f5b6137dd565b8581528460208201528284604083013760409201918201526060019392505050565b60006020828403121561383a57600080fd5b813567ffffffffffffffff8116811461229f57600080fd5b60028110613509576135096134e3565b608081016138708287613852565b84602083015267ffffffffffffffff8416604083015282606083015295945050505050565b6000602082840312156138a757600080fd5b81356007811061229f57600080fd5b6000808335601e198436030181126138cd57600080fd5b83018035915067ffffffffffffffff8211156138e857600080fd5b602001915036819003821315612fb957600080fd5b6000808335601e1984360301811261391457600080fd5b83018035915067ffffffffffffffff82111561392f57600080fd5b6020019150600581901b3603821315612fb957600080fd5b60006001600160a01b03808a16835288602084015280881660408401525085606083015260c0608083015261398060c083018587613632565b90508260a083015298975050505050505050565b8082028115828204841417610f5b57610f5b6137dd565b80820180821115610f5b57610f5b6137dd565b6080815260006139d260808301888a613632565b86602084015282810360408401526139eb818688613632565b915050826060830152979650505050505050565b6001600160a01b0386168152846020820152608060408201526000613a28608083018587613632565b90508260608301529695505050505050565b600060208284031215613a4c57600080fd5b8151801515811461229f57600080fd5b60028110613a6c57613a6c6134e3565b60f81b9052565b613a7d8185613a5c565b60609290921b6001600160601b03191660018301526015820152603501919050565b60006001600160a01b03808a168352808916602084015287604084015267ffffffffffffffff8716606084015260c06080840152613ae160c084018688613632565b915080841660a08401525098975050505050505050565b60008251613b0a8184602087016135e2565b9190910192915050565b600060208284031215613b2657600080fd5b81516003811061229f57600080fd5b60a08101613b438288613852565b856020830152613b5660408301866134f9565b67ffffffffffffffff939093166060820152608001529392505050565b608081526000613b87608083018a8c613632565b8281036020840152613b9a81898b61365b565b90508281036040840152613baf8187896136ed565b90508281036060840152613bc4818587613734565b9b9a5050505050505050505050565b600060208284031215613be557600080fd5b5051919050565b8381526bffffffffffffffffffffffff198360601b16602082015260008251613c1c8160348501602087016135e2565b91909101603401949350505050565b60006001600160a01b03808816835286602084015260806040840152613c55608084018688613632565b91508084166060840152509695505050505050565b600082613c8757634e487b7160e01b600052601260045260246000fd5b500490565b602081526000610f586020830184613606565b613ca9818a613a5c565b60008851613cbe816001850160208d016135e2565b80830190506bffffffffffffffffffffffff198960601b1660018201526001600160c01b0319808960c01b16601583015287601d830152808760c01b16603d830152508385604583013760009301604501928352509098975050505050505050565b60006001600160a01b03808816835267ffffffffffffffff8716602084015260806040840152613c55608084018688613632565b608081526000613d676080830188613606565b67ffffffffffffffff871660208401528281036040840152613d8a818688613632565b9150506001600160a01b03831660608301529695505050505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215613dce57600080fd5b815167ffffffffffffffff80821115613de657600080fd5b818401915084601f830112613dfa57600080fd5b815181811115613e0c57613e0c613da6565b604051601f8201601f19908116603f01168101908382118183101715613e3457613e34613da6565b81604052828152876020848701011115613e4d57600080fd5b613e5e8360208301602088016135e2565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201613e9157613e916137dd565b506001019056fe657865637574654d6573736167652862797465732c75696e7436342c62797465732c61646472657373294f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572657865637574654d65737361676528616464726573732c75696e7436342c62797465732c6164647265737329a264697066735822122059397ddb441e07a9d7962df6708b6dab520de9f19a5724dc4a1f0612110e771a64736f6c63430008110033000000000000000000000000d46f8e428a06789b5884df54e029e738277388d1000000000000000000000000d46f8e428a06789b5884df54e029e738277388d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d46f8e428a06789b5884df54e029e738277388d1000000000000000000000000d46f8e428a06789b5884df54e029e738277388d10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _sigsVerifier (address): 0xd46f8e428a06789b5884df54e029e738277388d1
Arg [1] : _liquidityBridge (address): 0xd46f8e428a06789b5884df54e029e738277388d1
Arg [2] : _pegBridge (address): 0x0000000000000000000000000000000000000000
Arg [3] : _pegVault (address): 0x0000000000000000000000000000000000000000
Arg [4] : _pegBridgeV2 (address): 0x0000000000000000000000000000000000000000
Arg [5] : _pegVaultV2 (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000d46f8e428a06789b5884df54e029e738277388d1
Arg [1] : 000000000000000000000000d46f8e428a06789b5884df54e029e738277388d1
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
136:1049:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25128:187:10;;;;;;;;;;-1:-1:-1;25128:187:10;;;;;:::i;:::-;;:::i;:::-;;5818:122:11;;;;;;;;;;-1:-1:-1;5818:122:11;;;;;:::i;:::-;;:::i;4518:755::-;;;;;;;;;;-1:-1:-1;4518:755:11;;;;;:::i;:::-;;:::i;722:461:9:-;;;;;;;;;;-1:-1:-1;722:461:9;;;;;:::i;:::-;;:::i;3074:2011:10:-;;;;;;:::i;:::-;;:::i;22505:466::-;;;;;;;;;;-1:-1:-1;22505:466:10;;;;;:::i;:::-;;:::i;3240:736:11:-;;;;;;:::i;:::-;;:::i;25908:122:10:-;;;;;;;;;;-1:-1:-1;25908:122:10;;;;;:::i;:::-;;:::i;7900:382::-;;;;;;:::i;:::-;;:::i;5482:134:11:-;;;;;;;;;;-1:-1:-1;5482:134:11;;;;;:::i;:::-;;:::i;:::-;;;8341:25:13;;;8329:2;8314:18;5482:134:11;;;;;;;;1005:40:10;;;;;;;;;;;;;;;;24911:211;;;;;;;;;;-1:-1:-1;24911:211:10;;;;;:::i;:::-;;:::i;303:48:11:-;;;;;;;;;;-1:-1:-1;303:48:11;;;;;:::i;:::-;;;;;;;;;;;;;;21742:462:10;;;;;;;;;;-1:-1:-1;21742:462:10;;;;;:::i;:::-;;:::i;5613:1731::-;;;;;;:::i;:::-;;:::i;2081:272:11:-;;;;;;:::i;:::-;;:::i;593:30:10:-;;;;;;;;;;-1:-1:-1;593:30:10;;;;-1:-1:-1;;;;;593:30:10;;;;;;-1:-1:-1;;;;;9331:55:13;;;9313:74;;9301:2;9286:18;593:30:10;9167:226:13;25510:195:10;;;;;;;;;;-1:-1:-1;25510:195:10;;;;;:::i;:::-;;:::i;1479:85:12:-;;;;;;;;;;-1:-1:-1;1525:7:12;1551:6;-1:-1:-1;;;;;1551:6:12;1479:85;;768:26:10;;;;;;;;;;-1:-1:-1;768:26:10;;;;-1:-1:-1;;;;;768:26:10;;;244:22:11;;;;;;;;;;;;;;;;25321:183:10;;;;;;;;;;-1:-1:-1;25321:183:10;;;;;:::i;:::-;;:::i;1709:264:11:-;;;;;;:::i;:::-;;:::i;822:25:10:-;;;;;;;;;;-1:-1:-1;822:25:10;;;;-1:-1:-1;;;;;822:25:10;;;194:43:11;;;;;;;;;;;;;;;521:65:10;;;;;;;;;;-1:-1:-1;521:65:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;709:23::-;;;;;;;;;;-1:-1:-1;709:23:10;;;;-1:-1:-1;;;;;709:23:10;;;8393:384;;;;;;:::i;:::-;;:::i;657:24::-;;;;;;;;;;-1:-1:-1;657:24:10;;;;-1:-1:-1;;;;;657:24:10;;;5678:134:11;;;;;;;;;;-1:-1:-1;5678:134:11;;;;;:::i;:::-;;:::i;1916:189:12:-;;;;;;;;;;-1:-1:-1;1916:189:12;;;;;:::i;:::-;;:::i;272:25:11:-;;;;;;;;;;;;;;;;25711:191:10;;;;;;;;;;-1:-1:-1;25711:191:10;;;;;:::i;:::-;;:::i;25128:187::-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;12742:2:13;1683:66:12;;;12724:21:13;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:13;;;12793:62;12872:18;;1683:66:12;;;;;;;;;-1:-1:-1;;;;;25200:19:10;::::1;25192:47;;;::::0;-1:-1:-1;;;25192:47:10;;13103:2:13;25192:47:10::1;::::0;::::1;13085:21:13::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:13;;;13154:45;13216:18;;25192:47:10::1;12901:339:13::0;25192:47:10::1;25249:9;:17:::0;;-1:-1:-1;;;;;;25249:17:10::1;-1:-1:-1::0;;;;;25249:17:10;::::1;::::0;;::::1;::::0;;;25281:27:::1;::::0;9313:74:13;;;25281:27:10::1;::::0;9301:2:13;9286:18;25281:27:10::1;;;;;;;;25128:187:::0;:::o;5818:122:11:-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;12742:2:13;1683:66:12;;;12724:21:13;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:13;;;12793:62;12872:18;;1683:66:12;12540:356:13;1683:66:12;5881:7:11::1;:14:::0;;;5910:23:::1;::::0;8341:25:13;;;5910:23:11::1;::::0;8329:2:13;8314:18;5910:23:11::1;8195:177:13::0;4518:755:11;4727:14;4771:13;4794:4;4754:61;;;;;;;;13503:19:13;;;13560:2;13556:15;-1:-1:-1;;;;;;13552:53:13;13547:2;13538:12;;13531:75;13636:13;13631:2;13622:12;;13615:35;13675:2;13666:12;;13245:439;4754:61:11;;;;;;;-1:-1:-1;;4754:61:11;;;;;;4744:72;;4754:61;4744:72;;;;4850:50;;;13874:19:13;;;13931:2;13927:15;;;-1:-1:-1;;;;;;13923:53:13;13909:12;;;13902:75;13993:12;;;;13986:28;;;4850:50:11;;;;;;;;;;14030:12:13;;;4850:50:11;;;;-1:-1:-1;;;4826:101:11;;;4744:72;-1:-1:-1;4826:12:11;-1:-1:-1;;;;;4826:23:11;;;;:101;;4902:5;;;;4909:8;;;;4919:7;;;;4826:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;4971:23:11;;4937:14;4971:23;;;:13;:23;;;;;;4954:40;;:14;:40;:::i;:::-;4937:57;;5021:1;5012:6;:10;5004:48;;;;-1:-1:-1;;;5004:48:11;;18175:2:13;5004:48:11;;;18157:21:13;18214:2;18194:18;;;18187:30;18253:27;18233:18;;;18226:55;18298:18;;5004:48:11;17973:349:13;5004:48:11;-1:-1:-1;;;;;5062:23:11;;;;;;:13;:23;;;;;;:40;;;5128:44;5062:23;;;5162:5;;5149:6;;5062:23;5128:44;5062:23;5128:44;5149:6;5062:23;5162:5;5128:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5112:60;;;5190:4;5182:39;;;;-1:-1:-1;;;5182:39:11;;18739:2:13;5182:39:11;;;18721:21:13;18778:2;18758:18;;;18751:30;18817:24;18797:18;;;18790:52;18859:18;;5182:39:11;18537:346:13;5182:39:11;5236:30;;;-1:-1:-1;;;;;19080:55:13;;19062:74;;19167:2;19152:18;;19145:34;;;5236:30:11;;19035:18:13;5236:30:11;;;;;;;4717:556;;;4518:755;;;;;;;;:::o;722:461:9:-;976:11;:9;:11::i;:::-;1096:80;1109:16;1127:10;1139:9;1150:12;1164:11;1096:12;:80::i;:::-;722:461;;;;;:::o;3074:2011:10:-;3497:17;3517:25;3532:9;3517:14;:25::i;:::-;3497:45;-1:-1:-1;3591:26:10;3560:27;;;;:16;:27;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;3552:95;;;;-1:-1:-1;;;3552:95:10;;19392:2:13;3552:95:10;;;19374:21:13;19431:2;19411:18;;;19404:30;19470:27;19450:18;;;19443:55;19515:18;;3552:95:10;19190:349:13;3552:95:10;3657:27;;;;3687:29;3657:27;;;;;;;;:59;;-1:-1:-1;;3657:59:10;;;;;;;3754:69;;3771:13;3754:69;;;19802:19:13;;;;-1:-1:-1;;;;;;3794:4:10;19859:2:13;19855:15;19851:53;19837:12;;;19830:75;;;;19935:21;19921:12;;;19914:43;19973:12;;3754:69:10;;;;;;;;;;;;3744:80;;;;;;3727:97;;3842:15;;;;;;;;;-1:-1:-1;;;;;3842:15:10;-1:-1:-1;;;;;3834:35:10;;3900:6;3908:9;3919:8;;3929:9;:19;;;3883:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3963:5;;3982:8;;4004:7;;3834:187;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4031:28;4069:39;4111:47;4138:9;4149:8;;4111:26;:47::i;:::-;4069:89;-1:-1:-1;4179:43:10;4172:3;:50;;;;;;;;:::i;:::-;;4168:789;;4247:29;4238:38;;4168:789;;;4304:41;4297:3;:48;;;;;;;;:::i;:::-;;4293:664;;4391:26;4361:27;;;:16;:27;;;;;:56;;-1:-1:-1;;4361:56:10;;4391:26;4361:56;;;;;;4436:183;4463:40;4521:9;4548;:20;;;;;;;;;;:::i;:::-;4586:9;:19;;;4436:183;;;;;;;;;:::i;:::-;;;;;;;;4633:7;;;;;;4293:664;4676:55;4711:9;4722:8;;4676:34;:55::i;:::-;4670:61;-1:-1:-1;4756:43:10;4749:3;:50;;;;;;;;:::i;:::-;;4745:202;;4828:30;4819:39;;4745:202;;;4906:26;4897:35;;4745:202;4966:27;;;;:16;:27;;;;;;;;:36;;4996:6;;-1:-1:-1;;4966:36:10;;;;;;4996:6;;4966:36;;;;;;;:::i;:::-;;;;;;5012:66;5049:9;5060:6;5068:9;5012:36;:66::i;:::-;3323:1762;;;;3074:2011;;;;;;;;;;:::o;22505:466::-;22700:55;22716:21;;;;:19;;;:21;:::i;:::-;22739:15;22700;:55::i;:::-;22765:199;22811:18;:10;;:18;:::i;:::-;22843:19;;;22876:15;;;;22843:10;22876:15;:::i;:::-;22905:18;;;;:10;:18;:::i;:::-;22937:17;;;;:10;:17;:::i;22765:199::-;22505:466;;:::o;3240:736:11:-;3478:13;3463:11;:28;3455:56;;;;-1:-1:-1;;;3455:56:11;;24014:2:13;3455:56:11;;;23996:21:13;24053:2;24033:18;;;24026:30;-1:-1:-1;;;24072:18:13;;;24065:45;24127:18;;3455:56:11;23812:339:13;3455:56:11;3521:14;3538:17;3546:8;;3538:7;:17::i;:::-;3521:34;;3586:6;3573:9;:19;;3565:48;;;;-1:-1:-1;;;3565:48:11;;24358:2:13;3565:48:11;;;24340:21:13;24397:2;24377:18;;;24370:30;-1:-1:-1;;;24416:18:13;;;24409:46;24472:18;;3565:48:11;24156:340:13;3565:48:11;3885:10;-1:-1:-1;;;;;3865:104:11;;3897:9;3908:11;3921:10;3933:14;3949:8;;3959:9;3865:104;;;;;;;;;;;;:::i;:::-;;;;;;;;3445:531;3240:736;;;;;;:::o;25908:122:10:-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;12742:2:13;1683:66:12;;;12724:21:13;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:13;;;12793:62;12872:18;;1683:66:12;12540:356:13;1683:66:12;25989:25:10::1;:34:::0;25908:122::o;7900:382::-;8143:31;8177:20;8190:6;8177:12;:20::i;:::-;8143:54;;8207:68;8222:8;;8232:5;8239;;8246:8;;8256:7;;8207:68;;;;;;;;;;;;;;;;;:14;:68::i;:::-;8133:149;7900:382;;;;;;;;;:::o;5482:134:11:-;5599:10;;5545:7;;5581:28;;:8;:28;:::i;:::-;5571:7;;:38;;;;:::i;:::-;5564:45;;5482:134;;;;;:::o;24911:211:10:-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;12742:2:13;1683:66:12;;;12724:21:13;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:13;;;12793:62;12872:18;;1683:66:12;12540:356:13;1683:66:12;-1:-1:-1;;;;;24989:19:10;::::1;24981:47;;;::::0;-1:-1:-1;;;24981:47:10;;13103:2:13;24981:47:10::1;::::0;::::1;13085:21:13::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:13;;;13154:45;13216:18;;24981:47:10::1;12901:339:13::0;24981:47:10::1;25038:15;:23:::0;;-1:-1:-1;;;;;;25038:23:10::1;-1:-1:-1::0;;;;;25038:23:10;::::1;::::0;;::::1;::::0;;;25076:39:::1;::::0;9313:74:13;;;25076:39:10::1;::::0;9301:2:13;9286:18;25076:39:10::1;9167:226:13::0;21742:462:10;21939:55;21955:21;;;;:19;;;:21;:::i;21939:55::-;22004:193;22044:18;:10;;:18;:::i;:::-;22076:19;;;22109:15;;;;22076:10;22109:15;:::i;:::-;22138:18;;;;:10;:18;:::i;:::-;22170:17;;;;:10;:17;:::i;5613:1731::-;5985:17;6005:25;6020:9;6005:14;:25::i;:::-;5985:45;-1:-1:-1;6079:26:10;6048:27;;;;:16;:27;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;6040:95;;;;-1:-1:-1;;;6040:95:10;;19392:2:13;6040:95:10;;;19374:21:13;19431:2;19411:18;;;19404:30;19470:27;19450:18;;;19443:55;19515:18;;6040:95:10;19190:349:13;6040:95:10;6145:27;;;;6175:29;6145:27;;;;;;;;:59;;-1:-1:-1;;6145:59:10;;;;;;;6242:75;;6259:13;6242:75;;;25749:19:13;;;;-1:-1:-1;;;;;;6282:4:10;25806:2:13;25802:15;25798:53;25784:12;;;25777:75;;;;25882:27;25868:12;;;25861:49;25926:12;;6242:75:10;;;;;;;;;;;;6232:86;;;;;;6215:103;;6336:15;;;;;;;;;-1:-1:-1;;;;;6336:15:10;-1:-1:-1;;;;;6328:35:10;;6394:6;6402:9;6413:8;;6423:9;:19;;;6377:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6457:5;;6476:8;;6498:7;;6328:187;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6525:28;6563:39;6605:53;6638:9;6649:8;;6605:32;:53::i;:::-;6563:95;-1:-1:-1;6679:43:10;6672:3;:50;;;;;;;;:::i;:::-;;6668:548;;6747:29;6738:38;;6668:548;;;6804:41;6797:3;:48;;;;;;;;:::i;:::-;;6793:423;;6891:26;6861:27;;;:16;:27;;;;;:56;;-1:-1:-1;;6861:56:10;;6891:26;6861:56;;2081:272:11;2231:35;2244:11;2257:8;;2231:12;:35::i;:::-;2290:10;-1:-1:-1;;;;;2281:65:11;;2302:9;;2313:11;2326:8;;2336:9;2281:65;;;;;;;;;;;:::i;:::-;;;;;;;;2081:272;;;;;:::o;25510:195:10:-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;12742:2:13;1683:66:12;;;12724:21:13;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:13;;;12793:62;12872:18;;1683:66:12;12540:356:13;1683:66:12;-1:-1:-1;;;;;25584:19:10;::::1;25576:47;;;::::0;-1:-1:-1;;;25576:47:10;;13103:2:13;25576:47:10::1;::::0;::::1;13085:21:13::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:13;;;13154:45;13216:18;;25576:47:10::1;12901:339:13::0;25576:47:10::1;25633:11;:19:::0;;-1:-1:-1;;;;;;25633:19:10::1;-1:-1:-1::0;;;;;25633:19:10;::::1;::::0;;::::1;::::0;;;25667:31:::1;::::0;9313:74:13;;;25667:31:10::1;::::0;9301:2:13;9286:18;25667:31:10::1;9167:226:13::0;25321:183:10;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;12742:2:13;1683:66:12;;;12724:21:13;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:13;;;12793:62;12872:18;;1683:66:12;12540:356:13;1683:66:12;-1:-1:-1;;;;;25392:19:10;::::1;25384:47;;;::::0;-1:-1:-1;;;25384:47:10;;13103:2:13;25384:47:10::1;::::0;::::1;13085:21:13::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:13;;;13154:45;13216:18;;25384:47:10::1;12901:339:13::0;25384:47:10::1;25441:8;:16:::0;;-1:-1:-1;;;;;;25441:16:10::1;-1:-1:-1::0;;;;;25441:16:10;::::1;::::0;;::::1;::::0;;;25472:25:::1;::::0;9313:74:13;;;25472:25:10::1;::::0;9301:2:13;9286:18;25472:25:10::1;9167:226:13::0;1709:264:11;1852:35;1865:11;1878:8;;1852:12;:35::i;:::-;1910:10;-1:-1:-1;;;;;1902:64:11;;1922:9;1933:11;1946:8;;1956:9;1902:64;;;;;;;;;;:::i;:::-;;;;;;;;1709:264;;;;:::o;8393:384:10:-;8637:31;8671:20;8684:6;8671:12;:20::i;:::-;8637:54;;8701:69;8716:8;;8726:5;8733;;8740:8;;8750:7;;8701:69;;;;;;;;;;;;;;;;;:14;:69::i;5678:134:11:-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;12742:2:13;1683:66:12;;;12724:21:13;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:13;;;12793:62;12872:18;;1683:66:12;12540:356:13;1683:66:12;5744:10:11::1;:17:::0;;;5776:29:::1;::::0;8341:25:13;;;5776:29:11::1;::::0;8329:2:13;8314:18;5776:29:11::1;8195:177:13::0;1916:189:12;1702:10;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;12742:2:13;1683:66:12;;;12724:21:13;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:13;;;12793:62;12872:18;;1683:66:12;12540:356:13;1683:66:12;-1:-1:-1;;;;;2004:22:12;::::1;1996:73;;;::::0;-1:-1:-1;;;1996:73:12;;27244:2:13;1996:73:12::1;::::0;::::1;27226:21:13::0;27283:2;27263:18;;;27256:30;27322:34;27302:18;;;27295:62;27393:8;27373:18;;;27366:36;27419:19;;1996:73:12::1;27042:402:13::0;1996:73:12::1;2079:19;2089:8;2079:9;:19::i;:::-;1916:189:::0;:::o;25711:191:10:-;1702:10:12;1691:7;1525;1551:6;-1:-1:-1;;;;;1551:6:12;;1479:85;1691:7;-1:-1:-1;;;;;1691:21:12;;1683:66;;;;-1:-1:-1;;;1683:66:12;;12742:2:13;1683:66:12;;;12724:21:13;;;12761:18;;;12754:30;-1:-1:-1;;;;;;;;;;;12800:18:13;;;12793:62;12872:18;;1683:66:12;12540:356:13;1683:66:12;-1:-1:-1;;;;;25784:19:10;::::1;25776:47;;;::::0;-1:-1:-1;;;25776:47:10;;13103:2:13;25776:47:10::1;::::0;::::1;13085:21:13::0;13142:2;13122:18;;;13115:30;-1:-1:-1;;;13161:18:13;;;13154:45;13216:18;;25776:47:10::1;12901:339:13::0;25776:47:10::1;25833:10;:18:::0;;-1:-1:-1;;;;;;25833:18:10::1;-1:-1:-1::0;;;;;25833:18:10;::::1;::::0;;::::1;::::0;;;25866:29:::1;::::0;9313:74:13;;;25866:29:10::1;::::0;9301:2:13;9286:18;25866:29:10::1;9167:226:13::0;1275:128:12;1341:1;1323:6;-1:-1:-1;;;;;1323:6:12;:20;1315:50;;;;-1:-1:-1;;;1315:50:12;;27651:2:13;1315:50:12;;;27633:21:13;27690:2;27670:18;;;27663:30;27729:19;27709:18;;;27702:47;27766:18;;1315:50:12;27449:341:13;1315:50:12;1375:21;1385:10;1375:9;:21::i;:::-;1275:128::o;2030:447:10:-;2233:15;;-1:-1:-1;;;;;2233:15:10;:29;2225:69;;;;-1:-1:-1;;;2225:69:10;;27997:2:13;2225:69:10;;;27979:21:13;28036:2;28016:18;;;28009:30;28075:29;28055:18;;;28048:57;28122:18;;2225:69:10;27795:351:13;2225:69:10;2304:15;:34;;-1:-1:-1;;;;;;2304:34:10;;;-1:-1:-1;;;;;2304:34:10;;;;;;;2348:9;:22;;;;;;;;;;;;;;2380:8;:20;;;;;;;;;;;;;;2410:11;:26;;;;;;;;;;;;;2446:10;:24;;;;;;;;;;;;;2030:447::o;13868:3500::-;13960:7;;;14054:33;14039:11;;;;:9;:11;:::i;:::-;:48;;;;;;;;:::i;:::-;;14035:3217;;14181:16;;;;;;;;:::i;:::-;14219:18;;;;;;;;:::i;:::-;14259:15;;;;;;;;:::i;:::-;14296:16;;;;14334:20;;;;;;;;:::i;:::-;14143:309;;-1:-1:-1;;;;;;28514:2:13;28510:15;;;28506:24;;14143:309:10;;;28494:37:13;28565:15;;;28561:24;;28547:12;;;28540:46;28620:15;;;;28616:24;;;28602:12;;;28595:46;28657:12;;;28650:28;;;;-1:-1:-1;;;;;;28801:3:13;28797:16;;;28793:25;;28779:12;;;28772:47;14383:13:10;28854:16:13;;;28850:25;;;28835:13;;;28828:48;14419:15:10;;;;28892:13:13;;;28885:29;28930:13;;14143:309:10;;;;;;-1:-1:-1;;14143:309:10;;;;;;;14116:350;;14143:309;14116:350;;;;14493:15;;-1:-1:-1;;;14530:41:10;;;;;8341:25:13;;;14116:350:10;;-1:-1:-1;;;;;;14493:15:10;;-1:-1:-1;14493:15:10;;14530:29;;8314:18:13;;14530:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;14575:4;14530:49;14522:84;;;;-1:-1:-1;;;14522:84:10;;29620:2:13;14522:84:10;;;29602:21:13;29659:2;29639:18;;;29632:30;29698:24;29678:18;;;29671:52;29740:18;;14522:84:10;29418:346:13;14522:84:10;14035:3217;;;14642:36;14627:11;;;;:9;:11;:::i;:::-;:51;;;;;;;;:::i;:::-;;14623:2629;;14779:13;14815:15;;;;;;;;:::i;:::-;14852:18;;;;;;;;:::i;:::-;14892:15;;;;;;;;:::i;:::-;14734:229;;-1:-1:-1;;;;;;30111:3:13;30107:16;;;30103:25;;14734:229:10;;;30091:38:13;30162:16;;;;30158:25;;;30145:11;;;30138:46;-1:-1:-1;;;;;;30272:2:13;30268:15;;;30264:24;;30250:12;;;30243:46;30323:15;;;30319:24;30305:12;;;30298:46;14929:16:10;;;;30360:12:13;;;30353:28;30397:12;;14734:229:10;;;;;;-1:-1:-1;;14734:229:10;;;;;;;14707:270;;14734:229;14707:270;;;;15004:15;;-1:-1:-1;;;15041:41:10;;;;;8341:25:13;;;14707:270:10;;-1:-1:-1;;;;;;15004:15:10;;-1:-1:-1;15004:15:10;;15041:29;;8314:18:13;;15041:41:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;15086:4;15041:49;15033:87;;;;-1:-1:-1;;;15033:87:10;;30622:2:13;15033:87:10;;;30604:21:13;30661:2;30641:18;;;30634:30;30700:27;30680:18;;;30673:55;30745:18;;15033:87:10;30420:349:13;14623:2629:10;15169:33;15154:11;;;;:9;:11;:::i;:::-;:48;;;;;;;;:::i;:::-;;:104;;;-1:-1:-1;15221:37:10;15206:11;;;;:9;:11;:::i;:::-;:52;;;;;;;;:::i;:::-;;15154:104;15137:2115;;;15361:18;;;;;;;;:::i;:::-;15401:15;;;;;;;;:::i;:::-;15438:16;;;;15476;;;;;;;;:::i;:::-;15514:20;;;;;;;;:::i;:::-;15323:266;;31111:2:13;31107:15;;;-1:-1:-1;;;;;;31103:24:13;;;15323:266:10;;;31091:37:13;31162:15;;;31158:24;;31144:12;;;31137:46;31199:12;;;31192:28;;;;31254:15;;31250:24;;;31236:12;;;31229:46;31313:3;31309:16;;;;-1:-1:-1;;;;;;31305:89:13;31291:12;;;31284:111;15556:15:10;;;;31411:13:13;;;31404:29;31449:13;;15323:266:10;;;-1:-1:-1;;15323:266:10;;;;;;;;;15296:307;;15323:266;15296:307;;;;;-1:-1:-1;15636:33:10;15621:11;;;;:9;:11;:::i;:::-;:48;;;;;;;;:::i;:::-;;15617:466;;-1:-1:-1;15702:9:10;;15737:50;;-1:-1:-1;;;15737:50:10;;;;;8341:25:13;;;-1:-1:-1;;;;;15702:9:10;;;;;;15737:38;;8314:18:13;;15737:50:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;15791:4;15737:58;15729:92;;;;-1:-1:-1;;;15729:92:10;;31675:2:13;15729:92:10;;;31657:21:13;31714:2;31694:18;;;31687:30;31753:23;31733:18;;;31726:51;31794:18;;15729:92:10;31473:345:13;15617:466:10;-1:-1:-1;15945:8:10;;15979:51;;-1:-1:-1;;;15979:51:10;;;;;8341:25:13;;;-1:-1:-1;;;;;15945:8:10;;;;;;15979:39;;8314:18:13;;15979:51:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;16034:4;15979:59;15971:97;;;;-1:-1:-1;;;15971:97:10;;32025:2:13;15971:97:10;;;32007:21:13;32064:2;32044:18;;;32037:30;32103:27;32083:18;;;32076:55;32148:18;;15971:97:10;31823:349:13;15137:2115:10;16131:35;16116:11;;;;:9;:11;:::i;:::-;:50;;;;;;;;:::i;:::-;;:108;;;-1:-1:-1;16185:39:10;16170:11;;;;:9;:11;:::i;:::-;:54;;;;;;;;:::i;:::-;;16116:108;16099:1153;;;16268:35;16253:11;;;;:9;:11;:::i;:::-;:50;;;;;;;;:::i;:::-;;16249:234;;-1:-1:-1;16336:11:10;;-1:-1:-1;;;;;16336:11:10;16249:234;;;-1:-1:-1;16458:10:10;;-1:-1:-1;;;;;16458:10:10;16249:234;16574:18;;;;;;;;:::i;:::-;16614:15;;;;;;;;:::i;:::-;16651:16;;;;16689;;;;;;;;:::i;:::-;16727:20;;;;;;;;:::i;:::-;16536:298;;32542:2:13;32538:15;;;-1:-1:-1;;;;;;32534:24:13;;;16536:298:10;;;32522:37:13;32593:15;;;32589:24;;32575:12;;;32568:46;32630:12;;;32623:28;;;;32685:15;;;32681:24;;32667:12;;;32660:46;32744:3;32740:16;-1:-1:-1;;;;;;32736:89:13;32722:12;;;32715:111;16769:15:10;;;;32842:13:13;;;32835:29;32899:15;;;;32895:24;32880:13;;;32873:47;32936:13;;16536:298:10;;;-1:-1:-1;;16536:298:10;;;;;;;;;16509:339;;16536:298;16509:339;;;;;-1:-1:-1;16881:35:10;16866:11;;;;:9;:11;:::i;:::-;:50;;;;;;;;:::i;:::-;;16862:380;;16944:52;;-1:-1:-1;;;16944:52:10;;;;;8341:25:13;;;-1:-1:-1;;;;;16944:40:10;;;;;8314:18:13;;16944:52:10;8195:177:13;16862:380:10;17136:53;;-1:-1:-1;;;17136:53:10;;;;;8341:25:13;;;-1:-1:-1;;;;;17136:41:10;;;;;8314:18:13;;17136:53:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;17193:4;17136:61;17128:99;;;;-1:-1:-1;;;17128:99:10;;32025:2:13;17128:99:10;;;32007:21:13;32064:2;32044:18;;;32037:30;32103:27;32083:18;;;32076:55;32148:18;;17128:99:10;31823:349:13;17128:99:10;17295:40;17337:10;17349;17278:82;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17268:93;;;;;;17261:100;;;;13868:3500;;;:::o;11260:878::-;11400:35;11451:30;11484:9;11451:42;-1:-1:-1;11504:7:10;;11541:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;11533:32:10;11573:9;-1:-1:-1;;;11710:16:10;;;;;;;;:::i;:::-;11744:15;;;;;;;;:::i;:::-;11777:16;;;;11811:20;;;;;;;;:::i;:::-;11849:8;;11875:10;11597:302;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11597:302:10;;;;;;;;;;;;;;-1:-1:-1;;;;;11597:302:10;-1:-1:-1;;;;;;11597:302:10;;;;;;;;;;11533:376;;;;11597:302;11533:376;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11503:406;;;;11923:2;11919:96;;;11960:3;11948:56;;;;;;;;;;;;:::i;:::-;11941:63;;;;;;;11919:96;12024:50;12046:22;12070:3;12024:21;:50::i;:::-;12091:40;12084:47;;;;;11260:878;;;;;;:::o;12144:894::-;12292:35;12343:30;12376:9;12343:42;-1:-1:-1;12396:7:10;;12433:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;12425:32:10;12465:9;-1:-1:-1;;;12610:16:10;;;;;;;;:::i;10447:419::-;10764:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10643:216:10;;10665:40;10719:10;10743:7;10796:20;;;;;;;;:::i;:::-;10830:9;:19;;;10643:216;;;;;;;;;;:::i;:::-;;;;;;;;10447:419;;;:::o;22977:1868::-;23130:33;23125:1;:38;;;;;;;;:::i;:::-;;23121:1718;;23187:15;;-1:-1:-1;;;;;23187:15:10;23179:30;23227:23;:15;;:23;:::i;:::-;23268:20;;;;:15;:20;:::i;:::-;23306:23;;;;:15;:23;:::i;:::-;23347:22;;;;:15;:22;:::i;:::-;23179:204;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22505:466;;:::o;23121:1718::-;23409:36;23404:1;:41;;;;;;;;:::i;:::-;;23400:1439;;23469:15;;-1:-1:-1;;;;;23469:15:10;23461:33;23512:23;:15;;:23;:::i;23400:1439::-;23694:33;23689:1;:38;;;;;;;;:::i;:::-;;23685:1154;;23762:9;;-1:-1:-1;;;;;23762:9:10;23743:34;23795:23;:15;;:23;:::i;23685:1154::-;23977:35;23972:1;:40;;;;;;;;:::i;:::-;;23968:871;;24049:11;;-1:-1:-1;;;;;24049:11:10;24028:38;24084:23;:15;;:23;:::i;:::-;24125:20;;;;:15;:20;:::i;:::-;24163:23;;;;:15;:23;:::i;:::-;24204:22;;;;:15;:22;:::i;:::-;24028:212;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;22505:466;;:::o;23968:871::-;24266:37;24261:1;:42;;;;;;;;:::i;:::-;;24257:582;;24339:8;;-1:-1:-1;;;;;24339:8:10;24319:38;24375:23;:15;;:23;:::i;24257:582::-;24557:39;24552:1;:44;;;;;;;;:::i;:::-;;24548:291;;24634:10;;-1:-1:-1;;;;;24634:10:10;24612:42;24672:23;:15;;:23;:::i;20929:226::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21057:91:10;;;;;;;;;;21076:13;;;;:6;:13;:::i;:::-;-1:-1:-1;;;;;21057:91:10;;;;;;;;;;;;;;;;;;;;;21095:6;:15;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;21057:91:10;;;;;21112:17;;;;;;;;:::i;:::-;21057:91;;;;;;21131:6;:16;;;21057:91;;;21050:98;;20929:226;;;:::o;8783:1582::-;9224:17;9244:38;9265:6;9273:8;;9244:20;:38::i;:::-;9224:58;-1:-1:-1;9331:26:10;9300:27;;;;:16;:27;;;;;;;;;;;;:57;;;;;;;:::i;:::-;;9292:94;;;;-1:-1:-1;;;9292:94:10;;36713:2:13;9292:94:10;;;36695:21:13;36752:2;36732:18;;;36725:30;36791:26;36771:18;;;36764:54;36835:18;;9292:94:10;36511:348:13;9292:94:10;9396:27;;;;9426:29;9396:27;;;;;;;;:59;;-1:-1:-1;;9396:59:10;;;;;;;9493:58;;;;9510:13;;9533:4;;9540:10;;9493:58;;:::i;:::-;;;;-1:-1:-1;;9493:58:10;;;;;;;;;9483:69;;9493:58;9483:69;;;;9570:15;;9598:35;;;37499:19:13;;;37534:12;;;37527:28;;;9598:35:10;;;;;;;;;37571:12:13;;;9598:35:10;;;;-1:-1:-1;;;9562:98:10;;;9483:69;-1:-1:-1;;;;;;9570:15:10;;9562:35;;:98;;9635:5;;;;9642:8;;;;9652:7;;;;9562:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9670:28;9708:39;9750:32;9765:6;9773:8;;9750:14;:32::i;:::-;9708:74;-1:-1:-1;9803:43:10;9796:3;:50;;;;;;;;:::i;:::-;;9792:456;;9871:29;9862:38;;9792:456;;;9928:41;9921:3;:48;;;;;;;;:::i;:::-;;9917:331;;10015:26;9985:27;;;:16;:27;;;;;;;:56;;-1:-1:-1;;9985:56:10;;;10115:17;;;;10134:16;;;;10060:91;;;;;;9985:56;;:27;;10134:16;10060:91;:::i;:::-;;;;;;;;10165:7;;;;;;9917:331;10211:26;10202:35;;9917:331;10257:27;;;;:16;:27;;;;;;;;:36;;10287:6;;-1:-1:-1;;10257:36:10;;;;;;10287:6;;10257:36;;;;;;;:::i;:::-;;;;;;10303:55;10332:9;10343:6;10351;10303:28;:55::i;:::-;9035:1330;;;;8783:1582;;;;;;;;;;:::o;13044:818::-;13190:35;13241:30;13274:9;13241:42;-1:-1:-1;13294:7:10;;13331:18;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13323:32:10;13363:9;-1:-1:-1;;;13506:15:10;;;;;;;;:::i;:::-;13539:9;:16;;;13573:8;;13599:10;13387:236;;;;;;;;;;;;:::i;2359:251:11:-;2468:13;2453:11;:28;2445:56;;;;-1:-1:-1;;;2445:56:11;;24014:2:13;2445:56:11;;;23996:21:13;24053:2;24033:18;;;24026:30;-1:-1:-1;;;24072:18:13;;;24065:45;24127:18;;2445:56:11;23812:339:13;2445:56:11;2511:14;2528:17;2536:8;;2528:7;:17::i;:::-;2511:34;;2576:6;2563:9;:19;;2555:48;;;;-1:-1:-1;;;2555:48:11;;24358:2:13;2555:48:11;;;24340:21:13;24397:2;24377:18;;;24370:30;-1:-1:-1;;;24416:18:13;;;24409:46;24472:18;;2555:48:11;24156:340:13;2555:48:11;2435:175;2359:251;;;:::o;21161:235:10:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21290:99:10;;;;;;;;;-1:-1:-1;21290:99:10;;;;;21321:13;:6;;:13;:::i;:::-;21290:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21290:99:10;;;-1:-1:-1;21290:99:10;;;;;21336:15;;;;;;;;;:::i;2111:169:12:-;2166:16;2185:6;;-1:-1:-1;;;;;2201:17:12;;;-1:-1:-1;;;;;;2201:17:12;;;;;;2233:40;;2185:6;;;;;;;2233:40;;2166:16;2233:40;2156:124;2111:169;:::o;19369:1033:10:-;19477:29;19509:9;19477:41;;19528:25;19573;;19556:14;:42;;;;:::i;:::-;19528:70;;19638:17;19612:23;:43;:100;;;;-1:-1:-1;19684:28:10;19710:2;19684:23;:28;:::i;:::-;19659:21;:53;;19612:100;19608:471;;;20046:9;19608:471;20088:23;20114:31;20133:11;20114:18;:31::i;:::-;20088:57;;20230:27;20247:9;20230:16;:27::i;:::-;20372:23;20385:9;20372:23;;;;;;:::i;:::-;;;;;;;;19467:935;;;19369:1033;;:::o;17374:676::-;17554:18;;;;17586:13;;17509:7;;17554:18;17586;;17582:89;;17646:13;;17629:31;;;;17646:13;17629:31;;38732:2:13;38728:15;;;;-1:-1:-1;;;;;;38724:53:13;38712:66;;38803:2;38794:12;;38583:229;17629:31:10;;;;;;;;;;;;;17620:40;;17582:89;17764:32;17818:6;17846;:15;;;17883:6;:17;;;17922:6;:16;;;17967:13;18003:8;;17726:303;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17699:344;;;;;;17680:363;;;17374:676;;;;;:::o;18056:1307::-;18172:35;18223:30;18256:9;18223:42;;18275:7;18292:16;18322:6;:18;;;:25;18351:1;18322:30;18318:817;;18388:6;:15;;;-1:-1:-1;;;;;18380:29:10;18417:9;18506:53;;;;;;;;;;;;;;;;;18496:64;;;;;;;18583:13;;18618:17;;;;18445:270;;;;18583:13;18618:17;18657:8;;;;18687:10;;18445:270;;;:::i;:::-;;;;-1:-1:-1;;18445:270:10;;;;;;;;;;;;;;-1:-1:-1;;;;;18445:270:10;-1:-1:-1;;;;;;18445:270:10;;;;;;;;;;18380:349;;;;18445:270;18380:349;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18368:361:10;;-1:-1:-1;18368:361:10;-1:-1:-1;18318:817:10;;;18780:6;:15;;;-1:-1:-1;;;;;18772:29:10;18809:9;18898:51;;;;;;;;;;;;;;;;;18888:62;;;;;;18973:6;:18;;;19013:6;:17;;;19052:8;;19082:10;18837:273;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;18837:273:10;;;;;;;;;;;;;;-1:-1:-1;;;;;18837:273:10;-1:-1:-1;;;;;;18837:273:10;;;;;;;;;;18772:352;;;;18837:273;18772:352;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18760:364:10;;-1:-1:-1;18760:364:10;-1:-1:-1;18318:817:10;19148:2;19144:96;;;19185:3;19173:56;;;;;;;;;;;;:::i;10872:382::-;11161:6;:15;;;-1:-1:-1;;;;;11048:199:10;;11070:32;11116:10;11140:7;11190:6;:17;;;11221:6;:16;;;11048:199;;;;;;;;;;:::i;226:485:6:-;297:13;458:2;437:11;:18;:23;433:67;;;-1:-1:-1;;462:38:6;;;;;;;;;;;;;;;;;;226:485::o;433:67::-;599:4;586:11;582:22;567:37;;641:11;630:33;;;;;;;;;;;;:::i;20408:515:10:-;20516:25;;;;;;;;;;;;;;;;;;20607:15;;20582:10;;-1:-1:-1;20603:314:10;;20665:9;20660:191;20684:11;:18;20680:1;:22;20660:191;;;20746:11;20758:1;20746:14;;;;;;;;:::i;:::-;;;;;;;;;20731:29;;;:8;20740:1;20731:11;;;;;;;;:::i;:::-;;;;;;;:29;20727:110;;20784:7;;;20408:515;:::o;20727:110::-;20704:3;;;;:::i;:::-;;;;20660:191;;;;20871:10;20864:18;;-1:-1:-1;;;20864:18:10;;;;;;;;:::i;14:196:13:-;82:20;;-1:-1:-1;;;;;131:54:13;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;406:180::-;465:6;518:2;506:9;497:7;493:23;489:32;486:52;;;534:1;531;524:12;486:52;-1:-1:-1;557:23:13;;406:180;-1:-1:-1;406:180:13:o;591:374::-;661:8;671:6;725:3;718:4;710:6;706:17;702:27;692:55;;743:1;740;733:12;692:55;-1:-1:-1;766:20:13;;809:18;798:30;;795:50;;;841:1;838;831:12;795:50;878:4;870:6;866:17;854:29;;938:3;931:4;921:6;918:1;914:14;906:6;902:27;898:38;895:47;892:67;;;955:1;952;945:12;892:67;591:374;;;;;:::o;970:1264::-;1157:6;1165;1173;1181;1189;1197;1205;1213;1266:3;1254:9;1245:7;1241:23;1237:33;1234:53;;;1283:1;1280;1273:12;1234:53;1306:29;1325:9;1306:29;:::i;:::-;1296:39;;1382:2;1371:9;1367:18;1354:32;1344:42;;1437:2;1426:9;1422:18;1409:32;1460:18;1501:2;1493:6;1490:14;1487:34;;;1517:1;1514;1507:12;1487:34;1556:77;1625:7;1616:6;1605:9;1601:22;1556:77;:::i;:::-;1652:8;;-1:-1:-1;1530:103:13;-1:-1:-1;1740:2:13;1725:18;;1712:32;;-1:-1:-1;1756:16:13;;;1753:36;;;1785:1;1782;1775:12;1753:36;1824:79;1895:7;1884:8;1873:9;1869:24;1824:79;:::i;:::-;1922:8;;-1:-1:-1;1798:105:13;-1:-1:-1;2010:3:13;1995:19;;1982:33;;-1:-1:-1;2027:16:13;;;2024:36;;;2056:1;2053;2046:12;2024:36;;2095:79;2166:7;2155:8;2144:9;2140:24;2095:79;:::i;:::-;970:1264;;;;-1:-1:-1;970:1264:13;;-1:-1:-1;970:1264:13;;;;;;2193:8;-1:-1:-1;;;970:1264:13:o;2239:484::-;2334:6;2342;2350;2358;2366;2419:3;2407:9;2398:7;2394:23;2390:33;2387:53;;;2436:1;2433;2426:12;2387:53;2459:29;2478:9;2459:29;:::i;:::-;2449:39;;2507:38;2541:2;2530:9;2526:18;2507:38;:::i;:::-;2497:48;;2564:38;2598:2;2587:9;2583:18;2564:38;:::i;:::-;2554:48;;2621:38;2655:2;2644:9;2640:18;2621:38;:::i;:::-;2611:48;;2678:39;2712:3;2701:9;2697:19;2678:39;:::i;:::-;2668:49;;2239:484;;;;;;;;:::o;2728:347::-;2779:8;2789:6;2843:3;2836:4;2828:6;2824:17;2820:27;2810:55;;2861:1;2858;2851:12;2810:55;-1:-1:-1;2884:20:13;;2927:18;2916:30;;2913:50;;;2959:1;2956;2949:12;2913:50;2996:4;2988:6;2984:17;2972:29;;3048:3;3041:4;3032:6;3024;3020:19;3016:30;3013:39;3010:59;;;3065:1;3062;3055:12;3080:1572;3309:6;3317;3325;3333;3341;3349;3357;3365;3373;3417:9;3408:7;3404:23;3447:3;3443:2;3439:12;3436:32;;;3464:1;3461;3454:12;3436:32;3504:9;3491:23;3533:18;3574:2;3566:6;3563:14;3560:34;;;3590:1;3587;3580:12;3560:34;3629:58;3679:7;3670:6;3659:9;3655:22;3629:58;:::i;:::-;3706:8;;-1:-1:-1;3603:84:13;-1:-1:-1;3603:84:13;;-1:-1:-1;3775:3:13;-1:-1:-1;;3757:16:13;;3753:26;3750:46;;;3792:1;3789;3782:12;3750:46;3830:2;3819:9;3815:18;3805:28;;3886:3;3875:9;3871:19;3858:33;3842:49;;3916:2;3906:8;3903:16;3900:36;;;3932:1;3929;3922:12;3900:36;3971:79;4042:7;4031:8;4020:9;4016:24;3971:79;:::i;:::-;3945:105;;-1:-1:-1;3945:105:13;-1:-1:-1;4157:3:13;4142:19;;4129:33;;-1:-1:-1;3945:105:13;;-1:-1:-1;4174:16:13;;;4171:36;;;4203:1;4200;4193:12;4171:36;4242:79;4313:7;4302:8;4291:9;4287:24;4242:79;:::i;:::-;4216:105;;-1:-1:-1;4216:105:13;-1:-1:-1;4428:3:13;4413:19;;4400:33;;-1:-1:-1;4216:105:13;;-1:-1:-1;4445:16:13;;;4442:36;;;4474:1;4471;4464:12;4442:36;;;4513:79;4584:7;4573:8;4562:9;4558:24;4513:79;:::i;:::-;4487:105;;4611:8;4601:18;;;4638:8;4628:18;;;3080:1572;;;;;;;;;;;:::o;4657:169::-;4730:5;4775:3;4766:6;4761:3;4757:16;4753:26;4750:46;;;4792:1;4789;4782:12;4750:46;-1:-1:-1;4814:6:13;4657:169;-1:-1:-1;4657:169:13:o;4831:689::-;4987:6;4995;5048:2;5036:9;5027:7;5023:23;5019:32;5016:52;;;5064:1;5061;5054:12;5016:52;5104:9;5091:23;5133:18;5174:2;5166:6;5163:14;5160:34;;;5190:1;5187;5180:12;5160:34;5213:80;5285:7;5276:6;5265:9;5261:22;5213:80;:::i;:::-;5203:90;;5346:2;5335:9;5331:18;5318:32;5302:48;;5375:2;5365:8;5362:16;5359:36;;;5391:1;5388;5381:12;5359:36;-1:-1:-1;5414:24:13;;5472:3;5454:16;;;5450:26;5447:46;;;5489:1;5486;5479:12;5447:46;5512:2;5502:12;;;4831:689;;;;;:::o;5525:695::-;5631:6;5639;5647;5655;5663;5671;5724:3;5712:9;5703:7;5699:23;5695:33;5692:53;;;5741:1;5738;5731:12;5692:53;5764:29;5783:9;5764:29;:::i;:::-;5754:39;;5840:2;5829:9;5825:18;5812:32;5802:42;;5863:38;5897:2;5886:9;5882:18;5863:38;:::i;:::-;5853:48;;5948:2;5937:9;5933:18;5920:32;5910:42;;6003:3;5992:9;5988:19;5975:33;6031:18;6023:6;6020:30;6017:50;;;6063:1;6060;6053:12;6017:50;6102:58;6152:7;6143:6;6132:9;6128:22;6102:58;:::i;:::-;5525:695;;;;-1:-1:-1;5525:695:13;;-1:-1:-1;5525:695:13;;6179:8;;5525:695;-1:-1:-1;;;5525:695:13:o;6225:1551::-;6451:6;6459;6467;6475;6483;6491;6499;6507;6515;6568:3;6556:9;6547:7;6543:23;6539:33;6536:53;;;6585:1;6582;6575:12;6536:53;6625:9;6612:23;6654:18;6695:2;6687:6;6684:14;6681:34;;;6711:1;6708;6701:12;6681:34;6750:58;6800:7;6791:6;6780:9;6776:22;6750:58;:::i;:::-;6827:8;;-1:-1:-1;6724:84:13;-1:-1:-1;6724:84:13;;-1:-1:-1;6881:76:13;6949:7;6944:2;6929:18;;6881:76;:::i;:::-;6871:86;;7010:3;6999:9;6995:19;6982:33;6966:49;;7040:2;7030:8;7027:16;7024:36;;;7056:1;7053;7046:12;7024:36;7095:79;7166:7;7155:8;7144:9;7140:24;7095:79;:::i;:::-;7193:8;;-1:-1:-1;7069:105:13;-1:-1:-1;7281:3:13;7266:19;;7253:33;;-1:-1:-1;7298:16:13;;;7295:36;;;7327:1;7324;7317:12;7295:36;7366:79;7437:7;7426:8;7415:9;7411:24;7366:79;:::i;:::-;7464:8;;-1:-1:-1;7340:105:13;-1:-1:-1;7552:3:13;7537:19;;7524:33;;-1:-1:-1;7569:16:13;;;7566:36;;;7598:1;7595;7588:12;7566:36;;7637:79;7708:7;7697:8;7686:9;7682:24;7637:79;:::i;7781:409::-;7851:6;7859;7912:2;7900:9;7891:7;7887:23;7883:32;7880:52;;;7928:1;7925;7918:12;7880:52;7968:9;7955:23;8001:18;7993:6;7990:30;7987:50;;;8033:1;8030;8023:12;7987:50;8072:58;8122:7;8113:6;8102:9;8098:22;8072:58;:::i;:::-;8149:8;;8046:84;;-1:-1:-1;7781:409:13;-1:-1:-1;;;;7781:409:13:o;8377:785::-;8476:6;8484;8492;8500;8508;8561:2;8549:9;8540:7;8536:23;8532:32;8529:52;;;8577:1;8574;8567:12;8529:52;8617:9;8604:23;8646:18;8687:2;8679:6;8676:14;8673:34;;;8703:1;8700;8693:12;8673:34;8742:58;8792:7;8783:6;8772:9;8768:22;8742:58;:::i;:::-;8819:8;;-1:-1:-1;8716:84:13;-1:-1:-1;8901:2:13;8886:18;;8873:32;;-1:-1:-1;8958:2:13;8943:18;;8930:32;;-1:-1:-1;8974:16:13;;;8971:36;;;9003:1;9000;8993:12;8971:36;;9042:60;9094:7;9083:8;9072:9;9068:24;9042:60;:::i;:::-;8377:785;;;;-1:-1:-1;8377:785:13;;-1:-1:-1;9121:8:13;;9016:86;8377:785;-1:-1:-1;;;8377:785:13:o;9398:551::-;9486:6;9494;9502;9510;9563:2;9551:9;9542:7;9538:23;9534:32;9531:52;;;9579:1;9576;9569:12;9531:52;9602:29;9621:9;9602:29;:::i;:::-;9592:39;;9678:2;9667:9;9663:18;9650:32;9640:42;;9733:2;9722:9;9718:18;9705:32;9760:18;9752:6;9749:30;9746:50;;;9792:1;9789;9782:12;9746:50;9831:58;9881:7;9872:6;9861:9;9857:22;9831:58;:::i;:::-;9398:551;;;;-1:-1:-1;9908:8:13;-1:-1:-1;;;;9398:551:13:o;10391:127::-;10452:10;10447:3;10443:20;10440:1;10433:31;10483:4;10480:1;10473:15;10507:4;10504:1;10497:15;10523:139;10603:1;10596:5;10593:12;10583:46;;10609:18;;:::i;:::-;10638;;10523:139::o;10667:205::-;10811:2;10796:18;;10823:43;10800:9;10848:6;10823:43;:::i;10877:1658::-;11104:6;11112;11120;11128;11136;11144;11152;11160;11168;11221:3;11209:9;11200:7;11196:23;11192:33;11189:53;;;11238:1;11235;11228:12;11189:53;11278:9;11265:23;11307:18;11348:2;11340:6;11337:14;11334:34;;;11364:1;11361;11354:12;11334:34;11403:58;11453:7;11444:6;11433:9;11429:22;11403:58;:::i;:::-;11480:8;;-1:-1:-1;11377:84:13;-1:-1:-1;11568:2:13;11553:18;;11540:32;;-1:-1:-1;11584:16:13;;;11581:36;;;11613:1;11610;11603:12;11581:36;11636:82;11710:7;11699:8;11688:9;11684:24;11636:82;:::i;:::-;11626:92;;11771:2;11760:9;11756:18;11743:32;11727:48;;11800:2;11790:8;11787:16;11784:36;;;11816:1;11813;11806:12;11784:36;11855:79;11926:7;11915:8;11904:9;11900:24;11855:79;:::i;:::-;11953:8;;-1:-1:-1;11829:105:13;-1:-1:-1;12041:2:13;12026:18;;12013:32;;-1:-1:-1;12057:16:13;;;12054:36;;;12086:1;12083;12076:12;12054:36;12125:79;12196:7;12185:8;12174:9;12170:24;12125:79;:::i;:::-;12223:8;;-1:-1:-1;12099:105:13;-1:-1:-1;12311:3:13;12296:19;;12283:33;;-1:-1:-1;12328:16:13;;;12325:36;;;12357:1;12354;12347:12;14053:250;14138:1;14148:113;14162:6;14159:1;14156:13;14148:113;;;14238:11;;;14232:18;14219:11;;;14212:39;14184:2;14177:10;14148:113;;;-1:-1:-1;;14295:1:13;14277:16;;14270:27;14053:250::o;14308:270::-;14349:3;14387:5;14381:12;14414:6;14409:3;14402:19;14430:76;14499:6;14492:4;14487:3;14483:14;14476:4;14469:5;14465:16;14430:76;:::i;:::-;14560:2;14539:15;-1:-1:-1;;14535:29:13;14526:39;;;;14567:4;14522:50;;14308:270;-1:-1:-1;;14308:270:13:o;14583:266::-;14671:6;14666:3;14659:19;14723:6;14716:5;14709:4;14704:3;14700:14;14687:43;-1:-1:-1;14775:1:13;14750:16;;;14768:4;14746:27;;;14739:38;;;;14831:2;14810:15;;;-1:-1:-1;;14806:29:13;14797:39;;;14793:50;;14583:266::o;14854:1067::-;14961:6;14956:3;14949:19;14931:3;14987:4;15028:2;15023:3;15019:12;15053:11;15080;15073:18;;15130:6;15127:1;15123:14;15116:5;15112:26;15100:38;;15161:5;15184:1;15194:701;15208:6;15205:1;15202:13;15194:701;;;15279:5;15273:4;15269:16;15264:3;15257:29;15338:6;15325:20;15428:2;15424:7;15416:5;15400:14;15396:26;15392:40;15372:18;15368:65;15358:93;;15447:1;15444;15437:12;15358:93;15479:30;;15587:16;;;;15538:21;15632:18;15619:32;;15616:52;;;15664:1;15661;15654:12;15616:52;15717:8;15701:14;15697:29;15688:7;15684:43;15681:63;;;15740:1;15737;15730:12;15681:63;15765:50;15810:4;15800:8;15791:7;15765:50;:::i;:::-;15873:12;;;;15757:58;-1:-1:-1;;;15838:15:13;;;;15230:1;15223:9;15194:701;;;-1:-1:-1;15911:4:13;;14854:1067;-1:-1:-1;;;;;;;14854:1067:13:o;15926:470::-;16026:6;16021:3;16014:19;15996:3;16052:4;16081:2;16076:3;16072:12;16065:19;;16107:5;16130:1;16140:231;16154:6;16151:1;16148:13;16140:231;;;-1:-1:-1;;;;;16219:26:13;16238:6;16219:26;:::i;:::-;16215:75;16203:88;;16311:12;;;;16346:15;;;;16176:1;16169:9;16140:231;;;-1:-1:-1;16387:3:13;;15926:470;-1:-1:-1;;;;;15926:470:13:o;16401:358::-;16501:6;16496:3;16489:19;16471:3;16531:66;16523:6;16520:78;16517:98;;;16611:1;16608;16601:12;16517:98;16647:6;16644:1;16640:14;16699:8;16692:5;16685:4;16680:3;16676:14;16663:45;16728:18;;;;16748:4;16724:29;;16401:358;-1:-1:-1;;;16401:358:13:o;16764:939::-;17195:3;17184:9;17177:22;17158:4;17222:45;17262:3;17251:9;17247:19;17239:6;17222:45;:::i;:::-;17315:9;17307:6;17303:22;17298:2;17287:9;17283:18;17276:50;17349:68;17410:6;17402;17394;17349:68;:::i;:::-;17335:82;;17465:9;17457:6;17453:22;17448:2;17437:9;17433:18;17426:50;17499:61;17553:6;17545;17537;17499:61;:::i;:::-;17485:75;;17608:9;17600:6;17596:22;17591:2;17580:9;17576:18;17569:50;17636:61;17690:6;17682;17674;17636:61;:::i;:::-;17628:69;16764:939;-1:-1:-1;;;;;;;;;;16764:939:13:o;17708:127::-;17769:10;17764:3;17760:20;17757:1;17750:31;17800:4;17797:1;17790:15;17824:4;17821:1;17814:15;17840:128;17907:9;;;17928:11;;;17925:37;;;17942:18;;:::i;19996:452::-;20249:6;20244:3;20237:19;20286:6;20281:2;20276:3;20272:12;20265:28;20337:6;20329;20324:2;20319:3;20315:12;20302:42;20403:2;20363:16;;20395:11;;;20388:27;20439:2;20431:11;;19996:452;-1:-1:-1;;;19996:452:13:o;20453:284::-;20511:6;20564:2;20552:9;20543:7;20539:23;20535:32;20532:52;;;20580:1;20577;20570:12;20532:52;20619:9;20606:23;20669:18;20662:5;20658:30;20651:5;20648:41;20638:69;;20703:1;20700;20693:12;20742:147;20830:1;20823:5;20820:12;20810:46;;20836:18;;:::i;20894:449::-;21119:3;21104:19;;21132:51;21108:9;21165:6;21132:51;:::i;:::-;21219:6;21214:2;21203:9;21199:18;21192:34;21274:18;21266:6;21262:31;21257:2;21246:9;21242:18;21235:59;21330:6;21325:2;21314:9;21310:18;21303:34;20894:449;;;;;;;:::o;21348:272::-;21423:6;21476:2;21464:9;21455:7;21451:23;21447:32;21444:52;;;21492:1;21489;21482:12;21444:52;21531:9;21518:23;21570:1;21563:5;21560:12;21550:40;;21586:1;21583;21576:12;21625:521;21702:4;21708:6;21768:11;21755:25;21862:2;21858:7;21847:8;21831:14;21827:29;21823:43;21803:18;21799:68;21789:96;;21881:1;21878;21871:12;21789:96;21908:33;;21960:20;;;-1:-1:-1;22003:18:13;21992:30;;21989:50;;;22035:1;22032;22025:12;21989:50;22068:4;22056:17;;-1:-1:-1;22099:14:13;22095:27;;;22085:38;;22082:58;;;22136:1;22133;22126:12;22151:556;22255:4;22261:6;22321:11;22308:25;22415:2;22411:7;22400:8;22384:14;22380:29;22376:43;22356:18;22352:68;22342:96;;22434:1;22431;22424:12;22342:96;22461:33;;22513:20;;;-1:-1:-1;22556:18:13;22545:30;;22542:50;;;22588:1;22585;22578:12;22542:50;22621:4;22609:17;;-1:-1:-1;22672:1:13;22668:14;;;22652;22648:35;22638:46;;22635:66;;;22697:1;22694;22687:12;24501:682;24761:4;-1:-1:-1;;;;;24871:2:13;24863:6;24859:15;24848:9;24841:34;24911:6;24906:2;24895:9;24891:18;24884:34;24966:2;24958:6;24954:15;24949:2;24938:9;24934:18;24927:43;;25006:6;25001:2;24990:9;24986:18;24979:34;25050:3;25044;25033:9;25029:19;25022:32;25071:62;25128:3;25117:9;25113:19;25105:6;25097;25071:62;:::i;:::-;25063:70;;25170:6;25164:3;25153:9;25149:19;25142:35;24501:682;;;;;;;;;;:::o;25188:168::-;25261:9;;;25292;;25309:15;;;25303:22;;25289:37;25279:71;;25330:18;;:::i;25361:125::-;25426:9;;;25447:10;;;25444:36;;;25460:18;;:::i;25949:575::-;26218:3;26207:9;26200:22;26181:4;26245:62;26302:3;26291:9;26287:19;26279:6;26271;26245:62;:::i;:::-;26343:6;26338:2;26327:9;26323:18;26316:34;26398:9;26390:6;26386:22;26381:2;26370:9;26366:18;26359:50;26426:49;26468:6;26460;26452;26426:49;:::i;:::-;26418:57;;;26511:6;26506:2;26495:9;26491:18;26484:34;25949:575;;;;;;;;;:::o;26529:508::-;-1:-1:-1;;;;;26774:6:13;26770:55;26759:9;26752:74;26862:6;26857:2;26846:9;26842:18;26835:34;26905:3;26900:2;26889:9;26885:18;26878:31;26733:4;26926:62;26983:3;26972:9;26968:19;26960:6;26952;26926:62;:::i;:::-;26918:70;;27024:6;27019:2;27008:9;27004:18;26997:34;26529:508;;;;;;;;:::o;29136:277::-;29203:6;29256:2;29244:9;29235:7;29231:23;29227:32;29224:52;;;29272:1;29269;29262:12;29224:52;29304:9;29298:16;29357:5;29350:13;29343:21;29336:5;29333:32;29323:60;;29379:1;29376;29369:12;32960:148;33039:1;33032:5;33029:12;33019:46;;33045:18;;:::i;:::-;33090:3;33086:15;33074:28;;32960:148::o;33113:384::-;33307:36;33339:3;33331:6;33307:36;:::i;:::-;33380:2;33376:15;;;;-1:-1:-1;;;;;;33372:53:13;33368:1;33359:11;;33352:74;33451:2;33442:12;;33435:28;33488:2;33479:12;;33113:384;-1:-1:-1;33113:384:13:o;33502:714::-;33760:4;-1:-1:-1;;;;;33870:2:13;33862:6;33858:15;33847:9;33840:34;33922:2;33914:6;33910:15;33905:2;33894:9;33890:18;33883:43;33962:6;33957:2;33946:9;33942:18;33935:34;34017:18;34009:6;34005:31;34000:2;33989:9;33985:18;33978:59;34074:3;34068;34057:9;34053:19;34046:32;34095:62;34152:3;34141:9;34137:19;34129:6;34121;34095:62;:::i;:::-;34087:70;;34206:2;34198:6;34194:15;34188:3;34177:9;34173:19;34166:44;;33502:714;;;;;;;;;;:::o;34221:287::-;34350:3;34388:6;34382:13;34404:66;34463:6;34458:3;34451:4;34443:6;34439:17;34404:66;:::i;:::-;34486:16;;;;;34221:287;-1:-1:-1;;34221:287:13:o;34513:279::-;34602:6;34655:2;34643:9;34634:7;34630:23;34626:32;34623:52;;;34671:1;34668;34661:12;34623:52;34703:9;34697:16;34742:1;34735:5;34732:12;34722:40;;34758:1;34755;34748:12;34797:549;35060:3;35045:19;;35073:51;35049:9;35106:6;35073:51;:::i;:::-;35160:6;35155:2;35144:9;35140:18;35133:34;35176:52;35224:2;35213:9;35209:18;35201:6;35176:52;:::i;:::-;35276:18;35264:31;;;;35259:2;35244:18;;35237:59;35327:3;35312:19;35305:35;34797:549;;-1:-1:-1;;;34797:549:13:o;35351:966::-;35792:3;35781:9;35774:22;35755:4;35819:62;35876:3;35865:9;35861:19;35853:6;35845;35819:62;:::i;:::-;35929:9;35921:6;35917:22;35912:2;35901:9;35897:18;35890:50;35963:68;36024:6;36016;36008;35963:68;:::i;:::-;35949:82;;36079:9;36071:6;36067:22;36062:2;36051:9;36047:18;36040:50;36113:61;36167:6;36159;36151;36113:61;:::i;:::-;36099:75;;36222:9;36214:6;36210:22;36205:2;36194:9;36190:18;36183:50;36250:61;36304:6;36296;36288;36250:61;:::i;:::-;36242:69;35351:966;-1:-1:-1;;;;;;;;;;;35351:966:13:o;36322:184::-;36392:6;36445:2;36433:9;36424:7;36420:23;36416:32;36413:52;;;36461:1;36458;36451:12;36413:52;-1:-1:-1;36484:16:13;;36322:184;-1:-1:-1;36322:184:13:o;36864:473::-;37081:6;37076:3;37069:19;37143:26;37139:31;37130:6;37126:2;37122:15;37118:53;37113:2;37108:3;37104:12;37097:75;37051:3;37201:6;37195:13;37217:73;37283:6;37278:2;37273:3;37269:12;37264:2;37256:6;37252:15;37217:73;:::i;:::-;37310:16;;;;37328:2;37306:25;;36864:473;-1:-1:-1;;;;36864:473:13:o;37594:538::-;37798:4;-1:-1:-1;;;;;37908:2:13;37900:6;37896:15;37885:9;37878:34;37948:6;37943:2;37932:9;37928:18;37921:34;37991:3;37986:2;37975:9;37971:18;37964:31;38012:62;38069:3;38058:9;38054:19;38046:6;38038;38012:62;:::i;:::-;38004:70;;38122:2;38114:6;38110:15;38105:2;38094:9;38090:18;38083:43;;37594:538;;;;;;;;:::o;38137:217::-;38177:1;38203;38193:132;;38247:10;38242:3;38238:20;38235:1;38228:31;38282:4;38279:1;38272:15;38310:4;38307:1;38300:15;38193:132;-1:-1:-1;38339:9:13;;38137:217::o;38359:219::-;38508:2;38497:9;38490:21;38471:4;38528:44;38568:2;38557:9;38553:18;38545:6;38528:44;:::i;38817:990::-;39165:36;39197:3;39189:6;39165:36;:::i;:::-;39147:3;39230:6;39224:13;39246:74;39313:6;39309:1;39304:3;39300:11;39293:4;39285:6;39281:17;39246:74;:::i;:::-;39348:6;39343:3;39339:16;39329:26;;39408;39404:31;39395:6;39391:2;39387:15;39383:53;39379:1;39375:2;39371:10;39364:73;-1:-1:-1;;;;;;39573:2:13;39564:6;39559:3;39555:16;39551:25;39546:2;39542;39538:11;39531:46;39606:6;39601:2;39597;39593:11;39586:27;39664:2;39655:6;39650:3;39646:16;39642:25;39637:2;39633;39629:11;39622:46;;39711:6;39703;39698:2;39694;39690:11;39677:41;39781:1;39741:15;;39758:2;39737:24;39770:13;;;-1:-1:-1;39737:24:13;;38817:990;-1:-1:-1;;;;;;;;38817:990:13:o;39812:561::-;40014:4;-1:-1:-1;;;;;40124:2:13;40116:6;40112:15;40101:9;40094:34;40176:18;40168:6;40164:31;40159:2;40148:9;40144:18;40137:59;40232:3;40227:2;40216:9;40212:18;40205:31;40253:62;40310:3;40299:9;40295:19;40287:6;40279;40253:62;:::i;40378:620::-;40635:3;40624:9;40617:22;40598:4;40662:45;40702:3;40691:9;40687:19;40679:6;40662:45;:::i;:::-;40755:18;40747:6;40743:31;40738:2;40727:9;40723:18;40716:59;40823:9;40815:6;40811:22;40806:2;40795:9;40791:18;40784:50;40851:49;40893:6;40885;40877;40851:49;:::i;:::-;40843:57;;;-1:-1:-1;;;;;40940:6:13;40936:55;40931:2;40920:9;40916:18;40909:83;40378:620;;;;;;;;:::o;41003:127::-;41064:10;41059:3;41055:20;41052:1;41045:31;41095:4;41092:1;41085:15;41119:4;41116:1;41109:15;41135:897;41215:6;41268:2;41256:9;41247:7;41243:23;41239:32;41236:52;;;41284:1;41281;41274:12;41236:52;41317:9;41311:16;41346:18;41387:2;41379:6;41376:14;41373:34;;;41403:1;41400;41393:12;41373:34;41441:6;41430:9;41426:22;41416:32;;41486:7;41479:4;41475:2;41471:13;41467:27;41457:55;;41508:1;41505;41498:12;41457:55;41537:2;41531:9;41559:2;41555;41552:10;41549:36;;;41565:18;;:::i;:::-;41640:2;41634:9;41608:2;41694:13;;-1:-1:-1;;41690:22:13;;;41714:2;41686:31;41682:40;41670:53;;;41738:18;;;41758:22;;;41735:46;41732:72;;;41784:18;;:::i;:::-;41824:10;41820:2;41813:22;41859:2;41851:6;41844:18;41899:7;41894:2;41889;41885;41881:11;41877:20;41874:33;41871:53;;;41920:1;41917;41910:12;41871:53;41933:68;41998:2;41993;41985:6;41981:15;41976:2;41972;41968:11;41933:68;:::i;:::-;42020:6;41135:897;-1:-1:-1;;;;;;;41135:897:13:o;42037:127::-;42098:10;42093:3;42089:20;42086:1;42079:31;42129:4;42126:1;42119:15;42153:4;42150:1;42143:15;42169:135;42208:3;42229:17;;;42226:43;;42249:18;;:::i;:::-;-1:-1:-1;42296:1:13;42285:13;;42169:135::o
Swarm Source
ipfs://59397ddb441e07a9d7962df6708b6dab520de9f19a5724dc4a1f0612110e771a
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.