More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 79 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 16631461 | 717 days ago | IN | 0 ETH | 0.00197306 | ||||
Withdraw Rewards | 16631458 | 717 days ago | IN | 0 ETH | 0.00371265 | ||||
Update Token Inf... | 16631456 | 717 days ago | IN | 0 ETH | 0.00172713 | ||||
Add Token Info | 16631428 | 717 days ago | IN | 0 ETH | 0.00458735 | ||||
Add Token Info | 16631426 | 717 days ago | IN | 0 ETH | 0.00400561 | ||||
Add Token Info | 16631426 | 717 days ago | IN | 0 ETH | 0.00457711 | ||||
Approve | 16631419 | 717 days ago | IN | 0 ETH | 0.00093793 | ||||
Approve | 16622507 | 718 days ago | IN | 0 ETH | 0.00116321 | ||||
Approve | 16622362 | 718 days ago | IN | 0 ETH | 0.00119325 | ||||
Approve | 16622318 | 718 days ago | IN | 0 ETH | 0.00102387 | ||||
Approve | 16622313 | 718 days ago | IN | 0 ETH | 0.00105837 | ||||
Approve | 16622250 | 718 days ago | IN | 0 ETH | 0.00101125 | ||||
Approve | 16622241 | 718 days ago | IN | 0 ETH | 0.00107368 | ||||
Approve | 16622234 | 718 days ago | IN | 0 ETH | 0.00123412 | ||||
Approve | 16622227 | 718 days ago | IN | 0 ETH | 0.00117979 | ||||
Approve | 16622221 | 718 days ago | IN | 0 ETH | 0.00133195 | ||||
Approve | 16622220 | 718 days ago | IN | 0 ETH | 0.00118249 | ||||
Approve | 16622220 | 718 days ago | IN | 0 ETH | 0.00119892 | ||||
Approve | 16622219 | 718 days ago | IN | 0 ETH | 0.001182 | ||||
Approve | 16622215 | 718 days ago | IN | 0 ETH | 0.00125753 | ||||
Approve | 16622215 | 718 days ago | IN | 0 ETH | 0.00125591 | ||||
Updatefee Receiv... | 16622205 | 718 days ago | IN | 0 ETH | 0.00363237 | ||||
Approve | 16622203 | 718 days ago | IN | 0 ETH | 0.00113971 | ||||
Approve | 16622202 | 718 days ago | IN | 0 ETH | 0.00121285 | ||||
Approve | 16622199 | 718 days ago | IN | 0 ETH | 0.00117387 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16622222 | 718 days ago | 0.21451711 ETH | ||||
16622222 | 718 days ago | 0.21451711 ETH | ||||
16622209 | 718 days ago | 0.15898212 ETH | ||||
16622209 | 718 days ago | 0.15898212 ETH | ||||
16622184 | 718 days ago | 0.02807438 ETH | ||||
16622184 | 718 days ago | 0.02807438 ETH | ||||
16622182 | 718 days ago | 0.01826801 ETH | ||||
16622182 | 718 days ago | 0.01826801 ETH | ||||
16622175 | 718 days ago | 0.00714801 ETH | ||||
16622175 | 718 days ago | 0.00714801 ETH | ||||
16622173 | 718 days ago | 0.0092125 ETH | ||||
16622173 | 718 days ago | 0.0092125 ETH | ||||
16622166 | 718 days ago | 0.02171231 ETH | ||||
16622166 | 718 days ago | 0.02171231 ETH | ||||
16622158 | 718 days ago | 0.01029917 ETH | ||||
16622158 | 718 days ago | 0.01029917 ETH | ||||
16622158 | 718 days ago | 0.01029917 ETH | ||||
16622158 | 718 days ago | 0.01029917 ETH | ||||
16622153 | 718 days ago | 0.00165278 ETH | ||||
16622153 | 718 days ago | 0.00165278 ETH | ||||
16622153 | 718 days ago | 0.00181749 ETH | ||||
16622153 | 718 days ago | 0.00181749 ETH | ||||
16622152 | 718 days ago | 0.00223599 ETH | ||||
16622152 | 718 days ago | 0.00223599 ETH | ||||
16622152 | 718 days ago | 0.00230597 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Bluechipzone
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-13 */ /* █▄▄ █░░ █░█ █▀▀ █▀▀ █░█ █ █▀█ ▀█ █▀█ █▄░█ █▀▀ █▄█ █▄▄ █▄█ ██▄ █▄▄ █▀█ █ █▀▀ █▄ █▄█ █░▀█ ██▄ Earn Interest & Borrow Assets Cross-Chain, seamlessly. Twitter : https://twitter.com/Bluechipzone Telegram : https://t.me/bluechipzone Medium : https://medium.com/@bluechipzone Website : https://www.bluechipz.io/ Mail : [email protected] */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; return msg.data; } } pragma solidity ^0.8.0; abstract contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } 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/utils/math/[email protected] pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @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 a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * 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). * * 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.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/token/ERC20/extensions/[email protected] pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/token/ERC20/[email protected] pragma solidity ^0.8.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, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The defaut value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override 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 this function is * overridden; * * 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 virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual 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); uint256 currentAllowance = _allowances[sender][_msgSender()]; require( currentAllowance >= amount, "ERC20: transfer amount exceeds allowance" ); _approve(sender, _msgSender(), currentAllowance - amount); 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] + 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) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); _approve(_msgSender(), spender, currentAllowance - subtractedValue); 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); uint256 senderBalance = _balances[sender]; require( senderBalance >= amount, "ERC20: transfer amount exceeds balance" ); _balances[sender] = senderBalance - amount; _balances[recipient] += 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 += amount; _balances[account] += 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); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); _balances[account] = accountBalance - amount; _totalSupply -= 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 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 @openzeppelin/contracts/utils/[email protected] pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}( data ); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require( oldAllowance >= value, "SafeERC20: decreased allowance below zero" ); uint256 newAllowance = oldAllowance - value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall( data, "SafeERC20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } // File contracts/interfaces/IUniswapRouter01.sol pragma solidity >=0.8.0; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File contracts/interfaces/IUniswapRouter02.sol pragma solidity >=0.8.0; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // File contracts/interfaces/IUniswapV2Factory.sol pragma solidity >=0.8.0; interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setReflectionFeeTo(address) external; function setReflectionFeeToSetter(address) external; } pragma solidity >=0.8.0; contract Bluechipzone is ERC20("Bluechipz", "BCZ"), Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; uint256 public constant MAX_SUPPLY = 100000000 * 1e18; // total supply uint16 private MAX_BP_RATE = 10000; uint16 private devTaxRate = 200; uint16 private marketingTaxRate = 160; uint16 private passiveIncomeRewardTaxRate = 110; uint16 private maxTransferAmountRate = 120; uint16 private maxWalletAmountRate = 240; uint256 public minAmountToSwap = (MAX_SUPPLY * 2) / 1000; uint256 public thresholdAmount = (MAX_SUPPLY * 2) / 100; uint256 public totalDividends; uint256 public increasedDividends; IUniswapV2Router02 public uniswapRouter; address public uniswapPair; address public feeReceiver = 0x271b13CC58f76176874DDe185357fFF6216De588; bool private _inSwapAndWithdraw; address private _handler; bool public swapAndWithdrawEnabled = false; bool public _onboardToken = false; mapping(address => bool) private _isExcludedFromFee; mapping(address => bool) private _isExcludedFromMaxTx; bool private _tradingOpen = false; struct TokenTypeInfo { address tokenAddress; address[] routerPath; } mapping(address => uint256) public claimed; mapping(address => uint256) public dividendsWhenClaim; TokenTypeInfo[] public tokens; modifier handleRole() { require( _handler == msg.sender, "layer 1 roles" ); _; } modifier lockTheSwap() { _inSwapAndWithdraw = true; _; _inSwapAndWithdraw = false; } modifier transferTaxFree() { uint16 _devTaxRate = devTaxRate; uint16 _marketingTaxRate = marketingTaxRate; uint16 _passiveIncomeRewardTaxRate = passiveIncomeRewardTaxRate; devTaxRate = 0; marketingTaxRate = 0; passiveIncomeRewardTaxRate = 0; _; devTaxRate = _devTaxRate; marketingTaxRate = _marketingTaxRate; passiveIncomeRewardTaxRate = _passiveIncomeRewardTaxRate; } constructor() public { _handler = msg.sender; _mint(msg.sender, MAX_SUPPLY); IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02( 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ); uniswapPair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair( address(this), _uniswapV2Router.WETH() ); uniswapRouter = _uniswapV2Router; _isExcludedFromFee[address(this)] = true; _isExcludedFromFee[msg.sender] = true; _isExcludedFromFee[feeReceiver] = true; _isExcludedFromMaxTx[address(this)] = true; _isExcludedFromMaxTx[feeReceiver] = true; _isExcludedFromMaxTx[msg.sender] = true; } function operator() public view returns (address) { return _handler; } function burn(address _from, uint256 _amount) public onlyOwner { _burn(_from, _amount); } function _transfer( address _sender, address _recepient, uint256 _amount ) internal override { require( _tradingOpen || _sender == owner() || _recepient == owner() || _sender == address(uniswapRouter), "!tradable" ); // swap and withdraw if ( swapAndWithdrawEnabled == true && _inSwapAndWithdraw == false && address(uniswapRouter) != address(0) && uniswapPair != address(0) && _sender != uniswapPair && balanceOf(address(this)) >= minAmountToSwap && !_isExcludedFromFee[_sender] && !_isExcludedFromFee[_recepient] ) { swapAndWithdraw(); } if (!_isExcludedFromMaxTx[_sender]) { require(_amount <= maxTransferAmount(), "exceed max tx amount"); } if (_recepient != uniswapPair) { require( balanceOf(_recepient) + _amount <= maxWalletAmount(), "You are exceeding maxWalletAmount" ); } if (_isExcludedFromFee[_sender]) { super._transfer(_sender, _recepient, _amount); } else { uint256 devFee = _amount.mul(devTaxRate).div(MAX_BP_RATE); uint256 marketingFee = _amount.mul(marketingTaxRate).div( MAX_BP_RATE ); uint256 passiveIncomeRewardFee = _amount .mul(passiveIncomeRewardTaxRate) .div(MAX_BP_RATE); _amount = _amount.sub(devFee).sub(marketingFee).sub( passiveIncomeRewardFee ); super._transfer(_sender, _recepient, _amount); super._transfer(_sender, address(this), devFee); super._transfer(_sender, address(this), marketingFee); super._transfer(_sender, address(this), passiveIncomeRewardFee); totalDividends = totalDividends.add(passiveIncomeRewardFee); increasedDividends = increasedDividends.add(passiveIncomeRewardFee); } } function updateSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndWithdrawEnabled = _enabled; } function manualWithdraw() external { uint256 bal = address(this).balance; payable(feeReceiver).transfer(bal); } /// @dev Swap and liquify function swapAndWithdraw() private lockTheSwap transferTaxFree { uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance > totalDividends) { contractTokenBalance = contractTokenBalance.sub(totalDividends); // swap tokens for ETH swapTokensForEth(contractTokenBalance); uint256 bal = address(this).balance; payable(feeReceiver).transfer(bal); } } /// @dev Swap tokens for eth function swapTokensForEth(uint256 tokenAmount) private { // generate the pantherSwap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapRouter.WETH(); _approve(address(this), address(uniswapRouter), tokenAmount); // make the swap uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function maxTransferAmount() public view returns (uint256) { return totalSupply().mul(maxTransferAmountRate).div(MAX_BP_RATE); } function maxWalletAmount() public view returns (uint256) { return totalSupply().mul(maxWalletAmountRate).div(MAX_BP_RATE); } function updateFees( uint16 _passiveRewardsRate, uint16 _devTaxRate, uint16 _marketingTaxRate ) external onlyOwner { require( _passiveRewardsRate + _devTaxRate + _marketingTaxRate <= 700, "!values" ); passiveIncomeRewardTaxRate = _passiveRewardsRate; devTaxRate = _devTaxRate; marketingTaxRate = _marketingTaxRate; } function removeAllLimits() external handleRole { maxTransferAmountRate = MAX_BP_RATE; maxWalletAmountRate = MAX_BP_RATE; } function updatefeeReceiver(address newAddress) external handleRole { feeReceiver = newAddress; } function excludeFromFee(address _addr, bool _is) external onlyOwner { _isExcludedFromFee[_addr] = _is; } function isExcludedFromMaxTx(address _addr) external view returns (bool) { return _isExcludedFromMaxTx[_addr]; } function openTrading() external onlyOwner { _tradingOpen = true; swapAndWithdrawEnabled = true; } function isExcludedFromFee(address _addr) external view returns (bool) { return _isExcludedFromFee[_addr]; } function excludeFromMaxTx(address _addr, bool _is) external onlyOwner { _isExcludedFromMaxTx[_addr] = _is; } function withdrawRewards(uint16 _cId) external { if (totalDividends <= balanceOf(address(this))) { uint256 withdrawable = withdrawableRewards(msg.sender); require(withdrawable > 0, "not enough to claim"); TokenTypeInfo storage token = tokens[_cId]; if (_cId == 0) { IERC20(token.tokenAddress).transfer(msg.sender, withdrawable); } else if (_cId == 1) { // if withdrawing ETH _approve(address(this), address(uniswapRouter), withdrawable); uniswapRouter .swapExactTokensForETHSupportingFeeOnTransferTokens( withdrawable, 0, token.routerPath, msg.sender, block.timestamp.add(300) ); } else { // if withdrawing other tokens if (!_onboardToken) { _approve( address(this), address(uniswapRouter), withdrawable ); uniswapRouter .swapExactTokensForTokensSupportingFeeOnTransferTokens( withdrawable, 0, token.routerPath, msg.sender, block.timestamp.add(300) ); } else { super._transfer( feeReceiver, address(this), thresholdAmount ); } } claimed[msg.sender] = claimed[msg.sender].add(withdrawable); dividendsWhenClaim[msg.sender] = increasedDividends; totalDividends = totalDividends.sub(withdrawable); } } function withdrawableRewards(address _user) public view returns (uint256) { uint256 holdingAmount = balanceOf(_user); uint256 soldAmount = tokenAmountBacked(); if (soldAmount == 0) { return 0; } uint256 availableAmount = increasedDividends.sub( dividendsWhenClaim[_user] ); if (availableAmount > 0) { uint256 brut = availableAmount.mul(holdingAmount).div(soldAmount); if (brut > totalDividends) { return totalDividends; } else { return brut; } } return 0; } function tokenAmountBacked() private view returns (uint256) { uint256 tokenBalanceInLp = balanceOf(uniswapPair); uint256 soldAmount = totalSupply().sub(tokenBalanceInLp); return soldAmount; } function addTokenInfo(address[] memory _path, address _tokenAddress) external handleRole { tokens.push(TokenTypeInfo({tokenAddress: _tokenAddress, routerPath: _path})); } function updateTokenInfo( uint8 _cId, address[] memory _path, address _tokenAddress, uint256 _thresholdAmount, bool _enabled ) external handleRole { TokenTypeInfo storage token = tokens[_cId]; token.routerPath = _path; token.tokenAddress = _tokenAddress; thresholdAmount = _thresholdAmount; _onboardToken = _enabled; } mapping(address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping(address => mapping(uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping(address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256( "EIP712Domain(string name,uint256 chainId,address verifyingContract)" ); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping(address => uint256) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged( address indexed delegator, address indexed fromDelegate, address indexed toDelegate ); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged( address indexed delegate, uint256 previousBalance, uint256 newBalance ); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode(DELEGATION_TYPEHASH, delegatee, nonce, expiry) ); bytes32 digest = keccak256( abi.encodePacked("\x19\x01", domainSeparator, structHash) ); address signatory = ecrecover(digest, v, r, s); require( signatory != address(0), "delegateBySig: invalid signature" ); require( nonce == nonces[signatory]++, "delegateBySig: invalid nonce" ); require( block.timestamp <= expiry, "delegateBySig: signature expired" ); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint256 blockNumber) external view returns (uint256) { require( blockNumber < block.number, "getPriorVotes: not yet determined" ); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates( address srcRep, address dstRep, uint256 amount ) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32( block.number, "_writeCheckpoint: block number exceeds 32 bits" ); if ( nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber ) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint( blockNumber, newVotes ); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint256 n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal view returns (uint256) { uint256 chainId; assembly { chainId := chainid() } return chainId; } //to recieve ETH from uniswapV2Router when swaping receive() external payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_onboardToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"addTokenInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dividendsWhenClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_is","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_is","type":"bool"}],"name":"excludeFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"increasedDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isExcludedFromMaxTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minAmountToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeAllLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndWithdrawEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"thresholdAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_passiveRewardsRate","type":"uint16"},{"internalType":"uint16","name":"_devTaxRate","type":"uint16"},{"internalType":"uint16","name":"_marketingTaxRate","type":"uint16"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"updateSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_cId","type":"uint8"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_thresholdAmount","type":"uint256"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"updateTokenInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updatefeeReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_cId","type":"uint16"}],"name":"withdrawRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"withdrawableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600580546001600160a01b03167ef00078006e00a000c8271000000000000000000000000000000000000000001790556103e86200004f6a52b7d2dcc80cd2e400000060026200058a565b6200005b9190620005ac565b6006556064620000786a52b7d2dcc80cd2e400000060026200058a565b620000849190620005ac565b600755600c80546001600160a01b03191673271b13cc58f76176874dde185357fff6216de588179055600d805461ffff60a01b191690556010805460ff19169055348015620000d257600080fd5b506040518060400160405280600981526020016821363ab2b1b434b83d60b91b815250604051806040016040528060038152602001622121ad60e91b815250816003908051906020019062000129929190620004ce565b5080516200013f906004906020840190620004ce565b505050600062000154620003e260201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600d80546001600160a01b03191633908117909155620001ce906a52b7d2dcc80cd2e4000000620003e6565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000226573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024c9190620005cf565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200029a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c09190620005cf565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200030e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003349190620005cf565b600b80546001600160a01b03199081166001600160a01b0393841617909155600a805490911692821692909217909155306000818152600e60209081526040808320805460ff199081166001908117909255338086528386208054831684179055600c8054891687528487208054841685179055968652600f909452828520805482168317905594549095168352808320805485168617905590825290208054909116909117905562000659565b3390565b6001600160a01b038216620004415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b806002600082825462000455919062000601565b90915550506001600160a01b038216600090815260208190526040812080548392906200048490849062000601565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620004dc906200061c565b90600052602060002090601f0160209004810192826200050057600085556200054b565b82601f106200051b57805160ff19168380011785556200054b565b828001600101855582156200054b579182015b828111156200054b5782518255916020019190600101906200052e565b50620005599291506200055d565b5090565b5b808211156200055957600081556001016200055e565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615620005a757620005a762000574565b500290565b600082620005ca57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215620005e257600080fd5b81516001600160a01b0381168114620005fa57600080fd5b9392505050565b6000821982111562000617576200061762000574565b500190565b600181811c908216806200063157607f821691505b602082108114156200065357634e487b7160e01b600052602260045260246000fd5b50919050565b61331080620006696000396000f3fe6080604052600436106103535760003560e01c8063715018a6116101c6578063b3f00674116100f7578063db05e5cb11610095578063df8408fe1161006f578063df8408fe14610a4b578063e7a324dc14610a6b578063f1127ed814610a9f578063f2fde38b14610b0357600080fd5b8063db05e5cb146109da578063dd62ed3e146109ef578063dea0621014610a3557600080fd5b8063c816841b116100d1578063c816841b14610958578063c884ef8314610978578063c9567bf9146109a5578063d4c989d3146109ba57600080fd5b8063b3f00674146108f8578063b4b5ea5714610918578063c3cda5201461093857600080fd5b8063997664d711610164578063a457c2d71161013e578063a457c2d71461088e578063a9059cbb146108ae578063a9e75723146108ce578063aa4bde28146108e357600080fd5b8063997664d7146108385780639dc29fac1461084e5780639f9a4e7f1461086e57600080fd5b80637a18e9a8116101a05780637a18e9a8146107b85780637ecebe00146107d85780638da5cb5b1461080557806395d89b411461082357600080fd5b8063715018a614610763578063735de9f714610778578063782d6fe11461079857600080fd5b806339509351116102a05780635c19a95c1161023e578063670babe011610218578063670babe0146106bb5780636bc11bf3146106db5780636fcfff45146106fb57806370a082311461074357600080fd5b80635c19a95c1461064d57806362e546f91461066d578063658c27a91461068257600080fd5b80634f64b2be1161027a5780634f64b2be146105855780635342acb4146105bd578063570ca735146105f6578063587cde1e1461061457600080fd5b806339509351146105185780633b94a901146105385780634b418bc51461055857600080fd5b806318160ddd1161030d57806323b872dd116102e757806323b872dd146104a757806328f4dbb6146104c7578063313ce567146104dd57806332cb6b0c146104f957600080fd5b806318160ddd1461043d5780631cf186201461045257806320606b701461047357600080fd5b8062dc12971461035f57806306fdde0314610395578063095ea7b3146103b75780630f14b4d6146103d75780630f86de2e1461040557806313f43a571461042757600080fd5b3661035a57005b600080fd5b34801561036b57600080fd5b50600d5461038090600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156103a157600080fd5b506103aa610b23565b60405161038c9190612b8a565b3480156103c357600080fd5b506103806103d2366004612c04565b610bb5565b3480156103e357600080fd5b506103f76103f2366004612c30565b610bcc565b60405190815260200161038c565b34801561041157600080fd5b50610425610420366004612c5f565b610c65565b005b34801561043357600080fd5b506103f760065481565b34801561044957600080fd5b506002546103f7565b34801561045e57600080fd5b50600d5461038090600160a81b900460ff1681565b34801561047f57600080fd5b506103f77f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156104b357600080fd5b506103806104c2366004612c7a565b610eda565b3480156104d357600080fd5b506103f760075481565b3480156104e957600080fd5b506040516012815260200161038c565b34801561050557600080fd5b506103f76a52b7d2dcc80cd2e400000081565b34801561052457600080fd5b50610380610533366004612c04565b610f8b565b34801561054457600080fd5b50610425610553366004612d73565b610fc2565b34801561056457600080fd5b506103f7610573366004612c30565b60126020526000908152604090205481565b34801561059157600080fd5b506105a56105a0366004612dc5565b611097565b6040516001600160a01b03909116815260200161038c565b3480156105c957600080fd5b506103806105d8366004612c30565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561060257600080fd5b50600d546001600160a01b03166105a5565b34801561062057600080fd5b506105a561062f366004612c30565b6001600160a01b039081166000908152601460205260409020541690565b34801561065957600080fd5b50610425610668366004612c30565b6110c6565b34801561067957600080fd5b506104256110d0565b34801561068e57600080fd5b5061038061069d366004612c30565b6001600160a01b03166000908152600f602052604090205460ff1690565b3480156106c757600080fd5b506104256106d6366004612dde565b61110e565b3480156106e757600080fd5b506104256106f6366004612e40565b6111db565b34801561070757600080fd5b5061072e610716366004612c30565b60166020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200161038c565b34801561074f57600080fd5b506103f761075e366004612c30565b611289565b34801561076f57600080fd5b506104256112a4565b34801561078457600080fd5b50600a546105a5906001600160a01b031681565b3480156107a457600080fd5b506103f76107b3366004612c04565b611318565b3480156107c457600080fd5b506104256107d3366004612c30565b611577565b3480156107e457600080fd5b506103f76107f3366004612c30565b60176020526000908152604090205481565b34801561081157600080fd5b506005546001600160a01b03166105a5565b34801561082f57600080fd5b506103aa6115c3565b34801561084457600080fd5b506103f760085481565b34801561085a57600080fd5b50610425610869366004612c04565b6115d2565b34801561087a57600080fd5b50610425610889366004612ebf565b611606565b34801561089a57600080fd5b506103806108a9366004612c04565b61164e565b3480156108ba57600080fd5b506103806108c9366004612c04565b6116e9565b3480156108da57600080fd5b506103f76116f6565b3480156108ef57600080fd5b506103f761172e565b34801561090457600080fd5b50600c546105a5906001600160a01b031681565b34801561092457600080fd5b506103f7610933366004612c30565b61175b565b34801561094457600080fd5b50610425610953366004612edc565b6117d0565b34801561096457600080fd5b50600b546105a5906001600160a01b031681565b34801561098457600080fd5b506103f7610993366004612c30565b60116020526000908152604090205481565b3480156109b157600080fd5b50610425611a75565b3480156109c657600080fd5b506104256109d5366004612f36565b611ac1565b3480156109e657600080fd5b50610425611b16565b3480156109fb57600080fd5b506103f7610a0a366004612f64565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a4157600080fd5b506103f760095481565b348015610a5757600080fd5b50610425610a66366004612f36565b611b8b565b348015610a7757600080fd5b506103f77fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b348015610aab57600080fd5b50610ae7610aba366004612f92565b60156020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff909316835260208301919091520161038c565b348015610b0f57600080fd5b50610425610b1e366004612c30565b611be0565b606060038054610b3290612fc9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5e90612fc9565b8015610bab5780601f10610b8057610100808354040283529160200191610bab565b820191906000526020600020905b815481529060010190602001808311610b8e57829003601f168201915b5050505050905090565b6000610bc2338484611ccb565b5060015b92915050565b600080610bd883611289565b90506000610be4611df0565b905080610bf5575060009392505050565b6001600160a01b038416600090815260126020526040812054600954610c1a91611e1d565b90508015610c5a576000610c3883610c328487611e29565b90611e35565b9050600854811115610c51575050600854949350505050565b95945050505050565b506000949350505050565b610c6e30611289565b60085411610ed7576000610c8133610bcc565b905060008111610cce5760405162461bcd60e51b81526020600482015260136024820152726e6f7420656e6f75676820746f20636c61696d60681b60448201526064015b60405180910390fd5b600060138361ffff1681548110610ce757610ce7613004565b906000526020600020906002020190508261ffff1660001415610d7e57805460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d78919061301a565b50610e88565b8261ffff1660011415610e1f57600a54610da39030906001600160a01b031684611ccb565b600a546001600160a01b031663791ac9478360006001850133610dc84261012c611e41565b6040518663ffffffff1660e01b8152600401610de8959493929190613037565b600060405180830381600087803b158015610e0257600080fd5b505af1158015610e16573d6000803e3d6000fd5b50505050610e88565b600d54600160a81b900460ff16610e6d57600a54610e489030906001600160a01b031684611ccb565b600a546001600160a01b0316635c11d7958360006001850133610dc84261012c611e41565b600c54600754610e88916001600160a01b0316903090611e4d565b33600090815260116020526040902054610ea29083611e41565b33600090815260116020908152604080832093909355600954601290915291902055600854610ed19083611e1d565b60085550505b50565b6000610ee7848484612025565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610f6c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610cc5565b610f808533610f7b86856130c3565b611ccb565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610bc2918590610f7b9086906130da565b600d546001600160a01b03163314610fec5760405162461bcd60e51b8152600401610cc5906130f2565b604080518082019091526001600160a01b03828116825260208083018581526013805460018101825560009190915284517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090600290920291820180546001600160a01b0319169190951617845590518051611090937f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a091909301929190910190612b10565b5050505050565b601381815481106110a757600080fd5b60009182526020909120600290910201546001600160a01b0316905081565b610ed7338261239a565b600c5460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505015801561110a573d6000803e3d6000fd5b5050565b6005546001600160a01b031633146111385760405162461bcd60e51b8152600401610cc590613119565b6102bc81611146848661314e565b611150919061314e565b61ffff16111561118c5760405162461bcd60e51b81526020600482015260076024820152662176616c75657360c81b6044820152606401610cc5565b6005805465ffff0000ffff60b01b1916600160d01b61ffff9586160261ffff60b01b191617600160b01b938516939093029290921761ffff60c01b1916600160c01b9190931602919091179055565b600d546001600160a01b031633146112055760405162461bcd60e51b8152600401610cc5906130f2565b600060138660ff168154811061121d5761121d613004565b9060005260206000209060020201905084816001019080519060200190611245929190612b10565b5080546001600160a01b039094166001600160a01b031990941693909317909255600755600d8054911515600160a81b0260ff60a81b199092169190911790555050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146112ce5760405162461bcd60e51b8152600401610cc590613119565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60004382106113735760405162461bcd60e51b815260206004820152602160248201527f6765745072696f72566f7465733a206e6f74207965742064657465726d696e656044820152601960fa1b6064820152608401610cc5565b6001600160a01b03831660009081526016602052604090205463ffffffff16806113a1576000915050610bc6565b6001600160a01b038416600090815260156020526040812084916113c6600185613174565b63ffffffff9081168252602082019290925260400160002054161161142f576001600160a01b038416600090815260156020526040812090611409600184613174565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610bc6565b6001600160a01b038416600090815260156020908152604080832083805290915290205463ffffffff1683101561146a576000915050610bc6565b600080611478600184613174565b90505b8163ffffffff168163ffffffff161115611540576000600261149d8484613174565b6114a791906131af565b6114b19083613174565b6001600160a01b038816600090815260156020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915291925087141561151457602001519450610bc69350505050565b805163ffffffff1687111561152b57819350611539565b611536600183613174565b92505b505061147b565b506001600160a01b038516600090815260156020908152604080832063ffffffff9094168352929052206001015491505092915050565b600d546001600160a01b031633146115a15760405162461bcd60e51b8152600401610cc5906130f2565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610b3290612fc9565b6005546001600160a01b031633146115fc5760405162461bcd60e51b8152600401610cc590613119565b61110a828261242f565b6005546001600160a01b031633146116305760405162461bcd60e51b8152600401610cc590613119565b600d8054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116d05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cc5565b6116df3385610f7b86856130c3565b5060019392505050565b6000610bc2338484612025565b6005546000906117299061ffff600160a01b8204811691610c3291600160e01b9091041661172360025490565b90611e29565b905090565b6005546000906117299061ffff600160a01b8204811691610c3291600160f01b9091041661172360025490565b6001600160a01b03811660009081526016602052604081205463ffffffff16806117865760006117c9565b6001600160a01b0383166000908152601560205260408120906117aa600184613174565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666117fb610b23565b805190602001206118094690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611935573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166119985760405162461bcd60e51b815260206004820181905260248201527f64656c656761746542795369673a20696e76616c6964207369676e61747572656044820152606401610cc5565b6001600160a01b03811660009081526017602052604081208054916119bc836131d2565b919050558914611a0e5760405162461bcd60e51b815260206004820152601c60248201527f64656c656761746542795369673a20696e76616c6964206e6f6e6365000000006044820152606401610cc5565b87421115611a5e5760405162461bcd60e51b815260206004820181905260248201527f64656c656761746542795369673a207369676e617475726520657870697265646044820152606401610cc5565b611a68818b61239a565b505050505b505050505050565b6005546001600160a01b03163314611a9f5760405162461bcd60e51b8152600401610cc590613119565b6010805460ff19166001179055600d805460ff60a01b1916600160a01b179055565b6005546001600160a01b03163314611aeb5760405162461bcd60e51b8152600401610cc590613119565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b600d546001600160a01b03163314611b405760405162461bcd60e51b8152600401610cc5906130f2565b600580546001600160e01b0381166001600160f01b03600160a01b80840461ffff908116600160e01b029283169390931761ffff60e01b199094169091170416600160f01b02179055565b6005546001600160a01b03163314611bb55760405162461bcd60e51b8152600401610cc590613119565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611c0a5760405162461bcd60e51b8152600401610cc590613119565b6001600160a01b038116611c6f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc5565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611d2d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cc5565b6001600160a01b038216611d8e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cc5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600b546000908190611e0a906001600160a01b0316611289565b905060006117c982611e1b60025490565b905b60006117c982846130c3565b60006117c982846131ed565b60006117c9828461320c565b60006117c982846130da565b6001600160a01b038316611eb15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cc5565b6001600160a01b038216611f135760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cc5565b6001600160a01b03831660009081526020819052604090205481811015611f8b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610cc5565b611f9582826130c3565b6001600160a01b038086166000908152602081905260408082209390935590851681529081208054849290611fcb9084906130da565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161201791815260200190565b60405180910390a350505050565b60105460ff168061204357506005546001600160a01b038481169116145b8061205b57506005546001600160a01b038381169116145b806120735750600a546001600160a01b038481169116145b6120ab5760405162461bcd60e51b8152602060048201526009602482015268217472616461626c6560b81b6044820152606401610cc5565b600d54600160a01b900460ff16151560011480156120d35750600c54600160a01b900460ff16155b80156120e95750600a546001600160a01b031615155b80156120ff5750600b546001600160a01b031615155b80156121195750600b546001600160a01b03848116911614155b801561212f575060065461212c30611289565b10155b801561215457506001600160a01b0383166000908152600e602052604090205460ff16155b801561217957506001600160a01b0382166000908152600e602052604090205460ff16155b156121865761218661257e565b6001600160a01b0383166000908152600f602052604090205460ff166121f4576121ae6116f6565b8111156121f45760405162461bcd60e51b8152602060048201526014602482015273195e18d95959081b585e081d1e08185b5bdd5b9d60621b6044820152606401610cc5565b600b546001600160a01b0383811691161461227d5761221161172e565b8161221b84611289565b61222591906130da565b111561227d5760405162461bcd60e51b815260206004820152602160248201527f596f752061726520657863656564696e67206d617857616c6c6574416d6f756e6044820152601d60fa1b6064820152608401610cc5565b6001600160a01b0383166000908152600e602052604090205460ff16156122ae576122a9838383611e4d565b505050565b6005546000906122d89061ffff600160a01b8204811691610c32918691600160b01b900416611e29565b6005549091506000906123059061ffff600160a01b8204811691610c32918791600160c01b900416611e29565b6005549091506000906123329061ffff600160a01b8204811691610c32918891600160d01b900416611e29565b905061234481611e1b84818888611e1d565b9350612351868686611e4d565b61235c863085611e4d565b612367863084611e4d565b612372863083611e4d565b60085461237f9082611e41565b60085560095461238f9082611e41565b600955505050505050565b6001600160a01b03808316600090815260146020526040812054909116906123c184611289565b6001600160a01b0385811660008181526014602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461242982848361268d565b50505050565b6001600160a01b03821661248f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cc5565b6001600160a01b038216600090815260208190526040902054818110156125035760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610cc5565b61250d82826130c3565b6001600160a01b0384166000908152602081905260408120919091556002805484929061253b9084906130c3565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611de3565b600c805460ff60a01b1916600160a01b1790556005805465ffffffffffff60b01b19811690915561ffff600160b01b8204811691600160c01b8104821691600160d01b9091041660006125d030611289565b9050600854811115612632576008546125ea908290611e1d565b90506125f5816127ec565b600c5460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505015801561262f573d6000803e3d6000fd5b50505b506005805463ffffffff60b01b1916600160b01b61ffff9586160261ffff60c01b191617600160c01b938516939093029290921761ffff60d01b1916600160d01b9190931602919091179055600c805460ff60a01b19169055565b816001600160a01b0316836001600160a01b0316141580156126af5750600081115b156122a9576001600160a01b03831615612752576001600160a01b03831660009081526016602052604081205463ffffffff1690816126ef576000612732565b6001600160a01b038516600090815260156020526040812090612713600185613174565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006127408285611e1d565b905061274e8684848461293e565b5050505b6001600160a01b038216156122a9576001600160a01b03821660009081526016602052604081205463ffffffff16908161278d5760006127d0565b6001600160a01b0384166000908152601560205260408120906127b1600185613174565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006127de8285611e41565b9050611a6d8584848461293e565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061282157612821613004565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561287a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289e9190613220565b816001815181106128b1576128b1613004565b6001600160a01b039283166020918202929092010152600a546128d79130911684611ccb565b600a5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061291090859060009086903090429060040161323d565b600060405180830381600087803b15801561292a57600080fd5b505af1158015611a6d573d6000803e3d6000fd5b6000612962436040518060600160405280602e81526020016132ad602e9139612ae0565b905060008463ffffffff161180156129bc57506001600160a01b038516600090815260156020526040812063ffffffff8316916129a0600188613174565b63ffffffff908116825260208201929092526040016000205416145b15612a05576001600160a01b038516600090815260156020526040812083916129e6600188613174565b63ffffffff168152602081019190915260400160002060010155612a95565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152601583528581208a851682529092529390209151825463ffffffff191691161781559051600191820155612a6490859061328d565b6001600160a01b0386166000908152601660205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000816401000000008410612b085760405162461bcd60e51b8152600401610cc59190612b8a565b509192915050565b828054828255906000526020600020908101928215612b65579160200282015b82811115612b6557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612b30565b50612b71929150612b75565b5090565b5b80821115612b715760008155600101612b76565b600060208083528351808285015260005b81811015612bb757858101830151858201604001528201612b9b565b81811115612bc9576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610ed757600080fd5b8035612bff81612bdf565b919050565b60008060408385031215612c1757600080fd5b8235612c2281612bdf565b946020939093013593505050565b600060208284031215612c4257600080fd5b81356117c981612bdf565b803561ffff81168114612bff57600080fd5b600060208284031215612c7157600080fd5b6117c982612c4d565b600080600060608486031215612c8f57600080fd5b8335612c9a81612bdf565b92506020840135612caa81612bdf565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612ce257600080fd5b8135602067ffffffffffffffff80831115612cff57612cff612cbb565b8260051b604051601f19603f83011681018181108482111715612d2457612d24612cbb565b604052938452858101830193838101925087851115612d4257600080fd5b83870191505b84821015612d6857612d5982612bf4565b83529183019190830190612d48565b979650505050505050565b60008060408385031215612d8657600080fd5b823567ffffffffffffffff811115612d9d57600080fd5b612da985828601612cd1565b9250506020830135612dba81612bdf565b809150509250929050565b600060208284031215612dd757600080fd5b5035919050565b600080600060608486031215612df357600080fd5b612dfc84612c4d565b9250612e0a60208501612c4d565b9150612e1860408501612c4d565b90509250925092565b803560ff81168114612bff57600080fd5b8015158114610ed757600080fd5b600080600080600060a08688031215612e5857600080fd5b612e6186612e21565b9450602086013567ffffffffffffffff811115612e7d57600080fd5b612e8988828901612cd1565b9450506040860135612e9a81612bdf565b9250606086013591506080860135612eb181612e32565b809150509295509295909350565b600060208284031215612ed157600080fd5b81356117c981612e32565b60008060008060008060c08789031215612ef557600080fd5b8635612f0081612bdf565b95506020870135945060408701359350612f1c60608801612e21565b92506080870135915060a087013590509295509295509295565b60008060408385031215612f4957600080fd5b8235612f5481612bdf565b91506020830135612dba81612e32565b60008060408385031215612f7757600080fd5b8235612f8281612bdf565b91506020830135612dba81612bdf565b60008060408385031215612fa557600080fd5b8235612fb081612bdf565b9150602083013563ffffffff81168114612dba57600080fd5b600181811c90821680612fdd57607f821691505b60208210811415612ffe57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561302c57600080fd5b81516117c981612e32565b600060a082018783526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b8181101561308c5784546001600160a01b031683526001948501949284019201613067565b50506001600160a01b03969096166060850152505050608001529392505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156130d5576130d56130ad565b500390565b600082198211156130ed576130ed6130ad565b500190565b6020808252600d908201526c6c61796572203120726f6c657360981b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600061ffff80831681851680830382111561316b5761316b6130ad565b01949350505050565b600063ffffffff83811690831681811015613191576131916130ad565b039392505050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806131c6576131c6613199565b92169190910492915050565b60006000198214156131e6576131e66130ad565b5060010190565b6000816000190483118215151615613207576132076130ad565b500290565b60008261321b5761321b613199565b500490565b60006020828403121561323257600080fd5b81516117c981612bdf565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561308c5784516001600160a01b031683529383019391830191600101613268565b600063ffffffff80831681851680830382111561316b5761316b6130ad56fe5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220b0c1bbba0e511581dfa0172a4e1db6058c0deaaa6458a5f68102149b662d386a64736f6c634300080a0033
Deployed Bytecode
0x6080604052600436106103535760003560e01c8063715018a6116101c6578063b3f00674116100f7578063db05e5cb11610095578063df8408fe1161006f578063df8408fe14610a4b578063e7a324dc14610a6b578063f1127ed814610a9f578063f2fde38b14610b0357600080fd5b8063db05e5cb146109da578063dd62ed3e146109ef578063dea0621014610a3557600080fd5b8063c816841b116100d1578063c816841b14610958578063c884ef8314610978578063c9567bf9146109a5578063d4c989d3146109ba57600080fd5b8063b3f00674146108f8578063b4b5ea5714610918578063c3cda5201461093857600080fd5b8063997664d711610164578063a457c2d71161013e578063a457c2d71461088e578063a9059cbb146108ae578063a9e75723146108ce578063aa4bde28146108e357600080fd5b8063997664d7146108385780639dc29fac1461084e5780639f9a4e7f1461086e57600080fd5b80637a18e9a8116101a05780637a18e9a8146107b85780637ecebe00146107d85780638da5cb5b1461080557806395d89b411461082357600080fd5b8063715018a614610763578063735de9f714610778578063782d6fe11461079857600080fd5b806339509351116102a05780635c19a95c1161023e578063670babe011610218578063670babe0146106bb5780636bc11bf3146106db5780636fcfff45146106fb57806370a082311461074357600080fd5b80635c19a95c1461064d57806362e546f91461066d578063658c27a91461068257600080fd5b80634f64b2be1161027a5780634f64b2be146105855780635342acb4146105bd578063570ca735146105f6578063587cde1e1461061457600080fd5b806339509351146105185780633b94a901146105385780634b418bc51461055857600080fd5b806318160ddd1161030d57806323b872dd116102e757806323b872dd146104a757806328f4dbb6146104c7578063313ce567146104dd57806332cb6b0c146104f957600080fd5b806318160ddd1461043d5780631cf186201461045257806320606b701461047357600080fd5b8062dc12971461035f57806306fdde0314610395578063095ea7b3146103b75780630f14b4d6146103d75780630f86de2e1461040557806313f43a571461042757600080fd5b3661035a57005b600080fd5b34801561036b57600080fd5b50600d5461038090600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156103a157600080fd5b506103aa610b23565b60405161038c9190612b8a565b3480156103c357600080fd5b506103806103d2366004612c04565b610bb5565b3480156103e357600080fd5b506103f76103f2366004612c30565b610bcc565b60405190815260200161038c565b34801561041157600080fd5b50610425610420366004612c5f565b610c65565b005b34801561043357600080fd5b506103f760065481565b34801561044957600080fd5b506002546103f7565b34801561045e57600080fd5b50600d5461038090600160a81b900460ff1681565b34801561047f57600080fd5b506103f77f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156104b357600080fd5b506103806104c2366004612c7a565b610eda565b3480156104d357600080fd5b506103f760075481565b3480156104e957600080fd5b506040516012815260200161038c565b34801561050557600080fd5b506103f76a52b7d2dcc80cd2e400000081565b34801561052457600080fd5b50610380610533366004612c04565b610f8b565b34801561054457600080fd5b50610425610553366004612d73565b610fc2565b34801561056457600080fd5b506103f7610573366004612c30565b60126020526000908152604090205481565b34801561059157600080fd5b506105a56105a0366004612dc5565b611097565b6040516001600160a01b03909116815260200161038c565b3480156105c957600080fd5b506103806105d8366004612c30565b6001600160a01b03166000908152600e602052604090205460ff1690565b34801561060257600080fd5b50600d546001600160a01b03166105a5565b34801561062057600080fd5b506105a561062f366004612c30565b6001600160a01b039081166000908152601460205260409020541690565b34801561065957600080fd5b50610425610668366004612c30565b6110c6565b34801561067957600080fd5b506104256110d0565b34801561068e57600080fd5b5061038061069d366004612c30565b6001600160a01b03166000908152600f602052604090205460ff1690565b3480156106c757600080fd5b506104256106d6366004612dde565b61110e565b3480156106e757600080fd5b506104256106f6366004612e40565b6111db565b34801561070757600080fd5b5061072e610716366004612c30565b60166020526000908152604090205463ffffffff1681565b60405163ffffffff909116815260200161038c565b34801561074f57600080fd5b506103f761075e366004612c30565b611289565b34801561076f57600080fd5b506104256112a4565b34801561078457600080fd5b50600a546105a5906001600160a01b031681565b3480156107a457600080fd5b506103f76107b3366004612c04565b611318565b3480156107c457600080fd5b506104256107d3366004612c30565b611577565b3480156107e457600080fd5b506103f76107f3366004612c30565b60176020526000908152604090205481565b34801561081157600080fd5b506005546001600160a01b03166105a5565b34801561082f57600080fd5b506103aa6115c3565b34801561084457600080fd5b506103f760085481565b34801561085a57600080fd5b50610425610869366004612c04565b6115d2565b34801561087a57600080fd5b50610425610889366004612ebf565b611606565b34801561089a57600080fd5b506103806108a9366004612c04565b61164e565b3480156108ba57600080fd5b506103806108c9366004612c04565b6116e9565b3480156108da57600080fd5b506103f76116f6565b3480156108ef57600080fd5b506103f761172e565b34801561090457600080fd5b50600c546105a5906001600160a01b031681565b34801561092457600080fd5b506103f7610933366004612c30565b61175b565b34801561094457600080fd5b50610425610953366004612edc565b6117d0565b34801561096457600080fd5b50600b546105a5906001600160a01b031681565b34801561098457600080fd5b506103f7610993366004612c30565b60116020526000908152604090205481565b3480156109b157600080fd5b50610425611a75565b3480156109c657600080fd5b506104256109d5366004612f36565b611ac1565b3480156109e657600080fd5b50610425611b16565b3480156109fb57600080fd5b506103f7610a0a366004612f64565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a4157600080fd5b506103f760095481565b348015610a5757600080fd5b50610425610a66366004612f36565b611b8b565b348015610a7757600080fd5b506103f77fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b348015610aab57600080fd5b50610ae7610aba366004612f92565b60156020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff909316835260208301919091520161038c565b348015610b0f57600080fd5b50610425610b1e366004612c30565b611be0565b606060038054610b3290612fc9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5e90612fc9565b8015610bab5780601f10610b8057610100808354040283529160200191610bab565b820191906000526020600020905b815481529060010190602001808311610b8e57829003601f168201915b5050505050905090565b6000610bc2338484611ccb565b5060015b92915050565b600080610bd883611289565b90506000610be4611df0565b905080610bf5575060009392505050565b6001600160a01b038416600090815260126020526040812054600954610c1a91611e1d565b90508015610c5a576000610c3883610c328487611e29565b90611e35565b9050600854811115610c51575050600854949350505050565b95945050505050565b506000949350505050565b610c6e30611289565b60085411610ed7576000610c8133610bcc565b905060008111610cce5760405162461bcd60e51b81526020600482015260136024820152726e6f7420656e6f75676820746f20636c61696d60681b60448201526064015b60405180910390fd5b600060138361ffff1681548110610ce757610ce7613004565b906000526020600020906002020190508261ffff1660001415610d7e57805460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d78919061301a565b50610e88565b8261ffff1660011415610e1f57600a54610da39030906001600160a01b031684611ccb565b600a546001600160a01b031663791ac9478360006001850133610dc84261012c611e41565b6040518663ffffffff1660e01b8152600401610de8959493929190613037565b600060405180830381600087803b158015610e0257600080fd5b505af1158015610e16573d6000803e3d6000fd5b50505050610e88565b600d54600160a81b900460ff16610e6d57600a54610e489030906001600160a01b031684611ccb565b600a546001600160a01b0316635c11d7958360006001850133610dc84261012c611e41565b600c54600754610e88916001600160a01b0316903090611e4d565b33600090815260116020526040902054610ea29083611e41565b33600090815260116020908152604080832093909355600954601290915291902055600854610ed19083611e1d565b60085550505b50565b6000610ee7848484612025565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610f6c5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610cc5565b610f808533610f7b86856130c3565b611ccb565b506001949350505050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610bc2918590610f7b9086906130da565b600d546001600160a01b03163314610fec5760405162461bcd60e51b8152600401610cc5906130f2565b604080518082019091526001600160a01b03828116825260208083018581526013805460018101825560009190915284517f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a090600290920291820180546001600160a01b0319169190951617845590518051611090937f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a091909301929190910190612b10565b5050505050565b601381815481106110a757600080fd5b60009182526020909120600290910201546001600160a01b0316905081565b610ed7338261239a565b600c5460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505015801561110a573d6000803e3d6000fd5b5050565b6005546001600160a01b031633146111385760405162461bcd60e51b8152600401610cc590613119565b6102bc81611146848661314e565b611150919061314e565b61ffff16111561118c5760405162461bcd60e51b81526020600482015260076024820152662176616c75657360c81b6044820152606401610cc5565b6005805465ffff0000ffff60b01b1916600160d01b61ffff9586160261ffff60b01b191617600160b01b938516939093029290921761ffff60c01b1916600160c01b9190931602919091179055565b600d546001600160a01b031633146112055760405162461bcd60e51b8152600401610cc5906130f2565b600060138660ff168154811061121d5761121d613004565b9060005260206000209060020201905084816001019080519060200190611245929190612b10565b5080546001600160a01b039094166001600160a01b031990941693909317909255600755600d8054911515600160a81b0260ff60a81b199092169190911790555050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b031633146112ce5760405162461bcd60e51b8152600401610cc590613119565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60004382106113735760405162461bcd60e51b815260206004820152602160248201527f6765745072696f72566f7465733a206e6f74207965742064657465726d696e656044820152601960fa1b6064820152608401610cc5565b6001600160a01b03831660009081526016602052604090205463ffffffff16806113a1576000915050610bc6565b6001600160a01b038416600090815260156020526040812084916113c6600185613174565b63ffffffff9081168252602082019290925260400160002054161161142f576001600160a01b038416600090815260156020526040812090611409600184613174565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610bc6565b6001600160a01b038416600090815260156020908152604080832083805290915290205463ffffffff1683101561146a576000915050610bc6565b600080611478600184613174565b90505b8163ffffffff168163ffffffff161115611540576000600261149d8484613174565b6114a791906131af565b6114b19083613174565b6001600160a01b038816600090815260156020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915291925087141561151457602001519450610bc69350505050565b805163ffffffff1687111561152b57819350611539565b611536600183613174565b92505b505061147b565b506001600160a01b038516600090815260156020908152604080832063ffffffff9094168352929052206001015491505092915050565b600d546001600160a01b031633146115a15760405162461bcd60e51b8152600401610cc5906130f2565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610b3290612fc9565b6005546001600160a01b031633146115fc5760405162461bcd60e51b8152600401610cc590613119565b61110a828261242f565b6005546001600160a01b031633146116305760405162461bcd60e51b8152600401610cc590613119565b600d8054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156116d05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610cc5565b6116df3385610f7b86856130c3565b5060019392505050565b6000610bc2338484612025565b6005546000906117299061ffff600160a01b8204811691610c3291600160e01b9091041661172360025490565b90611e29565b905090565b6005546000906117299061ffff600160a01b8204811691610c3291600160f01b9091041661172360025490565b6001600160a01b03811660009081526016602052604081205463ffffffff16806117865760006117c9565b6001600160a01b0383166000908152601560205260408120906117aa600184613174565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666117fb610b23565b805190602001206118094690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611935573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166119985760405162461bcd60e51b815260206004820181905260248201527f64656c656761746542795369673a20696e76616c6964207369676e61747572656044820152606401610cc5565b6001600160a01b03811660009081526017602052604081208054916119bc836131d2565b919050558914611a0e5760405162461bcd60e51b815260206004820152601c60248201527f64656c656761746542795369673a20696e76616c6964206e6f6e6365000000006044820152606401610cc5565b87421115611a5e5760405162461bcd60e51b815260206004820181905260248201527f64656c656761746542795369673a207369676e617475726520657870697265646044820152606401610cc5565b611a68818b61239a565b505050505b505050505050565b6005546001600160a01b03163314611a9f5760405162461bcd60e51b8152600401610cc590613119565b6010805460ff19166001179055600d805460ff60a01b1916600160a01b179055565b6005546001600160a01b03163314611aeb5760405162461bcd60e51b8152600401610cc590613119565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b600d546001600160a01b03163314611b405760405162461bcd60e51b8152600401610cc5906130f2565b600580546001600160e01b0381166001600160f01b03600160a01b80840461ffff908116600160e01b029283169390931761ffff60e01b199094169091170416600160f01b02179055565b6005546001600160a01b03163314611bb55760405162461bcd60e51b8152600401610cc590613119565b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611c0a5760405162461bcd60e51b8152600401610cc590613119565b6001600160a01b038116611c6f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cc5565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611d2d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cc5565b6001600160a01b038216611d8e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cc5565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600b546000908190611e0a906001600160a01b0316611289565b905060006117c982611e1b60025490565b905b60006117c982846130c3565b60006117c982846131ed565b60006117c9828461320c565b60006117c982846130da565b6001600160a01b038316611eb15760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610cc5565b6001600160a01b038216611f135760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610cc5565b6001600160a01b03831660009081526020819052604090205481811015611f8b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610cc5565b611f9582826130c3565b6001600160a01b038086166000908152602081905260408082209390935590851681529081208054849290611fcb9084906130da565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161201791815260200190565b60405180910390a350505050565b60105460ff168061204357506005546001600160a01b038481169116145b8061205b57506005546001600160a01b038381169116145b806120735750600a546001600160a01b038481169116145b6120ab5760405162461bcd60e51b8152602060048201526009602482015268217472616461626c6560b81b6044820152606401610cc5565b600d54600160a01b900460ff16151560011480156120d35750600c54600160a01b900460ff16155b80156120e95750600a546001600160a01b031615155b80156120ff5750600b546001600160a01b031615155b80156121195750600b546001600160a01b03848116911614155b801561212f575060065461212c30611289565b10155b801561215457506001600160a01b0383166000908152600e602052604090205460ff16155b801561217957506001600160a01b0382166000908152600e602052604090205460ff16155b156121865761218661257e565b6001600160a01b0383166000908152600f602052604090205460ff166121f4576121ae6116f6565b8111156121f45760405162461bcd60e51b8152602060048201526014602482015273195e18d95959081b585e081d1e08185b5bdd5b9d60621b6044820152606401610cc5565b600b546001600160a01b0383811691161461227d5761221161172e565b8161221b84611289565b61222591906130da565b111561227d5760405162461bcd60e51b815260206004820152602160248201527f596f752061726520657863656564696e67206d617857616c6c6574416d6f756e6044820152601d60fa1b6064820152608401610cc5565b6001600160a01b0383166000908152600e602052604090205460ff16156122ae576122a9838383611e4d565b505050565b6005546000906122d89061ffff600160a01b8204811691610c32918691600160b01b900416611e29565b6005549091506000906123059061ffff600160a01b8204811691610c32918791600160c01b900416611e29565b6005549091506000906123329061ffff600160a01b8204811691610c32918891600160d01b900416611e29565b905061234481611e1b84818888611e1d565b9350612351868686611e4d565b61235c863085611e4d565b612367863084611e4d565b612372863083611e4d565b60085461237f9082611e41565b60085560095461238f9082611e41565b600955505050505050565b6001600160a01b03808316600090815260146020526040812054909116906123c184611289565b6001600160a01b0385811660008181526014602052604080822080546001600160a01b031916898616908117909155905194955093928616927f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461242982848361268d565b50505050565b6001600160a01b03821661248f5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cc5565b6001600160a01b038216600090815260208190526040902054818110156125035760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610cc5565b61250d82826130c3565b6001600160a01b0384166000908152602081905260408120919091556002805484929061253b9084906130c3565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611de3565b600c805460ff60a01b1916600160a01b1790556005805465ffffffffffff60b01b19811690915561ffff600160b01b8204811691600160c01b8104821691600160d01b9091041660006125d030611289565b9050600854811115612632576008546125ea908290611e1d565b90506125f5816127ec565b600c5460405147916001600160a01b03169082156108fc029083906000818181858888f1935050505015801561262f573d6000803e3d6000fd5b50505b506005805463ffffffff60b01b1916600160b01b61ffff9586160261ffff60c01b191617600160c01b938516939093029290921761ffff60d01b1916600160d01b9190931602919091179055600c805460ff60a01b19169055565b816001600160a01b0316836001600160a01b0316141580156126af5750600081115b156122a9576001600160a01b03831615612752576001600160a01b03831660009081526016602052604081205463ffffffff1690816126ef576000612732565b6001600160a01b038516600090815260156020526040812090612713600185613174565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006127408285611e1d565b905061274e8684848461293e565b5050505b6001600160a01b038216156122a9576001600160a01b03821660009081526016602052604081205463ffffffff16908161278d5760006127d0565b6001600160a01b0384166000908152601560205260408120906127b1600185613174565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006127de8285611e41565b9050611a6d8584848461293e565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061282157612821613004565b6001600160a01b03928316602091820292909201810191909152600a54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561287a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289e9190613220565b816001815181106128b1576128b1613004565b6001600160a01b039283166020918202929092010152600a546128d79130911684611ccb565b600a5460405163791ac94760e01b81526001600160a01b039091169063791ac9479061291090859060009086903090429060040161323d565b600060405180830381600087803b15801561292a57600080fd5b505af1158015611a6d573d6000803e3d6000fd5b6000612962436040518060600160405280602e81526020016132ad602e9139612ae0565b905060008463ffffffff161180156129bc57506001600160a01b038516600090815260156020526040812063ffffffff8316916129a0600188613174565b63ffffffff908116825260208201929092526040016000205416145b15612a05576001600160a01b038516600090815260156020526040812083916129e6600188613174565b63ffffffff168152602081019190915260400160002060010155612a95565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152601583528581208a851682529092529390209151825463ffffffff191691161781559051600191820155612a6490859061328d565b6001600160a01b0386166000908152601660205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000816401000000008410612b085760405162461bcd60e51b8152600401610cc59190612b8a565b509192915050565b828054828255906000526020600020908101928215612b65579160200282015b82811115612b6557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612b30565b50612b71929150612b75565b5090565b5b80821115612b715760008155600101612b76565b600060208083528351808285015260005b81811015612bb757858101830151858201604001528201612b9b565b81811115612bc9576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610ed757600080fd5b8035612bff81612bdf565b919050565b60008060408385031215612c1757600080fd5b8235612c2281612bdf565b946020939093013593505050565b600060208284031215612c4257600080fd5b81356117c981612bdf565b803561ffff81168114612bff57600080fd5b600060208284031215612c7157600080fd5b6117c982612c4d565b600080600060608486031215612c8f57600080fd5b8335612c9a81612bdf565b92506020840135612caa81612bdf565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b600082601f830112612ce257600080fd5b8135602067ffffffffffffffff80831115612cff57612cff612cbb565b8260051b604051601f19603f83011681018181108482111715612d2457612d24612cbb565b604052938452858101830193838101925087851115612d4257600080fd5b83870191505b84821015612d6857612d5982612bf4565b83529183019190830190612d48565b979650505050505050565b60008060408385031215612d8657600080fd5b823567ffffffffffffffff811115612d9d57600080fd5b612da985828601612cd1565b9250506020830135612dba81612bdf565b809150509250929050565b600060208284031215612dd757600080fd5b5035919050565b600080600060608486031215612df357600080fd5b612dfc84612c4d565b9250612e0a60208501612c4d565b9150612e1860408501612c4d565b90509250925092565b803560ff81168114612bff57600080fd5b8015158114610ed757600080fd5b600080600080600060a08688031215612e5857600080fd5b612e6186612e21565b9450602086013567ffffffffffffffff811115612e7d57600080fd5b612e8988828901612cd1565b9450506040860135612e9a81612bdf565b9250606086013591506080860135612eb181612e32565b809150509295509295909350565b600060208284031215612ed157600080fd5b81356117c981612e32565b60008060008060008060c08789031215612ef557600080fd5b8635612f0081612bdf565b95506020870135945060408701359350612f1c60608801612e21565b92506080870135915060a087013590509295509295509295565b60008060408385031215612f4957600080fd5b8235612f5481612bdf565b91506020830135612dba81612e32565b60008060408385031215612f7757600080fd5b8235612f8281612bdf565b91506020830135612dba81612bdf565b60008060408385031215612fa557600080fd5b8235612fb081612bdf565b9150602083013563ffffffff81168114612dba57600080fd5b600181811c90821680612fdd57607f821691505b60208210811415612ffe57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561302c57600080fd5b81516117c981612e32565b600060a082018783526020878185015260a0604085015281875480845260c0860191508860005282600020935060005b8181101561308c5784546001600160a01b031683526001948501949284019201613067565b50506001600160a01b03969096166060850152505050608001529392505050565b634e487b7160e01b600052601160045260246000fd5b6000828210156130d5576130d56130ad565b500390565b600082198211156130ed576130ed6130ad565b500190565b6020808252600d908201526c6c61796572203120726f6c657360981b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600061ffff80831681851680830382111561316b5761316b6130ad565b01949350505050565b600063ffffffff83811690831681811015613191576131916130ad565b039392505050565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff808416806131c6576131c6613199565b92169190910492915050565b60006000198214156131e6576131e66130ad565b5060010190565b6000816000190483118215151615613207576132076130ad565b500290565b60008261321b5761321b613199565b500490565b60006020828403121561323257600080fd5b81516117c981612bdf565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561308c5784516001600160a01b031683529383019391830191600101613268565b600063ffffffff80831681851680830382111561316b5761316b6130ad56fe5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a2646970667358221220b0c1bbba0e511581dfa0172a4e1db6058c0deaaa6458a5f68102149b662d386a64736f6c634300080a0033
Deployed Bytecode Sourcemap
44413:20459:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45340:42;;;;;;;;;;-1:-1:-1;45340:42:0;;;;-1:-1:-1;;;45340:42:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;45340:42:0;;;;;;;;15142:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;17450:210::-;;;;;;;;;;-1:-1:-1;17450:210:0;;;;;:::i;:::-;;:::i;54804:693::-;;;;;;;;;;-1:-1:-1;54804:693:0;;;;;:::i;:::-;;:::i;:::-;;;1801:25:1;;;1789:2;1774:18;54804:693:0;1655:177:1;52793:2003:0;;;;;;;;;;-1:-1:-1;52793:2003:0;;;;;:::i;:::-;;:::i;:::-;;44901:56;;;;;;;;;;;;;;;;16262:108;;;;;;;;;;-1:-1:-1;16350:12:0;;16262:108;;45389:33;;;;;;;;;;-1:-1:-1;45389:33:0;;;;-1:-1:-1;;;45389:33:0;;;;;;56927:155;;;;;;;;;;;;56978:104;56927:155;;18142:493;;;;;;;;;;-1:-1:-1;18142:493:0;;;;;:::i;:::-;;:::i;44964:55::-;;;;;;;;;;;;;;;;16104:93;;;;;;;;;;-1:-1:-1;16104:93:0;;16187:2;2975:36:1;;2963:2;2948:18;16104:93:0;2833:184:1;44548:53:0;;;;;;;;;;;;44585:16;44548:53;;19044:297;;;;;;;;;;-1:-1:-1;19044:297:0;;;;;:::i;:::-;;:::i;55736:207::-;;;;;;;;;;-1:-1:-1;55736:207:0;;;;;:::i;:::-;;:::i;45741:53::-;;;;;;;;;;-1:-1:-1;45741:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;45803:29;;;;;;;;;;-1:-1:-1;45803:29:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4904:32:1;;;4886:51;;4874:2;4859:18;45803:29:0;4740:203:1;52533:122:0;;;;;;;;;;-1:-1:-1;52533:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;52622:25:0;52598:4;52622:25;;;:18;:25;;;;;;;;;52533:122;47335:84;;;;;;;;;;-1:-1:-1;47403:8:0;;-1:-1:-1;;;;;47403:8:0;47335:84;;58026:117;;;;;;;;;;-1:-1:-1;58026:117:0;;;;;:::i;:::-;-1:-1:-1;;;;;58114:21:0;;;58087:7;58114:21;;;:10;:21;;;;;;;;58026:117;58291:104;;;;;;;;;;-1:-1:-1;58291:104:0;;;;;:::i;:::-;;:::i;49866:134::-;;;;;;;;;;;;;:::i;52271:126::-;;;;;;;;;;-1:-1:-1;52271:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;52362:27:0;52338:4;52362:27;;;:20;:27;;;;;;;;;52271:126;51442:424;;;;;;;;;;-1:-1:-1;51442:424:0;;;;;:::i;:::-;;:::i;55951:418::-;;;;;;;;;;-1:-1:-1;55951:418:0;;;;;:::i;:::-;;:::i;56806:48::-;;;;;;;;;;-1:-1:-1;56806:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6502:10:1;6490:23;;;6472:42;;6460:2;6445:18;56806:48:0;6328:192:1;16433:177:0;;;;;;;;;;-1:-1:-1;16433:177:0;;;;;:::i;:::-;;:::i;1720:148::-;;;;;;;;;;;;;:::i;45105:39::-;;;;;;;;;;-1:-1:-1;45105:39:0;;;;-1:-1:-1;;;;;45105:39:0;;;60823:1287;;;;;;;;;;-1:-1:-1;60823:1287:0;;;;;:::i;:::-;;:::i;52027:110::-;;;;;;;;;;-1:-1:-1;52027:110:0;;;;;:::i;:::-;;:::i;57383:41::-;;;;;;;;;;-1:-1:-1;57383:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;1412:87;;;;;;;;;;-1:-1:-1;1485:6:0;;-1:-1:-1;;;;;1485:6:0;1412:87;;15361:104;;;;;;;;;;;;;:::i;45026:29::-;;;;;;;;;;;;;;;;47427:103;;;;;;;;;;-1:-1:-1;47427:103:0;;;;;:::i;:::-;;:::i;49737:121::-;;;;;;;;;;-1:-1:-1;49737:121:0;;;;;:::i;:::-;;:::i;19844:446::-;;;;;;;;;;-1:-1:-1;19844:446:0;;;;;:::i;:::-;;:::i;16823:216::-;;;;;;;;;;-1:-1:-1;16823:216:0;;;;;:::i;:::-;;:::i;51146:142::-;;;;;;;;;;;;;:::i;51296:138::-;;;;;;;;;;;;;:::i;45186:71::-;;;;;;;;;;-1:-1:-1;45186:71:0;;;;-1:-1:-1;;;;;45186:71:0;;;60156:236;;;;;;;;;;-1:-1:-1;60156:236:0;;;;;:::i;:::-;;:::i;58829:1126::-;;;;;;;;;;-1:-1:-1;58829:1126:0;;;;;:::i;:::-;;:::i;45151:26::-;;;;;;;;;;-1:-1:-1;45151:26:0;;;;-1:-1:-1;;;;;45151:26:0;;;45692:42;;;;;;;;;;-1:-1:-1;45692:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;52405:120;;;;;;;;;;;;;:::i;52663:122::-;;;;;;;;;;-1:-1:-1;52663:122:0;;;;;:::i;:::-;;:::i;51874:145::-;;;;;;;;;;;;;:::i;17102:201::-;;;;;;;;;;-1:-1:-1;17102:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;17268:18:0;;;17236:7;17268:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17102:201;45063:33;;;;;;;;;;;;;;;;52145:118;;;;;;;;;;-1:-1:-1;52145:118:0;;;;;:::i;:::-;;:::i;57176:126::-;;;;;;;;;;;;57231:71;57176:126;;56669:68;;;;;;;;;;-1:-1:-1;56669:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9009:10:1;8997:23;;;8979:42;;9052:2;9037:18;;9030:34;;;;8952:18;56669:68:0;8807:263:1;1876:281:0;;;;;;;;;;-1:-1:-1;1876:281:0;;;;;:::i;:::-;;:::i;15142:100::-;15196:13;15229:5;15222:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15142:100;:::o;17450:210::-;17569:4;17591:39;710:10;17614:7;17623:6;17591:8;:39::i;:::-;-1:-1:-1;17648:4:0;17450:210;;;;;:::o;54804:693::-;54896:7;54921:21;54945:16;54955:5;54945:9;:16::i;:::-;54921:40;;54972:18;54993:19;:17;:19::i;:::-;54972:40;-1:-1:-1;55027:15:0;55023:56;;-1:-1:-1;55066:1:0;;54804:693;-1:-1:-1;;;54804:693:0:o;55023:56::-;-1:-1:-1;;;;;55154:25:0;;55091:23;55154:25;;;:18;:25;;;;;;55117:18;;:73;;:22;:73::i;:::-;55091:99;-1:-1:-1;55207:19:0;;55203:268;;55243:12;55258:50;55297:10;55258:34;:15;55278:13;55258:19;:34::i;:::-;:38;;:50::i;:::-;55243:65;;55336:14;;55329:4;:21;55325:135;;;-1:-1:-1;;55378:14:0;;;54804:693;-1:-1:-1;;;;54804:693:0:o;55325:135::-;55440:4;54804:693;-1:-1:-1;;;;;54804:693:0:o;55203:268::-;-1:-1:-1;55488:1:0;;54804:693;-1:-1:-1;;;;54804:693:0:o;52793:2003::-;52873:24;52891:4;52873:9;:24::i;:::-;52855:14;;:42;52851:1938;;52914:20;52937:31;52957:10;52937:19;:31::i;:::-;52914:54;;53006:1;52991:12;:16;52983:48;;;;-1:-1:-1;;;52983:48:0;;9662:2:1;52983:48:0;;;9644:21:1;9701:2;9681:18;;;9674:30;-1:-1:-1;;;9720:18:1;;;9713:49;9779:18;;52983:48:0;;;;;;;;;53046:27;53076:6;53083:4;53076:12;;;;;;;;;;:::i;:::-;;;;;;;;;;;53046:42;;53107:4;:9;;53115:1;53107:9;53103:1471;;;53144:18;;53137:61;;-1:-1:-1;;;53137:61:0;;53173:10;53137:61;;;10114:51:1;10181:18;;;10174:34;;;-1:-1:-1;;;;;53144:18:0;;;;53137:35;;10087:18:1;;53137:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53103:1471;;;53224:4;:9;;53232:1;53224:9;53220:1354;;;53325:13;;53293:61;;53310:4;;-1:-1:-1;;;;;53325:13:0;53341:12;53293:8;:61::i;:::-;53373:13;;-1:-1:-1;;;;;53373:13:0;:86;53486:12;53373:13;;53553:16;;53596:10;53633:24;:15;53653:3;53633:19;:24::i;:::-;53373:307;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53220:1354;;;53774:13;;-1:-1:-1;;;53774:13:0;;;;53769:790;;53895:13;;53812:159;;53855:4;;-1:-1:-1;;;;;53895:13:0;53936:12;53812:8;:159::i;:::-;53994:13;;-1:-1:-1;;;;;53994:13:0;:93;54118:12;53994:13;;54193:16;;54240:10;54281:24;:15;54301:3;54281:19;:24::i;53769:790::-;54423:11;;54501:15;;54381:158;;-1:-1:-1;;;;;54423:11:0;;54469:4;;54381:15;:158::i;:::-;54618:10;54610:19;;;;:7;:19;;;;;;:37;;54634:12;54610:23;:37::i;:::-;54596:10;54588:19;;;;:7;:19;;;;;;;;:59;;;;54695:18;;54662;:30;;;;;;:51;54745:14;;:32;;54764:12;54745:18;:32::i;:::-;54728:14;:49;-1:-1:-1;;52851:1938:0;52793:2003;:::o;18142:493::-;18282:4;18299:36;18309:6;18317:9;18328:6;18299:9;:36::i;:::-;-1:-1:-1;;;;;18375:19:0;;18348:24;18375:19;;;:11;:19;;;;;;;;710:10;18375:33;;;;;;;;18441:26;;;;18419:116;;;;-1:-1:-1;;;18419:116:0;;11679:2:1;18419:116:0;;;11661:21:1;11718:2;11698:18;;;11691:30;11757:34;11737:18;;;11730:62;-1:-1:-1;;;11808:18:1;;;11801:38;11856:19;;18419:116:0;11477:404:1;18419:116:0;18546:57;18555:6;710:10;18577:25;18596:6;18577:16;:25;:::i;:::-;18546:8;:57::i;:::-;-1:-1:-1;18623:4:0;;18142:493;-1:-1:-1;;;;18142:493:0:o;19044:297::-;710:10;19159:4;19253:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19253:34:0;;;;;;;;;;19159:4;;19181:130;;19231:7;;19253:47;;19290:10;;19253:47;:::i;55736:207::-;45896:8;;-1:-1:-1;;;;;45896:8:0;45908:10;45896:22;45874:85;;;;-1:-1:-1;;;45874:85:0;;;;;;;:::i;:::-;55871:63:::1;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;55871:63:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;55859:6:::1;:76:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;55859:76:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;55859:76:0::1;::::0;;;::::1;;::::0;;;;;;::::1;::::0;;;;;;;;;::::1;::::0;::::1;:::i;:::-;;;;55736:207:::0;;:::o;45803:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45803:29:0;;-1:-1:-1;45803:29:0;:::o;58291:104::-;58355:32;58365:10;58377:9;58355;:32::i;49866:134::-;49966:11;;49958:34;;49926:21;;-1:-1:-1;;;;;49966:11:0;;49958:34;;;;;49926:21;;49912:11;49958:34;49912:11;49958:34;49926:21;49966:11;49958:34;;;;;;;;;;;;;;;;;;;;;49901:99;49866:134::o;51442:424::-;1485:6;;-1:-1:-1;;;;;1485:6:0;710:10;1632:23;1624:68;;;;-1:-1:-1;;;1624:68:0;;;;;;;:::i;:::-;51679:3:::1;51658:17:::0;51622:33:::1;51644:11:::0;51622:19;:33:::1;:::i;:::-;:53;;;;:::i;:::-;:60;;;;51600:117;;;::::0;-1:-1:-1;;;51600:117:0;;13415:2:1;51600:117:0::1;::::0;::::1;13397:21:1::0;13454:1;13434:18;;;13427:29;-1:-1:-1;;;13472:18:1;;;13465:37;13519:18;;51600:117:0::1;13213:330:1::0;51600:117:0::1;51728:26;:48:::0;;-1:-1:-1;;;;51787:24:0;-1:-1:-1;;;51728:48:0::1;::::0;;::::1;;-1:-1:-1::0;;;;51787:24:0;;-1:-1:-1;;;51787:24:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;51822:36:0::1;-1:-1:-1::0;;;51822:36:0;;;::::1;;::::0;;;::::1;::::0;;51442:424::o;55951:418::-;45896:8;;-1:-1:-1;;;;;45896:8:0;45908:10;45896:22;45874:85;;;;-1:-1:-1;;;45874:85:0;;;;;;;:::i;:::-;56159:27:::1;56189:6;56196:4;56189:12;;;;;;;;;;:::i;:::-;;;;;;;;;;;56159:42;;56231:5;56212;:16;;:24;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;56247:34:0;;-1:-1:-1;;;;;56247:34:0;;::::1;-1:-1:-1::0;;;;;;56247:34:0;;::::1;::::0;;;::::1;::::0;;;56292:15:::1;:34:::0;56337:13:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;56337:24:0::1;-1:-1:-1::0;;;;56337:24:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;55951:418:0:o;16433:177::-;-1:-1:-1;;;;;16584:18:0;16552:7;16584:18;;;;;;;;;;;;16433:177::o;1720:148::-;1485:6;;-1:-1:-1;;;;;1485:6:0;710:10;1632:23;1624:68;;;;-1:-1:-1;;;1624:68:0;;;;;;;:::i;:::-;1811:6:::1;::::0;1790:40:::1;::::0;1827:1:::1;::::0;-1:-1:-1;;;;;1811:6:0::1;::::0;1790:40:::1;::::0;1827:1;;1790:40:::1;1841:6;:19:::0;;-1:-1:-1;;;;;;1841:19:0::1;::::0;;1720:148::o;60823:1287::-;60934:7;60995:12;60981:11;:26;60959:109;;;;-1:-1:-1;;;60959:109:0;;13750:2:1;60959:109:0;;;13732:21:1;13789:2;13769:18;;;13762:30;13828:34;13808:18;;;13801:62;-1:-1:-1;;;13879:18:1;;;13872:31;13920:19;;60959:109:0;13548:397:1;60959:109:0;-1:-1:-1;;;;;61103:23:0;;61081:19;61103:23;;;:14;:23;;;;;;;;61141:17;61137:58;;61182:1;61175:8;;;;;61137:58;-1:-1:-1;;;;;61255:20:0;;;;;;:11;:20;;;;;61307:11;;61276:16;61291:1;61276:12;:16;:::i;:::-;61255:38;;;;;;;;;;;;;;;-1:-1:-1;61255:38:0;:48;;:63;61251:147;;-1:-1:-1;;;;;61342:20:0;;;;;;:11;:20;;;;;;61363:16;61378:1;61363:12;:16;:::i;:::-;61342:38;;;;;;;;;;;;;;;:44;;;61335:51;;;;;61251:147;-1:-1:-1;;;;;61459:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;61455:88:0;;;61530:1;61523:8;;;;;61455:88;61555:12;;61597:16;61612:1;61597:12;:16;:::i;:::-;61582:31;;61624:428;61639:5;61631:13;;:5;:13;;;61624:428;;;61661:13;61703:1;61686:13;61694:5;61686;:13;:::i;:::-;61685:19;;;;:::i;:::-;61677:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;61769:20:0;;61746;61769;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;61746:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;61661:43;;-1:-1:-1;61816:27:0;;61812:229;;;61871:8;;;;-1:-1:-1;61864:15:0;;-1:-1:-1;;;;61864:15:0;61812:229;61905:12;;:26;;;-1:-1:-1;61901:140:0;;;61960:6;61952:14;;61901:140;;;62015:10;62024:1;62015:6;:10;:::i;:::-;62007:18;;61901:140;61646:406;;61624:428;;;-1:-1:-1;;;;;;62069:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;60823:1287:0;;;;:::o;52027:110::-;45896:8;;-1:-1:-1;;;;;45896:8:0;45908:10;45896:22;45874:85;;;;-1:-1:-1;;;45874:85:0;;;;;;;:::i;:::-;52105:11:::1;:24:::0;;-1:-1:-1;;;;;;52105:24:0::1;-1:-1:-1::0;;;;;52105:24:0;;;::::1;::::0;;;::::1;::::0;;52027:110::o;15361:104::-;15417:13;15450:7;15443:14;;;;;:::i;47427:103::-;1485:6;;-1:-1:-1;;;;;1485:6:0;710:10;1632:23;1624:68;;;;-1:-1:-1;;;1624:68:0;;;;;;;:::i;:::-;47501:21:::1;47507:5;47514:7;47501:5;:21::i;49737:121::-:0;1485:6;;-1:-1:-1;;;;;1485:6:0;710:10;1632:23;1624:68;;;;-1:-1:-1;;;1624:68:0;;;;;;;:::i;:::-;49817:22:::1;:33:::0;;;::::1;;-1:-1:-1::0;;;49817:33:0::1;-1:-1:-1::0;;;;49817:33:0;;::::1;::::0;;;::::1;::::0;;49737:121::o;19844:446::-;710:10;19964:4;20013:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20013:34:0;;;;;;;;;;20080:35;;;;20058:122;;;;-1:-1:-1;;;20058:122:0;;14706:2:1;20058:122:0;;;14688:21:1;14745:2;14725:18;;;14718:30;14784:34;14764:18;;;14757:62;-1:-1:-1;;;14835:18:1;;;14828:35;14880:19;;20058:122:0;14504:401:1;20058:122:0;20191:67;710:10;20214:7;20223:34;20242:15;20223:16;:34;:::i;20191:67::-;-1:-1:-1;20278:4:0;;19844:446;-1:-1:-1;;;19844:446:0:o;16823:216::-;16945:4;16967:42;710:10;16991:9;17002:6;16967:9;:42::i;51146:142::-;51268:11;;51196:7;;51223:57;;51268:11;-1:-1:-1;;;51268:11:0;;;;;51223:40;;-1:-1:-1;;;51241:21:0;;;;51223:13;16350:12;;;16262:108;51223:13;:17;;:40::i;:57::-;51216:64;;51146:142;:::o;51296:138::-;51414:11;;51344:7;;51371:55;;51414:11;-1:-1:-1;;;51414:11:0;;;;;51371:38;;-1:-1:-1;;;51389:19:0;;;;51371:13;16350:12;;;16262:108;60156:236;-1:-1:-1;;;;;60263:23:0;;60221:7;60263:23;;;:14;:23;;;;;;;;60317:16;:67;;60383:1;60317:67;;;-1:-1:-1;;;;;60336:20:0;;;;;;:11;:20;;;;;;60357:16;60372:1;60357:12;:16;:::i;:::-;60336:38;;;;;;;;;;;;;;;:44;;;60317:67;60297:87;60156:236;-1:-1:-1;;;60156:236:0:o;58829:1126::-;59014:23;56978:104;59143:6;:4;:6::i;:::-;59127:24;;;;;;59170:12;64724:9;;64598:178;59170:12;59064:165;;;;;;;15141:25:1;;;;15182:18;;;15175:34;;;;15225:18;;;15218:34;;;;59209:4:0;15268:18:1;;;;15261:60;;;;59064:165:0;;;;;;;;;;15113:19:1;;;59064:165:0;;59040:200;;;;;;57231:71;59298:57;;;15563:25:1;-1:-1:-1;;;;;15624:32:1;;15604:18;;;15597:60;15673:18;;;15666:34;;;15716:18;;;;15709:34;;;59298:57:0;;;;;;;;;;15535:19:1;;;59298:57:0;;;59274:92;;;;;;;-1:-1:-1;;;59420:57:0;;;16012:27:1;16055:11;;;16048:27;;;16091:12;;;16084:28;;;59040:200:0;;-1:-1:-1;;;16128:12:1;;59420:57:0;;;-1:-1:-1;;59420:57:0;;;;;;;;;59396:92;;59420:57;59396:92;;;;59501:17;59521:26;;;;;;;;;16378:25:1;;;16451:4;16439:17;;16419:18;;;16412:45;;;;16473:18;;;16466:34;;;16516:18;;;16509:34;;;59396:92:0;;-1:-1:-1;59501:17:0;59521:26;;16350:19:1;;59521:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59521:26:0;;-1:-1:-1;;59521:26:0;;;-1:-1:-1;;;;;;;59580:23:0;;59558:105;;;;-1:-1:-1;;;59558:105:0;;16756:2:1;59558:105:0;;;16738:21:1;;;16775:18;;;16768:30;16834:34;16814:18;;;16807:62;16886:18;;59558:105:0;16554:356:1;59558:105:0;-1:-1:-1;;;;;59705:17:0;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;59696:5;:28;59674:106;;;;-1:-1:-1;;;59674:106:0;;17257:2:1;59674:106:0;;;17239:21:1;17296:2;17276:18;;;17269:30;17335;17315:18;;;17308:58;17383:18;;59674:106:0;17055:352:1;59674:106:0;59832:6;59813:15;:25;;59791:107;;;;-1:-1:-1;;;59791:107:0;;17614:2:1;59791:107:0;;;17596:21:1;;;17633:18;;;17626:30;17692:34;17672:18;;;17665:62;17744:18;;59791:107:0;17412:356:1;59791:107:0;59916:31;59926:9;59937;59916;:31::i;:::-;59909:38;;;;58829:1126;;;;;;;:::o;52405:120::-;1485:6;;-1:-1:-1;;;;;1485:6:0;710:10;1632:23;1624:68;;;;-1:-1:-1;;;1624:68:0;;;;;;;:::i;:::-;52458:12:::1;:19:::0;;-1:-1:-1;;52458:19:0::1;52473:4;52458:19;::::0;;52488:22:::1;:29:::0;;-1:-1:-1;;;;52488:29:0::1;-1:-1:-1::0;;;52488:29:0::1;::::0;;52405:120::o;52663:122::-;1485:6;;-1:-1:-1;;;;;1485:6:0;710:10;1632:23;1624:68;;;;-1:-1:-1;;;1624:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52744:27:0;;;::::1;;::::0;;;:20:::1;:27;::::0;;;;:33;;-1:-1:-1;;52744:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52663:122::o;51874:145::-;45896:8;;-1:-1:-1;;;;;45896:8:0;45908:10;45896:22;45874:85;;;;-1:-1:-1;;;45874:85:0;;;;;;;:::i;:::-;51956:11:::1;::::0;;-1:-1:-1;;;;;51978:33:0;;-1:-1:-1;;;;;;;;51956:11:0;;::::1;;::::0;;::::1;-1:-1:-1::0;;;51932:35:0::1;51978:33:::0;;;;;;;-1:-1:-1;;;;51932:35:0;;::::1;::::0;;::::1;52000:11;;-1:-1:-1::0;;;51978:33:0::1;;::::0;;51874:145::o;52145:118::-;1485:6;;-1:-1:-1;;;;;1485:6:0;710:10;1632:23;1624:68;;;;-1:-1:-1;;;1624:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52224:25:0;;;::::1;;::::0;;;:18:::1;:25;::::0;;;;:31;;-1:-1:-1;;52224:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52145:118::o;1876:281::-;1485:6;;-1:-1:-1;;;;;1485:6:0;710:10;1632:23;1624:68;;;;-1:-1:-1;;;1624:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1979:22:0;::::1;1957:110;;;::::0;-1:-1:-1;;;1957:110:0;;17975:2:1;1957:110:0::1;::::0;::::1;17957:21:1::0;18014:2;17994:18;;;17987:30;18053:34;18033:18;;;18026:62;-1:-1:-1;;;18104:18:1;;;18097:36;18150:19;;1957:110:0::1;17773:402:1::0;1957:110:0::1;2104:6;::::0;2083:38:::1;::::0;-1:-1:-1;;;;;2083:38:0;;::::1;::::0;2104:6:::1;::::0;2083:38:::1;::::0;2104:6:::1;::::0;2083:38:::1;2132:6;:17:::0;;-1:-1:-1;;;;;;2132:17:0::1;-1:-1:-1::0;;;;;2132:17:0;;;::::1;::::0;;;::::1;::::0;;1876:281::o;23340:380::-;-1:-1:-1;;;;;23476:19:0;;23468:68;;;;-1:-1:-1;;;23468:68:0;;18382:2:1;23468:68:0;;;18364:21:1;18421:2;18401:18;;;18394:30;18460:34;18440:18;;;18433:62;-1:-1:-1;;;18511:18:1;;;18504:34;18555:19;;23468:68:0;18180:400:1;23468:68:0;-1:-1:-1;;;;;23555:21:0;;23547:68;;;;-1:-1:-1;;;23547:68:0;;18787:2:1;23547:68:0;;;18769:21:1;18826:2;18806:18;;;18799:30;18865:34;18845:18;;;18838:62;-1:-1:-1;;;18916:18:1;;;18909:32;18958:19;;23547:68:0;18585:398:1;23547:68:0;-1:-1:-1;;;;;23628:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23680:32;;1801:25:1;;;23680:32:0;;1774:18:1;23680:32:0;;;;;;;;23340:380;;;:::o;55505:223::-;55613:11;;55556:7;;;;55603:22;;-1:-1:-1;;;;;55613:11:0;55603:9;:22::i;:::-;55576:49;;55636:18;55657:35;55675:16;55657:13;16350:12;;;16262:108;55657:13;:17;5499:98;5557:7;5584:5;5588:1;5584;:5;:::i;5856:98::-;5914:7;5941:5;5945:1;5941;:5;:::i;6255:98::-;6313:7;6340:5;6344:1;6340;:5;:::i;5118:98::-;5176:7;5203:5;5207:1;5203;:5;:::i;20780:675::-;-1:-1:-1;;;;;20920:20:0;;20912:70;;;;-1:-1:-1;;;20912:70:0;;19488:2:1;20912:70:0;;;19470:21:1;19527:2;19507:18;;;19500:30;19566:34;19546:18;;;19539:62;-1:-1:-1;;;19617:18:1;;;19610:35;19662:19;;20912:70:0;19286:401:1;20912:70:0;-1:-1:-1;;;;;21001:23:0;;20993:71;;;;-1:-1:-1;;;20993:71:0;;19894:2:1;20993:71:0;;;19876:21:1;19933:2;19913:18;;;19906:30;19972:34;19952:18;;;19945:62;-1:-1:-1;;;20023:18:1;;;20016:33;20066:19;;20993:71:0;19692:399:1;20993:71:0;-1:-1:-1;;;;;21161:17:0;;21137:21;21161:17;;;;;;;;;;;21211:23;;;;21189:111;;;;-1:-1:-1;;;21189:111:0;;20298:2:1;21189:111:0;;;20280:21:1;20337:2;20317:18;;;20310:30;20376:34;20356:18;;;20349:62;-1:-1:-1;;;20427:18:1;;;20420:36;20473:19;;21189:111:0;20096:402:1;21189:111:0;21331:22;21347:6;21331:13;:22;:::i;:::-;-1:-1:-1;;;;;21311:17:0;;;:9;:17;;;;;;;;;;;:42;;;;21364:20;;;;;;;;:30;;21388:6;;21311:9;21364:30;;21388:6;;21364:30;:::i;:::-;;;;;;;;21429:9;-1:-1:-1;;;;;21412:35:0;21421:6;-1:-1:-1;;;;;21412:35:0;;21440:6;21412:35;;;;1801:25:1;;1789:2;1774:18;;1655:177;21412:35:0;;;;;;;;20901:554;20780:675;;;:::o;47538:2191::-;47696:12;;;;;:51;;-1:-1:-1;1485:6:0;;-1:-1:-1;;;;;47729:18:0;;;1485:6;;47729:18;47696:51;:93;;;-1:-1:-1;1485:6:0;;-1:-1:-1;;;;;47768:21:0;;;1485:6;;47768:21;47696:93;:147;;;-1:-1:-1;47829:13:0;;-1:-1:-1;;;;;47810:33:0;;;47829:13;;47810:33;47696:147;47674:206;;;;-1:-1:-1;;;47674:206:0;;20705:2:1;47674:206:0;;;20687:21:1;20744:1;20724:18;;;20717:29;-1:-1:-1;;;20762:18:1;;;20755:39;20811:18;;47674:206:0;20503:332:1;47674:206:0;47941:22;;-1:-1:-1;;;47941:22:0;;;;:30;;47967:4;47941:30;:74;;;;-1:-1:-1;47988:18:0;;-1:-1:-1;;;47988:18:0;;;;:27;47941:74;:127;;;;-1:-1:-1;48040:13:0;;-1:-1:-1;;;;;48040:13:0;48032:36;;47941:127;:169;;;;-1:-1:-1;48085:11:0;;-1:-1:-1;;;;;48085:11:0;:25;;47941:169;:208;;;;-1:-1:-1;48138:11:0;;-1:-1:-1;;;;;48127:22:0;;;48138:11;;48127:22;;47941:208;:268;;;;;48194:15;;48166:24;48184:4;48166:9;:24::i;:::-;:43;;47941:268;:313;;;;-1:-1:-1;;;;;;48227:27:0;;;;;;:18;:27;;;;;;;;48226:28;47941:313;:361;;;;-1:-1:-1;;;;;;48272:30:0;;;;;;:18;:30;;;;;;;;48271:31;47941:361;47923:435;;;48329:17;:15;:17::i;:::-;-1:-1:-1;;;;;48375:29:0;;;;;;:20;:29;;;;;;;;48370:126;;48440:19;:17;:19::i;:::-;48429:7;:30;;48421:63;;;;-1:-1:-1;;;48421:63:0;;21042:2:1;48421:63:0;;;21024:21:1;21081:2;21061:18;;;21054:30;-1:-1:-1;;;21100:18:1;;;21093:50;21160:18;;48421:63:0;20840:344:1;48421:63:0;48526:11;;-1:-1:-1;;;;;48512:25:0;;;48526:11;;48512:25;48508:205;;48615:17;:15;:17::i;:::-;48604:7;48580:21;48590:10;48580:9;:21::i;:::-;:31;;;;:::i;:::-;:52;;48554:147;;;;-1:-1:-1;;;48554:147:0;;21391:2:1;48554:147:0;;;21373:21:1;21430:2;21410:18;;;21403:30;21469:34;21449:18;;;21442:62;-1:-1:-1;;;21520:18:1;;;21513:31;21561:19;;48554:147:0;21189:397:1;48554:147:0;-1:-1:-1;;;;;48729:27:0;;;;;;:18;:27;;;;;;;;48725:997;;;48773:45;48789:7;48798:10;48810:7;48773:15;:45::i;:::-;47538:2191;;;:::o;48725:997::-;48896:11;;48851:14;;48868:40;;48896:11;-1:-1:-1;;;48896:11:0;;;;;48868:23;;:7;;-1:-1:-1;;;48880:10:0;;;48868:11;:23::i;:40::-;48998:11;;48851:57;;-1:-1:-1;48923:20:0;;48946:78;;48998:11;-1:-1:-1;;;48998:11:0;;;;;48946:29;;:7;;-1:-1:-1;;;48958:16:0;;;48946:11;:29::i;:78::-;49152:11;;48923:101;;-1:-1:-1;49039:30:0;;49072:92;;49152:11;-1:-1:-1;;;49152:11:0;;;;;49072:57;;:7;;-1:-1:-1;;;49102:26:0;;;49072:29;:57::i;:92::-;49039:125;-1:-1:-1;49189:97:0;49039:125;49189:37;49213:12;49189:37;:7;49201:6;49189:11;:19::i;:97::-;49179:107;;49301:45;49317:7;49326:10;49338:7;49301:15;:45::i;:::-;49361:47;49377:7;49394:4;49401:6;49361:15;:47::i;:::-;49423:53;49439:7;49456:4;49463:12;49423:15;:53::i;:::-;49491:63;49507:7;49524:4;49531:22;49491:15;:63::i;:::-;49586:14;;:42;;49605:22;49586:18;:42::i;:::-;49569:14;:59;49664:18;;:46;;49687:22;49664;:46::i;:::-;49643:18;:67;-1:-1:-1;;;47538:2191:0;;;:::o;62118:380::-;-1:-1:-1;;;;;62221:21:0;;;62195:23;62221:21;;;:10;:21;;;;;;;;;;62280:20;62232:9;62280;:20::i;:::-;-1:-1:-1;;;;;62312:21:0;;;;;;;:10;:21;;;;;;:33;;-1:-1:-1;;;;;;62312:33:0;;;;;;;;;;62363:54;;62253:47;;-1:-1:-1;62312:33:0;62363:54;;;;;;62312:21;62363:54;62430:60;62445:15;62462:9;62473:16;62430:14;:60::i;:::-;62184:314;;62118:380;;:::o;22408:494::-;-1:-1:-1;;;;;22492:21:0;;22484:67;;;;-1:-1:-1;;;22484:67:0;;21793:2:1;22484:67:0;;;21775:21:1;21832:2;21812:18;;;21805:30;21871:34;21851:18;;;21844:62;-1:-1:-1;;;21922:18:1;;;21915:31;21963:19;;22484:67:0;21591:397:1;22484:67:0;-1:-1:-1;;;;;22651:18:0;;22626:22;22651:18;;;;;;;;;;;22688:24;;;;22680:71;;;;-1:-1:-1;;;22680:71:0;;22195:2:1;22680:71:0;;;22177:21:1;22234:2;22214:18;;;22207:30;22273:34;22253:18;;;22246:62;-1:-1:-1;;;22324:18:1;;;22317:32;22366:19;;22680:71:0;21993:398:1;22680:71:0;22783:23;22800:6;22783:14;:23;:::i;:::-;-1:-1:-1;;;;;22762:18:0;;:9;:18;;;;;;;;;;:44;;;;22817:12;:22;;22833:6;;22762:9;22817:22;;22833:6;;22817:22;:::i;:::-;;;;-1:-1:-1;;22857:37:0;;1801:25:1;;;22883:1:0;;-1:-1:-1;;;;;22857:37:0;;;;;1789:2:1;1774:18;22857:37:0;1655:177:1;50039:470:0;46021:18;:25;;-1:-1:-1;;;;46021:25:0;-1:-1:-1;;;46021:25:0;;;46170:10:::1;::::0;;-1:-1:-1;;;;46375:30:0;;;;;46170:10:::1;-1:-1:-1::0;;;46170:10:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46218:16:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;46282:26:0;;::::1;;46021:25:::0;50144:24:::2;50162:4;50144:9;:24::i;:::-;50113:55;;50208:14;;50185:20;:37;50181:321;;;50287:14;::::0;50262:40:::2;::::0;:20;;:24:::2;:40::i;:::-;50239:63;;50353:38;50370:20;50353:16;:38::i;:::-;50464:11;::::0;50456:34:::2;::::0;50420:21:::2;::::0;-1:-1:-1;;;;;50464:11:0::2;::::0;50456:34;::::2;;;::::0;50420:21;;50406:11:::2;50456:34:::0;50406:11;50456:34;50420:21;50464:11;50456:34;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;50224:278;50181:321;-1:-1:-1::0;46428:10:0::1;:24:::0;;-1:-1:-1;;;;46463:36:0;-1:-1:-1;;;46428:24:0::1;::::0;;::::1;;-1:-1:-1::0;;;;46463:36:0;;-1:-1:-1;;;46463:36:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;46510:56:0::1;-1:-1:-1::0;;;46510:56:0;;;::::1;;::::0;;;::::1;::::0;;46069:18;:26;;-1:-1:-1;;;;46069:26:0;;;50039:470::o;62506:1065::-;62646:6;-1:-1:-1;;;;;62636:16:0;:6;-1:-1:-1;;;;;62636:16:0;;;:30;;;;;62665:1;62656:6;:10;62636:30;62632:932;;;-1:-1:-1;;;;;62687:20:0;;;62683:427;;-1:-1:-1;;;;;62795:22:0;;62776:16;62795:22;;;:14;:22;;;;;;;;;62856:13;:102;;62957:1;62856:102;;;-1:-1:-1;;;;;62893:19:0;;;;;;:11;:19;;;;;;62913:13;62925:1;62913:9;:13;:::i;:::-;62893:34;;;;;;;;;;;;;;;:40;;;62856:102;62836:122;-1:-1:-1;62977:17:0;62997:21;62836:122;63011:6;62997:13;:21::i;:::-;62977:41;;63037:57;63054:6;63062:9;63073;63084;63037:16;:57::i;:::-;62709:401;;;62683:427;-1:-1:-1;;;;;63130:20:0;;;63126:427;;-1:-1:-1;;;;;63238:22:0;;63219:16;63238:22;;;:14;:22;;;;;;;;;63299:13;:102;;63400:1;63299:102;;;-1:-1:-1;;;;;63336:19:0;;;;;;:11;:19;;;;;;63356:13;63368:1;63356:9;:13;:::i;:::-;63336:34;;;;;;;;;;;;;;;:40;;;63299:102;63279:122;-1:-1:-1;63420:17:0;63440:21;63279:122;63454:6;63440:13;:21::i;:::-;63420:41;;63480:57;63497:6;63505:9;63516;63527;63480:16;:57::i;50551:587::-;50705:16;;;50719:1;50705:16;;;;;;;;50681:21;;50705:16;;;;;;;;;;-1:-1:-1;50705:16:0;50681:40;;50750:4;50732;50737:1;50732:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50732:23:0;;;:7;;;;;;;;;;:23;;;;50776:13;;:20;;;-1:-1:-1;;;50776:20:0;;;;:13;;;;;:18;;:20;;;;;50732:7;;50776:20;;;;;:13;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50766:4;50771:1;50766:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50766:30:0;;;:7;;;;;;;;;:30;50841:13;;50809:60;;50826:4;;50841:13;50857:11;50809:8;:60::i;:::-;50908:13;;:222;;-1:-1:-1;;;50908:222:0;;-1:-1:-1;;;;;50908:13:0;;;;:64;;:222;;50987:11;;50908:13;;51057:4;;51084;;51104:15;;50908:222;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63579:807;63744:18;63765:107;63786:12;63765:107;;;;;;;;;;;;;;;;;:6;:107::i;:::-;63744:128;;63918:1;63903:12;:16;;;:98;;;;-1:-1:-1;;;;;;63936:22:0;;;;;;:11;:22;;;;;:65;;;;63959:16;63974:1;63959:12;:16;:::i;:::-;63936:40;;;;;;;;;;;;;;;-1:-1:-1;63936:40:0;:50;;:65;63903:98;63885:425;;;-1:-1:-1;;;;;64028:22:0;;;;;;:11;:22;;;;;64077:8;;64051:16;64066:1;64051:12;:16;:::i;:::-;64028:40;;;;;;;;;;;;;-1:-1:-1;64028:40:0;:46;;:57;63885:425;;;64157:82;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64118:22:0;;-1:-1:-1;64118:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:121;;;;-1:-1:-1;;64118:121:0;;;;;;;;-1:-1:-1;64118:121:0;;;;64282:16;;64118:36;;64282:16;:::i;:::-;-1:-1:-1;;;;;64254:25:0;;;;;;:14;:25;;;;;:44;;-1:-1:-1;;64254:44:0;;;;;;;;;;;;63885:425;64327:51;;;24044:25:1;;;24100:2;24085:18;;24078:34;;;-1:-1:-1;;;;;64327:51:0;;;;;24017:18:1;64327:51:0;;;;;;;63733:653;63579:807;;;;:::o;64394:196::-;64499:6;64542:12;64535:5;64531:9;;64523:32;;;;-1:-1:-1;;;64523:32:0;;;;;;;;:::i;:::-;-1:-1:-1;64580:1:0;;64394:196;-1:-1:-1;;64394:196:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;206:597:1;318:4;347:2;376;365:9;358:21;408:6;402:13;451:6;446:2;435:9;431:18;424:34;476:1;486:140;500:6;497:1;494:13;486:140;;;595:14;;;591:23;;585:30;561:17;;;580:2;557:26;550:66;515:10;;486:140;;;644:6;641:1;638:13;635:91;;;714:1;709:2;700:6;689:9;685:22;681:31;674:42;635:91;-1:-1:-1;787:2:1;766:15;-1:-1:-1;;762:29:1;747:45;;;;794:2;743:54;;206:597;-1:-1:-1;;;206:597:1:o;808:131::-;-1:-1:-1;;;;;883:31:1;;873:42;;863:70;;929:1;926;919:12;944:134;1012:20;;1041:31;1012:20;1041:31;:::i;:::-;944:134;;;:::o;1083:315::-;1151:6;1159;1212:2;1200:9;1191:7;1187:23;1183:32;1180:52;;;1228:1;1225;1218:12;1180:52;1267:9;1254:23;1286:31;1311:5;1286:31;:::i;:::-;1336:5;1388:2;1373:18;;;;1360:32;;-1:-1:-1;;;1083:315:1:o;1403:247::-;1462:6;1515:2;1503:9;1494:7;1490:23;1486:32;1483:52;;;1531:1;1528;1521:12;1483:52;1570:9;1557:23;1589:31;1614:5;1589:31;:::i;1837:159::-;1904:20;;1964:6;1953:18;;1943:29;;1933:57;;1986:1;1983;1976:12;2001:184;2059:6;2112:2;2100:9;2091:7;2087:23;2083:32;2080:52;;;2128:1;2125;2118:12;2080:52;2151:28;2169:9;2151:28;:::i;2372:456::-;2449:6;2457;2465;2518:2;2506:9;2497:7;2493:23;2489:32;2486:52;;;2534:1;2531;2524:12;2486:52;2573:9;2560:23;2592:31;2617:5;2592:31;:::i;:::-;2642:5;-1:-1:-1;2699:2:1;2684:18;;2671:32;2712:33;2671:32;2712:33;:::i;:::-;2372:456;;2764:7;;-1:-1:-1;;;2818:2:1;2803:18;;;;2790:32;;2372:456::o;3022:127::-;3083:10;3078:3;3074:20;3071:1;3064:31;3114:4;3111:1;3104:15;3138:4;3135:1;3128:15;3154:908;3208:5;3261:3;3254:4;3246:6;3242:17;3238:27;3228:55;;3279:1;3276;3269:12;3228:55;3315:6;3302:20;3341:4;3364:18;3401:2;3397;3394:10;3391:36;;;3407:18;;:::i;:::-;3453:2;3450:1;3446:10;3485:2;3479:9;3548:2;3544:7;3539:2;3535;3531:11;3527:25;3519:6;3515:38;3603:6;3591:10;3588:22;3583:2;3571:10;3568:18;3565:46;3562:72;;;3614:18;;:::i;:::-;3650:2;3643:22;3700:18;;;3776:15;;;3772:24;;;3734:15;;;;-1:-1:-1;3808:15:1;;;3805:35;;;3836:1;3833;3826:12;3805:35;3872:2;3864:6;3860:15;3849:26;;3884:148;3900:6;3895:3;3892:15;3884:148;;;3966:23;3985:3;3966:23;:::i;:::-;3954:36;;4010:12;;;;3917;;;;3884:148;;;4050:6;3154:908;-1:-1:-1;;;;;;;3154:908:1:o;4067:483::-;4160:6;4168;4221:2;4209:9;4200:7;4196:23;4192:32;4189:52;;;4237:1;4234;4227:12;4189:52;4277:9;4264:23;4310:18;4302:6;4299:30;4296:50;;;4342:1;4339;4332:12;4296:50;4365:61;4418:7;4409:6;4398:9;4394:22;4365:61;:::i;:::-;4355:71;;;4476:2;4465:9;4461:18;4448:32;4489:31;4514:5;4489:31;:::i;:::-;4539:5;4529:15;;;4067:483;;;;;:::o;4555:180::-;4614:6;4667:2;4655:9;4646:7;4642:23;4638:32;4635:52;;;4683:1;4680;4673:12;4635:52;-1:-1:-1;4706:23:1;;4555:180;-1:-1:-1;4555:180:1:o;4948:328::-;5022:6;5030;5038;5091:2;5079:9;5070:7;5066:23;5062:32;5059:52;;;5107:1;5104;5097:12;5059:52;5130:28;5148:9;5130:28;:::i;:::-;5120:38;;5177:37;5210:2;5199:9;5195:18;5177:37;:::i;:::-;5167:47;;5233:37;5266:2;5255:9;5251:18;5233:37;:::i;:::-;5223:47;;4948:328;;;;;:::o;5281:156::-;5347:20;;5407:4;5396:16;;5386:27;;5376:55;;5427:1;5424;5417:12;5442:118;5528:5;5521:13;5514:21;5507:5;5504:32;5494:60;;5550:1;5547;5540:12;5565:758;5680:6;5688;5696;5704;5712;5765:3;5753:9;5744:7;5740:23;5736:33;5733:53;;;5782:1;5779;5772:12;5733:53;5805:27;5822:9;5805:27;:::i;:::-;5795:37;;5883:2;5872:9;5868:18;5855:32;5910:18;5902:6;5899:30;5896:50;;;5942:1;5939;5932:12;5896:50;5965:61;6018:7;6009:6;5998:9;5994:22;5965:61;:::i;:::-;5955:71;;;6076:2;6065:9;6061:18;6048:32;6089:31;6114:5;6089:31;:::i;:::-;6139:5;-1:-1:-1;6191:2:1;6176:18;;6163:32;;-1:-1:-1;6247:3:1;6232:19;;6219:33;6261:30;6219:33;6261:30;:::i;:::-;6310:7;6300:17;;;5565:758;;;;;;;;:::o;6760:241::-;6816:6;6869:2;6857:9;6848:7;6844:23;6840:32;6837:52;;;6885:1;6882;6875:12;6837:52;6924:9;6911:23;6943:28;6965:5;6943:28;:::i;7006:592::-;7108:6;7116;7124;7132;7140;7148;7201:3;7189:9;7180:7;7176:23;7172:33;7169:53;;;7218:1;7215;7208:12;7169:53;7257:9;7244:23;7276:31;7301:5;7276:31;:::i;:::-;7326:5;-1:-1:-1;7378:2:1;7363:18;;7350:32;;-1:-1:-1;7429:2:1;7414:18;;7401:32;;-1:-1:-1;7452:36:1;7484:2;7469:18;;7452:36;:::i;:::-;7442:46;;7535:3;7524:9;7520:19;7507:33;7497:43;;7587:3;7576:9;7572:19;7559:33;7549:43;;7006:592;;;;;;;;:::o;7603:382::-;7668:6;7676;7729:2;7717:9;7708:7;7704:23;7700:32;7697:52;;;7745:1;7742;7735:12;7697:52;7784:9;7771:23;7803:31;7828:5;7803:31;:::i;:::-;7853:5;-1:-1:-1;7910:2:1;7895:18;;7882:32;7923:30;7882:32;7923:30;:::i;7990:388::-;8058:6;8066;8119:2;8107:9;8098:7;8094:23;8090:32;8087:52;;;8135:1;8132;8125:12;8087:52;8174:9;8161:23;8193:31;8218:5;8193:31;:::i;:::-;8243:5;-1:-1:-1;8300:2:1;8285:18;;8272:32;8313:33;8272:32;8313:33;:::i;8383:419::-;8450:6;8458;8511:2;8499:9;8490:7;8486:23;8482:32;8479:52;;;8527:1;8524;8517:12;8479:52;8566:9;8553:23;8585:31;8610:5;8585:31;:::i;:::-;8635:5;-1:-1:-1;8692:2:1;8677:18;;8664:32;8740:10;8727:24;;8715:37;;8705:65;;8766:1;8763;8756:12;9075:380;9154:1;9150:12;;;;9197;;;9218:61;;9272:4;9264:6;9260:17;9250:27;;9218:61;9325:2;9317:6;9314:14;9294:18;9291:38;9288:161;;;9371:10;9366:3;9362:20;9359:1;9352:31;9406:4;9403:1;9396:15;9434:4;9431:1;9424:15;9288:161;;9075:380;;;:::o;9808:127::-;9869:10;9864:3;9860:20;9857:1;9850:31;9900:4;9897:1;9890:15;9924:4;9921:1;9914:15;10219:245;10286:6;10339:2;10327:9;10318:7;10314:23;10310:32;10307:52;;;10355:1;10352;10345:12;10307:52;10387:9;10381:16;10406:28;10428:5;10406:28;:::i;10469:1003::-;10728:4;10776:3;10765:9;10761:19;10807:6;10796:9;10789:25;10833:2;10871:6;10866:2;10855:9;10851:18;10844:34;10914:3;10909:2;10898:9;10894:18;10887:31;10938:6;10973;10967:13;11004:6;10996;10989:22;11042:3;11031:9;11027:19;11020:26;;11065:6;11062:1;11055:17;11108:2;11105:1;11095:16;11081:30;;11129:1;11139:194;11153:6;11150:1;11147:13;11139:194;;;11218:13;;-1:-1:-1;;;;;11214:39:1;11202:52;;11250:1;11309:14;;;;11274:12;;;;11168:9;11139:194;;;-1:-1:-1;;;;;;;11389:32:1;;;;11384:2;11369:18;;11362:60;-1:-1:-1;;;11453:3:1;11438:19;11431:35;11350:3;10469:1003;-1:-1:-1;;;10469:1003:1:o;11886:127::-;11947:10;11942:3;11938:20;11935:1;11928:31;11978:4;11975:1;11968:15;12002:4;11999:1;11992:15;12018:125;12058:4;12086:1;12083;12080:8;12077:34;;;12091:18;;:::i;:::-;-1:-1:-1;12128:9:1;;12018:125::o;12148:128::-;12188:3;12219:1;12215:6;12212:1;12209:13;12206:39;;;12225:18;;:::i;:::-;-1:-1:-1;12261:9:1;;12148:128::o;12281:337::-;12483:2;12465:21;;;12522:2;12502:18;;;12495:30;-1:-1:-1;;;12556:2:1;12541:18;;12534:43;12609:2;12594:18;;12281:337::o;12623:356::-;12825:2;12807:21;;;12844:18;;;12837:30;12903:34;12898:2;12883:18;;12876:62;12970:2;12955:18;;12623:356::o;12984:224::-;13023:3;13051:6;13084:2;13081:1;13077:10;13114:2;13111:1;13107:10;13145:3;13141:2;13137:12;13132:3;13129:21;13126:47;;;13153:18;;:::i;:::-;13189:13;;12984:224;-1:-1:-1;;;;12984:224:1:o;13950:221::-;13989:4;14018:10;14078;;;;14048;;14100:12;;;14097:38;;;14115:18;;:::i;:::-;14152:13;;13950:221;-1:-1:-1;;;13950:221:1:o;14176:127::-;14237:10;14232:3;14228:20;14225:1;14218:31;14268:4;14265:1;14258:15;14292:4;14289:1;14282:15;14308:191;14347:1;14373:10;14410:2;14407:1;14403:10;14432:3;14422:37;;14439:18;;:::i;:::-;14477:10;;14473:20;;;;;14308:191;-1:-1:-1;;14308:191:1:o;16915:135::-;16954:3;-1:-1:-1;;16975:17:1;;16972:43;;;16995:18;;:::i;:::-;-1:-1:-1;17042:1:1;17031:13;;16915:135::o;18988:168::-;19028:7;19094:1;19090;19086:6;19082:14;19079:1;19076:21;19071:1;19064:9;19057:17;19053:45;19050:71;;;19101:18;;:::i;:::-;-1:-1:-1;19141:9:1;;18988:168::o;19161:120::-;19201:1;19227;19217:35;;19232:18;;:::i;:::-;-1:-1:-1;19266:9:1;;19161:120::o;22396:251::-;22466:6;22519:2;22507:9;22498:7;22494:23;22490:32;22487:52;;;22535:1;22532;22525:12;22487:52;22567:9;22561:16;22586:31;22611:5;22586:31;:::i;22652:980::-;22914:4;22962:3;22951:9;22947:19;22993:6;22982:9;22975:25;23019:2;23057:6;23052:2;23041:9;23037:18;23030:34;23100:3;23095:2;23084:9;23080:18;23073:31;23124:6;23159;23153:13;23190:6;23182;23175:22;23228:3;23217:9;23213:19;23206:26;;23267:2;23259:6;23255:15;23241:29;;23288:1;23298:195;23312:6;23309:1;23306:13;23298:195;;;23377:13;;-1:-1:-1;;;;;23373:39:1;23361:52;;23468:15;;;;23433:12;;;;23409:1;23327:9;23298:195;;23637:228;23676:3;23704:10;23741:2;23738:1;23734:10;23771:2;23768:1;23764:10;23802:3;23798:2;23794:12;23789:3;23786:21;23783:47;;;23810:18;;:::i
Swarm Source
ipfs://b0c1bbba0e511581dfa0172a4e1db6058c0deaaa6458a5f68102149b662d386a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.