Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Balance | 11100770 | 1302 days ago | IN | 0 ETH | 0.01497804 | ||||
Set R Account Ba... | 11100719 | 1302 days ago | IN | 0 ETH | 0.54610056 | ||||
Set R Account Ba... | 11100661 | 1302 days ago | IN | 0 ETH | 0.91476185 | ||||
Set R Account Ba... | 11100641 | 1302 days ago | IN | 0 ETH | 0.42446038 | ||||
Set Token Contra... | 11100620 | 1302 days ago | IN | 0 ETH | 0.0067349 | ||||
0x60806040 | 11100477 | 1302 days ago | IN | Create: RedFoxMigration | 0 ETH | 0.29942952 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
RedFoxMigration
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-21 */ // File: contracts/RedFoxMigration.sol // File: @openzeppelin/contracts/GSN/Context.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.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. */ 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(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/math/SafeMath.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, 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. */ 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. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { 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. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } // File: contracts/RedFoxMigration.sol // SPDX-License-Identifier: MIT // Redfox migration pragma solidity ^0.6.6; pragma experimental ABIEncoderV2; /// @title RedFox Migration Contract /// @author James Russell /// @notice This contract allows for the allocation of ERC20 tokens to accounts identified by a public key contract RedFoxMigration is Ownable{ struct TimedBalance { uint256 blockHeight; uint256 amount; bool paid; } struct AccountStatus { uint256 pending; uint256 available; uint256 released; } struct SetRBalance { bytes20 account; TimedBalance[] balances; } struct SetEthBalance { address account; TimedBalance[] balances; } address private _tokenContract; bool private _finalizeImport; //for balances with an r address mapping (bytes20 => TimedBalance[]) private _rbalances; //for balances with an ethereum address mapping (address => TimedBalance[]) private _ebalances; event RedFoxMigrated(address account,uint256 amount); constructor() public { _finalizeImport = false; } function setTokenContract(address tokenContract) public onlyOwner{ require(_finalizeImport == false, "tokenContract cannot be changed after import has been finalized"); _tokenContract = tokenContract; } function finalizeImport() public onlyOwner{ require(_finalizeImport == false, "Action cannot be taken after import has been finalized"); _finalizeImport = true; } function isFinalized() public view returns(bool){ return _finalizeImport; } function getTokenContract() public view returns(address){ return _tokenContract; } function checkTokenBalance() public view returns(uint256){ ERC20 redFoxToken = ERC20(_tokenContract); return redFoxToken.balanceOf(address(this)); } function setRAccountBalance(bytes20 account, TimedBalance[] memory balances) public onlyOwner{ require(_finalizeImport == false, "Action cannot be taken after import has been finalized"); for(uint256 i = 0; i < balances.length; i++){ _rbalances[account].push(balances[i]); } } function setRAccountBalances(SetRBalance[] memory balances) public onlyOwner{ require(_finalizeImport == false, "Action cannot be taken after import has been finalized"); for (uint i=0; i < balances.length; i++){ setRAccountBalance(balances[i].account,balances[i].balances); } } function setEthAccountBalance(address ethAddress, TimedBalance[] memory balances) public onlyOwner{ require(_finalizeImport == false, "Action cannot be taken after import has been finalized"); for(uint256 i = 0; i < balances.length; i++){ _ebalances[ethAddress].push(balances[i]); } } function setEthAccountBalances(SetEthBalance[] memory balances) public onlyOwner{ require(_finalizeImport == false, "Action cannot be taken after import has been finalized"); for (uint i=0; i < balances.length; i++){ setEthAccountBalance(balances[i].account,balances[i].balances); } } function getEthAccountBalances(address ethAddress) public view returns (TimedBalance[] memory) { return _ebalances[ethAddress]; } function getRAccountBalances(bytes20 rAddress) public view returns (TimedBalance[] memory) { return _rbalances[rAddress]; } function getEthAccountAvailable(address ethAddress) public view returns(uint256){ AccountStatus memory eStatus = generateAccountStatus(_ebalances[ethAddress]); return eStatus.available; } function getRAccountAvailable(bytes20 account) public view returns (uint256) { AccountStatus memory rStatus = generateAccountStatus(_rbalances[account]); return rStatus.available; } function getEthAccountStatus(address ethAddress) public view returns(AccountStatus memory){ return generateAccountStatus(_ebalances[ethAddress]); } function getRAccountStatus(bytes20 account) public view returns (AccountStatus memory) { return generateAccountStatus(_rbalances[account]); } function totalAccountBalance(bytes32 publicKeyX,bytes32 publicKeyY) public view returns (AccountStatus memory) { AccountStatus memory totalAccountStatus; bytes20 accountReference = getAccountReference(publicKeyX,publicKeyY); address ethAddress = getEthereumAddress(publicKeyX,publicKeyY); AccountStatus memory rStatus = getRAccountStatus(accountReference); AccountStatus memory eStatus = getEthAccountStatus(ethAddress); totalAccountStatus.pending = rStatus.pending + eStatus.pending; totalAccountStatus.available = rStatus.available + eStatus.available; totalAccountStatus.released = rStatus.released + eStatus.released; return totalAccountStatus; } function withdrawBalance(bytes32 publicKeyX,bytes32 publicKeyY) public { ERC20 redFoxToken = ERC20(_tokenContract); address ethAddress = getEthereumAddress(publicKeyX,publicKeyY); //check that the public key matches the msg.sender require(msg.sender == ethAddress, "msg.sender must equal the ethereum address from the public key"); //retrieve the balance from the public key bytes20 accountRef = getAccountReference(publicKeyX,publicKeyY); uint256 withdrawAmount = getEthAccountAvailable(ethAddress) + getRAccountAvailable(accountRef); //check that the balance allocated to this contract is enough to cover the withdrawal require(redFoxToken.balanceOf(address(this))>=withdrawAmount, "Migration Contract has insufficient funds"); //send the balance to the msg.sender redFoxToken.transfer(msg.sender,withdrawAmount); //mark the items as paid updateBalances(ethAddress,accountRef); emit RedFoxMigrated(msg.sender,withdrawAmount); } function getAccountReference(bytes32 publicKeyX,bytes32 publicKeyY) private pure returns(bytes20){ bytes memory compressedPublicKey = getCompressedPublicKey(publicKeyX,publicKeyY); bytes32 firstSha256 = sha256(compressedPublicKey); bytes20 ripemd = ripemd160(abi.encodePacked(firstSha256)); return ripemd; } function getEthereumAddress(bytes32 publicKeyX,bytes32 publicKeyY) private pure returns(address addr){ bytes32 hash = keccak256(abi.encodePacked(publicKeyX,publicKeyY)); assembly { mstore(0, hash) addr := mload(0) } } function getCompressedPublicKey(bytes32 publicKeyX,bytes32 publicKeyY) public pure returns(bytes memory){ uint256 yAsInt = uint256(publicKeyY); uint8 yOdd = uint8(yAsInt&1); byte leadingByte; if(yOdd == 1) leadingByte = 0x03; else leadingByte = 0x02; bytes memory cPublicKey = abi.encodePacked(leadingByte,publicKeyX); return cPublicKey; } function generateAccountStatus(TimedBalance[] memory balances) private view returns (AccountStatus memory) { uint256 currentBlockHeight = block.number; AccountStatus memory currentStatus; currentStatus.pending = 0; currentStatus.available = 0; currentStatus.released = 0; for(uint256 i = 0; i < balances.length; i++){ if(currentBlockHeight >= balances[i].blockHeight && balances[i].paid == false){ currentStatus.available += balances[i].amount; } if(balances[i].blockHeight > currentBlockHeight && balances[i].paid == false){ currentStatus.pending += balances[i].amount; } if(balances[i].paid == true){ currentStatus.released += balances[i].amount; } } return currentStatus; } function updateBalances(address ethAddress,bytes20 accountRef) private { uint currentBlockHeight = block.number; for(uint256 i = 0; i < _ebalances[ethAddress].length; i++){ if(currentBlockHeight >= _ebalances[ethAddress][i].blockHeight && !_ebalances[ethAddress][i].paid){ _ebalances[ethAddress][i].paid = true; } } for(uint256 i = 0; i < _rbalances[accountRef].length; i++){ if(currentBlockHeight >= _rbalances[accountRef][i].blockHeight && !_rbalances[accountRef][i].paid){ _rbalances[accountRef][i].paid = true; } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RedFoxMigrated","type":"event"},{"inputs":[],"name":"checkTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalizeImport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"publicKeyX","type":"bytes32"},{"internalType":"bytes32","name":"publicKeyY","type":"bytes32"}],"name":"getCompressedPublicKey","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"ethAddress","type":"address"}],"name":"getEthAccountAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ethAddress","type":"address"}],"name":"getEthAccountBalances","outputs":[{"components":[{"internalType":"uint256","name":"blockHeight","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"paid","type":"bool"}],"internalType":"struct RedFoxMigration.TimedBalance[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ethAddress","type":"address"}],"name":"getEthAccountStatus","outputs":[{"components":[{"internalType":"uint256","name":"pending","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"}],"internalType":"struct RedFoxMigration.AccountStatus","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes20","name":"account","type":"bytes20"}],"name":"getRAccountAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes20","name":"rAddress","type":"bytes20"}],"name":"getRAccountBalances","outputs":[{"components":[{"internalType":"uint256","name":"blockHeight","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"paid","type":"bool"}],"internalType":"struct RedFoxMigration.TimedBalance[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes20","name":"account","type":"bytes20"}],"name":"getRAccountStatus","outputs":[{"components":[{"internalType":"uint256","name":"pending","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"}],"internalType":"struct RedFoxMigration.AccountStatus","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ethAddress","type":"address"},{"components":[{"internalType":"uint256","name":"blockHeight","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"paid","type":"bool"}],"internalType":"struct RedFoxMigration.TimedBalance[]","name":"balances","type":"tuple[]"}],"name":"setEthAccountBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"components":[{"internalType":"uint256","name":"blockHeight","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"paid","type":"bool"}],"internalType":"struct RedFoxMigration.TimedBalance[]","name":"balances","type":"tuple[]"}],"internalType":"struct RedFoxMigration.SetEthBalance[]","name":"balances","type":"tuple[]"}],"name":"setEthAccountBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes20","name":"account","type":"bytes20"},{"components":[{"internalType":"uint256","name":"blockHeight","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"paid","type":"bool"}],"internalType":"struct RedFoxMigration.TimedBalance[]","name":"balances","type":"tuple[]"}],"name":"setRAccountBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes20","name":"account","type":"bytes20"},{"components":[{"internalType":"uint256","name":"blockHeight","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"paid","type":"bool"}],"internalType":"struct RedFoxMigration.TimedBalance[]","name":"balances","type":"tuple[]"}],"internalType":"struct RedFoxMigration.SetRBalance[]","name":"balances","type":"tuple[]"}],"name":"setRAccountBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"setTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"publicKeyX","type":"bytes32"},{"internalType":"bytes32","name":"publicKeyY","type":"bytes32"}],"name":"totalAccountBalance","outputs":[{"components":[{"internalType":"uint256","name":"pending","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"}],"internalType":"struct RedFoxMigration.AccountStatus","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"publicKeyX","type":"bytes32"},{"internalType":"bytes32","name":"publicKeyY","type":"bytes32"}],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5060006100216100df60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000600160146101000a81548160ff0219169083151502179055506100e7565b600033905090565b612d6280620000f76000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806384b3f29b116100b8578063bbcd5bbe1161007c578063bbcd5bbe1461033c578063c56c5cfe14610358578063d1ba519614610374578063e80f95d1146103a4578063f2fde38b146103c0578063f9c4b041146103dc57610137565b806384b3f29b146102845780638d4e4083146102b45780638da5cb5b146102d25780638e9e0553146102f05780639d77097a1461032057610137565b80635e6639ea116100ff5780635e6639ea146101e25780636623a0bd146101fe5780636dfa91c41461022e578063715018a61461024a578063837a7a0b1461025457610137565b80630ea695a81461013c57806328b7bede1461016c5780632ce6d0b71461018a5780634c943fe1146101945780634f731087146101c4575b600080fd5b61015660048036038101906101519190612313565b61040c565b6040516101639190612a50565b60405180910390f35b6101746104e3565b60405161018191906128d2565b60405180910390f35b61019261050d565b005b6101ae60048036038101906101a99190612313565b610615565b6040516101bb9190612a35565b60405180910390f35b6101cc6106e2565b6040516101d99190612a50565b60405180910390f35b6101fc60048036038101906101f791906122a9565b610799565b005b61021860048036038101906102139190612313565b6108dd565b6040516102259190612916565b60405180910390f35b61024860048036038101906102439190612268565b61099c565b005b610252610ae0565b005b61026e600480360381019061026991906123b9565b610c35565b60405161027b9190612a35565b60405180910390f35b61029e600480360381019061029991906121eb565b610cd1565b6040516102ab9190612a50565b60405180910390f35b6102bc610db6565b6040516102c99190612938565b60405180910390f35b6102da610dcd565b6040516102e791906128d2565b60405180910390f35b61030a600480360381019061030591906123b9565b610df6565b6040516103179190612953565b60405180910390f35b61033a60048036038101906103359190612214565b610e5d565b005b610356600480360381019061035191906121eb565b61101c565b005b610372600480360381019061036d91906123b9565b61114c565b005b61038e600480360381019061038991906121eb565b6113b8565b60405161039b9190612a35565b60405180910390f35b6103be60048036038101906103b9919061233c565b611493565b005b6103da60048036038101906103d591906121eb565b611644565b005b6103f660048036038101906103f191906121eb565b611808565b6040516104039190612916565b60405180910390f35b6000610416611e8f565b6104d460026000856bffffffffffffffffffffffff19166bffffffffffffffffffffffff19168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156104cb578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff1615151515815250508152602001906001019061046a565b505050506118d5565b90508060200151915050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610515611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059a90612995565b60405180910390fd5b60001515600160149054906101000a900460ff161515146105f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f0906129b5565b60405180910390fd5b60018060146101000a81548160ff021916908315150217905550565b61061d611e8f565b6106db60026000846bffffffffffffffffffffffff19166bffffffffffffffffffffffff19168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106d2578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505081526020019060010190610671565b505050506118d5565b9050919050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161074391906128d2565b60206040518083038186803b15801561075b57600080fd5b505afa15801561076f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079391906123f5565b91505090565b6107a1611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690612995565b60405180910390fd5b60001515600160149054906101000a900460ff16151514610885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087c906129b5565b60405180910390fd5b60008090505b81518110156108d9576108cc8282815181106108a357fe5b6020026020010151600001518383815181106108bb57fe5b602002602001015160200151611493565b808060010191505061088b565b5050565b606060026000836bffffffffffffffffffffffff19166bffffffffffffffffffffffff19168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610991578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505081526020019060010190610930565b505050509050919050565b6109a4611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2990612995565b60405180910390fd5b60001515600160149054906101000a900460ff16151514610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906129b5565b60405180910390fd5b60008090505b8151811015610adc57610acf828281518110610aa657fe5b602002602001015160000151838381518110610abe57fe5b602002602001015160200151610e5d565b8080600101915050610a8e565b5050565b610ae8611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90612995565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610c3d611e8f565b610c45611e8f565b6000610c518585611a63565b90506000610c5f8686611b2d565b9050610c69611e8f565b610c7283610615565b9050610c7c611e8f565b610c85836113b8565b9050806000015182600001510185600001818152505080602001518260200151018560200181815250508060400151826040015101856040018181525050849550505050505092915050565b6000610cdb611e8f565b610da7600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610d9e578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505081526020019060010190610d3d565b505050506118d5565b90508060200151915050919050565b6000600160149054906101000a900460ff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060008260001c90506000600182169050600060018260ff161415610e2257600360f81b9050610e2a565b600260f81b90505b60608187604051602001610e3f929190612848565b60405160208183030381529060405290508094505050505092915050565b610e65611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90612995565b60405180910390fd5b60001515600160149054906101000a900460ff16151514610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f40906129b5565b60405180910390fd5b60008090505b815181101561101757600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828281518110610fa357fe5b60200260200101519080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555050508080600101915050610f4f565b505050565b611024611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a990612995565b60405180910390fd5b60001515600160149054906101000a900460ff16151514611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff906129f5565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061117f8484611b2d565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e6906129d5565b60405180910390fd5b60006111fb8585611a63565b905060006112088261040c565b61121184610cd1565b019050808473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161124e91906128d2565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e91906123f5565b10156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d690612a15565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161131a9291906128ed565b602060405180830381600087803b15801561133457600080fd5b505af1158015611348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c91906122ea565b506113778383611b6b565b7f1d9800858c73141c1dd34039c3ecdb5cd06a8d28d83c9279342e5cc7304d5db533826040516113a89291906128ed565b60405180910390a1505050505050565b6113c0611e8f565b61148c600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611483578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505081526020019060010190611422565b505050506118d5565b9050919050565b61149b611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152090612995565b60405180910390fd5b60001515600160149054906101000a900460ff1615151461157f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611576906129b5565b60405180910390fd5b60008090505b815181101561163f5760026000846bffffffffffffffffffffffff19166bffffffffffffffffffffffff191681526020019081526020016000208282815181106115cb57fe5b60200260200101519080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555050508080600101915050611585565b505050565b61164c611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190612995565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174190612975565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156118ca578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505081526020019060010190611869565b505050509050919050565b6118dd611e8f565b60004390506118ea611e8f565b60008160000181815250506000816020018181525050600081604001818152505060008090505b8451811015611a505784818151811061192657fe5b602002602001015160000151831015801561195c57506000151585828151811061194c57fe5b6020026020010151604001511515145b156119895784818151811061196d57fe5b6020026020010151602001518260200181815101915081815250505b8285828151811061199657fe5b6020026020010151600001511180156119ca5750600015158582815181106119ba57fe5b6020026020010151604001511515145b156119f7578481815181106119db57fe5b6020026020010151602001518260000181815101915081815250505b60011515858281518110611a0757fe5b60200260200101516040015115151415611a4357848181518110611a2757fe5b6020026020010151602001518260400181815101915081815250505b8080600101915050611911565b508092505050919050565b600033905090565b60006060611a718484610df6565b90506000600282604051611a8591906128bb565b602060405180830381855afa158015611aa2573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611ac59190612390565b90506000600382604051602001611adc9190612874565b604051602081830303815290604052604051611af891906128bb565b602060405180830381855afa158015611b15573d6000803e3d6000fd5b5050506040515160601b905080935050505092915050565b6000808383604051602001611b4392919061288f565b6040516020818303038152906040528051906020012090508060005260005191505092915050565b600043905060008090505b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015611d1857600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110611c0a57fe5b9060005260206000209060030201600001548210158015611c915750600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110611c7057fe5b906000526020600020906003020160020160009054906101000a900460ff16155b15611d0b576001600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611ce257fe5b906000526020600020906003020160020160006101000a81548160ff0219169083151502179055505b8080600101915050611b76565b5060008090505b60026000846bffffffffffffffffffffffff19166bffffffffffffffffffffffff1916815260200190815260200160002080549050811015611e895760026000846bffffffffffffffffffffffff19166bffffffffffffffffffffffff191681526020019081526020016000208181548110611d9757fe5b9060005260206000209060030201600001548210158015611e10575060026000846bffffffffffffffffffffffff19166bffffffffffffffffffffffff191681526020019081526020016000208181548110611def57fe5b906000526020600020906003020160020160009054906101000a900460ff16155b15611e7c57600160026000856bffffffffffffffffffffffff19166bffffffffffffffffffffffff191681526020019081526020016000208281548110611e5357fe5b906000526020600020906003020160020160006101000a81548160ff0219169083151502179055505b8080600101915050611d1f565b50505050565b60405180606001604052806000815260200160008152602001600081525090565b600081359050611ebf81612cb9565b92915050565b600082601f830112611ed657600080fd5b8135611ee9611ee482612a98565b612a6b565b9150818183526020840193506020810190508360005b83811015611f2f5781358601611f158882612099565b845260208401935060208301925050600181019050611eff565b5050505092915050565b600082601f830112611f4a57600080fd5b8135611f5d611f5882612ac0565b612a6b565b9150818183526020840193506020810190508360005b83811015611fa35781358601611f8988826120fd565b845260208401935060208301925050600181019050611f73565b5050505092915050565b600082601f830112611fbe57600080fd5b8135611fd1611fcc82612ae8565b612a6b565b91508181835260208401935060208101905083856060840282011115611ff657600080fd5b60005b83811015612026578161200c8882612161565b845260208401935060608301925050600181019050611ff9565b5050505092915050565b60008135905061203f81612cd0565b92915050565b60008151905061205481612cd0565b92915050565b60008135905061206981612ce7565b92915050565b60008135905061207e81612cfe565b92915050565b60008151905061209381612cfe565b92915050565b6000604082840312156120ab57600080fd5b6120b56040612a6b565b905060006120c584828501611eb0565b600083015250602082013567ffffffffffffffff8111156120e557600080fd5b6120f184828501611fad565b60208301525092915050565b60006040828403121561210f57600080fd5b6121196040612a6b565b905060006121298482850161205a565b600083015250602082013567ffffffffffffffff81111561214957600080fd5b61215584828501611fad565b60208301525092915050565b60006060828403121561217357600080fd5b61217d6060612a6b565b9050600061218d848285016121c1565b60008301525060206121a1848285016121c1565b60208301525060406121b584828501612030565b60408301525092915050565b6000813590506121d081612d15565b92915050565b6000815190506121e581612d15565b92915050565b6000602082840312156121fd57600080fd5b600061220b84828501611eb0565b91505092915050565b6000806040838503121561222757600080fd5b600061223585828601611eb0565b925050602083013567ffffffffffffffff81111561225257600080fd5b61225e85828601611fad565b9150509250929050565b60006020828403121561227a57600080fd5b600082013567ffffffffffffffff81111561229457600080fd5b6122a084828501611ec5565b91505092915050565b6000602082840312156122bb57600080fd5b600082013567ffffffffffffffff8111156122d557600080fd5b6122e184828501611f39565b91505092915050565b6000602082840312156122fc57600080fd5b600061230a84828501612045565b91505092915050565b60006020828403121561232557600080fd5b60006123338482850161205a565b91505092915050565b6000806040838503121561234f57600080fd5b600061235d8582860161205a565b925050602083013567ffffffffffffffff81111561237a57600080fd5b61238685828601611fad565b9150509250929050565b6000602082840312156123a257600080fd5b60006123b084828501612084565b91505092915050565b600080604083850312156123cc57600080fd5b60006123da8582860161206f565b92505060206123eb8582860161206f565b9150509250929050565b60006020828403121561240757600080fd5b6000612415848285016121d6565b91505092915050565b600061242a83836127e8565b60608301905092915050565b61243f81612c2b565b82525050565b61244e81612b81565b82525050565b600061245f82612b20565b6124698185612b43565b935061247483612b10565b8060005b838110156124a557815161248c888261241e565b975061249783612b36565b925050600181019050612478565b5085935050505092915050565b6124bb81612b93565b82525050565b6124ca81612b93565b82525050565b6124e16124dc82612b9f565b612c94565b82525050565b6124f86124f382612bf7565b612c9e565b82525050565b600061250982612b2b565b6125138185612b54565b9350612523818560208601612c61565b61252c81612ca8565b840191505092915050565b600061254282612b2b565b61254c8185612b65565b935061255c818560208601612c61565b80840191505092915050565b6000612575602683612b70565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006125db602083612b70565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061261b603683612b70565b91507f416374696f6e2063616e6e6f742062652074616b656e20616674657220696d7060008301527f6f727420686173206265656e2066696e616c697a6564000000000000000000006020830152604082019050919050565b6000612681603e83612b70565b91507f6d73672e73656e646572206d75737420657175616c207468652065746865726560008301527f756d20616464726573732066726f6d20746865207075626c6963206b657900006020830152604082019050919050565b60006126e7603f83612b70565b91507f746f6b656e436f6e74726163742063616e6e6f74206265206368616e6765642060008301527f616674657220696d706f727420686173206265656e2066696e616c697a6564006020830152604082019050919050565b600061274d602983612b70565b91507f4d6967726174696f6e20436f6e74726163742068617320696e7375666669636960008301527f656e742066756e647300000000000000000000000000000000000000000000006020830152604082019050919050565b6060820160008201516127bc600085018261282a565b5060208201516127cf602085018261282a565b5060408201516127e2604085018261282a565b50505050565b6060820160008201516127fe600085018261282a565b506020820151612811602085018261282a565b50604082015161282460408501826124b2565b50505050565b61283381612c21565b82525050565b61284281612c21565b82525050565b600061285482856124d0565b60018201915061286482846124e7565b6020820191508190509392505050565b600061288082846124e7565b60208201915081905092915050565b600061289b82856124e7565b6020820191506128ab82846124e7565b6020820191508190509392505050565b60006128c78284612537565b915081905092915050565b60006020820190506128e76000830184612445565b92915050565b60006040820190506129026000830185612436565b61290f6020830184612839565b9392505050565b600060208201905081810360008301526129308184612454565b905092915050565b600060208201905061294d60008301846124c1565b92915050565b6000602082019050818103600083015261296d81846124fe565b905092915050565b6000602082019050818103600083015261298e81612568565b9050919050565b600060208201905081810360008301526129ae816125ce565b9050919050565b600060208201905081810360008301526129ce8161260e565b9050919050565b600060208201905081810360008301526129ee81612674565b9050919050565b60006020820190508181036000830152612a0e816126da565b9050919050565b60006020820190508181036000830152612a2e81612740565b9050919050565b6000606082019050612a4a60008301846127a6565b92915050565b6000602082019050612a656000830184612839565b92915050565b6000604051905081810181811067ffffffffffffffff82111715612a8e57600080fd5b8060405250919050565b600067ffffffffffffffff821115612aaf57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115612ad757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115612aff57600080fd5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612b8c82612c01565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612c3682612c3d565b9050919050565b6000612c4882612c4f565b9050919050565b6000612c5a82612c01565b9050919050565b60005b83811015612c7f578082015181840152602081019050612c64565b83811115612c8e576000848401525b50505050565b6000819050919050565b6000819050919050565b6000601f19601f8301169050919050565b612cc281612b81565b8114612ccd57600080fd5b50565b612cd981612b93565b8114612ce457600080fd5b50565b612cf081612bcb565b8114612cfb57600080fd5b50565b612d0781612bf7565b8114612d1257600080fd5b50565b612d1e81612c21565b8114612d2957600080fd5b5056fea26469706673582212207add6dcc7d775b021d606a7b94ae5beb7e8d964e7bda81779bef9f673ccd3d8164736f6c63430006060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c806384b3f29b116100b8578063bbcd5bbe1161007c578063bbcd5bbe1461033c578063c56c5cfe14610358578063d1ba519614610374578063e80f95d1146103a4578063f2fde38b146103c0578063f9c4b041146103dc57610137565b806384b3f29b146102845780638d4e4083146102b45780638da5cb5b146102d25780638e9e0553146102f05780639d77097a1461032057610137565b80635e6639ea116100ff5780635e6639ea146101e25780636623a0bd146101fe5780636dfa91c41461022e578063715018a61461024a578063837a7a0b1461025457610137565b80630ea695a81461013c57806328b7bede1461016c5780632ce6d0b71461018a5780634c943fe1146101945780634f731087146101c4575b600080fd5b61015660048036038101906101519190612313565b61040c565b6040516101639190612a50565b60405180910390f35b6101746104e3565b60405161018191906128d2565b60405180910390f35b61019261050d565b005b6101ae60048036038101906101a99190612313565b610615565b6040516101bb9190612a35565b60405180910390f35b6101cc6106e2565b6040516101d99190612a50565b60405180910390f35b6101fc60048036038101906101f791906122a9565b610799565b005b61021860048036038101906102139190612313565b6108dd565b6040516102259190612916565b60405180910390f35b61024860048036038101906102439190612268565b61099c565b005b610252610ae0565b005b61026e600480360381019061026991906123b9565b610c35565b60405161027b9190612a35565b60405180910390f35b61029e600480360381019061029991906121eb565b610cd1565b6040516102ab9190612a50565b60405180910390f35b6102bc610db6565b6040516102c99190612938565b60405180910390f35b6102da610dcd565b6040516102e791906128d2565b60405180910390f35b61030a600480360381019061030591906123b9565b610df6565b6040516103179190612953565b60405180910390f35b61033a60048036038101906103359190612214565b610e5d565b005b610356600480360381019061035191906121eb565b61101c565b005b610372600480360381019061036d91906123b9565b61114c565b005b61038e600480360381019061038991906121eb565b6113b8565b60405161039b9190612a35565b60405180910390f35b6103be60048036038101906103b9919061233c565b611493565b005b6103da60048036038101906103d591906121eb565b611644565b005b6103f660048036038101906103f191906121eb565b611808565b6040516104039190612916565b60405180910390f35b6000610416611e8f565b6104d460026000856bffffffffffffffffffffffff19166bffffffffffffffffffffffff19168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156104cb578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff1615151515815250508152602001906001019061046a565b505050506118d5565b90508060200151915050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610515611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059a90612995565b60405180910390fd5b60001515600160149054906101000a900460ff161515146105f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f0906129b5565b60405180910390fd5b60018060146101000a81548160ff021916908315150217905550565b61061d611e8f565b6106db60026000846bffffffffffffffffffffffff19166bffffffffffffffffffffffff19168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156106d2578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505081526020019060010190610671565b505050506118d5565b9050919050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161074391906128d2565b60206040518083038186803b15801561075b57600080fd5b505afa15801561076f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079391906123f5565b91505090565b6107a1611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461082f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082690612995565b60405180910390fd5b60001515600160149054906101000a900460ff16151514610885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087c906129b5565b60405180910390fd5b60008090505b81518110156108d9576108cc8282815181106108a357fe5b6020026020010151600001518383815181106108bb57fe5b602002602001015160200151611493565b808060010191505061088b565b5050565b606060026000836bffffffffffffffffffffffff19166bffffffffffffffffffffffff19168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610991578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505081526020019060010190610930565b505050509050919050565b6109a4611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2990612995565b60405180910390fd5b60001515600160149054906101000a900460ff16151514610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906129b5565b60405180910390fd5b60008090505b8151811015610adc57610acf828281518110610aa657fe5b602002602001015160000151838381518110610abe57fe5b602002602001015160200151610e5d565b8080600101915050610a8e565b5050565b610ae8611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6d90612995565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610c3d611e8f565b610c45611e8f565b6000610c518585611a63565b90506000610c5f8686611b2d565b9050610c69611e8f565b610c7283610615565b9050610c7c611e8f565b610c85836113b8565b9050806000015182600001510185600001818152505080602001518260200151018560200181815250508060400151826040015101856040018181525050849550505050505092915050565b6000610cdb611e8f565b610da7600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610d9e578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505081526020019060010190610d3d565b505050506118d5565b90508060200151915050919050565b6000600160149054906101000a900460ff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060008260001c90506000600182169050600060018260ff161415610e2257600360f81b9050610e2a565b600260f81b90505b60608187604051602001610e3f929190612848565b60405160208183030381529060405290508094505050505092915050565b610e65611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea90612995565b60405180910390fd5b60001515600160149054906101000a900460ff16151514610f49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f40906129b5565b60405180910390fd5b60008090505b815181101561101757600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828281518110610fa357fe5b60200260200101519080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555050508080600101915050610f4f565b505050565b611024611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a990612995565b60405180910390fd5b60001515600160149054906101000a900460ff16151514611108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ff906129f5565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600061117f8484611b2d565b90508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e6906129d5565b60405180910390fd5b60006111fb8585611a63565b905060006112088261040c565b61121184610cd1565b019050808473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161124e91906128d2565b60206040518083038186803b15801561126657600080fd5b505afa15801561127a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129e91906123f5565b10156112df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d690612a15565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b815260040161131a9291906128ed565b602060405180830381600087803b15801561133457600080fd5b505af1158015611348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c91906122ea565b506113778383611b6b565b7f1d9800858c73141c1dd34039c3ecdb5cd06a8d28d83c9279342e5cc7304d5db533826040516113a89291906128ed565b60405180910390a1505050505050565b6113c0611e8f565b61148c600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015611483578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505081526020019060010190611422565b505050506118d5565b9050919050565b61149b611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152090612995565b60405180910390fd5b60001515600160149054906101000a900460ff1615151461157f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611576906129b5565b60405180910390fd5b60008090505b815181101561163f5760026000846bffffffffffffffffffffffff19166bffffffffffffffffffffffff191681526020019081526020016000208282815181106115cb57fe5b60200260200101519080600181540180825580915050600190039060005260206000209060030201600090919091909150600082015181600001556020820151816001015560408201518160020160006101000a81548160ff02191690831515021790555050508080600101915050611585565b505050565b61164c611a5b565b73ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d190612995565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174190612975565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6060600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156118ca578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820160009054906101000a900460ff16151515158152505081526020019060010190611869565b505050509050919050565b6118dd611e8f565b60004390506118ea611e8f565b60008160000181815250506000816020018181525050600081604001818152505060008090505b8451811015611a505784818151811061192657fe5b602002602001015160000151831015801561195c57506000151585828151811061194c57fe5b6020026020010151604001511515145b156119895784818151811061196d57fe5b6020026020010151602001518260200181815101915081815250505b8285828151811061199657fe5b6020026020010151600001511180156119ca5750600015158582815181106119ba57fe5b6020026020010151604001511515145b156119f7578481815181106119db57fe5b6020026020010151602001518260000181815101915081815250505b60011515858281518110611a0757fe5b60200260200101516040015115151415611a4357848181518110611a2757fe5b6020026020010151602001518260400181815101915081815250505b8080600101915050611911565b508092505050919050565b600033905090565b60006060611a718484610df6565b90506000600282604051611a8591906128bb565b602060405180830381855afa158015611aa2573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611ac59190612390565b90506000600382604051602001611adc9190612874565b604051602081830303815290604052604051611af891906128bb565b602060405180830381855afa158015611b15573d6000803e3d6000fd5b5050506040515160601b905080935050505092915050565b6000808383604051602001611b4392919061288f565b6040516020818303038152906040528051906020012090508060005260005191505092915050565b600043905060008090505b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015611d1857600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110611c0a57fe5b9060005260206000209060030201600001548210158015611c915750600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208181548110611c7057fe5b906000526020600020906003020160020160009054906101000a900460ff16155b15611d0b576001600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611ce257fe5b906000526020600020906003020160020160006101000a81548160ff0219169083151502179055505b8080600101915050611b76565b5060008090505b60026000846bffffffffffffffffffffffff19166bffffffffffffffffffffffff1916815260200190815260200160002080549050811015611e895760026000846bffffffffffffffffffffffff19166bffffffffffffffffffffffff191681526020019081526020016000208181548110611d9757fe5b9060005260206000209060030201600001548210158015611e10575060026000846bffffffffffffffffffffffff19166bffffffffffffffffffffffff191681526020019081526020016000208181548110611def57fe5b906000526020600020906003020160020160009054906101000a900460ff16155b15611e7c57600160026000856bffffffffffffffffffffffff19166bffffffffffffffffffffffff191681526020019081526020016000208281548110611e5357fe5b906000526020600020906003020160020160006101000a81548160ff0219169083151502179055505b8080600101915050611d1f565b50505050565b60405180606001604052806000815260200160008152602001600081525090565b600081359050611ebf81612cb9565b92915050565b600082601f830112611ed657600080fd5b8135611ee9611ee482612a98565b612a6b565b9150818183526020840193506020810190508360005b83811015611f2f5781358601611f158882612099565b845260208401935060208301925050600181019050611eff565b5050505092915050565b600082601f830112611f4a57600080fd5b8135611f5d611f5882612ac0565b612a6b565b9150818183526020840193506020810190508360005b83811015611fa35781358601611f8988826120fd565b845260208401935060208301925050600181019050611f73565b5050505092915050565b600082601f830112611fbe57600080fd5b8135611fd1611fcc82612ae8565b612a6b565b91508181835260208401935060208101905083856060840282011115611ff657600080fd5b60005b83811015612026578161200c8882612161565b845260208401935060608301925050600181019050611ff9565b5050505092915050565b60008135905061203f81612cd0565b92915050565b60008151905061205481612cd0565b92915050565b60008135905061206981612ce7565b92915050565b60008135905061207e81612cfe565b92915050565b60008151905061209381612cfe565b92915050565b6000604082840312156120ab57600080fd5b6120b56040612a6b565b905060006120c584828501611eb0565b600083015250602082013567ffffffffffffffff8111156120e557600080fd5b6120f184828501611fad565b60208301525092915050565b60006040828403121561210f57600080fd5b6121196040612a6b565b905060006121298482850161205a565b600083015250602082013567ffffffffffffffff81111561214957600080fd5b61215584828501611fad565b60208301525092915050565b60006060828403121561217357600080fd5b61217d6060612a6b565b9050600061218d848285016121c1565b60008301525060206121a1848285016121c1565b60208301525060406121b584828501612030565b60408301525092915050565b6000813590506121d081612d15565b92915050565b6000815190506121e581612d15565b92915050565b6000602082840312156121fd57600080fd5b600061220b84828501611eb0565b91505092915050565b6000806040838503121561222757600080fd5b600061223585828601611eb0565b925050602083013567ffffffffffffffff81111561225257600080fd5b61225e85828601611fad565b9150509250929050565b60006020828403121561227a57600080fd5b600082013567ffffffffffffffff81111561229457600080fd5b6122a084828501611ec5565b91505092915050565b6000602082840312156122bb57600080fd5b600082013567ffffffffffffffff8111156122d557600080fd5b6122e184828501611f39565b91505092915050565b6000602082840312156122fc57600080fd5b600061230a84828501612045565b91505092915050565b60006020828403121561232557600080fd5b60006123338482850161205a565b91505092915050565b6000806040838503121561234f57600080fd5b600061235d8582860161205a565b925050602083013567ffffffffffffffff81111561237a57600080fd5b61238685828601611fad565b9150509250929050565b6000602082840312156123a257600080fd5b60006123b084828501612084565b91505092915050565b600080604083850312156123cc57600080fd5b60006123da8582860161206f565b92505060206123eb8582860161206f565b9150509250929050565b60006020828403121561240757600080fd5b6000612415848285016121d6565b91505092915050565b600061242a83836127e8565b60608301905092915050565b61243f81612c2b565b82525050565b61244e81612b81565b82525050565b600061245f82612b20565b6124698185612b43565b935061247483612b10565b8060005b838110156124a557815161248c888261241e565b975061249783612b36565b925050600181019050612478565b5085935050505092915050565b6124bb81612b93565b82525050565b6124ca81612b93565b82525050565b6124e16124dc82612b9f565b612c94565b82525050565b6124f86124f382612bf7565b612c9e565b82525050565b600061250982612b2b565b6125138185612b54565b9350612523818560208601612c61565b61252c81612ca8565b840191505092915050565b600061254282612b2b565b61254c8185612b65565b935061255c818560208601612c61565b80840191505092915050565b6000612575602683612b70565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006125db602083612b70565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061261b603683612b70565b91507f416374696f6e2063616e6e6f742062652074616b656e20616674657220696d7060008301527f6f727420686173206265656e2066696e616c697a6564000000000000000000006020830152604082019050919050565b6000612681603e83612b70565b91507f6d73672e73656e646572206d75737420657175616c207468652065746865726560008301527f756d20616464726573732066726f6d20746865207075626c6963206b657900006020830152604082019050919050565b60006126e7603f83612b70565b91507f746f6b656e436f6e74726163742063616e6e6f74206265206368616e6765642060008301527f616674657220696d706f727420686173206265656e2066696e616c697a6564006020830152604082019050919050565b600061274d602983612b70565b91507f4d6967726174696f6e20436f6e74726163742068617320696e7375666669636960008301527f656e742066756e647300000000000000000000000000000000000000000000006020830152604082019050919050565b6060820160008201516127bc600085018261282a565b5060208201516127cf602085018261282a565b5060408201516127e2604085018261282a565b50505050565b6060820160008201516127fe600085018261282a565b506020820151612811602085018261282a565b50604082015161282460408501826124b2565b50505050565b61283381612c21565b82525050565b61284281612c21565b82525050565b600061285482856124d0565b60018201915061286482846124e7565b6020820191508190509392505050565b600061288082846124e7565b60208201915081905092915050565b600061289b82856124e7565b6020820191506128ab82846124e7565b6020820191508190509392505050565b60006128c78284612537565b915081905092915050565b60006020820190506128e76000830184612445565b92915050565b60006040820190506129026000830185612436565b61290f6020830184612839565b9392505050565b600060208201905081810360008301526129308184612454565b905092915050565b600060208201905061294d60008301846124c1565b92915050565b6000602082019050818103600083015261296d81846124fe565b905092915050565b6000602082019050818103600083015261298e81612568565b9050919050565b600060208201905081810360008301526129ae816125ce565b9050919050565b600060208201905081810360008301526129ce8161260e565b9050919050565b600060208201905081810360008301526129ee81612674565b9050919050565b60006020820190508181036000830152612a0e816126da565b9050919050565b60006020820190508181036000830152612a2e81612740565b9050919050565b6000606082019050612a4a60008301846127a6565b92915050565b6000602082019050612a656000830184612839565b92915050565b6000604051905081810181811067ffffffffffffffff82111715612a8e57600080fd5b8060405250919050565b600067ffffffffffffffff821115612aaf57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115612ad757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115612aff57600080fd5b602082029050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000612b8c82612c01565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b60007fffffffffffffffffffffffffffffffffffffffff00000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000612c3682612c3d565b9050919050565b6000612c4882612c4f565b9050919050565b6000612c5a82612c01565b9050919050565b60005b83811015612c7f578082015181840152602081019050612c64565b83811115612c8e576000848401525b50505050565b6000819050919050565b6000819050919050565b6000601f19601f8301169050919050565b612cc281612b81565b8114612ccd57600080fd5b50565b612cd981612b93565b8114612ce457600080fd5b50565b612cf081612bcb565b8114612cfb57600080fd5b50565b612d0781612bf7565b8114612d1257600080fd5b50565b612d1e81612c21565b8114612d2957600080fd5b5056fea26469706673582212207add6dcc7d775b021d606a7b94ae5beb7e8d964e7bda81779bef9f673ccd3d8164736f6c63430006060033
Deployed Bytecode Sourcemap
29078:8769:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29078:8769:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;32731:204:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30540:96;;;:::i;:::-;;;;;;;;;;;;;;;;30237:198;;;:::i;:::-;;33116:155;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30644:171;;;:::i;:::-;;;;;;;;;;;;;;;;31165:336;;;;;;;;;;;;;;;;:::i;:::-;;32364:137;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;31863:342;;;;;;;;;;;;;;;;:::i;:::-;;2820:148;;;:::i;:::-;;33283:736;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;32513:210;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30443:89;;;:::i;:::-;;;;;;;;;;;;;;;;2178:79;;;:::i;:::-;;;;;;;;;;;;;;;;35826:436;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;31513:342;;;;;;;;;;;;;;;;:::i;:::-;;29984:240;;;;;;;;;;;;;;;;:::i;:::-;;34027:1136;;;;;;;;;;;;;;;;:::i;:::-;;32947:161;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30823:334;;;;;;;;;;;;;;;;:::i;:::-;;3123:244;;;;;;;;;;;;;;;;:::i;:::-;;32213:143;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;32731:204;32799:7;32819:28;;:::i;:::-;32850:42;32872:10;:19;32883:7;32872:19;;;;;;;;;;;;;;;;;32850:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:42::i;:::-;32819:73;;32910:7;:17;;;32903:24;;;32731:204;;;:::o;30540:96::-;30588:7;30614:14;;;;;;;;;;;30607:21;;30540:96;:::o;30237:198::-;2400:12;:10;:12::i;:::-;2390:22;;:6;;;;;;;;;;;:22;;;2382:67;;;;;;;;;;;;;;;;;;;;;;30317:5:::1;30298:24;;:15;;;;;;;;;;;:24;;;30290:104;;;;;;;;;;;;;;;;;;;;;;30423:4;30405:15:::0;::::1;:22;;;;;;;;;;;;;;;;;;30237:198::o:0;33116:155::-;33181:20;;:::i;:::-;33221:42;33243:10;:19;33254:7;33243:19;;;;;;;;;;;;;;;;;33221:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:42::i;:::-;33214:49;;33116:155;;;:::o;30644:171::-;30693:7;30712:17;30738:14;;;;;;;;;;;30712:41;;30771:11;:21;;;30801:4;30771:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30771:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30771:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;30771:36:0;;;;;;;;;30764:43;;;30644:171;:::o;31165:336::-;2400:12;:10;:12::i;:::-;2390:22;;:6;;;;;;;;;;;:22;;;2382:67;;;;;;;;;;;;;;;;;;;;;;31279:5:::1;31260:24;;:15;;;;;;;;;;;:24;;;31252:104;;;;;;;;;;;;;;;;;;;;;;31372:6;31379:1:::0;31372:8:::1;;31367:127;31386:8;:15;31382:1;:19;31367:127;;;31422:60;31441:8;31450:1;31441:11;;;;;;;;;;;;;;:19;;;31461:8;31470:1;31461:11;;;;;;;;;;;;;;:20;;;31422:18;:60::i;:::-;31403:3;;;;;;;31367:127;;;;31165:336:::0;:::o;32364:137::-;32432:21;32473:10;:20;32484:8;32473:20;;;;;;;;;;;;;;;;;32466:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32364:137;;;:::o;31863:342::-;2400:12;:10;:12::i;:::-;2390:22;;:6;;;;;;;;;;;:22;;;2382:67;;;;;;;;;;;;;;;;;;;;;;31981:5:::1;31962:24;;:15;;;;;;;;;;;:24;;;31954:104;;;;;;;;;;;;;;;;;;;;;;32074:6;32081:1:::0;32074:8:::1;;32069:129;32088:8;:15;32084:1;:19;32069:129;;;32124:62;32145:8;32154:1;32145:11;;;;;;;;;;;;;;:19;;;32165:8;32174:1;32165:11;;;;;;;;;;;;;;:20;;;32124;:62::i;:::-;32105:3;;;;;;;32069:129;;;;31863:342:::0;:::o;2820:148::-;2400:12;:10;:12::i;:::-;2390:22;;:6;;;;;;;;;;;:22;;;2382:67;;;;;;;;;;;;;;;;;;;;;;2927:1:::1;2890:40;;2911:6;::::0;::::1;;;;;;;;;2890:40;;;;;;;;;;;;2958:1;2941:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2820:148::o:0;33283:736::-;33372:20;;:::i;:::-;33405:39;;:::i;:::-;33455:24;33482:42;33502:10;33513;33482:19;:42::i;:::-;33455:69;;33535:18;33556:41;33575:10;33586;33556:18;:41::i;:::-;33535:62;;33608:28;;:::i;:::-;33639:35;33657:16;33639:17;:35::i;:::-;33608:66;;33685:28;;:::i;:::-;33716:31;33736:10;33716:19;:31::i;:::-;33685:62;;33805:7;:15;;;33787:7;:15;;;:33;33758:18;:26;;:62;;;;;33882:7;:17;;;33862:7;:17;;;:37;33831:18;:28;;:68;;;;;33959:7;:16;;;33940:7;:16;;;:35;33910:18;:27;;:65;;;;;33993:18;33986:25;;;;;;;33283:736;;;;:::o;32513:210::-;32585:7;32604:28;;:::i;:::-;32635:45;32657:10;:22;32668:10;32657:22;;;;;;;;;;;;;;;32635:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:45::i;:::-;32604:76;;32698:7;:17;;;32691:24;;;32513:210;;;:::o;30443:89::-;30486:4;30509:15;;;;;;;;;;;30502:22;;30443:89;:::o;2178:79::-;2216:7;2243:6;;;;;;;;;;;2236:13;;2178:79;:::o;35826:436::-;35917:12;35941:14;35966:10;35958:19;;35941:36;;35988:10;36014:1;36007:6;:8;35988:28;;36027:16;36065:1;36057:4;:9;;;36054:95;;;36096:4;36082:18;;;;36054:95;;;36145:4;36131:18;;;;36054:95;36160:23;36203:11;36215:10;36186:40;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;36186:40:0;;;36160:66;;36244:10;36237:17;;;;;;35826:436;;;;:::o;31513:342::-;2400:12;:10;:12::i;:::-;2390:22;;:6;;;;;;;;;;;:22;;;2382:67;;;;;;;;;;;;;;;;;;;;;;31649:5:::1;31630:24;;:15;;;;;;;;;;;:24;;;31622:104;;;;;;;;;;;;;;;;;;;;;;31741:9;31753:1:::0;31741:13:::1;;31737:111;31760:8;:15;31756:1;:19;31737:111;;;31796:10;:22;31807:10;31796:22;;;;;;;;;;;;;;;31824:8;31833:1;31824:11;;;;;;;;;;;;;;31796:40;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;31796:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31777:3;;;;;;;31737:111;;;;31513:342:::0;;:::o;29984:240::-;2400:12;:10;:12::i;:::-;2390:22;;:6;;;;;;;;;;;:22;;;2382:67;;;;;;;;;;;;;;;;;;;;;;30087:5:::1;30068:24;;:15;;;;;;;;;;;:24;;;30060:113;;;;;;;;;;;;;;;;;;;;;;30201:13;30184:14;;:30;;;;;;;;;;;;;;;;;;29984:240:::0;:::o;34027:1136::-;34109:17;34135:14;;;;;;;;;;;34109:41;;34161:18;34182:41;34201:10;34212;34182:18;:41::i;:::-;34161:62;;34326:10;34312:24;;:10;:24;;;34304:112;;;;;;;;;;;;;;;;;;;;;;34489:18;34510:42;34530:10;34541;34510:19;:42::i;:::-;34489:63;;34563:22;34625:32;34646:10;34625:20;:32::i;:::-;34588:34;34611:10;34588:22;:34::i;:::-;:69;34563:94;;34819:14;34781:11;:21;;;34811:4;34781:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34781:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34781:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;34781:36:0;;;;;;;;;:52;;34773:119;;;;;;;;;;;;;;;;;;;;;;34959:11;:20;;;34980:10;34991:14;34959:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;34959:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34959:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;34959:47:0;;;;;;;;;;35061:37;35076:10;35087;35061:14;:37::i;:::-;35114:41;35129:10;35140:14;35114:41;;;;;;;;;;;;;;;;34027:1136;;;;;;:::o;32947:161::-;33016:20;;:::i;:::-;33055:45;33077:10;:22;33088:10;33077:22;;;;;;;;;;;;;;;33055:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:21;:45::i;:::-;33048:52;;32947:161;;;:::o;30823:334::-;2400:12;:10;:12::i;:::-;2390:22;;:6;;;;;;;;;;;:22;;;2382:67;;;;;;;;;;;;;;;;;;;;;;30954:5:::1;30935:24;;:15;;;;;;;;;;;:24;;;30927:104;;;;;;;;;;;;;;;;;;;;;;31046:9;31058:1:::0;31046:13:::1;;31042:108;31065:8;:15;31061:1;:19;31042:108;;;31101:10;:19;31112:7;31101:19;;;;;;;;;;;;;;;;;31126:8;31135:1;31126:11;;;;;;;;;;;;;;31101:37;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;31101:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31082:3;;;;;;;31042:108;;;;30823:334:::0;;:::o;3123:244::-;2400:12;:10;:12::i;:::-;2390:22;;:6;;;;;;;;;;;:22;;;2382:67;;;;;;;;;;;;;;;;;;;;;;3232:1:::1;3212:22;;:8;:22;;;;3204:73;;;;;;;;;;;;;;;;;;;;;;3322:8;3293:38;;3314:6;::::0;::::1;;;;;;;;;3293:38;;;;;;;;;;;;3351:8;3342:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;3123:244:::0;:::o;32213:143::-;32285:21;32326:10;:22;32337:10;32326:22;;;;;;;;;;;;;;;32319:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32213:143;;;:::o;36274:902::-;36359:20;;:::i;:::-;36392:26;36421:12;36392:41;;36444:34;;:::i;:::-;36523:1;36499:13;:21;;:25;;;;;36561:1;36535:13;:23;;:27;;;;;36598:1;36573:13;:22;;:26;;;;;36624:9;36636:1;36624:13;;36620:518;36643:8;:15;36639:1;:19;36620:518;;;36704:8;36713:1;36704:11;;;;;;;;;;;;;;:23;;;36682:18;:45;;:74;;;;;36751:5;36731:25;;:8;36740:1;36731:11;;;;;;;;;;;;;;:16;;;:25;;;36682:74;36679:158;;;36803:8;36812:1;36803:11;;;;;;;;;;;;;;:18;;;36776:13;:23;;:45;;;;;;;;;;;36679:158;36880:18;36854:8;36863:1;36854:11;;;;;;;;;;;;;;:23;;;:44;:73;;;;;36922:5;36902:25;;:8;36911:1;36902:11;;;;;;;;;;;;;;:16;;;:25;;;36854:73;36851:155;;;36972:8;36981:1;36972:11;;;;;;;;;;;;;;:18;;;36947:13;:21;;:43;;;;;;;;;;;36851:155;37043:4;37023:24;;:8;37032:1;37023:11;;;;;;;;;;;;;;:16;;;:24;;;37020:107;;;37093:8;37102:1;37093:11;;;;;;;;;;;;;;:18;;;37067:13;:22;;:44;;;;;;;;;;;37020:107;36660:3;;;;;;;36620:518;;;;37155:13;37148:20;;;;36274:902;;;:::o;699:106::-;752:15;787:10;780:17;;699:106;:::o;35171:356::-;35260:7;35279:32;35314:45;35337:10;35348;35314:22;:45::i;:::-;35279:80;;35370:19;35392:27;35399:19;35392:27;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35392:27:0;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;35392:27:0;;;;;;;;;35370:49;;35430:14;35447:40;35474:11;35457:29;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;35457:29:0;;;35447:40;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35447:40:0;;;;;;;;35430:57;;35505:6;35498:13;;;;;35171:356;;;;:::o;35535:279::-;35623:12;35647;35689:10;35700;35672:39;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;35672:39:0;;;35662:50;;;;;;35647:65;;35757:4;35754:1;35747:15;35790:1;35784:8;35776:16;;35732:71;;;;;:::o;37188:656::-;37270:23;37296:12;37270:38;;37323:9;37335:1;37323:13;;37319:254;37342:10;:22;37353:10;37342:22;;;;;;;;;;;;;;;:29;;;;37338:1;:33;37319:254;;;37417:10;:22;37428:10;37417:22;;;;;;;;;;;;;;;37440:1;37417:25;;;;;;;;;;;;;;;;;;:37;;;37395:18;:59;;:94;;;;;37459:10;:22;37470:10;37459:22;;;;;;;;;;;;;;;37482:1;37459:25;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;37458:31;37395:94;37392:170;;;37542:4;37509:10;:22;37520:10;37509:22;;;;;;;;;;;;;;;37532:1;37509:25;;;;;;;;;;;;;;;;;;:30;;;:37;;;;;;;;;;;;;;;;;;37392:170;37373:3;;;;;;;37319:254;;;;37587:9;37599:1;37587:13;;37583:254;37606:10;:22;37617:10;37606:22;;;;;;;;;;;;;;;;;:29;;;;37602:1;:33;37583:254;;;37681:10;:22;37692:10;37681:22;;;;;;;;;;;;;;;;;37704:1;37681:25;;;;;;;;;;;;;;;;;;:37;;;37659:18;:59;;:94;;;;;37723:10;:22;37734:10;37723:22;;;;;;;;;;;;;;;;;37746:1;37723:25;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;37722:31;37659:94;37656:170;;;37806:4;37773:10;:22;37784:10;37773:22;;;;;;;;;;;;;;;;;37796:1;37773:25;;;;;;;;;;;;;;;;;;:30;;;:37;;;;;;;;;;;;;;;;;;37656:170;37637:3;;;;;;;37583:254;;;;37188:656;;;:::o;29078:8769::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;189:771;;337:3;330:4;322:6;318:17;314:27;304:2;;355:1;352;345:12;304:2;392:6;379:20;414:111;429:95;517:6;429:95;;;414:111;;;405:120;;542:5;567:6;560:5;553:21;597:4;589:6;585:17;575:27;;619:4;614:3;610:14;603:21;;672:6;705:1;690:264;715:6;712:1;709:13;690:264;;;798:3;785:17;777:6;773:30;822:68;886:3;874:10;822:68;;;817:3;810:81;914:4;909:3;905:14;898:21;;942:4;937:3;933:14;926:21;;747:207;737:1;734;730:9;725:14;;690:264;;;694:14;297:663;;;;;;;;1013:765;;1159:3;1152:4;1144:6;1140:17;1136:27;1126:2;;1177:1;1174;1167:12;1126:2;1214:6;1201:20;1236:109;1251:93;1337:6;1251:93;;;1236:109;;;1227:118;;1362:5;1387:6;1380:5;1373:21;1417:4;1409:6;1405:17;1395:27;;1439:4;1434:3;1430:14;1423:21;;1492:6;1525:1;1510:262;1535:6;1532:1;1529:13;1510:262;;;1618:3;1605:17;1597:6;1593:30;1642:66;1704:3;1692:10;1642:66;;;1637:3;1630:79;1732:4;1727:3;1723:14;1716:21;;1760:4;1755:3;1751:14;1744:21;;1567:205;1557:1;1554;1550:9;1545:14;;1510:262;;;1514:14;1119:659;;;;;;;;1832:797;;1979:3;1972:4;1964:6;1960:17;1956:27;1946:2;;1997:1;1994;1987:12;1946:2;2034:6;2021:20;2056:110;2071:94;2158:6;2071:94;;;2056:110;;;2047:119;;2183:5;2208:6;2201:5;2194:21;2238:4;2230:6;2226:17;2216:27;;2260:4;2255:3;2251:14;2244:21;;2313:6;2360:3;2352:4;2344:6;2340:17;2335:3;2331:27;2328:36;2325:2;;;2377:1;2374;2367:12;2325:2;2402:1;2387:236;2412:6;2409:1;2406:13;2387:236;;;2470:3;2492:67;2555:3;2543:10;2492:67;;;2487:3;2480:80;2583:4;2578:3;2574:14;2567:21;;2611:4;2606:3;2602:14;2595:21;;2444:179;2434:1;2431;2427:9;2422:14;;2387:236;;;2391:14;1939:690;;;;;;;;2637:124;;2714:6;2701:20;2692:29;;2726:30;2750:5;2726:30;;;2686:75;;;;;2768:128;;2849:6;2843:13;2834:22;;2861:30;2885:5;2861:30;;;2828:68;;;;;2903:130;;2983:6;2970:20;2961:29;;2995:33;3022:5;2995:33;;;2955:78;;;;;3040:130;;3120:6;3107:20;3098:29;;3132:33;3159:5;3132:33;;;3092:78;;;;;3177:134;;3261:6;3255:13;3246:22;;3273:33;3300:5;3273:33;;;3240:71;;;;;3361:621;;3481:4;3469:9;3464:3;3460:19;3456:30;3453:2;;;3499:1;3496;3489:12;3453:2;3517:20;3532:4;3517:20;;;3508:29;;3590:1;3622:49;3667:3;3658:6;3647:9;3643:22;3622:49;;;3615:4;3608:5;3604:16;3597:75;3547:136;3765:2;3754:9;3750:18;3737:32;3789:18;3781:6;3778:30;3775:2;;;3821:1;3818;3811:12;3775:2;3856:104;3956:3;3947:6;3936:9;3932:22;3856:104;;;3849:4;3842:5;3838:16;3831:130;3693:279;3447:535;;;;;4030:619;;4148:4;4136:9;4131:3;4127:19;4123:30;4120:2;;;4166:1;4163;4156:12;4120:2;4184:20;4199:4;4184:20;;;4175:29;;4257:1;4289:49;4334:3;4325:6;4314:9;4310:22;4289:49;;;4282:4;4275:5;4271:16;4264:75;4214:136;4432:2;4421:9;4417:18;4404:32;4456:18;4448:6;4445:30;4442:2;;;4488:1;4485;4478:12;4442:2;4523:104;4623:3;4614:6;4603:9;4599:22;4523:104;;;4516:4;4509:5;4505:16;4498:130;4360:279;4114:535;;;;;4698:622;;4817:4;4805:9;4800:3;4796:19;4792:30;4789:2;;;4835:1;4832;4825:12;4789:2;4853:20;4868:4;4853:20;;;4844:29;;4930:1;4962:49;5007:3;4998:6;4987:9;4983:22;4962:49;;;4955:4;4948:5;4944:16;4937:75;4883:140;5075:2;5108:49;5153:3;5144:6;5133:9;5129:22;5108:49;;;5101:4;5094:5;5090:16;5083:75;5033:136;5219:2;5252:46;5294:3;5285:6;5274:9;5270:22;5252:46;;;5245:4;5238:5;5234:16;5227:72;5179:131;4783:537;;;;;5327:130;;5407:6;5394:20;5385:29;;5419:33;5446:5;5419:33;;;5379:78;;;;;5464:134;;5548:6;5542:13;5533:22;;5560:33;5587:5;5560:33;;;5527:71;;;;;5605:241;;5709:2;5697:9;5688:7;5684:23;5680:32;5677:2;;;5725:1;5722;5715:12;5677:2;5760:1;5777:53;5822:7;5813:6;5802:9;5798:22;5777:53;;;5767:63;;5739:97;5671:175;;;;;5853:562;;;6029:2;6017:9;6008:7;6004:23;6000:32;5997:2;;;6045:1;6042;6035:12;5997:2;6080:1;6097:53;6142:7;6133:6;6122:9;6118:22;6097:53;;;6087:63;;6059:97;6215:2;6204:9;6200:18;6187:32;6239:18;6231:6;6228:30;6225:2;;;6271:1;6268;6261:12;6225:2;6291:108;6391:7;6382:6;6371:9;6367:22;6291:108;;;6281:118;;6166:239;5991:424;;;;;;6422:439;;6582:2;6570:9;6561:7;6557:23;6553:32;6550:2;;;6598:1;6595;6588:12;6550:2;6661:1;6650:9;6646:17;6633:31;6684:18;6676:6;6673:30;6670:2;;;6716:1;6713;6706:12;6670:2;6736:109;6837:7;6828:6;6817:9;6813:22;6736:109;;;6726:119;;6612:239;6544:317;;;;;6868:435;;7026:2;7014:9;7005:7;7001:23;6997:32;6994:2;;;7042:1;7039;7032:12;6994:2;7105:1;7094:9;7090:17;7077:31;7128:18;7120:6;7117:30;7114:2;;;7160:1;7157;7150:12;7114:2;7180:107;7279:7;7270:6;7259:9;7255:22;7180:107;;;7170:117;;7056:237;6988:315;;;;;7310:257;;7422:2;7410:9;7401:7;7397:23;7393:32;7390:2;;;7438:1;7435;7428:12;7390:2;7473:1;7490:61;7543:7;7534:6;7523:9;7519:22;7490:61;;;7480:71;;7452:105;7384:183;;;;;7574:241;;7678:2;7666:9;7657:7;7653:23;7649:32;7646:2;;;7694:1;7691;7684:12;7646:2;7729:1;7746:53;7791:7;7782:6;7771:9;7767:22;7746:53;;;7736:63;;7708:97;7640:175;;;;;7822:562;;;7998:2;7986:9;7977:7;7973:23;7969:32;7966:2;;;8014:1;8011;8004:12;7966:2;8049:1;8066:53;8111:7;8102:6;8091:9;8087:22;8066:53;;;8056:63;;8028:97;8184:2;8173:9;8169:18;8156:32;8208:18;8200:6;8197:30;8194:2;;;8240:1;8237;8230:12;8194:2;8260:108;8360:7;8351:6;8340:9;8336:22;8260:108;;;8250:118;;8135:239;7960:424;;;;;;8391:263;;8506:2;8494:9;8485:7;8481:23;8477:32;8474:2;;;8522:1;8519;8512:12;8474:2;8557:1;8574:64;8630:7;8621:6;8610:9;8606:22;8574:64;;;8564:74;;8536:108;8468:186;;;;;8661:366;;;8782:2;8770:9;8761:7;8757:23;8753:32;8750:2;;;8798:1;8795;8788:12;8750:2;8833:1;8850:53;8895:7;8886:6;8875:9;8871:22;8850:53;;;8840:63;;8812:97;8940:2;8958:53;9003:7;8994:6;8983:9;8979:22;8958:53;;;8948:63;;8919:98;8744:283;;;;;;9034:263;;9149:2;9137:9;9128:7;9124:23;9120:32;9117:2;;;9165:1;9162;9155:12;9117:2;9200:1;9217:64;9273:7;9264:6;9253:9;9249:22;9217:64;;;9207:74;;9179:108;9111:186;;;;;9305:293;;9452:106;9554:3;9546:6;9452:106;;;9587:4;9582:3;9578:14;9564:28;;9445:153;;;;;9606:142;9697:45;9736:5;9697:45;;;9692:3;9685:58;9679:69;;;9755:113;9838:24;9856:5;9838:24;;;9833:3;9826:37;9820:48;;;9962:930;;10167:84;10245:5;10167:84;;;10264:116;10373:6;10368:3;10264:116;;;10257:123;;10401:86;10481:5;10401:86;;;10507:7;10535:1;10520:350;10545:6;10542:1;10539:13;10520:350;;;10612:6;10606:13;10633:123;10752:3;10737:13;10633:123;;;10626:130;;10773:90;10856:6;10773:90;;;10763:100;;10577:293;10567:1;10564;10560:9;10555:14;;10520:350;;;10524:14;10883:3;10876:10;;10146:746;;;;;;;;10900:94;10967:21;10982:5;10967:21;;;10962:3;10955:34;10949:45;;;11001:104;11078:21;11093:5;11078:21;;;11073:3;11066:34;11060:45;;;11112:148;11211:43;11230:23;11247:5;11230:23;;;11211:43;;;11206:3;11199:56;11193:67;;;11267:152;11368:45;11388:24;11406:5;11388:24;;;11368:45;;;11363:3;11356:58;11350:69;;;11426:343;;11536:38;11568:5;11536:38;;;11586:70;11649:6;11644:3;11586:70;;;11579:77;;11661:52;11706:6;11701:3;11694:4;11687:5;11683:16;11661:52;;;11734:29;11756:6;11734:29;;;11729:3;11725:39;11718:46;;11516:253;;;;;;11776:356;;11904:38;11936:5;11904:38;;;11954:88;12035:6;12030:3;11954:88;;;11947:95;;12047:52;12092:6;12087:3;12080:4;12073:5;12069:16;12047:52;;;12120:6;12115:3;12111:16;12104:23;;11884:248;;;;;;12140:375;;12300:67;12364:2;12359:3;12300:67;;;12293:74;;12400:34;12396:1;12391:3;12387:11;12380:55;12469:8;12464:2;12459:3;12455:12;12448:30;12506:2;12501:3;12497:12;12490:19;;12286:229;;;;12524:332;;12684:67;12748:2;12743:3;12684:67;;;12677:74;;12784:34;12780:1;12775:3;12771:11;12764:55;12847:2;12842:3;12838:12;12831:19;;12670:186;;;;12865:391;;13025:67;13089:2;13084:3;13025:67;;;13018:74;;13125:34;13121:1;13116:3;13112:11;13105:55;13194:24;13189:2;13184:3;13180:12;13173:46;13247:2;13242:3;13238:12;13231:19;;13011:245;;;;13265:399;;13425:67;13489:2;13484:3;13425:67;;;13418:74;;13525:34;13521:1;13516:3;13512:11;13505:55;13594:32;13589:2;13584:3;13580:12;13573:54;13655:2;13650:3;13646:12;13639:19;;13411:253;;;;13673:400;;13833:67;13897:2;13892:3;13833:67;;;13826:74;;13933:34;13929:1;13924:3;13920:11;13913:55;14002:33;13997:2;13992:3;13988:12;13981:55;14064:2;14059:3;14055:12;14048:19;;13819:254;;;;14082:378;;14242:67;14306:2;14301:3;14242:67;;;14235:74;;14342:34;14338:1;14333:3;14329:11;14322:55;14411:11;14406:2;14401:3;14397:12;14390:33;14451:2;14446:3;14442:12;14435:19;;14228:232;;;;14551:654;14706:4;14701:3;14697:14;14792:4;14785:5;14781:16;14775:23;14804:63;14861:4;14856:3;14852:14;14838:12;14804:63;;;14726:147;14951:4;14944:5;14940:16;14934:23;14963:63;15020:4;15015:3;15011:14;14997:12;14963:63;;;14883:149;15109:4;15102:5;15098:16;15092:23;15121:63;15178:4;15173:3;15169:14;15155:12;15121:63;;;15042:148;14679:526;;;;15293:633;15436:4;15431:3;15427:14;15526:4;15519:5;15515:16;15509:23;15538:63;15595:4;15590:3;15586:14;15572:12;15538:63;;;15456:151;15682:4;15675:5;15671:16;15665:23;15694:63;15751:4;15746:3;15742:14;15728:12;15694:63;;;15617:146;15836:4;15829:5;15825:16;15819:23;15848:57;15899:4;15894:3;15890:14;15876:12;15848:57;;;15773:138;15409:517;;;;15933:103;16006:24;16024:5;16006:24;;;16001:3;15994:37;15988:48;;;16043:113;16126:24;16144:5;16126:24;;;16121:3;16114:37;16108:48;;;16163:378;;16308:73;16377:3;16368:6;16308:73;;;16403:1;16398:3;16394:11;16387:18;;16416:75;16487:3;16478:6;16416:75;;;16513:2;16508:3;16504:12;16497:19;;16533:3;16526:10;;16296:245;;;;;;16548:244;;16667:75;16738:3;16729:6;16667:75;;;16764:2;16759:3;16755:12;16748:19;;16784:3;16777:10;;16655:137;;;;;16799:383;;16946:75;17017:3;17008:6;16946:75;;;17043:2;17038:3;17034:12;17027:19;;17057:75;17128:3;17119:6;17057:75;;;17154:2;17149:3;17145:12;17138:19;;17174:3;17167:10;;16934:248;;;;;;17189:262;;17333:93;17422:3;17413:6;17333:93;;;17326:100;;17443:3;17436:10;;17314:137;;;;;17458:213;;17576:2;17565:9;17561:18;17553:26;;17590:71;17658:1;17647:9;17643:17;17634:6;17590:71;;;17547:124;;;;;17678:340;;17832:2;17821:9;17817:18;17809:26;;17846:79;17922:1;17911:9;17907:17;17898:6;17846:79;;;17936:72;18004:2;17993:9;17989:18;17980:6;17936:72;;;17803:215;;;;;;18025:481;;18253:2;18242:9;18238:18;18230:26;;18303:9;18297:4;18293:20;18289:1;18278:9;18274:17;18267:47;18328:168;18491:4;18482:6;18328:168;;;18320:176;;18224:282;;;;;18513:201;;18625:2;18614:9;18610:18;18602:26;;18639:65;18701:1;18690:9;18686:17;18677:6;18639:65;;;18596:118;;;;;18721:297;;18857:2;18846:9;18842:18;18834:26;;18907:9;18901:4;18897:20;18893:1;18882:9;18878:17;18871:47;18932:76;19003:4;18994:6;18932:76;;;18924:84;;18828:190;;;;;19025:407;;19216:2;19205:9;19201:18;19193:26;;19266:9;19260:4;19256:20;19252:1;19241:9;19237:17;19230:47;19291:131;19417:4;19291:131;;;19283:139;;19187:245;;;;19439:407;;19630:2;19619:9;19615:18;19607:26;;19680:9;19674:4;19670:20;19666:1;19655:9;19651:17;19644:47;19705:131;19831:4;19705:131;;;19697:139;;19601:245;;;;19853:407;;20044:2;20033:9;20029:18;20021:26;;20094:9;20088:4;20084:20;20080:1;20069:9;20065:17;20058:47;20119:131;20245:4;20119:131;;;20111:139;;20015:245;;;;20267:407;;20458:2;20447:9;20443:18;20435:26;;20508:9;20502:4;20498:20;20494:1;20483:9;20479:17;20472:47;20533:131;20659:4;20533:131;;;20525:139;;20429:245;;;;20681:407;;20872:2;20861:9;20857:18;20849:26;;20922:9;20916:4;20912:20;20908:1;20897:9;20893:17;20886:47;20947:131;21073:4;20947:131;;;20939:139;;20843:245;;;;21095:407;;21286:2;21275:9;21271:18;21263:26;;21336:9;21330:4;21326:20;21322:1;21311:9;21307:17;21300:47;21361:131;21487:4;21361:131;;;21353:139;;21257:245;;;;21509:337;;21689:2;21678:9;21674:18;21666:26;;21703:133;21833:1;21822:9;21818:17;21809:6;21703:133;;;21660:186;;;;;21853:213;;21971:2;21960:9;21956:18;21948:26;;21985:71;22053:1;22042:9;22038:17;22029:6;21985:71;;;21942:124;;;;;22073:256;;22135:2;22129:9;22119:19;;22173:4;22165:6;22161:17;22272:6;22260:10;22257:22;22236:18;22224:10;22221:34;22218:62;22215:2;;;22293:1;22290;22283:12;22215:2;22313:10;22309:2;22302:22;22113:216;;;;;22336:335;;22526:18;22518:6;22515:30;22512:2;;;22558:1;22555;22548:12;22512:2;22593:4;22585:6;22581:17;22573:25;;22656:4;22650;22646:15;22638:23;;22449:222;;;;22678:333;;22866:18;22858:6;22855:30;22852:2;;;22898:1;22895;22888:12;22852:2;22933:4;22925:6;22921:17;22913:25;;22996:4;22990;22986:15;22978:23;;22789:222;;;;23018:334;;23207:18;23199:6;23196:30;23193:2;;;23239:1;23236;23229:12;23193:2;23274:4;23266:6;23262:17;23254:25;;23337:4;23331;23327:15;23319:23;;23130:222;;;;23359:181;;23475:3;23467:11;;23513:4;23508:3;23504:14;23496:22;;23461:79;;;;23547:167;;23686:5;23680:12;23670:22;;23651:63;;;;23721:121;;23814:5;23808:12;23798:22;;23779:63;;;;23849:138;;23977:4;23972:3;23968:14;23960:22;;23954:33;;;;23995:208;;24155:6;24150:3;24143:19;24192:4;24187:3;24183:14;24168:29;;24136:67;;;;;24212:162;;24326:6;24321:3;24314:19;24363:4;24358:3;24354:14;24339:29;;24307:67;;;;;24383:144;;24518:3;24503:18;;24496:31;;;;;24536:163;;24651:6;24646:3;24639:19;24688:4;24683:3;24679:14;24664:29;;24632:67;;;;;24707:91;;24769:24;24787:5;24769:24;;;24758:35;;24752:46;;;;24805:85;;24878:5;24871:13;24864:21;24853:32;;24847:43;;;;24897:144;;24969:66;24962:5;24958:78;24947:89;;24941:100;;;;25048:145;;25121:66;25114:5;25110:78;25099:89;;25093:100;;;;25200:72;;25262:5;25251:16;;25245:27;;;;25279:121;;25352:42;25345:5;25341:54;25330:65;;25324:76;;;;25407:72;;25469:5;25458:16;;25452:27;;;;25486:129;;25573:37;25604:5;25573:37;;;25560:50;;25554:61;;;;25622:121;;25701:37;25732:5;25701:37;;;25688:50;;25682:61;;;;25750:108;;25829:24;25847:5;25829:24;;;25816:37;;25810:48;;;;25866:268;25931:1;25938:101;25952:6;25949:1;25946:13;25938:101;;;26028:1;26023:3;26019:11;26013:18;26009:1;26004:3;26000:11;25993:39;25974:2;25971:1;25967:10;25962:15;;25938:101;;;26054:6;26051:1;26048:13;26045:2;;;26119:1;26110:6;26105:3;26101:16;26094:27;26045:2;25915:219;;;;;26142:73;;26205:5;26194:16;;26188:27;;;;26222:74;;26286:5;26275:16;;26269:27;;;;26303:97;;26391:2;26387:7;26382:2;26375:5;26371:14;26367:28;26357:38;;26351:49;;;;26408:117;26477:24;26495:5;26477:24;;;26470:5;26467:35;26457:2;;26516:1;26513;26506:12;26457:2;26451:74;;26532:111;26598:21;26613:5;26598:21;;;26591:5;26588:32;26578:2;;26634:1;26631;26624:12;26578:2;26572:71;;26650:117;26719:24;26737:5;26719:24;;;26712:5;26709:35;26699:2;;26758:1;26755;26748:12;26699:2;26693:74;;26774:117;26843:24;26861:5;26843:24;;;26836:5;26833:35;26823:2;;26882:1;26879;26872:12;26823:2;26817:74;;26898:117;26967:24;26985:5;26967:24;;;26960:5;26957:35;26947:2;;27006:1;27003;26996:12;26947:2;26941:74;
Swarm Source
ipfs://7add6dcc7d775b021d606a7b94ae5beb7e8d964e7bda81779bef9f673ccd3d81
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 25 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.