Contract Overview
Balance:
25.744560038284657867 Ether
My Name Tag:
Not Available
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
InstantRefundRelay
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-20 */ pragma solidity 0.6.2; pragma experimental ABIEncoderV2; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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. * * 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. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal virtual { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /* * @author Patrick McCorry & Chris Buckland (ITX) * @title Payment Deposit contract * @notice Handles customers deposits and only the owner/child contracts can issue withdraws. */ contract PaymentDeposit is Ownable { // Every depositor has a unique identifier. Helps with off-chain tracking. mapping(address => uint) public depositors; uint public uniqueDepositors; event Deposit(address indexed sender, uint amount, uint indexed index); event Withdraw(address indexed depositor, address indexed recipient, uint amount); /** * @param _recipient Associate funds with this address. * Supply a deposit for a specified recipient. * Caution: The recipient must be an externally owned account as all jobs sent to * any.sender must be signed and associated with a positive balance in this contract. */ function depositFor(address _recipient) public payable { require(msg.value > 0, "No value provided to depositFor."); uint index = getDepositorIndex(_recipient); emit Deposit(_recipient, msg.value, index); } /** * @param _depositor Depositor address * Sets the depositors index if necessary. */ function getDepositorIndex(address _depositor) internal returns(uint) { if(depositors[_depositor] == 0) { uniqueDepositors = uniqueDepositors + 1; depositors[_depositor] = uniqueDepositors; } return depositors[_depositor]; } /* * It is only intended for external users who want to deposit via a wallet. */ receive() external payable { require(msg.value > 0, "No value provided to fallback."); require(tx.origin == msg.sender, "Only EOA can deposit directly."); uint index = getDepositorIndex(msg.sender); emit Deposit(msg.sender, msg.value, index); } /** * Internal function for sending funds. */ function withdraw(address payable _depositor, address payable _recipient, uint _amount) internal { _recipient.transfer(_amount); emit Withdraw(_depositor, _recipient, _amount); } /** * @param _depositor Funds being withdrawn from (e.g. deducts their balance). * @param _recipient Receiver of the funds * @param _amount Funds to send * Move funds out of the contract * Depositor is the OWNER of the funds being withdrawn. * Recipient is the RECEIVER of the funds. */ function withdrawFor(address payable _depositor, address payable _recipient, uint _amount) public onlyOwner { withdraw(_depositor, _recipient, _amount); } /** * @param _recipient Address that receives funds in the new PaymentDeposit * @param _amount Funds to send * @param _otherDeposit New Payment Deposit contract * Use admin privileges to migrate a user's deposits to another deposit contract */ function migrate(address payable _recipient, uint _amount, PaymentDeposit _otherDeposit) public onlyOwner { require(address(this).balance >= _amount, "Not enough balance to migrate."); require(address(_otherDeposit) != address(this), "Cannot migrate to same contract."); _otherDeposit.depositFor.value(_amount)(_recipient); // We assume an upgraded contract has this interface. emit Withdraw(address(this), _recipient, _amount); } } /** * @author Patrick McCorry & Chris Buckland (ITX) * @title Relayer Manager contract * @notice Manage relayers and issue topups */ contract RelayerManager is PaymentDeposit { mapping(address => bool) public relayers; event RelayerInstalled(address relayer); event RelayerUninstalled(address relayer); modifier onlyRelayer { require(relayers[msg.sender], "Only relayer can call this function."); _; } /** * @param newOwner Owner of contract * @dev Owner cannot be a relayer or this contract. */ function transferOwnership(address newOwner) public override onlyOwner { require(!relayers[newOwner], "Relayer cannot be an owner."); require(newOwner != address(this), "Contract cannot own itself."); _transferOwnership(newOwner); } /** * @param _relayer New relayer address * @dev Only the owner can install a new relayer */ function installRelayer(address _relayer) onlyOwner public { require(!relayers[_relayer], "Relayer is already installed."); require(_relayer != address(this), "The relay contract cannot be installed as a relayer."); require(_relayer != owner(), "Avoid mixing relayer and owner roles."); relayers[_relayer] = true; emit RelayerInstalled(_relayer); } /** * @param _relayer New relayer address * @dev Only the owner can uninstall a new relayer */ function uninstallRelayer(address _relayer) onlyOwner public { require(relayers[_relayer], "Relayer must be installed."); relayers[_relayer] = false; emit RelayerUninstalled(_relayer); } /** * @param _recipient Receiver of the topup * @param _maxBalance Maximum topup to send * Called by a relayer to perform a relative top up. * Only sends enough funds for relayer to reach max balance. */ function relativeTopUp(address payable _recipient, uint256 _maxBalance) public onlyRelayer { require(relayers[_recipient], "Recipient must be a relayer to receive a top up."); uint256 relayerBalance = address(_recipient).balance; // The contract or relayer must be pre-collateralized with the // max balance in advance. So if maxBalance = 3 ETH, then a new relayer // should have a balance at or greater than 3 ETH. if (_maxBalance > relayerBalance) { uint256 toTopUp = _maxBalance - relayerBalance; withdraw(msg.sender, _recipient, toTopUp); } } /** * @param _recipient Receiver of the topup * @param _topUp Funds to send * Called by a relayer to perform an "absolute" top up. * It can exceed the expected max balance of a relayer. */ function absoluteTopUp(address payable _recipient, uint256 _topUp) public onlyRelayer { require(relayers[_recipient], "Recipient must be a relayer to receive an emergency topup."); withdraw(msg.sender, _recipient, _topUp); } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @author Patrick McCorry & Chris Buckland (ITX) * @title Relay contract * @notice Handles relaying transactions, managing the relayers & user deposits. * @dev Two-stage deployment required. Deploy via CREATE2 and INIT() in the same transaction. */ contract InstantRefundRelay is RelayerManager { using SafeMath for uint256; event RelayExecuted(bytes32 indexed relayTxId, bool success, address indexed to, uint gasUsed, uint gasPrice); event OutOfCoins(); // @dev The relay transaction struct RelayTx { bytes32 id; // Off-chain identifier to track transaction & payment. address to; // Address for external contract. bytes data; // Call data that we need to send. Includes function call name, etc. uint gasLimit; // How much gas is allocated to this function call? } /** * @param _relayTx A relay tx containing the job to execute * @param _gasRefund Gas amount to refund * @dev Only authorised relayer can execute relay jobs and they are refunded gas at the end of the call. * Critically, if the relay job fails, we can simply catch exception and continue with the refund. */ function execute(RelayTx calldata _relayTx, uint _gasRefund) external { uint gasStarted = gasleft(); // The msg.sender check protects against two problems: // - Replay attacks across chains (chainid in transaction) // - Re-entrancy attacks back into .execute() (signer required) // - Stops external relayers spending the contract balance without any.sender authorisation require(relayers[msg.sender], "Relayer must call this function."); // In the worst case, the contract will only send 63/64 of the transaction's // remaining gas due to https://eips.ethereum.org/EIPS/eip-150 // But this is problematic as outlined in https://eips.ethereum.org/EIPS/eip-1930 // so to fix... we need to make sure we supply 64/63 * gasLimit. // Assumption: Underlying contract called did not have a minimum gas required check // We add 1000 to cover the cost of calculating new gas limit - this should be a lot more than // is required - measuring shows cost of 58 require(gasleft() > _relayTx.gasLimit.div(63).add(_relayTx.gasLimit).add(1000), "Not enough gas supplied."); // execute the actual call (bool success,) = _relayTx.to.call.gas(_relayTx.gasLimit)(_relayTx.data); uint gasUsed = gasStarted.add(_gasRefund).sub(gasleft()); // Takes into account gas cost for refund. if(_gasRefund > 0) { if(!msg.sender.send(gasUsed*tx.gasprice)) { // Notify admin we need to provide more refund to this contract emit OutOfCoins(); } } emit RelayExecuted(_relayTx.id, success, _relayTx.to, gasUsed, tx.gasprice); } }
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[],"name":"OutOfCoins","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"relayTxId","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"gasUsed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasPrice","type":"uint256"}],"name":"RelayExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"relayer","type":"address"}],"name":"RelayerInstalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"relayer","type":"address"}],"name":"RelayerUninstalled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"depositor","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_topUp","type":"uint256"}],"name":"absoluteTopUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"depositFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"gasLimit","type":"uint256"}],"internalType":"struct InstantRefundRelay.RelayTx","name":"_relayTx","type":"tuple"},{"internalType":"uint256","name":"_gasRefund","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"}],"name":"installRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"contract PaymentDeposit","name":"_otherDeposit","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_maxBalance","type":"uint256"}],"name":"relativeTopUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"relayers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"}],"name":"uninstallRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniqueDepositors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_depositor","type":"address"},{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405260006100176001600160e01b0361006616565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35061006a565b3390565b61146a806100796000396000f3fe6080604052600436106100ec5760003560e01c80638da5cb5b1161008a578063e539a02711610059578063e539a027146102e7578063e775716214610307578063eed75f6d14610329578063f2fde38b146103495761018b565b80638da5cb5b1461027d5780638f32d59b1461029f5780639f1d9267146102b4578063aa67c919146102d45761018b565b80635300f841116100c65780635300f841146101f2578063715018a614610228578063758f7f801461023d57806386f31f2e1461025d5761018b565b80632703e0f6146101905780633b9ca2d0146101b25780634a2c07f9146101d25761018b565b3661018b576000341161011a5760405162461bcd60e51b815260040161011190611214565b60405180910390fd5b3233146101395760405162461bcd60e51b815260040161011190610fb8565b600061014433610369565b905080336001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15346040516101809190611416565b60405180910390a350005b600080fd5b34801561019c57600080fd5b506101b06101ab366004610e34565b6103ca565b005b3480156101be57600080fd5b506101b06101cd366004610e5f565b610459565b3480156101de57600080fd5b506101b06101ed366004610e34565b610576565b3480156101fe57600080fd5b5061021261020d366004610dd8565b6105ec565b60405161021f9190610f0d565b60405180910390f35b34801561023457600080fd5b506101b0610601565b34801561024957600080fd5b506101b0610258366004610ea0565b61066f565b34801561026957600080fd5b506101b0610278366004610dd8565b61087e565b34801561028957600080fd5b50610292610935565b60405161021f9190610ef9565b3480156102ab57600080fd5b50610212610944565b3480156102c057600080fd5b506101b06102cf366004610df4565b610968565b6101b06102e2366004610dd8565b610997565b3480156102f357600080fd5b506101b0610302366004610dd8565b610a0a565b34801561031357600080fd5b5061031c610b1c565b60405161021f9190611416565b34801561033557600080fd5b5061031c610344366004610dd8565b610b22565b34801561035557600080fd5b506101b0610364366004610dd8565b610b34565b6001600160a01b0381166000908152600160205260408120546103ae57600280546001908101918290556001600160a01b038416600090815260209190915260409020555b506001600160a01b031660009081526001602052604090205490565b3360009081526003602052604090205460ff166103f95760405162461bcd60e51b8152600401610111906112ee565b6001600160a01b03821660009081526003602052604090205460ff166104315760405162461bcd60e51b8152600401610111906113c6565b6001600160a01b038216318082111561045457808203610452338583610bc6565b505b505050565b610461610944565b61047d5760405162461bcd60e51b815260040161011190611282565b8147101561049d5760405162461bcd60e51b81526004016101119061138f565b6001600160a01b0381163014156104c65760405162461bcd60e51b8152600401610111906111df565b60405163aa67c91960e01b81526001600160a01b0382169063aa67c9199084906104f4908790600401610ef9565b6000604051808303818588803b15801561050d57600080fd5b505af1158015610521573d6000803e3d6000fd5b5050505050826001600160a01b0316306001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb846040516105699190611416565b60405180910390a3505050565b3360009081526003602052604090205460ff166105a55760405162461bcd60e51b8152600401610111906112ee565b6001600160a01b03821660009081526003602052604090205460ff166105dd5760405162461bcd60e51b815260040161011190611332565b6105e8338383610bc6565b5050565b60036020526000908152604090205460ff1681565b610609610944565b6106255760405162461bcd60e51b815260040161011190611282565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60005a3360009081526003602052604090205490915060ff166106a45760405162461bcd60e51b81526004016101119061111f565b6106cd6103e86106c160608601358181603f63ffffffff610c4016565b9063ffffffff610c8916565b5a116106eb5760405162461bcd60e51b8152600401610111906110a3565b60006106fd6040850160208601610dd8565b6001600160a01b0316606085013585604081018035601e193684900301811261072557600080fd5b9091016020810191503567ffffffffffffffff81111561074457600080fd5b3681900382131561075457600080fd5b604051610762929190610ee9565b60006040518083038160008787f1925050503d80600081146107a0576040519150601f19603f3d011682016040523d82523d6000602084013e6107a5565b606091505b5050905060006107cb5a6107bf858763ffffffff610c8916565b9063ffffffff610cae16565b9050831561081e5760405133903a830280156108fc02916000818181858888f1935050505061081e576040517fbf3f3724ef99c8fe84317065fe5f9cc66d0c3dd306d1e3a876b3ec97951a3f4790600090a15b61082e6040860160208701610dd8565b6001600160a01b031685600001357fc0c16d3c4a6d98b3a759dc10155989fc33c39244e0fd84e14303325aac5ce42584843a60405161086f93929190610f18565b60405180910390a35050505050565b610886610944565b6108a25760405162461bcd60e51b815260040161011190611282565b6001600160a01b03811660009081526003602052604090205460ff166108da5760405162461bcd60e51b81526004016101119061124b565b6001600160a01b03811660009081526003602052604090819020805460ff19169055517fbf71a2e72339c706ee003aec232ad0e38d32bda19a6d513193425047a33c7dde9061092a908390610ef9565b60405180910390a150565b6000546001600160a01b031690565b600080546001600160a01b0316610959610cf0565b6001600160a01b031614905090565b610970610944565b61098c5760405162461bcd60e51b815260040161011190611282565b610454838383610bc6565b600034116109b75760405162461bcd60e51b815260040161011190610f83565b60006109c282610369565b905080826001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15346040516109fe9190611416565b60405180910390a35050565b610a12610944565b610a2e5760405162461bcd60e51b815260040161011190611282565b6001600160a01b03811660009081526003602052604090205460ff1615610a675760405162461bcd60e51b8152600401610111906112b7565b6001600160a01b038116301415610a905760405162461bcd60e51b81526004016101119061118b565b610a98610935565b6001600160a01b0316816001600160a01b03161415610ac95760405162461bcd60e51b8152600401610111906110da565b6001600160a01b03811660009081526003602052604090819020805460ff19166001179055517f4b25d4880707e035ab47f6b15a868abe2d90dd17251c8a5c81673eea42e2be579061092a908390610ef9565b60025481565b60016020526000908152604090205481565b610b3c610944565b610b585760405162461bcd60e51b815260040161011190611282565b6001600160a01b03811660009081526003602052604090205460ff1615610b915760405162461bcd60e51b815260040161011190611035565b6001600160a01b038116301415610bba5760405162461bcd60e51b815260040161011190611154565b610bc381610cf4565b50565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610bfc573d6000803e3d6000fd5b50816001600160a01b0316836001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb836040516105699190611416565b6000610c8283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610d75565b9392505050565b600082820183811015610c825760405162461bcd60e51b81526004016101119061106c565b6000610c8283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610dac565b3390565b6001600160a01b038116610d1a5760405162461bcd60e51b815260040161011190610fef565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008183610d965760405162461bcd60e51b81526004016101119190610f30565b506000838581610da257fe5b0495945050505050565b60008184841115610dd05760405162461bcd60e51b81526004016101119190610f30565b505050900390565b600060208284031215610de9578081fd5b8135610c828161141f565b600080600060608486031215610e08578182fd5b8335610e138161141f565b92506020840135610e238161141f565b929592945050506040919091013590565b60008060408385031215610e46578182fd5b8235610e518161141f565b946020939093013593505050565b600080600060608486031215610e73578283fd5b8335610e7e8161141f565b9250602084013591506040840135610e958161141f565b809150509250925092565b60008060408385031215610eb2578182fd5b823567ffffffffffffffff811115610ec8578283fd5b80840160808187031215610eda578384fd5b95602094909401359450505050565b6000828483379101908152919050565b6001600160a01b0391909116815260200190565b901515815260200190565b92151583526020830191909152604082015260600190565b6000602080835283518082850152825b81811015610f5c57858101830151858201604001528201610f40565b81811115610f6d5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4e6f2076616c75652070726f766964656420746f206465706f736974466f722e604082015260600190565b6020808252601e908201527f4f6e6c7920454f412063616e206465706f736974206469726563746c792e0000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f52656c617965722063616e6e6f7420626520616e206f776e65722e0000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526018908201527f4e6f7420656e6f7567682067617320737570706c6965642e0000000000000000604082015260600190565b60208082526025908201527f41766f6964206d6978696e672072656c6179657220616e64206f776e6572207260408201526437b632b99760d91b606082015260800190565b6020808252818101527f52656c61796572206d7573742063616c6c20746869732066756e6374696f6e2e604082015260600190565b6020808252601b908201527f436f6e74726163742063616e6e6f74206f776e20697473656c662e0000000000604082015260600190565b60208082526034908201527f5468652072656c617920636f6e74726163742063616e6e6f7420626520696e736040820152733a30b63632b21030b99030903932b630bcb2b91760611b606082015260800190565b6020808252818101527f43616e6e6f74206d69677261746520746f2073616d6520636f6e74726163742e604082015260600190565b6020808252601e908201527f4e6f2076616c75652070726f766964656420746f2066616c6c6261636b2e0000604082015260600190565b6020808252601a908201527f52656c61796572206d75737420626520696e7374616c6c65642e000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f52656c6179657220697320616c726561647920696e7374616c6c65642e000000604082015260600190565b60208082526024908201527f4f6e6c792072656c617965722063616e2063616c6c20746869732066756e637460408201526334b7b71760e11b606082015260800190565b6020808252603a908201527f526563697069656e74206d75737420626520612072656c6179657220746f207260408201527f65636569766520616e20656d657267656e637920746f7075702e000000000000606082015260800190565b6020808252601e908201527f4e6f7420656e6f7567682062616c616e636520746f206d6967726174652e0000604082015260600190565b60208082526030908201527f526563697069656e74206d75737420626520612072656c6179657220746f207260408201526f32b1b2b4bb329030903a37b8103ab81760811b606082015260800190565b90815260200190565b6001600160a01b0381168114610bc357600080fdfea2646970667358221220ec7d0afe773b5ec77a36102cd31416beee4c1a8cdc4ac7dced43131f24ac5cde64736f6c63430006020033
Deployed ByteCode Sourcemap
15865:2699:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5285:1;5273:9;:13;5265:56;;;;-1:-1:-1;;;5265:56:0;;;;;;;;;;;;;;;;;5340:9;5353:10;5340:23;5332:66;;;;-1:-1:-1;;;5332:66:0;;;;;;;;;5409:10;5422:29;5440:10;5422:17;:29::i;:::-;5409:42;;5498:5;5475:10;-1:-1:-1;;;;;5467:37:0;;5487:9;5467:37;;;;;;;;;;;;;;;5227:285;15865:2699;;;;;9041:642;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9041:642:0;;;;;;;;:::i;:::-;;6585:471;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6585:471:0;;;;;;;;:::i;9916:247::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9916:247:0;;;;;;;;:::i;7258:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7258:40:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2822:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2822:148:0;;;:::i;16814:1747::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16814:1747:0;;;;;;;;:::i;8567:220::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8567:220:0;;;;;;;;:::i;2011:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2011:79:0;;;:::i;:::-;;;;;;;;2377:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2377:94:0;;;:::i;6130:168::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6130:168:0;;;;;;;;:::i;4478:239::-;;;;;;;;;:::i;8039:400::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8039:400:0;;;;;;;;:::i;3961:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3961:28:0;;;:::i;:::-;;;;;;;;3912:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3912:42:0;;;;;;;;:::i;7650:265::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7650:265:0;;;;;;;;:::i;4836:284::-;-1:-1:-1;;;;;4920:22:0;;4900:4;4920:22;;;:10;:22;;;;;;4917:154;;4983:16;;;5002:1;4983:20;;;4964:39;;;;-1:-1:-1;;;;;5018:22:0;;-1:-1:-1;5018:22:0;;;;;;;;;;;:41;4917:154;-1:-1:-1;;;;;;5090:22:0;;;;;:10;:22;;;;;;;4836:284::o;9041:642::-;7452:10;7443:20;;;;:8;:20;;;;;;;;7435:69;;;;-1:-1:-1;;;7435:69:0;;;;;;;;;-1:-1:-1;;;;;9151:20:0;::::1;;::::0;;;:8:::1;:20;::::0;;;;;::::1;;9143:81;;;;-1:-1:-1::0;;;9143:81:0::1;;;;;;;;;-1:-1:-1::0;;;;;9260:27:0;::::1;;9517:28:::0;;::::1;9513:163;;;9580:28:::0;;::::1;9623:41;9632:10;9644::::0;9580:28;9623:8:::1;:41::i;:::-;9513:163;;7515:1;9041:642:::0;;:::o;6585:471::-;2223:9;:7;:9::i;:::-;2215:54;;;;-1:-1:-1;;;2215:54:0;;;;;;;;;6735:7:::1;6710:21;:32;;6702:75;;;;-1:-1:-1::0;;;6702:75:0::1;;;;;;;;;-1:-1:-1::0;;;;;6796:39:0;::::1;6830:4;6796:39;;6788:84;;;;-1:-1:-1::0;;;6788:84:0::1;;;;;;;;;6883:51;::::0;-1:-1:-1;;;6883:51:0;;-1:-1:-1;;;;;6883:24:0;::::1;::::0;::::1;::::0;6914:7;;6883:51:::1;::::0;6923:10;;6883:51:::1;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;6883:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;6883:51:0;;;;;7028:10;-1:-1:-1::0;;;;;7004:44:0::1;7021:4;-1:-1:-1::0;;;;;7004:44:0::1;;7040:7;7004:44;;;;;;;;;;;;;;;6585:471:::0;;;:::o;9916:247::-;7452:10;7443:20;;;;:8;:20;;;;;;;;7435:69;;;;-1:-1:-1;;;7435:69:0;;;;;;;;;-1:-1:-1;;;;;10021:20:0;::::1;;::::0;;;:8:::1;:20;::::0;;;;;::::1;;10013:91;;;;-1:-1:-1::0;;;10013:91:0::1;;;;;;;;;10115:40;10124:10;10136;10148:6;10115:8;:40::i;:::-;9916:247:::0;;:::o;7258:40::-;;;;;;;;;;;;;;;:::o;2822:148::-;2223:9;:7;:9::i;:::-;2215:54;;;;-1:-1:-1;;;2215:54:0;;;;;;;;;2929:1:::1;2913:6:::0;;2892:40:::1;::::0;-1:-1:-1;;;;;2913:6:0;;::::1;::::0;2892:40:::1;::::0;2929:1;;2892:40:::1;2960:1;2943:19:::0;;-1:-1:-1;;;;;;2943:19:0::1;::::0;;2822:148::o;16814:1747::-;16895:15;16913:9;17258:10;17249:20;;;;:8;:20;;;;;;16895:27;;-1:-1:-1;17249:20:0;;17241:65;;;;-1:-1:-1;;;17241:65:0;;;;;;;;;17912:58;17965:4;17912:48;17942:17;;;;17912:48;17942:17;17934:2;17912:25;:21;:25;:::i;:::-;:29;:48;:29;:48;:::i;:58::-;17900:9;:70;17892:107;;;;-1:-1:-1;;;17892:107:0;;;;;;;;;18049:12;18066:11;;;;;;;;;;-1:-1:-1;;;;;18066:16:0;18087:17;;;;:8;18106:13;;;30:25:-1;;-1:-1;;100:14;96:29;;;92:48;68:73;;58:2;;155:1;152;145:12;58:2;174:33;;;69:4;55:19;;;-1:-1;16:22;93:18;82:30;;79:2;;;125:1;122;115:12;79:2;155:14;151:38;;;137:53;;134:2;;;203:1;200;193:12;134:2;18066:54:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;18048:72:0;;;18133:12;18148:41;18179:9;18148:26;:10;18163;18148:26;:14;:26;:::i;:::-;:30;:41;:30;:41;:::i;:::-;18133:56;-1:-1:-1;18249:14:0;;18246:220;;18284:36;;:10;;18308:11;18300:19;;18284:36;;;;;;;;;18300:19;18284:10;:36;;;;;;;18280:175;;18427:12;;;;;;;18280:175;18519:11;;;;;;;;;;-1:-1:-1;;;;;18483:70:0;18497:8;:11;;;18483:70;18510:7;18532;18541:11;18483:70;;;;;;;;;;;;;;;;;16814:1747;;;;;:::o;8567:220::-;2223:9;:7;:9::i;:::-;2215:54;;;;-1:-1:-1;;;2215:54:0;;;;;;;;;-1:-1:-1;;;;;8647:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;::::1;;8639:57;;;;-1:-1:-1::0;;;8639:57:0::1;;;;;;;;;-1:-1:-1::0;;;;;8709:18:0;::::1;8730:5;8709:18:::0;;;:8:::1;:18;::::0;;;;;;:26;;-1:-1:-1;;8709:26:0::1;::::0;;8751:28;::::1;::::0;::::1;::::0;8718:8;;8751:28:::1;;;;;;;;;;8567:220:::0;:::o;2011:79::-;2049:7;2076:6;-1:-1:-1;;;;;2076:6:0;2011:79;:::o;2377:94::-;2417:4;2457:6;;-1:-1:-1;;;;;2457:6:0;2441:12;:10;:12::i;:::-;-1:-1:-1;;;;;2441:22:0;;2434:29;;2377:94;:::o;6130:168::-;2223:9;:7;:9::i;:::-;2215:54;;;;-1:-1:-1;;;2215:54:0;;;;;;;;;6249:41:::1;6258:10;6270;6282:7;6249:8;:41::i;4478:239::-:0;4565:1;4553:9;:13;4545:58;;;;-1:-1:-1;;;4545:58:0;;;;;;;;;4614:10;4627:29;4645:10;4627:17;:29::i;:::-;4614:42;;4703:5;4680:10;-1:-1:-1;;;;;4672:37:0;;4692:9;4672:37;;;;;;;;;;;;;;;4478:239;;:::o;8039:400::-;2223:9;:7;:9::i;:::-;2215:54;;;;-1:-1:-1;;;2215:54:0;;;;;;;;;-1:-1:-1;;;;;8118:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;::::1;;8117:19;8109:61;;;;-1:-1:-1::0;;;8109:61:0::1;;;;;;;;;-1:-1:-1::0;;;;;8189:25:0;::::1;8209:4;8189:25;;8181:90;;;;-1:-1:-1::0;;;8181:90:0::1;;;;;;;;;8302:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;8290:19:0::1;:8;-1:-1:-1::0;;;;;8290:19:0::1;;;8282:69;;;;-1:-1:-1::0;;;8282:69:0::1;;;;;;;;;-1:-1:-1::0;;;;;8364:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;;:25;;-1:-1:-1;;8364:25:0::1;8385:4;8364:25;::::0;;8405:26;::::1;::::0;::::1;::::0;8373:8;;8405:26:::1;;3961:28:::0;;;;:::o;3912:42::-;;;;;;;;;;;;;:::o;7650:265::-;2223:9;:7;:9::i;:::-;2215:54;;;;-1:-1:-1;;;2215:54:0;;;;;;;;;-1:-1:-1;;;;;7742:18:0;::::1;;::::0;;;:8:::1;:18;::::0;;;;;::::1;;7741:19;7733:59;;;;-1:-1:-1::0;;;7733:59:0::1;;;;;;;;;-1:-1:-1::0;;;;;7811:25:0;::::1;7831:4;7811:25;;7803:65;;;;-1:-1:-1::0;;;7803:65:0::1;;;;;;;;;7879:28;7898:8;7879:18;:28::i;:::-;7650:265:::0;:::o;5584:201::-;5692:28;;-1:-1:-1;;;;;5692:19:0;;;:28;;;;;5712:7;;5692:28;;;;5712:7;5692:19;:28;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5692:28:0;5757:10;-1:-1:-1;;;;;5736:41:0;5745:10;-1:-1:-1;;;;;5736:41:0;;5769:7;5736:41;;;;;;;13313:132;13371:7;13398:39;13402:1;13405;13398:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;13391:46;13313:132;-1:-1:-1;;;13313:132:0:o;11002:181::-;11060:7;11092:5;;;11116:6;;;;11108:46;;;;-1:-1:-1;;;11108:46:0;;;;;;;;11458:136;11516:7;11543:43;11547:1;11550;11543:43;;;;;;;;;;;;;;;;;:3;:43::i;786:106::-;874:10;786:106;:::o;3348:237::-;-1:-1:-1;;;;;3430:22:0;;3422:73;;;;-1:-1:-1;;;3422:73:0;;;;;;;;;3532:6;;;3511:38;;-1:-1:-1;;;;;3511:38:0;;;;3532:6;;;3511:38;;;3560:6;:17;;-1:-1:-1;;;;;;3560:17:0;-1:-1:-1;;;;;3560:17:0;;;;;;;;;;3348:237::o;13975:345::-;14061:7;14163:12;14156:5;14148:28;;;;-1:-1:-1;;;14148:28:0;;;;;;;;;;;14187:9;14203:1;14199;:5;;;;;;;13975:345;-1:-1:-1;;;;;13975:345:0:o;11931:192::-;12017:7;12053:12;12045:6;;;;12037:29;;;;-1:-1:-1;;;12037:29:0;;;;;;;;;;-1:-1:-1;;;12089:5:0;;;11931:192::o;820:241:-1:-;;924:2;912:9;903:7;899:23;895:32;892:2;;;-1:-1;;930:12;892:2;85:6;72:20;97:33;124:5;97:33;;1068:523;;;;1222:2;1210:9;1201:7;1197:23;1193:32;1190:2;;;-1:-1;;1228:12;1190:2;230:6;217:20;242:41;277:5;242:41;;;1280:71;-1:-1;1388:2;1435:22;;217:20;242:41;217:20;242:41;;;1184:407;;1396:71;;-1:-1;;;1504:2;1543:22;;;;750:20;;1184:407;1598:382;;;1727:2;1715:9;1706:7;1702:23;1698:32;1695:2;;;-1:-1;;1733:12;1695:2;230:6;217:20;242:41;277:5;242:41;;;1785:71;1893:2;1932:22;;;;750:20;;-1:-1;;;1689:291;1987:551;;;;2155:2;2143:9;2134:7;2130:23;2126:32;2123:2;;;-1:-1;;2161:12;2123:2;230:6;217:20;242:41;277:5;242:41;;;2213:71;-1:-1;2321:2;2360:22;;750:20;;-1:-1;2429:2;2490:22;;384:20;409:55;384:20;409:55;;;2437:85;;;;2117:421;;;;;;2545:504;;;2692:2;2680:9;2671:7;2667:23;2663:32;2660:2;;;-1:-1;;2698:12;2660:2;2756:17;2743:31;2794:18;2786:6;2783:30;2780:2;;;-1:-1;;2816:12;2780:2;2908:6;2897:9;2893:22;628:3;619:6;614:3;610:16;606:26;603:2;;;-1:-1;;635:12;603:2;2836:89;2962:2;3001:22;;;;750:20;;-1:-1;;;;2654:395;10987:274;;22302:6;22297:3;22292;22279:30;22340:16;;22333:27;;;22340:16;11118:143;-1:-1;11118:143;11268:213;-1:-1;;;;;21696:54;;;;3276:37;;11386:2;11371:18;;11357:124;11724:201;21480:13;;21473:21;3390:34;;11836:2;11821:18;;11807:118;11932:423;21480:13;;21473:21;3390:34;;12258:2;12243:18;;10938:37;;;;12341:2;12326:18;;10938:37;12100:2;12085:18;;12071:284;12362:301;;12500:2;;12521:17;12514:47;3918:5;20844:12;21154:6;12500:2;12489:9;12485:18;21142:19;-1:-1;22447:101;22461:6;22458:1;22455:13;22447:101;;;22528:11;;;;;22522:18;22509:11;;;21182:14;22509:11;22502:39;22476:10;;22447:101;;;22563:6;22560:1;22557:13;22554:2;;;-1:-1;21182:14;22619:6;12489:9;22610:16;;22603:27;22554:2;-1:-1;22735:7;22719:14;-1:-1;;22715:28;4076:39;;;;21182:14;4076:39;;12471:192;-1:-1;;;12471:192;12670:407;12861:2;12875:47;;;12846:18;;;21142:19;4388:34;21182:14;;;4368:55;4442:12;;;12832:245;13084:407;13275:2;13289:47;;;4693:2;13260:18;;;21142:19;4729:32;21182:14;;;4709:53;4781:12;;;13246:245;13498:407;13689:2;13703:47;;;5032:2;13674:18;;;21142:19;5068:34;21182:14;;;5048:55;-1:-1;;;5123:12;;;5116:30;5165:12;;;13660:245;13912:407;14103:2;14117:47;;;5416:2;14088:18;;;21142:19;5452:29;21182:14;;;5432:50;5501:12;;;14074:245;14326:407;14517:2;14531:47;;;5752:2;14502:18;;;21142:19;5788:29;21182:14;;;5768:50;5837:12;;;14488:245;14740:407;14931:2;14945:47;;;6088:2;14916:18;;;21142:19;6124:26;21182:14;;;6104:47;6170:12;;;14902:245;15154:407;15345:2;15359:47;;;6421:2;15330:18;;;21142:19;6457:34;21182:14;;;6437:55;-1:-1;;;6512:12;;;6505:29;6553:12;;;15316:245;15568:407;15759:2;15773:47;;;15744:18;;;21142:19;6840:34;21182:14;;;6820:55;6894:12;;;15730:245;15982:407;16173:2;16187:47;;;7145:2;16158:18;;;21142:19;7181:29;21182:14;;;7161:50;7230:12;;;16144:245;16396:407;16587:2;16601:47;;;7481:2;16572:18;;;21142:19;7517:34;21182:14;;;7497:55;-1:-1;;;7572:12;;;7565:44;7628:12;;;16558:245;16810:407;17001:2;17015:47;;;16986:18;;;21142:19;7915:34;21182:14;;;7895:55;7969:12;;;16972:245;17224:407;17415:2;17429:47;;;8220:2;17400:18;;;21142:19;8256:32;21182:14;;;8236:53;8308:12;;;17386:245;17638:407;17829:2;17843:47;;;8559:2;17814:18;;;21142:19;8595:28;21182:14;;;8575:49;8643:12;;;17800:245;18052:407;18243:2;18257:47;;;18228:18;;;21142:19;8930:34;21182:14;;;8910:55;8984:12;;;18214:245;18466:407;18657:2;18671:47;;;9235:2;18642:18;;;21142:19;9271:31;21182:14;;;9251:52;9322:12;;;18628:245;18880:407;19071:2;19085:47;;;9573:2;19056:18;;;21142:19;9609:34;21182:14;;;9589:55;-1:-1;;;9664:12;;;9657:28;9704:12;;;19042:245;19294:407;19485:2;19499:47;;;9955:2;19470:18;;;21142:19;9991:34;21182:14;;;9971:55;10060:28;10046:12;;;10039:50;10108:12;;;19456:245;19708:407;19899:2;19913:47;;;10359:2;19884:18;;;21142:19;10395:32;21182:14;;;10375:53;10447:12;;;19870:245;20122:407;20313:2;20327:47;;;10698:2;20298:18;;;21142:19;10734:34;21182:14;;;10714:55;-1:-1;;;10789:12;;;10782:40;10841:12;;;20284:245;20536:213;10938:37;;;20654:2;20639:18;;20625:124;22756:117;-1:-1;;;;;21696:54;;22815:35;;22805:2;;22864:1;;22854:12
Swarm Source
ipfs://ec7d0afe773b5ec77a36102cd31416beee4c1a8cdc4ac7dced43131f24ac5cde