Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 12498185 | 1134 days ago | IN | Create: xBNT | 0 ETH | 0.2322861 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
xBNT
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-24 */ // File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts-ethereum-package/contracts/Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/Pausable.sol pragma solidity ^0.6.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract PausableUpgradeSafe is Initializable, ContextUpgradeSafe { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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"); } } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20MinterPauser}. * * 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 ERC20UpgradeSafe is Initializable, ContextUpgradeSafe, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name, string memory symbol) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name, symbol); } function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } uint256[44] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.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 ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "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/interface/IContractRegistry.sol pragma solidity >=0.6.0; interface IContractRegistry { function addressOf(bytes32 contractName) external view returns(address); } // File: contracts/interface/IBancorGovernance.sol pragma solidity >=0.6.0; interface IBancorGovernance { function voteFor(uint256 _id) external; function voteAgainst(uint256 _id) external; function stake(uint256 _amount) external; function unstake(uint256 _amount) external; } // File: contracts/interface/IStakingRewards.sol pragma solidity >=0.6.0; interface IDSToken { } interface IStakingRewards { // claims all rewards from providing address function claimRewards() external returns (uint256); // returns pending rewards from providing address function pendingRewards(address provider) external view returns (uint256); // returns all staked rewards and the ID of the new position function stakeRewards(uint256 maxAmount, IDSToken poolToken) external returns (uint256, uint256); } // File: contracts/interface/ILiquidityProtection.sol pragma solidity >=0.6.0; interface IConverterAnchor { } interface ILiquidityProtection { function addLiquidity( IConverterAnchor _poolAnchor, IERC20 _reserveToken, uint256 _amount ) external payable returns(uint); // returns id of deposit function removeLiquidity(uint256 _id, uint32 _portion) external; function removeLiquidityReturn( uint256 _id, uint32 _portion, uint256 _removeTimestamp ) external view returns (uint256, uint256, uint256); // returns amount in the reserve token // returns actual return amount in the reserve token // returns compensation in the network token // call 24 hours after removing liquidity function claimBalance(uint256 _startIndex, uint256 _endIndex) external; } // File: contracts/interface/ILiquidityProvider.sol pragma solidity 0.6.2; interface ILiquidityProvider { function initializeAndAddLiquidity( IContractRegistry _contractRegistry, address _xbntContract, IERC20 _bnt, IERC20 _vbnt, address _poolAnchor, uint256 _amount ) external returns(uint); function removeLiquidity(uint256 _id) external; function claimRewards() external returns(uint256); function claimBalance() external; function claimRewardsAndRemoveLiquidity() external returns(uint256); function claimAndRestake(address _poolToken) external returns(uint256, uint256); function pendingRewards() external view returns(uint256); } // File: contracts/interface/IMinimalProxyFactory.sol pragma solidity ^0.6.0; interface IMinimalProxyFactory { function deploy(uint256 salt, address implementation) external returns(address proxyAddress); } // File: contracts/interface/IDelegateRegistry.sol pragma solidity 0.6.2; interface IDelegateRegistry { function setDelegate(bytes32 id, address delegate) external; } // File: contracts/interface/IxBNT.sol pragma solidity 0.6.2; interface IxBNT { function getProxyAddressDepositIds(address proxyAddress) external view returns(uint256[] memory); } // File: contracts/helpers/LiquidityProvider.sol pragma solidity 0.6.2; contract LiquidityProvider { bool private initialized; IContractRegistry private contractRegistry; IERC20 private bnt; IERC20 private vbnt; address private xbnt; uint256 public nextDepositIndexToClaimBalance; function initializeAndAddLiquidity( IContractRegistry _contractRegistry, address _xbnt, IERC20 _bnt, IERC20 _vbnt, address _poolToken, uint256 _amount ) external returns(uint256) { require(msg.sender == _xbnt, 'Invalid caller'); require(!initialized, 'Already initialized'); initialized = true; contractRegistry = _contractRegistry; xbnt = _xbnt; bnt = _bnt; vbnt = _vbnt; return _addLiquidity(_poolToken, _amount); } function _addLiquidity( address _poolToken, uint256 _amount ) private returns(uint256 id) { ILiquidityProtection lp = getLiquidityProtectionContract(); bnt.approve(address(lp), uint(-1)); id = lp.addLiquidity(IConverterAnchor(_poolToken), bnt, _amount); _retrieveVbntBalance(); } /* * @notice Restake this proxy's rewards */ function claimAndRestake(address _poolToken) external onlyXbntContract returns(uint256 newDepositId, uint256 restakedBal){ (, newDepositId) = getStakingRewardsContract().stakeRewards(uint(-1), IDSToken(_poolToken)); restakedBal = _retrieveVbntBalance(); } function claimRewards() external onlyXbntContract returns(uint256 rewardsAmount){ rewardsAmount = _claimRewards(); } function _claimRewards() private returns(uint256 rewards){ rewards = getStakingRewardsContract().claimRewards(); _retrieveBntBalance(); } function _removeLiquidity(ILiquidityProtection _lp, uint256 _id) private { _lp.removeLiquidity(_id, 1000000); // full PPM resolution } /* * @notice Initiate final exit from this proxy */ function claimRewardsAndRemoveLiquidity() external onlyXbntContract returns(uint256 rewards) { rewards = _claimRewards(); uint256[] memory depositIds = getDepositIds(); ILiquidityProtection lp = getLiquidityProtectionContract(); vbnt.approve(address(lp), uint(-1)); for(uint256 i = 0; i < depositIds.length; i++){ _removeLiquidity(lp, depositIds[i]); } } /* * @notice Called 24 hours after `claimRewardsAndRemoveLiquidity` */ function claimBalance() external onlyXbntContract { getLiquidityProtectionContract().claimBalance(0, getDepositIds().length); _retrieveBntBalance(); } function _retrieveBntBalance() private { bnt.transfer(xbnt, bnt.balanceOf(address(this))); } function _retrieveVbntBalance() private returns(uint256 vbntBal) { vbntBal = vbnt.balanceOf(address(this)); vbnt.transfer(xbnt, vbntBal); } function pendingRewards() external view returns(uint){ return getStakingRewardsContract().pendingRewards(address(this)); } function getStakingRewardsContract() private view returns(IStakingRewards){ return IStakingRewards(contractRegistry.addressOf('StakingRewards')); } function getLiquidityProtectionContract() private view returns(ILiquidityProtection){ return ILiquidityProtection(contractRegistry.addressOf('LiquidityProtection')); } function getDepositIds() private view returns(uint256[] memory){ return IxBNT(xbnt).getProxyAddressDepositIds(address(this)); } modifier onlyXbntContract { require(msg.sender == xbnt, 'Invalid caller'); _; } } // File: contracts/xBNTdepUpgrade.sol pragma solidity 0.6.2; interface IBancorNetwork { function convertByPath( address[] calldata _path, uint256 _amount, uint256 _minReturn, address _beneficiary, address _affiliateAccount, uint256 _affiliateFee ) external payable returns (uint256); function rateByPath(address[] calldata _path, uint256 _amount) external view returns (uint256); function conversionPath(IERC20 _sourceToken, IERC20 _targetToken) external view returns (address[] memory); } contract xBNT is ERC20UpgradeSafe, OwnableUpgradeSafe, PausableUpgradeSafe { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 private bnt; IERC20 private vbnt; IContractRegistry private contractRegistry; IBancorGovernance internal bancorGovernance; IMinimalProxyFactory private proxyFactory; bytes32 private constant bancorNetworkName = 'BancorNetwork'; bytes32 private constant stakingRewardsName = 'StakingRewards'; bytes32 private constant liquidityProtectionName = 'LiquidityProtection'; uint32 private constant PPM = 1000000; uint256 private constant DEC_18 = 1e18; uint256 private constant BUFFER_TARGET = 20; // 5% uint256 private constant MAX_UINT = 2**256 - 1; uint256 private constant WAITING_PERIOD = 2 days; uint256 private constant INITIAL_SUPPLY_MULTIPLIER = 10; uint256 private constant LIQUIDATION_TIME_PERIOD = 4 weeks; uint256 private lpImplementationChangedTimestamp; uint256 private governanceAddressChangedTimestamp; uint256 public adminActiveTimestamp; uint256 public lowestActiveProxyIndex; uint256 public nextProxyIndex; uint256 public totalAllocatedNav; uint256 public pendingRewardsContributionToNav; uint256 public withdrawableBntFees; address private manager; address private manager2; address internal liquidityProviderImplementation; address private queuedLiquidityProviderImplementation; address private queuedGovernanceAddress; address private constant ZERO_ADDRESS = address(0); struct FeeDivisors { uint256 mintFee; uint256 burnFee; uint256 claimFee; } FeeDivisors public feeDivisors; struct Deposit { address proxyAddress; uint256 depositId; uint256 initialContribution; uint256 latestContributionToNav; } mapping(uint256 => Deposit) public depositIdToDeposit; struct ProxyData { uint256[] depositIds; uint256 pendingRewardsContributionToNav; uint256 deployedBnt; bool balanceClaimed; } mapping(address => ProxyData) private proxyAddressToData; mapping(uint256 => address) public proxyIndexToAddress; event AddLiquidity( address poolToken, uint256 amount, uint256 depositId, uint256 proxyIndex, uint256 timestamp ); event ClaimRestake( uint256 proxyIndex, uint256 amount, uint256 depositId, uint256 timestamp ); event ClaimRemove(uint256 proxyIndex, uint256 rewardsClaimed); event ClaimRewards(uint256 proxyIndex, uint256 rewardsClaimed); event ClaimBalance(uint256 proxyIndex); event RewardsNavUpdated( uint256 previousRewardsNav, uint256 newRewardsNav, uint256 timestamp ); event KeyAddressChange(); function transferToNewInstance(address _newInstance) external onlyOwnerOrManager { bnt.transfer(_newInstance, getBufferBalance()); } /* ========================================================================================= */ /* Liquidity Provision */ /* ========================================================================================= */ /* * @notice Makes BNT deposit on Bancor * @notice Deploys new proxy * @notice Allocates buffer BNT to allocated NAV * @param _poolAnchor: Address of liquidity pool * @param _amount: BNT amount */ function addLiquidity(IConverterAnchor _poolAnchor, uint256 _amount) external onlyOwnerOrManager { uint256 salt = uint256(keccak256(abi.encodePacked(nextProxyIndex, _amount))); address liquidityProviderProxy = proxyFactory.deploy(salt, liquidityProviderImplementation); bnt.transfer(liquidityProviderProxy, _amount); uint256 depositId = ILiquidityProvider(liquidityProviderProxy) .initializeAndAddLiquidity( contractRegistry, address(this), bnt, vbnt, address(_poolAnchor), _amount ); Deposit memory newDeposit = Deposit({ proxyAddress: liquidityProviderProxy, depositId: depositId, initialContribution: _amount, latestContributionToNav: _amount }); emit AddLiquidity( address(_poolAnchor), _amount, depositId, nextProxyIndex, block.timestamp ); depositIdToDeposit[depositId] = newDeposit; ProxyData storage proxyData = proxyAddressToData[liquidityProviderProxy]; proxyData.depositIds.push(depositId); proxyData.deployedBnt = _amount; proxyIndexToAddress[nextProxyIndex] = liquidityProviderProxy; nextProxyIndex++; totalAllocatedNav = totalAllocatedNav.add(_amount); _stake(_amount); _updateAdminActiveTimestamp(); } /* * @notice Restakes rewards from current deposit into new deposit * @notice Deploys capital to same proxy as current deposit * @notice Allocates from rewards NAV to allocated NAV * @param proxyIndex: Proxy index * @param poolToken: Pool to restake rewards to */ function claimAndRestake(uint256 proxyIndex, address poolToken) external onlyOwnerOrManager { address proxyAddress = proxyIndexToAddress[proxyIndex]; ProxyData storage proxyData = proxyAddressToData[proxyAddress]; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); (uint256 newDepositId, uint256 restakedBal) = lpProxy.claimAndRestake(poolToken); // fee effectively deducted from buffer balance // because full rewards are restaked without cycling through xBNT _calculateAndIncrementFee(restakedBal, feeDivisors.claimFee); proxyData.depositIds.push(newDepositId); proxyData.deployedBnt = proxyData.deployedBnt.add(restakedBal); // zero out restaked rewards pendingRewardsContributionToNav = pendingRewardsContributionToNav.sub( proxyData.pendingRewardsContributionToNav ); proxyData.pendingRewardsContributionToNav = 0; // add restaked rewards back to nav totalAllocatedNav = totalAllocatedNav.add(restakedBal); depositIdToDeposit[newDepositId] = Deposit({ proxyAddress: proxyAddress, depositId: newDepositId, initialContribution: restakedBal, latestContributionToNav: restakedBal }); emit ClaimRestake( proxyIndex, restakedBal, newDepositId, block.timestamp ); _stake(restakedBal); _updateAdminActiveTimestamp(); } /* * @notice Iterates through proxies to calculate current available rewards * @notice Must be called daily or more to stay current with NAV * @notice We specify begin/end indices in case num proxies approaches gas limit * @param beginProxyIndexIterator: proxyIndex to begin iteration * @param endProxyIndexIterator: proxyIndex to end iteration */ function updatePendingRewardsContributionToNav( uint256 beginProxyIndexIterator, uint256 endProxyIndexIterator ) external onlyOwnerOrManager { require( beginProxyIndexIterator >= lowestActiveProxyIndex, 'Invalid index' ); require(endProxyIndexIterator <= nextProxyIndex, 'Invalid index'); require( endProxyIndexIterator > beginProxyIndexIterator, 'Invalid order' ); IStakingRewards stakingRewards = getStakingRewardsContract(); uint256 replacedPendingRewardsContributionToNav; uint256 updatedPendingRewardsContributionToNav; for (uint256 i = lowestActiveProxyIndex; i < nextProxyIndex; i++) { address proxyAddress = proxyIndexToAddress[i]; replacedPendingRewardsContributionToNav = replacedPendingRewardsContributionToNav .add( proxyAddressToData[proxyAddress].pendingRewardsContributionToNav ); uint256 newContributionToRewardsNav = stakingRewards.pendingRewards(proxyAddress); proxyAddressToData[proxyAddress] .pendingRewardsContributionToNav = newContributionToRewardsNav; updatedPendingRewardsContributionToNav = updatedPendingRewardsContributionToNav .add(newContributionToRewardsNav); } emit RewardsNavUpdated( pendingRewardsContributionToNav, updatedPendingRewardsContributionToNav, block.timestamp ); pendingRewardsContributionToNav = pendingRewardsContributionToNav .add(updatedPendingRewardsContributionToNav) .sub(replacedPendingRewardsContributionToNav); } /* * @notice Updates NAV for value of deposits * @notice Needs to be called weekly at least * @notice Due to IL protection, allocated NAV is assumed to be the greater of value * of initial deposit or removeLiquidityReturn * @notice We specify begin/end indices in case num deposits approaches gas limit * @param beginProxyIndexIterator: proxyIndex to begin iteration * @param endProxyIndexIterator: proxyIndex to end iteration */ function updateTotalAllocatedNav( uint256 beginProxyIndexIterator, uint256 endProxyIndexIterator ) external onlyOwnerOrManager { require( beginProxyIndexIterator >= lowestActiveProxyIndex, 'Invalid index' ); require(endProxyIndexIterator <= nextProxyIndex, 'Invalid index'); ILiquidityProtection lp = getLiquidityProtectionContract(); uint256[] memory depositIds; uint256 newContributionToAllocatedNav; for ( uint256 i = beginProxyIndexIterator; i < endProxyIndexIterator; i++ ) { depositIds = proxyAddressToData[proxyIndexToAddress[i]].depositIds; for (uint256 j = 0; j < depositIds.length; j++) { (newContributionToAllocatedNav, , ) = lp.removeLiquidityReturn( depositIds[j], PPM, block.timestamp ); Deposit storage deposit = depositIdToDeposit[depositIds[j]]; totalAllocatedNav = totalAllocatedNav .sub(deposit.latestContributionToNav) .add(newContributionToAllocatedNav); deposit.latestContributionToNav = newContributionToAllocatedNav; } } } /* * @notice Removes all deposits from proxy at lowestActiveProxyIndex */ function claimRewardsAndRemoveLiquidity() external onlyOwnerOrManager { _claimRewardsAndRemoveLiquidity(); _updateAdminActiveTimestamp(); } function emergencyClaimAndRemove() external liquidationTimeElapsed { _claimRewardsAndRemoveLiquidity(); } function _claimRewardsAndRemoveLiquidity() private { address proxyAddress = proxyIndexToAddress[lowestActiveProxyIndex]; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); ProxyData storage proxyData = proxyAddressToData[proxyAddress]; // rewards nav reallocated implicitly to buffer balance pendingRewardsContributionToNav = pendingRewardsContributionToNav.sub( proxyData.pendingRewardsContributionToNav ); proxyData.pendingRewardsContributionToNav = 0; _unstake(proxyData.deployedBnt); vbnt.transfer(proxyAddress, proxyData.deployedBnt); uint256 rewardsClaimed = lpProxy.claimRewardsAndRemoveLiquidity(); _calculateAndIncrementFee(rewardsClaimed, feeDivisors.claimFee); emit ClaimRemove(lowestActiveProxyIndex, rewardsClaimed); // we don't deduct totalAllocatedNav yet because we need to wait // 24 hours to `claimBalance`. Only rewards are immediately retrieved lowestActiveProxyIndex++; _updateAdminActiveTimestamp(); } /* * @notice Second step in removal process * @notice Claims deposits balance 24 hrs after `claimRewardsAndRemoveLiquidity` called * @param proxyIndex: proxyIndex */ function claimBalance(uint256 proxyIndex) external onlyOwnerOrManager { _claimBalance(proxyIndex); _updateAdminActiveTimestamp(); } function emergencyClaimBalance(uint256 proxyIndex) external liquidationTimeElapsed { _claimBalance(proxyIndex); } function _claimBalance(uint256 _proxyIndex) private { address proxyAddress = proxyIndexToAddress[_proxyIndex]; ProxyData memory proxyData = proxyAddressToData[proxyAddress]; require(!proxyData.balanceClaimed, 'Already claimed'); proxyAddressToData[proxyAddress].balanceClaimed = true; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); lpProxy.claimBalance(); uint256 contributionToTotalAllocatedNav; uint256[] memory depositIds = proxyData.depositIds; for (uint256 i = 0; i < depositIds.length; i++) { contributionToTotalAllocatedNav = contributionToTotalAllocatedNav .add(depositIdToDeposit[depositIds[i]].latestContributionToNav); } emit ClaimBalance(_proxyIndex); // allocatedNav now becomes bnt buffer balance totalAllocatedNav = totalAllocatedNav.sub( contributionToTotalAllocatedNav ); } /* * @notice Claims rewards from a proxy without restaking * @notice Will reset rewards multiplier - use sparingly when buffer balance needed */ function claimRewards(uint256 proxyIndex) external onlyOwnerOrManager { address proxyAddress = proxyIndexToAddress[lowestActiveProxyIndex]; ILiquidityProvider lpProxy = ILiquidityProvider(proxyAddress); uint256 proxyContributionToRewardsNav = getProxyAddressRewardsContributionToNav(proxyAddress); pendingRewardsContributionToNav = pendingRewardsContributionToNav.sub( proxyContributionToRewardsNav ); proxyAddressToData[proxyAddress].pendingRewardsContributionToNav = 0; uint256 rewards = lpProxy.claimRewards(); _calculateAndIncrementFee(rewards, feeDivisors.claimFee); _updateAdminActiveTimestamp(); emit ClaimRewards(proxyIndex, rewards); } function getLiquidityProtectionContract() public view returns (ILiquidityProtection) { return ILiquidityProtection( contractRegistry.addressOf(liquidityProtectionName) ); } function getStakingRewardsContract() public view returns (IStakingRewards) { return IStakingRewards(contractRegistry.addressOf(stakingRewardsName)); } /* ========================================================================================= */ /* Utils */ /* ========================================================================================= */ function getProxyAddressDepositIds(address proxyAddress) public view returns (uint256[] memory) { return proxyAddressToData[proxyAddress].depositIds; } function getProxyAddressRewardsContributionToNav(address proxyAddress) public view returns (uint256) { return proxyAddressToData[proxyAddress].pendingRewardsContributionToNav; } function changeLiquidityProviderImplementation(address newImplementation) external onlyOwner { queuedLiquidityProviderImplementation = newImplementation; lpImplementationChangedTimestamp = block.timestamp; emit KeyAddressChange(); } function confirmLiquidityProviderImplementationChange() external onlyOwner { require( block.timestamp > lpImplementationChangedTimestamp.add(WAITING_PERIOD), 'Too soon' ); liquidityProviderImplementation = queuedLiquidityProviderImplementation; } function changeGovernanceAddress(address newAddress) external onlyOwner { queuedGovernanceAddress = newAddress; governanceAddressChangedTimestamp = block.timestamp; emit KeyAddressChange(); } function confirmGovernanceAddressChange() external onlyOwner { require( block.timestamp > governanceAddressChangedTimestamp.add(WAITING_PERIOD), 'Too soon' ); bancorGovernance = IBancorGovernance(queuedGovernanceAddress); } /* ========================================================================================= */ /* Governance */ /* ========================================================================================= */ // we should probably have a setter in case bancor gov address changes function _stake(uint256 _amount) private { bancorGovernance.stake(_amount); } function _unstake(uint256 _amount) private { bancorGovernance.unstake(_amount); } /* ========================================================================================= */ /* NAV */ /* ========================================================================================= */ function getTargetBufferBalance() public view returns (uint256) { return getNav().div(BUFFER_TARGET); } function getNav() public view returns (uint256) { return totalAllocatedNav.add(getRewardsContributionToNav()).add( getBufferBalance() ); } function getRewardsContributionToNav() public view returns (uint256) { uint256 unassessedFees = pendingRewardsContributionToNav.div(feeDivisors.claimFee); return pendingRewardsContributionToNav.sub(unassessedFees); } function getBufferBalance() public view returns (uint256) { uint256 bntBal = bnt.balanceOf(address(this)); if (bntBal < withdrawableBntFees) return 0; return bntBal.sub(withdrawableBntFees); } function _calculateFee(uint256 _value, uint256 _feeDivisor) internal pure returns (uint256 fee) { if (_feeDivisor > 0 && _value > 0) { fee = _value.div(_feeDivisor); } } function _incrementWithdrawableBntFees(uint256 _feeAmount) private { withdrawableBntFees = withdrawableBntFees.add(_feeAmount); } function _calculateAndIncrementFee(uint256 _value, uint256 _feeDivisor) private returns (uint256 fee) { fee = _calculateFee(_value, _feeDivisor); _incrementWithdrawableBntFees(fee); } /* ========================================================================================= */ /* Utils */ /* ========================================================================================= */ function _approveIfNecessary(IERC20 _token, address _toApprove) private { if (_token.allowance(address(this), _toApprove) == 0) { _token.safeApprove(_toApprove, MAX_UINT); } } function getBancorNetworkContract() public view returns (IBancorNetwork) { return IBancorNetwork(contractRegistry.addressOf(bancorNetworkName)); } function approveVbnt(address _toApprove) external onlyOwnerOrManager { vbnt.approve(_toApprove, MAX_UINT); } function pauseContract() external onlyOwnerOrManager { _pause(); } function unpauseContract() external onlyOwnerOrManager { _unpause(); } modifier onlyOwnerOrManager { require( msg.sender == owner() || msg.sender == manager || msg.sender == manager2, 'Non-admin caller' ); _; } modifier liquidationTimeElapsed { require( adminActiveTimestamp.add(LIQUIDATION_TIME_PERIOD) < block.timestamp, 'Liquidation time not elapsed' ); _; } /* * @notice manager == alternative admin caller to owner */ function setManager(address _manager) external onlyOwner { manager = _manager; } /* * @notice manager2 == alternative admin caller to owner */ function setManager2(address _manager2) external onlyOwner { manager2 = _manager2; } /* * @notice Records admin activity * @notice If not certified for a period exceeding LIQUIDATION_TIME_PERIOD, * emergencyCooldown and emergencyRedeem become available to non-admin caller */ function _updateAdminActiveTimestamp() private { adminActiveTimestamp = block.timestamp; } receive() external payable { require(msg.sender != tx.origin, 'Errant ETH deposit'); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"poolToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"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":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"ClaimBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardsClaimed","type":"uint256"}],"name":"ClaimRemove","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ClaimRestake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardsClaimed","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[],"name":"KeyAddressChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousRewardsNav","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRewardsNav","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RewardsNavUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"contract IConverterAnchor","name":"_poolAnchor","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminActiveTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"_toApprove","type":"address"}],"name":"approveVbnt","outputs":[],"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":"newAddress","type":"address"}],"name":"changeGovernanceAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"changeLiquidityProviderImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"},{"internalType":"address","name":"poolToken","type":"address"}],"name":"claimAndRestake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"claimBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewardsAndRemoveLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmGovernanceAddressChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"confirmLiquidityProviderImplementationChange","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"","type":"uint256"}],"name":"depositIdToDeposit","outputs":[{"internalType":"address","name":"proxyAddress","type":"address"},{"internalType":"uint256","name":"depositId","type":"uint256"},{"internalType":"uint256","name":"initialContribution","type":"uint256"},{"internalType":"uint256","name":"latestContributionToNav","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyClaimAndRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proxyIndex","type":"uint256"}],"name":"emergencyClaimBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDivisors","outputs":[{"internalType":"uint256","name":"mintFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"claimFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBancorNetworkContract","outputs":[{"internalType":"contract IBancorNetwork","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBufferBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityProtectionContract","outputs":[{"internalType":"contract ILiquidityProtection","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"getProxyAddressDepositIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"proxyAddress","type":"address"}],"name":"getProxyAddressRewardsContributionToNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsContributionToNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingRewardsContract","outputs":[{"internalType":"contract IStakingRewards","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTargetBufferBalance","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":"lowestActiveProxyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextProxyIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRewardsContributionToNav","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proxyIndexToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager2","type":"address"}],"name":"setManager2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocatedNav","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":[{"internalType":"address","name":"_newInstance","type":"address"}],"name":"transferToNewInstance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"beginProxyIndexIterator","type":"uint256"},{"internalType":"uint256","name":"endProxyIndexIterator","type":"uint256"}],"name":"updatePendingRewardsContributionToNav","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"beginProxyIndexIterator","type":"uint256"},{"internalType":"uint256","name":"endProxyIndexIterator","type":"uint256"}],"name":"updateTotalAllocatedNav","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawableBntFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b5061370d806100206000396000f3fe6080604052600436106103035760003560e01c806386d1c5ff11610190578063afdb3df6116100dc578063dc24fc0711610095578063e942e4841161006f578063e942e48414610b5a578063e9484f8b14610b6f578063e9fad39614610ba2578063f2fde38b14610bcc57610354565b8063dc24fc0714610ae0578063dd62ed3e14610af5578063e1a0f07214610b3057610354565b8063afdb3df614610a05578063b33712c514610a35578063b5a0425714610a4a578063d0ebdbe714610a83578063d510805714610ab6578063dada981914610acb57610354565b80639440334f11610149578063a2d48da511610123578063a2d48da514610936578063a457c2d714610960578063a609096e14610999578063a9059cbb146109cc57610354565b80639440334f146108dc57806395d89b411461090c5780639db759621461092157610354565b806386d1c5ff146107b45780638bea72fb146107c95780638da5cb5b146107fc5780639068e211146108115780639154d77c14610894578063940f61b6146108a957610354565b8063439766ce1161024f578063629c577e11610208578063715018a6116101e2578063715018a6146107425780637c3651ae14610757578063803c64bb1461076c57806380bac4681461079f57610354565b8063629c577e146106c757806362fdfced146106fa57806370a082311461070f57610354565b8063439766ce146105e05780634ceac4db146105f557806351bb42571461064f578063566887001461066457806358927bc41461069d5780635c975abb146106b257610354565b806323b872dd116102bc578063313ce56711610296578063313ce5671461055257806332d6a2f21461057d5780633552c62f1461059257806339509351146105a757610354565b806323b872dd146104c957806326da9fb61461050c57806330d7aa841461052157610354565b80630636769e1461035957806306fdde031461038c578063095ea7b3146104165780630962ef79146104635780631373c1a61461048d57806318160ddd146104b457610354565b366103545733321415610352576040805162461bcd60e51b8152602060048201526012602482015271115c9c985b9d081155120819195c1bdcda5d60721b604482015290519081900360640190fd5b005b600080fd5b34801561036557600080fd5b506103526004803603602081101561037c57600080fd5b50356001600160a01b0316610bff565b34801561039857600080fd5b506103a1610ca4565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103db5781810151838201526020016103c3565b50505050905090810190601f1680156104085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042257600080fd5b5061044f6004803603604081101561043957600080fd5b506001600160a01b038135169060200135610d3b565b604080519115158252519081900360200190f35b34801561046f57600080fd5b506103526004803603602081101561048657600080fd5b5035610d59565b34801561049957600080fd5b506104a2610f0c565b60408051918252519081900360200190f35b3480156104c057600080fd5b506104a2610f2c565b3480156104d557600080fd5b5061044f600480360360608110156104ec57600080fd5b506001600160a01b03813581169160208101359091169060400135610f32565b34801561051857600080fd5b506104a2610fbf565b34801561052d57600080fd5b50610536610fc6565b604080516001600160a01b039092168252519081900360200190f35b34801561055e57600080fd5b50610567611058565b6040805160ff9092168252519081900360200190f35b34801561058957600080fd5b50610352611061565b34801561059e57600080fd5b506104a2611134565b3480156105b357600080fd5b5061044f600480360360408110156105ca57600080fd5b506001600160a01b038135169060200135611168565b3480156105ec57600080fd5b506103526111bc565b34801561060157600080fd5b5061061f6004803603602081101561061857600080fd5b5035611252565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b34801561065b57600080fd5b506104a2611284565b34801561067057600080fd5b506103526004803603604081101561068757600080fd5b506001600160a01b03813516906020013561128b565b3480156106a957600080fd5b5061053661164e565b3480156106be57600080fd5b5061044f6116a9565b3480156106d357600080fd5b506106dc6116b2565b60408051938452602084019290925282820152519081900360600190f35b34801561070657600080fd5b506103526116c1565b34801561071b57600080fd5b506104a26004803603602081101561073257600080fd5b50356001600160a01b0316611793565b34801561074e57600080fd5b506103526117ae565b34801561076357600080fd5b506104a2611850565b34801561077857600080fd5b506104a26004803603602081101561078f57600080fd5b50356001600160a01b0316611889565b3480156107ab57600080fd5b506104a26118a8565b3480156107c057600080fd5b506103526118af565b3480156107d557600080fd5b50610352600480360360208110156107ec57600080fd5b50356001600160a01b031661194b565b34801561080857600080fd5b506105366119c6565b34801561081d57600080fd5b506108446004803603602081101561083457600080fd5b50356001600160a01b03166119d5565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610880578181015183820152602001610868565b505050509050019250505060405180910390f35b3480156108a057600080fd5b506104a2611a42565b3480156108b557600080fd5b50610352600480360360208110156108cc57600080fd5b50356001600160a01b0316611a49565b3480156108e857600080fd5b50610352600480360360408110156108ff57600080fd5b5080359060200135611b5b565b34801561091857600080fd5b506103a1611e24565b34801561092d57600080fd5b506104a2611e85565b34801561094257600080fd5b506105366004803603602081101561095957600080fd5b5035611e8c565b34801561096c57600080fd5b5061044f6004803603604081101561098357600080fd5b506001600160a01b038135169060200135611ea8565b3480156109a557600080fd5b50610352600480360360208110156109bc57600080fd5b50356001600160a01b0316611f16565b3480156109d857600080fd5b5061044f600480360360408110156109ef57600080fd5b506001600160a01b03813516906020013561200b565b348015610a1157600080fd5b5061035260048036036040811015610a2857600080fd5b508035906020013561201f565b348015610a4157600080fd5b50610352612316565b348015610a5657600080fd5b5061035260048036036040811015610a6d57600080fd5b50803590602001356001600160a01b03166123aa565b348015610a8f57600080fd5b5061035260048036036020811015610aa657600080fd5b50356001600160a01b031661260c565b348015610ac257600080fd5b506104a2612687565b348015610ad757600080fd5b5061035261268e565b348015610aec57600080fd5b506104a2612701565b348015610b0157600080fd5b506104a260048036036040811015610b1857600080fd5b506001600160a01b03813581169160200135166127aa565b348015610b3c57600080fd5b5061035260048036036020811015610b5357600080fd5b50356127d5565b348015610b6657600080fd5b5061053661284c565b348015610b7b57600080fd5b5061035260048036036020811015610b9257600080fd5b50356001600160a01b03166128a8565b348015610bae57600080fd5b5061035260048036036020811015610bc557600080fd5b503561294d565b348015610bd857600080fd5b5061035260048036036020811015610bef57600080fd5b50356001600160a01b03166129ea565b610c07612ae3565b6097546001600160a01b03908116911614610c57576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b61010c80546001600160a01b0319166001600160a01b03831617905542610101556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b60688054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d305780601f10610d0557610100808354040283529160200191610d30565b820191906000526020600020905b815481529060010190602001808311610d1357829003601f168201915b505050505090505b90565b6000610d4f610d48612ae3565b8484612ae7565b5060015b92915050565b610d616119c6565b6001600160a01b0316336001600160a01b03161480610d8b5750610108546001600160a01b031633145b80610da15750610109546001600160a01b031633145b610de5576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010354600090815261011260205260408120546001600160a01b0316908190610e0e82611889565b61010654909150610e25908263ffffffff612bd316565b610106556001600160a01b03808416600090815261011160209081526040808320600101839055805163372500ab60e01b81529051929386169263372500ab9260048084019391929182900301818787803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b505050506040513d6020811015610ead57600080fd5b505161010f54909150610ec1908290612c1c565b50610eca612c33565b604080518681526020810183905281517f8b0944629ca33aba8dd5f33f7f8220efe77a2d5548a1651362c856c5ea586a65929181900390910190a15050505050565b6000610f276014610f1b611134565b9063ffffffff612c3a16565b905090565b60675490565b6000610f3f848484612c7c565b610fb584610f4b612ae3565b610fb085604051806060016040528060288152602001613622602891396001600160a01b038a16600090815260666020526040812090610f89612ae3565b6001600160a01b03168152602081019190915260400160002054919063ffffffff612de516565b612ae7565b5060019392505050565b6101035481565b60fd5460408051632ecd14d360e21b8152722634b8bab4b234ba3ca83937ba32b1ba34b7b760691b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561102757600080fd5b505afa15801561103b573d6000803e3d6000fd5b505050506040513d602081101561105157600080fd5b5051905090565b606a5460ff1690565b611069612ae3565b6097546001600160a01b039081169116146110b9576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b610100546110d0906202a30063ffffffff612e7c16565b421161110e576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010b5461010a80546001600160a01b0319166001600160a01b03909216919091179055565b6000610f27611141612701565b61115c61114c611850565b610105549063ffffffff612e7c16565b9063ffffffff612e7c16565b6000610d4f611175612ae3565b84610fb08560666000611186612ae3565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff612e7c16565b6111c46119c6565b6001600160a01b0316336001600160a01b031614806111ee5750610108546001600160a01b031633145b806112045750610109546001600160a01b031633145b611248576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611250612ed6565b565b6101106020526000908152604090208054600182015460028301546003909301546001600160a01b0390921692909184565b6101075481565b6112936119c6565b6001600160a01b0316336001600160a01b031614806112bd5750610108546001600160a01b031633145b806112d35750610109546001600160a01b031633145b611317576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010454604080516020808201939093528082018490528151808203830181526060820180845281519185019190912060ff5461010a5463df02995d60e01b909352606484018290526001600160a01b03928316608485015293519094600094929092169263df02995d9260a480830193919282900301818787803b15801561139f57600080fd5b505af11580156113b3573d6000803e3d6000fd5b505050506040513d60208110156113c957600080fd5b505160fb546040805163a9059cbb60e01b81526001600160a01b03808516600483015260248201889052915193945091169163a9059cbb916044808201926020929091908290030181600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505050506040513d602081101561144d57600080fd5b505060fd5460fb5460fc546040805163410ace9360e01b81526001600160a01b03948516600482015230602482015292841660448401529083166064830152868316608483015260a482018690525160009284169163410ace939160c480830192602092919082900301818787803b1580156114c857600080fd5b505af11580156114dc573d6000803e3d6000fd5b505050506040513d60208110156114f257600080fd5b505190506114fe613535565b5060408051608080820183526001600160a01b038086168352602080840186905283850189905260608085018a9052610104548651938c1684529183018a90528286018790528201524291810191909152915190917fd92dda7384b5f0fa573be9bbf63d63ac81a5bbb08ebc31f00c0f066e50239609919081900360a00190a1600082815261011060209081526040808320845181546001600160a01b039182166001600160a01b031991821617835584870151600180850191909155848801516002808601919091556060890151600390950194909455918916808752610111865284872080548085018255818952878920018a90559384018c905561010480548852610112909652939095208054909516909217909355815401905561010554611630908763ffffffff612e7c16565b6101055561163d86612f74565b611645612c33565b50505050505050565b60fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561102757600080fd5b60c95460ff1690565b61010d5461010e5461010f5483565b6116c9612ae3565b6097546001600160a01b03908116911614611719576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b61010154611730906202a30063ffffffff612e7c16565b421161176e576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010c5460fe80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b031660009081526065602052604090205490565b6117b6612ae3565b6097546001600160a01b03908116911614611806576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b61010f5461010654600091829161186c9163ffffffff612c3a16565b61010654909150611883908263ffffffff612bd316565b91505090565b6001600160a01b03166000908152610111602052604090206001015490565b6101065481565b6118b76119c6565b6001600160a01b0316336001600160a01b031614806118e15750610108546001600160a01b031633145b806118f75750610109546001600160a01b031633145b61193b576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611943612fdc565b611250612c33565b611953612ae3565b6097546001600160a01b039081169116146119a3576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b61010980546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031690565b6001600160a01b03811660009081526101116020908152604091829020805483518184028101840190945280845260609392830182828015611a3657602002820191906000526020600020905b815481526020019060010190808311611a22575b50505050509050919050565b6101025481565b611a516119c6565b6001600160a01b0316336001600160a01b03161480611a7b5750610108546001600160a01b031633145b80611a915750610109546001600160a01b031633145b611ad5576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60fc546040805163095ea7b360e01b81526001600160a01b03848116600483015260001960248301529151919092169163095ea7b39160448083019260209291908290030181600087803b158015611b2c57600080fd5b505af1158015611b40573d6000803e3d6000fd5b505050506040513d6020811015611b5657600080fd5b505050565b611b636119c6565b6001600160a01b0316336001600160a01b03161480611b8d5750610108546001600160a01b031633145b80611ba35750610109546001600160a01b031633145b611be7576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010354821015611c2f576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b61010454811115611c77576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b6000611c81610fc6565b905060606000845b84811015611e1c57600081815261011260209081526040808320546001600160a01b0316835261011182529182902080548351818402810184019094528084529091830182828015611cfa57602002820191906000526020600020905b815481526020019060010190808311611ce6575b50939650600093505050505b8351811015611e1357846001600160a01b0316636d533e9b858381518110611d2a57fe5b6020026020010151620f4240426040518463ffffffff1660e01b8152600401808481526020018363ffffffff1663ffffffff168152602001828152602001935050505060606040518083038186803b158015611d8557600080fd5b505afa158015611d99573d6000803e3d6000fd5b505050506040513d6060811015611daf57600080fd5b50518451909350600090610110908290879085908110611dcb57fe5b602002602001015181526020019081526020016000209050611e018461115c836003015461010554612bd390919063ffffffff16565b61010555600301839055600101611d06565b50600101611c89565b505050505050565b60698054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d305780601f10610d0557610100808354040283529160200191610d30565b6101045481565b610112602052600090815260409020546001600160a01b031681565b6000610d4f611eb5612ae3565b84610fb0856040518060600160405280602581526020016136b36025913960666000611edf612ae3565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff612de516565b611f1e6119c6565b6001600160a01b0316336001600160a01b03161480611f485750610108546001600160a01b031633145b80611f5e5750610109546001600160a01b031633145b611fa2576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60fb546001600160a01b031663a9059cbb82611fbc612701565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611b2c57600080fd5b6000610d4f612018612ae3565b8484612c7c565b6120276119c6565b6001600160a01b0316336001600160a01b031614806120515750610108546001600160a01b031633145b806120675750610109546001600160a01b031633145b6120ab576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b610103548210156120f3576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b6101045481111561213b576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b81811161217f576040805162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037b93232b960991b604482015290519081900360640190fd5b600061218961284c565b905060008060006101035490505b610104548110156122a257600081815261011260209081526040808320546001600160a01b0316808452610111909252909120600101546121df90859063ffffffff612e7c16565b93506000856001600160a01b03166331d7a262836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561223957600080fd5b505afa15801561224d573d6000803e3d6000fd5b505050506040513d602081101561226357600080fd5b50516001600160a01b0383166000908152610111602052604090206001018190559050612296848263ffffffff612e7c16565b93505050600101612197565b506101065460408051918252602082018390524282820152517fdb6384c96bf21119d48fbb5985f4f9b3dcd153386eba0ffcb2b8b4c69fd9aa409181900360600190a161230b826122ff8361010654612e7c90919063ffffffff16565b9063ffffffff612bd316565b610106555050505050565b61231e6119c6565b6001600160a01b0316336001600160a01b031614806123485750610108546001600160a01b031633145b8061235e5750610109546001600160a01b031633145b6123a2576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61125061319f565b6123b26119c6565b6001600160a01b0316336001600160a01b031614806123dc5750610108546001600160a01b031633145b806123f25750610109546001600160a01b031633145b612436576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b600082815261011260209081526040808320546001600160a01b03908116808552610111909352818420825163a04d481360e01b81529186166004830152825193949093859391928392859263a04d481392602480820193929182900301818787803b1580156124a557600080fd5b505af11580156124b9573d6000803e3d6000fd5b505050506040513d60408110156124cf57600080fd5b50805160209091015161010f5491935091506124ec908290612c1c565b508354600181018555600085815260209020018290556002840154612517908263ffffffff612e7c16565b60028501556001840154610106546125349163ffffffff612bd316565b610106556000600185015561010554612553908263ffffffff612e7c16565b6101055560408051608080820183526001600160a01b0388811683526020808401878152848601878152606080870189815260008b81526101108652899020975188546001600160a01b031916961695909517875591516001870155516002860155915160039094019390935583518b8152928301859052828401869052429083015291517f9737e7b0050fbe768c31b5c3d88bbcb6fe5e72237a4b8f3d60864d9110e4d397929181900390910190a161163d81612f74565b612614612ae3565b6097546001600160a01b03908116911614612664576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b61010880546001600160a01b0319166001600160a01b0392909216919091179055565b6101055481565b6101025442906126a7906224ea0063ffffffff612e7c16565b106126f9576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b611250612fdc565b60fb54604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561275157600080fd5b505afa158015612765573d6000803e3d6000fd5b505050506040513d602081101561277b57600080fd5b505161010754909150811015612795576000915050610d38565b6101075461188390829063ffffffff612bd316565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b6101025442906127ee906224ea0063ffffffff612e7c16565b10612840576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b61284981613220565b50565b60fd5460408051632ecd14d360e21b81526d5374616b696e675265776172647360901b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561102757600080fd5b6128b0612ae3565b6097546001600160a01b03908116911614612900576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b61010b80546001600160a01b0319166001600160a01b03831617905542610100556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b6129556119c6565b6001600160a01b0316336001600160a01b0316148061297f5750610108546001600160a01b031633145b806129955750610109546001600160a01b031633145b6129d9576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b6129e281613220565b612849612c33565b6129f2612ae3565b6097546001600160a01b03908116911614612a42576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b6001600160a01b038116612a875760405162461bcd60e51b81526004018080602001828103825260268152602001806135b46026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316612b2c5760405162461bcd60e51b815260040180806020018281038252602481526020018061368f6024913960400191505060405180910390fd5b6001600160a01b038216612b715760405162461bcd60e51b81526004018080602001828103825260228152602001806135da6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000612c1583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612de5565b9392505050565b6000612c288383613442565b9050610d5381613468565b4261010255565b6000612c1583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613483565b6001600160a01b038316612cc15760405162461bcd60e51b815260040180806020018281038252602581526020018061366a6025913960400191505060405180910390fd5b6001600160a01b038216612d065760405162461bcd60e51b81526004018080602001828103825260238152602001806135916023913960400191505060405180910390fd5b612d11838383611b56565b612d54816040518060600160405280602681526020016135fc602691396001600160a01b038616600090815260656020526040902054919063ffffffff612de516565b6001600160a01b038085166000908152606560205260408082209390935590841681522054612d89908263ffffffff612e7c16565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115612e745760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e39578181015183820152602001612e21565b50505050905090810190601f168015612e665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612c15576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60c95460ff1615612f21576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f57612ae3565b604080516001600160a01b039092168252519081900360200190a1565b60fe546040805163534a7e1d60e11b81526004810184905290516001600160a01b039092169163a694fc3a9160248082019260009290919082900301818387803b158015612fc157600080fd5b505af1158015612fd5573d6000803e3d6000fd5b5050505050565b61010354600090815261011260209081526040808320546001600160a01b0316808452610111909252909120600181015461010654839291613024919063ffffffff612bd316565b6101065560006001820155600281015461303d906134e8565b60fc5460028201546040805163a9059cbb60e01b81526001600160a01b03878116600483015260248201939093529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561309957600080fd5b505af11580156130ad573d6000803e3d6000fd5b505050506040513d60208110156130c357600080fd5b5050604080516386d1c5ff60e01b815290516000916001600160a01b038516916386d1c5ff9160048082019260209290919082900301818787803b15801561310a57600080fd5b505af115801561311e573d6000803e3d6000fd5b505050506040513d602081101561313457600080fd5b505161010f54909150613148908290612c1c565b5061010354604080519182526020820183905280517f2493012c2b3f032daebde31221d2adb14631b760cd03040957e4ba73dc20b9719281900390910190a161010380546001019055613199612c33565b50505050565b60c95460ff166131ed576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612f57612ae3565b600081815261011260205260409020546001600160a01b0316613241613566565b6001600160a01b038216600090815261011160209081526040918290208251815460a0938102820184019094526080810184815290939192849284918401828280156132ac57602002820191906000526020600020905b815481526020019060010190808311613298575b5050509183525050600182015460208201526002820154604082015260039091015460ff16151560609182015281015190915015613323576040805162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6001600160a01b03821660008181526101116020526040808220600301805460ff1916600117905580516318284de560e11b815290518593926330509bca926004808201939182900301818387803b15801561337e57600080fd5b505af1158015613392573d6000803e3d6000fd5b50508351600092509050815b81518110156133ee576133e461011060008484815181106133bb57fe5b602002602001015181526020019081526020016000206003015484612e7c90919063ffffffff16565b925060010161339e565b506040805187815290517f7fc547d30654f63b77c16f8a90f08290e8f69a076d8d5512d182b4ddbc198d039181900360200190a161010554613436908363ffffffff612bd316565b61010555505050505050565b600080821180156134535750600083115b15610d5357612c15838363ffffffff612c3a16565b6101075461347c908263ffffffff612e7c16565b6101075550565b600081836134d25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612e39578181015183820152602001612e21565b5060008385816134de57fe5b0495945050505050565b60fe54604080516305c2fbcf60e31b81526004810184905290516001600160a01b0390921691632e17de789160248082019260009290919082900301818387803b158015612fc157600080fd5b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6040518060800160405280606081526020016000815260200160008152602001600015158152509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b24383cb511fd1ae69b2c6e5a52fc15828fa5c944584af7ec01782cb4b9a3fc764736f6c63430006020033
Deployed Bytecode
0x6080604052600436106103035760003560e01c806386d1c5ff11610190578063afdb3df6116100dc578063dc24fc0711610095578063e942e4841161006f578063e942e48414610b5a578063e9484f8b14610b6f578063e9fad39614610ba2578063f2fde38b14610bcc57610354565b8063dc24fc0714610ae0578063dd62ed3e14610af5578063e1a0f07214610b3057610354565b8063afdb3df614610a05578063b33712c514610a35578063b5a0425714610a4a578063d0ebdbe714610a83578063d510805714610ab6578063dada981914610acb57610354565b80639440334f11610149578063a2d48da511610123578063a2d48da514610936578063a457c2d714610960578063a609096e14610999578063a9059cbb146109cc57610354565b80639440334f146108dc57806395d89b411461090c5780639db759621461092157610354565b806386d1c5ff146107b45780638bea72fb146107c95780638da5cb5b146107fc5780639068e211146108115780639154d77c14610894578063940f61b6146108a957610354565b8063439766ce1161024f578063629c577e11610208578063715018a6116101e2578063715018a6146107425780637c3651ae14610757578063803c64bb1461076c57806380bac4681461079f57610354565b8063629c577e146106c757806362fdfced146106fa57806370a082311461070f57610354565b8063439766ce146105e05780634ceac4db146105f557806351bb42571461064f578063566887001461066457806358927bc41461069d5780635c975abb146106b257610354565b806323b872dd116102bc578063313ce56711610296578063313ce5671461055257806332d6a2f21461057d5780633552c62f1461059257806339509351146105a757610354565b806323b872dd146104c957806326da9fb61461050c57806330d7aa841461052157610354565b80630636769e1461035957806306fdde031461038c578063095ea7b3146104165780630962ef79146104635780631373c1a61461048d57806318160ddd146104b457610354565b366103545733321415610352576040805162461bcd60e51b8152602060048201526012602482015271115c9c985b9d081155120819195c1bdcda5d60721b604482015290519081900360640190fd5b005b600080fd5b34801561036557600080fd5b506103526004803603602081101561037c57600080fd5b50356001600160a01b0316610bff565b34801561039857600080fd5b506103a1610ca4565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103db5781810151838201526020016103c3565b50505050905090810190601f1680156104085780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561042257600080fd5b5061044f6004803603604081101561043957600080fd5b506001600160a01b038135169060200135610d3b565b604080519115158252519081900360200190f35b34801561046f57600080fd5b506103526004803603602081101561048657600080fd5b5035610d59565b34801561049957600080fd5b506104a2610f0c565b60408051918252519081900360200190f35b3480156104c057600080fd5b506104a2610f2c565b3480156104d557600080fd5b5061044f600480360360608110156104ec57600080fd5b506001600160a01b03813581169160208101359091169060400135610f32565b34801561051857600080fd5b506104a2610fbf565b34801561052d57600080fd5b50610536610fc6565b604080516001600160a01b039092168252519081900360200190f35b34801561055e57600080fd5b50610567611058565b6040805160ff9092168252519081900360200190f35b34801561058957600080fd5b50610352611061565b34801561059e57600080fd5b506104a2611134565b3480156105b357600080fd5b5061044f600480360360408110156105ca57600080fd5b506001600160a01b038135169060200135611168565b3480156105ec57600080fd5b506103526111bc565b34801561060157600080fd5b5061061f6004803603602081101561061857600080fd5b5035611252565b604080516001600160a01b0390951685526020850193909352838301919091526060830152519081900360800190f35b34801561065b57600080fd5b506104a2611284565b34801561067057600080fd5b506103526004803603604081101561068757600080fd5b506001600160a01b03813516906020013561128b565b3480156106a957600080fd5b5061053661164e565b3480156106be57600080fd5b5061044f6116a9565b3480156106d357600080fd5b506106dc6116b2565b60408051938452602084019290925282820152519081900360600190f35b34801561070657600080fd5b506103526116c1565b34801561071b57600080fd5b506104a26004803603602081101561073257600080fd5b50356001600160a01b0316611793565b34801561074e57600080fd5b506103526117ae565b34801561076357600080fd5b506104a2611850565b34801561077857600080fd5b506104a26004803603602081101561078f57600080fd5b50356001600160a01b0316611889565b3480156107ab57600080fd5b506104a26118a8565b3480156107c057600080fd5b506103526118af565b3480156107d557600080fd5b50610352600480360360208110156107ec57600080fd5b50356001600160a01b031661194b565b34801561080857600080fd5b506105366119c6565b34801561081d57600080fd5b506108446004803603602081101561083457600080fd5b50356001600160a01b03166119d5565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610880578181015183820152602001610868565b505050509050019250505060405180910390f35b3480156108a057600080fd5b506104a2611a42565b3480156108b557600080fd5b50610352600480360360208110156108cc57600080fd5b50356001600160a01b0316611a49565b3480156108e857600080fd5b50610352600480360360408110156108ff57600080fd5b5080359060200135611b5b565b34801561091857600080fd5b506103a1611e24565b34801561092d57600080fd5b506104a2611e85565b34801561094257600080fd5b506105366004803603602081101561095957600080fd5b5035611e8c565b34801561096c57600080fd5b5061044f6004803603604081101561098357600080fd5b506001600160a01b038135169060200135611ea8565b3480156109a557600080fd5b50610352600480360360208110156109bc57600080fd5b50356001600160a01b0316611f16565b3480156109d857600080fd5b5061044f600480360360408110156109ef57600080fd5b506001600160a01b03813516906020013561200b565b348015610a1157600080fd5b5061035260048036036040811015610a2857600080fd5b508035906020013561201f565b348015610a4157600080fd5b50610352612316565b348015610a5657600080fd5b5061035260048036036040811015610a6d57600080fd5b50803590602001356001600160a01b03166123aa565b348015610a8f57600080fd5b5061035260048036036020811015610aa657600080fd5b50356001600160a01b031661260c565b348015610ac257600080fd5b506104a2612687565b348015610ad757600080fd5b5061035261268e565b348015610aec57600080fd5b506104a2612701565b348015610b0157600080fd5b506104a260048036036040811015610b1857600080fd5b506001600160a01b03813581169160200135166127aa565b348015610b3c57600080fd5b5061035260048036036020811015610b5357600080fd5b50356127d5565b348015610b6657600080fd5b5061053661284c565b348015610b7b57600080fd5b5061035260048036036020811015610b9257600080fd5b50356001600160a01b03166128a8565b348015610bae57600080fd5b5061035260048036036020811015610bc557600080fd5b503561294d565b348015610bd857600080fd5b5061035260048036036020811015610bef57600080fd5b50356001600160a01b03166129ea565b610c07612ae3565b6097546001600160a01b03908116911614610c57576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b61010c80546001600160a01b0319166001600160a01b03831617905542610101556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b60688054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d305780601f10610d0557610100808354040283529160200191610d30565b820191906000526020600020905b815481529060010190602001808311610d1357829003601f168201915b505050505090505b90565b6000610d4f610d48612ae3565b8484612ae7565b5060015b92915050565b610d616119c6565b6001600160a01b0316336001600160a01b03161480610d8b5750610108546001600160a01b031633145b80610da15750610109546001600160a01b031633145b610de5576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010354600090815261011260205260408120546001600160a01b0316908190610e0e82611889565b61010654909150610e25908263ffffffff612bd316565b610106556001600160a01b03808416600090815261011160209081526040808320600101839055805163372500ab60e01b81529051929386169263372500ab9260048084019391929182900301818787803b158015610e8357600080fd5b505af1158015610e97573d6000803e3d6000fd5b505050506040513d6020811015610ead57600080fd5b505161010f54909150610ec1908290612c1c565b50610eca612c33565b604080518681526020810183905281517f8b0944629ca33aba8dd5f33f7f8220efe77a2d5548a1651362c856c5ea586a65929181900390910190a15050505050565b6000610f276014610f1b611134565b9063ffffffff612c3a16565b905090565b60675490565b6000610f3f848484612c7c565b610fb584610f4b612ae3565b610fb085604051806060016040528060288152602001613622602891396001600160a01b038a16600090815260666020526040812090610f89612ae3565b6001600160a01b03168152602081019190915260400160002054919063ffffffff612de516565b612ae7565b5060019392505050565b6101035481565b60fd5460408051632ecd14d360e21b8152722634b8bab4b234ba3ca83937ba32b1ba34b7b760691b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561102757600080fd5b505afa15801561103b573d6000803e3d6000fd5b505050506040513d602081101561105157600080fd5b5051905090565b606a5460ff1690565b611069612ae3565b6097546001600160a01b039081169116146110b9576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b610100546110d0906202a30063ffffffff612e7c16565b421161110e576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010b5461010a80546001600160a01b0319166001600160a01b03909216919091179055565b6000610f27611141612701565b61115c61114c611850565b610105549063ffffffff612e7c16565b9063ffffffff612e7c16565b6000610d4f611175612ae3565b84610fb08560666000611186612ae3565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff612e7c16565b6111c46119c6565b6001600160a01b0316336001600160a01b031614806111ee5750610108546001600160a01b031633145b806112045750610109546001600160a01b031633145b611248576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611250612ed6565b565b6101106020526000908152604090208054600182015460028301546003909301546001600160a01b0390921692909184565b6101075481565b6112936119c6565b6001600160a01b0316336001600160a01b031614806112bd5750610108546001600160a01b031633145b806112d35750610109546001600160a01b031633145b611317576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010454604080516020808201939093528082018490528151808203830181526060820180845281519185019190912060ff5461010a5463df02995d60e01b909352606484018290526001600160a01b03928316608485015293519094600094929092169263df02995d9260a480830193919282900301818787803b15801561139f57600080fd5b505af11580156113b3573d6000803e3d6000fd5b505050506040513d60208110156113c957600080fd5b505160fb546040805163a9059cbb60e01b81526001600160a01b03808516600483015260248201889052915193945091169163a9059cbb916044808201926020929091908290030181600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505050506040513d602081101561144d57600080fd5b505060fd5460fb5460fc546040805163410ace9360e01b81526001600160a01b03948516600482015230602482015292841660448401529083166064830152868316608483015260a482018690525160009284169163410ace939160c480830192602092919082900301818787803b1580156114c857600080fd5b505af11580156114dc573d6000803e3d6000fd5b505050506040513d60208110156114f257600080fd5b505190506114fe613535565b5060408051608080820183526001600160a01b038086168352602080840186905283850189905260608085018a9052610104548651938c1684529183018a90528286018790528201524291810191909152915190917fd92dda7384b5f0fa573be9bbf63d63ac81a5bbb08ebc31f00c0f066e50239609919081900360a00190a1600082815261011060209081526040808320845181546001600160a01b039182166001600160a01b031991821617835584870151600180850191909155848801516002808601919091556060890151600390950194909455918916808752610111865284872080548085018255818952878920018a90559384018c905561010480548852610112909652939095208054909516909217909355815401905561010554611630908763ffffffff612e7c16565b6101055561163d86612f74565b611645612c33565b50505050505050565b60fd5460408051632ecd14d360e21b81526c42616e636f724e6574776f726b60981b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561102757600080fd5b60c95460ff1690565b61010d5461010e5461010f5483565b6116c9612ae3565b6097546001600160a01b03908116911614611719576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b61010154611730906202a30063ffffffff612e7c16565b421161176e576040805162461bcd60e51b81526020600482015260086024820152672a37b79039b7b7b760c11b604482015290519081900360640190fd5b61010c5460fe80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b031660009081526065602052604090205490565b6117b6612ae3565b6097546001600160a01b03908116911614611806576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b61010f5461010654600091829161186c9163ffffffff612c3a16565b61010654909150611883908263ffffffff612bd316565b91505090565b6001600160a01b03166000908152610111602052604090206001015490565b6101065481565b6118b76119c6565b6001600160a01b0316336001600160a01b031614806118e15750610108546001600160a01b031633145b806118f75750610109546001600160a01b031633145b61193b576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b611943612fdc565b611250612c33565b611953612ae3565b6097546001600160a01b039081169116146119a3576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b61010980546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031690565b6001600160a01b03811660009081526101116020908152604091829020805483518184028101840190945280845260609392830182828015611a3657602002820191906000526020600020905b815481526020019060010190808311611a22575b50505050509050919050565b6101025481565b611a516119c6565b6001600160a01b0316336001600160a01b03161480611a7b5750610108546001600160a01b031633145b80611a915750610109546001600160a01b031633145b611ad5576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60fc546040805163095ea7b360e01b81526001600160a01b03848116600483015260001960248301529151919092169163095ea7b39160448083019260209291908290030181600087803b158015611b2c57600080fd5b505af1158015611b40573d6000803e3d6000fd5b505050506040513d6020811015611b5657600080fd5b505050565b611b636119c6565b6001600160a01b0316336001600160a01b03161480611b8d5750610108546001600160a01b031633145b80611ba35750610109546001600160a01b031633145b611be7576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61010354821015611c2f576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b61010454811115611c77576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b6000611c81610fc6565b905060606000845b84811015611e1c57600081815261011260209081526040808320546001600160a01b0316835261011182529182902080548351818402810184019094528084529091830182828015611cfa57602002820191906000526020600020905b815481526020019060010190808311611ce6575b50939650600093505050505b8351811015611e1357846001600160a01b0316636d533e9b858381518110611d2a57fe5b6020026020010151620f4240426040518463ffffffff1660e01b8152600401808481526020018363ffffffff1663ffffffff168152602001828152602001935050505060606040518083038186803b158015611d8557600080fd5b505afa158015611d99573d6000803e3d6000fd5b505050506040513d6060811015611daf57600080fd5b50518451909350600090610110908290879085908110611dcb57fe5b602002602001015181526020019081526020016000209050611e018461115c836003015461010554612bd390919063ffffffff16565b61010555600301839055600101611d06565b50600101611c89565b505050505050565b60698054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d305780601f10610d0557610100808354040283529160200191610d30565b6101045481565b610112602052600090815260409020546001600160a01b031681565b6000610d4f611eb5612ae3565b84610fb0856040518060600160405280602581526020016136b36025913960666000611edf612ae3565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff612de516565b611f1e6119c6565b6001600160a01b0316336001600160a01b03161480611f485750610108546001600160a01b031633145b80611f5e5750610109546001600160a01b031633145b611fa2576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60fb546001600160a01b031663a9059cbb82611fbc612701565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611b2c57600080fd5b6000610d4f612018612ae3565b8484612c7c565b6120276119c6565b6001600160a01b0316336001600160a01b031614806120515750610108546001600160a01b031633145b806120675750610109546001600160a01b031633145b6120ab576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b610103548210156120f3576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b6101045481111561213b576040805162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b604482015290519081900360640190fd5b81811161217f576040805162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b21037b93232b960991b604482015290519081900360640190fd5b600061218961284c565b905060008060006101035490505b610104548110156122a257600081815261011260209081526040808320546001600160a01b0316808452610111909252909120600101546121df90859063ffffffff612e7c16565b93506000856001600160a01b03166331d7a262836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561223957600080fd5b505afa15801561224d573d6000803e3d6000fd5b505050506040513d602081101561226357600080fd5b50516001600160a01b0383166000908152610111602052604090206001018190559050612296848263ffffffff612e7c16565b93505050600101612197565b506101065460408051918252602082018390524282820152517fdb6384c96bf21119d48fbb5985f4f9b3dcd153386eba0ffcb2b8b4c69fd9aa409181900360600190a161230b826122ff8361010654612e7c90919063ffffffff16565b9063ffffffff612bd316565b610106555050505050565b61231e6119c6565b6001600160a01b0316336001600160a01b031614806123485750610108546001600160a01b031633145b8061235e5750610109546001600160a01b031633145b6123a2576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61125061319f565b6123b26119c6565b6001600160a01b0316336001600160a01b031614806123dc5750610108546001600160a01b031633145b806123f25750610109546001600160a01b031633145b612436576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b600082815261011260209081526040808320546001600160a01b03908116808552610111909352818420825163a04d481360e01b81529186166004830152825193949093859391928392859263a04d481392602480820193929182900301818787803b1580156124a557600080fd5b505af11580156124b9573d6000803e3d6000fd5b505050506040513d60408110156124cf57600080fd5b50805160209091015161010f5491935091506124ec908290612c1c565b508354600181018555600085815260209020018290556002840154612517908263ffffffff612e7c16565b60028501556001840154610106546125349163ffffffff612bd316565b610106556000600185015561010554612553908263ffffffff612e7c16565b6101055560408051608080820183526001600160a01b0388811683526020808401878152848601878152606080870189815260008b81526101108652899020975188546001600160a01b031916961695909517875591516001870155516002860155915160039094019390935583518b8152928301859052828401869052429083015291517f9737e7b0050fbe768c31b5c3d88bbcb6fe5e72237a4b8f3d60864d9110e4d397929181900390910190a161163d81612f74565b612614612ae3565b6097546001600160a01b03908116911614612664576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b61010880546001600160a01b0319166001600160a01b0392909216919091179055565b6101055481565b6101025442906126a7906224ea0063ffffffff612e7c16565b106126f9576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b611250612fdc565b60fb54604080516370a0823160e01b8152306004820152905160009283926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b15801561275157600080fd5b505afa158015612765573d6000803e3d6000fd5b505050506040513d602081101561277b57600080fd5b505161010754909150811015612795576000915050610d38565b6101075461188390829063ffffffff612bd316565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b6101025442906127ee906224ea0063ffffffff612e7c16565b10612840576040805162461bcd60e51b815260206004820152601c60248201527f4c69717569646174696f6e2074696d65206e6f7420656c617073656400000000604482015290519081900360640190fd5b61284981613220565b50565b60fd5460408051632ecd14d360e21b81526d5374616b696e675265776172647360901b600482015290516000926001600160a01b03169163bb34534c916024808301926020929190829003018186803b15801561102757600080fd5b6128b0612ae3565b6097546001600160a01b03908116911614612900576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b61010b80546001600160a01b0319166001600160a01b03831617905542610100556040517f856db4f5eb437a87fa0a8f78c2f1c0a5d1d95e6006b381f1bd0a7b5968cc090d90600090a150565b6129556119c6565b6001600160a01b0316336001600160a01b0316148061297f5750610108546001600160a01b031633145b806129955750610109546001600160a01b031633145b6129d9576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b6129e281613220565b612849612c33565b6129f2612ae3565b6097546001600160a01b03908116911614612a42576040805162461bcd60e51b8152602060048201819052602482015260008051602061364a833981519152604482015290519081900360640190fd5b6001600160a01b038116612a875760405162461bcd60e51b81526004018080602001828103825260268152602001806135b46026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b038316612b2c5760405162461bcd60e51b815260040180806020018281038252602481526020018061368f6024913960400191505060405180910390fd5b6001600160a01b038216612b715760405162461bcd60e51b81526004018080602001828103825260228152602001806135da6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000612c1583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612de5565b9392505050565b6000612c288383613442565b9050610d5381613468565b4261010255565b6000612c1583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613483565b6001600160a01b038316612cc15760405162461bcd60e51b815260040180806020018281038252602581526020018061366a6025913960400191505060405180910390fd5b6001600160a01b038216612d065760405162461bcd60e51b81526004018080602001828103825260238152602001806135916023913960400191505060405180910390fd5b612d11838383611b56565b612d54816040518060600160405280602681526020016135fc602691396001600160a01b038616600090815260656020526040902054919063ffffffff612de516565b6001600160a01b038085166000908152606560205260408082209390935590841681522054612d89908263ffffffff612e7c16565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115612e745760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e39578181015183820152602001612e21565b50505050905090810190601f168015612e665780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612c15576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60c95460ff1615612f21576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612f57612ae3565b604080516001600160a01b039092168252519081900360200190a1565b60fe546040805163534a7e1d60e11b81526004810184905290516001600160a01b039092169163a694fc3a9160248082019260009290919082900301818387803b158015612fc157600080fd5b505af1158015612fd5573d6000803e3d6000fd5b5050505050565b61010354600090815261011260209081526040808320546001600160a01b0316808452610111909252909120600181015461010654839291613024919063ffffffff612bd316565b6101065560006001820155600281015461303d906134e8565b60fc5460028201546040805163a9059cbb60e01b81526001600160a01b03878116600483015260248201939093529051919092169163a9059cbb9160448083019260209291908290030181600087803b15801561309957600080fd5b505af11580156130ad573d6000803e3d6000fd5b505050506040513d60208110156130c357600080fd5b5050604080516386d1c5ff60e01b815290516000916001600160a01b038516916386d1c5ff9160048082019260209290919082900301818787803b15801561310a57600080fd5b505af115801561311e573d6000803e3d6000fd5b505050506040513d602081101561313457600080fd5b505161010f54909150613148908290612c1c565b5061010354604080519182526020820183905280517f2493012c2b3f032daebde31221d2adb14631b760cd03040957e4ba73dc20b9719281900390910190a161010380546001019055613199612c33565b50505050565b60c95460ff166131ed576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612f57612ae3565b600081815261011260205260409020546001600160a01b0316613241613566565b6001600160a01b038216600090815261011160209081526040918290208251815460a0938102820184019094526080810184815290939192849284918401828280156132ac57602002820191906000526020600020905b815481526020019060010190808311613298575b5050509183525050600182015460208201526002820154604082015260039091015460ff16151560609182015281015190915015613323576040805162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015290519081900360640190fd5b6001600160a01b03821660008181526101116020526040808220600301805460ff1916600117905580516318284de560e11b815290518593926330509bca926004808201939182900301818387803b15801561337e57600080fd5b505af1158015613392573d6000803e3d6000fd5b50508351600092509050815b81518110156133ee576133e461011060008484815181106133bb57fe5b602002602001015181526020019081526020016000206003015484612e7c90919063ffffffff16565b925060010161339e565b506040805187815290517f7fc547d30654f63b77c16f8a90f08290e8f69a076d8d5512d182b4ddbc198d039181900360200190a161010554613436908363ffffffff612bd316565b61010555505050505050565b600080821180156134535750600083115b15610d5357612c15838363ffffffff612c3a16565b6101075461347c908263ffffffff612e7c16565b6101075550565b600081836134d25760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612e39578181015183820152602001612e21565b5060008385816134de57fe5b0495945050505050565b60fe54604080516305c2fbcf60e31b81526004810184905290516001600160a01b0390921691632e17de789160248082019260009290919082900301818387803b158015612fc157600080fd5b604051806080016040528060006001600160a01b031681526020016000815260200160008152602001600081525090565b6040518060800160405280606081526020016000815260200160008152602001600015158152509056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220b24383cb511fd1ae69b2c6e5a52fc15828fa5c944584af7ec01782cb4b9a3fc764736f6c63430006020033
Deployed Bytecode Sourcemap
42317:22231:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64491:10;64505:9;64491:23;;64483:54;;;;;-1:-1:-1;;;64483:54:0;;;;;;;;;;;;-1:-1:-1;;;64483:54:0;;;;;;;;;;;;;;;42317:22231;;;;;59413:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59413:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;59413:223:0;-1:-1:-1;;;;;59413:223:0;;:::i;21790:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21790:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;21790:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23896:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23896:169:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23896:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;56828:771;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56828:771:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56828:771:0;;:::i;60838:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60838:117:0;;;:::i;:::-;;;;;;;;;;;;;;;;22865:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22865:100:0;;;:::i;24539:321::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24539:321:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24539:321:0;;;;;;;;;;;;;;;;;:::i;43439:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43439:37:0;;;:::i;57607:261::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57607:261:0;;;:::i;:::-;;;;-1:-1:-1;;;;;57607:261:0;;;;;;;;;;;;;;22717:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22717:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;59084:321;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59084:321:0;;;:::i;60963:195::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60963:195:0;;;:::i;25269:218::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25269:218:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25269:218:0;;;;;;;;:::i;63113:80::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63113:80:0;;;:::i;44266:53::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44266:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44266:53:0;;:::i;:::-;;;;-1:-1:-1;;;;;44266:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43615:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43615:34:0;;;:::i;46021:1649::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46021:1649:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;46021:1649:0;;;;;;;;:::i;62815:160::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62815:160:0;;;:::i;12849:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12849:78:0;;;:::i;44057:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44057:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;59644:298;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59644:298:0;;;:::i;23028:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23028:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23028:119:0;-1:-1:-1;;;;;23028:119:0;;:::i;10944:148::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10944:148:0;;;:::i;61166:252::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61166:252:0;;;:::i;58558:223::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58558:223:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58558:223:0;-1:-1:-1;;;;;58558:223:0;;:::i;43560:46::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43560:46:0;;;:::i;53731:162::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53731:162:0;;;:::i;64007:98::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;64007:98:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;64007:98:0;-1:-1:-1;;;;;64007:98:0;;:::i;10302:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10302:79:0;;;:::i;58353:197::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58353:197:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58353:197:0;-1:-1:-1;;;;;58353:197:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;58353:197:0;;;;;;;;;;;;;;;;;43395:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43395:35:0;;;:::i;62983:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;62983:122:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;62983:122:0;-1:-1:-1;;;;;62983:122:0;;:::i;52271:1361::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52271:1361:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52271:1361:0;;;;;;;:::i;21992:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21992:87:0;;;:::i;43483:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43483:29:0;;;:::i;44565:54::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44565:54:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44565:54:0;;:::i;25990:269::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25990:269:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25990:269:0;;;;;;;;:::i;45301:169::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45301:169:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45301:169:0;-1:-1:-1;;;;;45301:169:0;;:::i;23360:175::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23360:175:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23360:175:0;;;;;;;;:::i;49972:1807::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49972:1807:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49972:1807:0;;;;;;;:::i;63201:84::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63201:84:0;;;:::i;47983:1592::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47983:1592:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47983:1592:0;;;;;;-1:-1:-1;;;;;47983:1592:0;;:::i;63826:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;63826:94:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;63826:94:0;-1:-1:-1;;;;;63826:94:0;;:::i;43521:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43521:32:0;;;:::i;53901:119::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53901:119:0;;;:::i;61426:224::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;61426:224:0;;;:::i;23598:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23598:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23598:151:0;;;;;;;;;;:::i;55502:150::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55502:150:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55502:150:0;;:::i;57876:164::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57876:164:0;;;:::i;58789:287::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58789:287:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58789:287:0;-1:-1:-1;;;;;58789:287:0;;:::i;55340:154::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55340:154:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55340:154:0;;:::i;11247:244::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11247:244:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11247:244:0;-1:-1:-1;;;;;11247:244:0;;:::i;59413:223::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;59496:23:::1;:36:::0;;-1:-1:-1;;;;;;59496:36:0::1;-1:-1:-1::0;;;;;59496:36:0;::::1;;::::0;;59579:15:::1;59543:33;:51:::0;59610:18:::1;::::0;::::1;::::0;-1:-1:-1;;59610:18:0::1;59413:223:::0;:::o;21790:83::-;21860:5;21853:12;;;;;;;;-1:-1:-1;;21853:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21827:13;;21853:12;;21860:5;;21853:12;;21860:5;21853:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21790:83;;:::o;23896:169::-;23979:4;23996:39;24005:12;:10;:12::i;:::-;24019:7;24028:6;23996:8;:39::i;:::-;-1:-1:-1;24053:4:0;23896:169;;;;;:::o;56828:771::-;63368:7;:5;:7::i;:::-;-1:-1:-1;;;;;63354:21:0;:10;-1:-1:-1;;;;;63354:21:0;;:63;;;-1:-1:-1;63410:7:0;;-1:-1:-1;;;;;63410:7:0;63396:10;:21;63354:63;:106;;;-1:-1:-1;63452:8:0;;-1:-1:-1;;;;;63452:8:0;63438:10;:22;63354:106;63332:172;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;;;;56952:22:::1;::::0;56909:20:::1;56932:43:::0;;;:19:::1;:43;::::0;;;;;-1:-1:-1;;;;;56932:43:0::1;::::0;;;57113:53:::1;56932:43:::0;57113:39:::1;:53::i;:::-;57211:31;::::0;57060:106;;-1:-1:-1;57211:90:0::1;::::0;57060:106;57211:90:::1;:35;:90;:::i;:::-;57177:31;:124:::0;-1:-1:-1;;;;;57312:32:0;;::::1;57379:1;57312:32:::0;;;:18:::1;:32;::::0;;;;;;;:64:::1;;:68:::0;;;57411:22;;-1:-1:-1;;;57411:22:0;;;;57379:1;;57411:20;::::1;::::0;::::1;::::0;:22:::1;::::0;;::::1;::::0;57312:32;;57411:22;;;;;;57379:1;57411:20;:22;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;57411:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;57411:22:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;57411:22:0;57479:20;;57411:22;;-1:-1:-1;57444:56:0::1;::::0;57411:22;;57444:25:::1;:56::i;:::-;;57511:29;:27;:29::i;:::-;57558:33;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;63515:1;;;;56828:771:::0;:::o;60838:117::-;60893:7;60920:27;43030:2;60920:8;:6;:8::i;:::-;:12;:27;:12;:27;:::i;:::-;60913:34;;60838:117;:::o;22865:100::-;22945:12;;22865:100;:::o;24539:321::-;24645:4;24662:36;24672:6;24680:9;24691:6;24662:9;:36::i;:::-;24709:121;24718:6;24726:12;:10;:12::i;:::-;24740:89;24778:6;24740:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24740:19:0;;;;;;:11;:19;;;;;;24760:12;:10;:12::i;:::-;-1:-1:-1;;;;;24740:33:0;;;;;;;;;;;;-1:-1:-1;24740:33:0;;;:89;;:37;:89;:::i;:::-;24709:8;:121::i;:::-;-1:-1:-1;24848:4:0;24539:321;;;;;:::o;43439:37::-;;;;:::o;57607:261::-;57794:16;;:51;;;-1:-1:-1;;;57794:51:0;;-1:-1:-1;;;57794:51:0;;;;;;57697:20;;-1:-1:-1;;;;;57794:16:0;;:26;;:51;;;;;;;;;;;;;;:16;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;57794:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57794:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57794:51:0;;-1:-1:-1;57607:261:0;:::o;22717:83::-;22783:9;;;;22717:83;:::o;59084:321::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;59227:32:::1;::::0;:52:::1;::::0;43140:6:::1;59227:52;:36;:52;:::i;:::-;59192:15;:87;59170:145;;;::::0;;-1:-1:-1;;;59170:145:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;59170:145:0;;;;;;;;;;;;;::::1;;59360:37;::::0;59326:31:::1;:71:::0;;-1:-1:-1;;;;;;59326:71:0::1;-1:-1:-1::0;;;;;59360:37:0;;::::1;59326:71:::0;;;::::1;::::0;;59084:321::o;60963:195::-;61002:7;61042:108;61117:18;:16;:18::i;:::-;61042:52;61064:29;:27;:29::i;:::-;61042:17;;;:52;:21;:52;:::i;:::-;:56;:108;:56;:108;:::i;25269:218::-;25357:4;25374:83;25383:12;:10;:12::i;:::-;25397:7;25406:50;25445:10;25406:11;:25;25418:12;:10;:12::i;:::-;-1:-1:-1;;;;;25406:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;25406:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;63113:80::-;63368:7;:5;:7::i;:::-;-1:-1:-1;;;;;63354:21:0;:10;-1:-1:-1;;;;;63354:21:0;;:63;;;-1:-1:-1;63410:7:0;;-1:-1:-1;;;;;63410:7:0;63396:10;:21;63354:63;:106;;;-1:-1:-1;63452:8:0;;-1:-1:-1;;;;;63452:8:0;63438:10;:22;63354:106;63332:172;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;;;;63177:8:::1;:6;:8::i;:::-;63113:80::o:0;44266:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44266:53:0;;;;;;;:::o;43615:34::-;;;;:::o;46021:1649::-;63368:7;:5;:7::i;:::-;-1:-1:-1;;;;;63354:21:0;:10;-1:-1:-1;;;;;63354:21:0;;:63;;;-1:-1:-1;63410:7:0;;-1:-1:-1;;;;;63410:7:0;63396:10;:21;63354:63;:106;;;-1:-1:-1;63452:8:0;;-1:-1:-1;;;;;63452:8:0;63438:10;:22;63354:106;63332:172;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;;;;46215:14:::1;::::0;46198:41:::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;46198:41:0;;;;;;46188:52;;;;::::1;::::0;;;;46298:12:::1;::::0;46324:31:::1;::::0;-1:-1:-1;;;46298:58:0;;;;;;;;;-1:-1:-1;;;;;46324:31:0;;::::1;46298:58:::0;;;;;;46188:52;;46152:12:::1;::::0;46298;;;::::1;::::0;:19:::1;::::0;:58;;;;;46198:41;;46298:58;;;;;46152:12;46298;:58;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;46298:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46298:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;46298:58:0;46369:3:::1;::::0;:45:::1;::::0;;-1:-1:-1;;;46369:45:0;;-1:-1:-1;;;;;46369:45:0;;::::1;;::::0;::::1;::::0;;;;;;;;;46298:58;;-1:-1:-1;46369:3:0;::::1;::::0;:12:::1;::::0;:45;;;;;46298:58:::1;::::0;46369:45;;;;;;;;:3:::1;::::0;:45;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;46369:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46369:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;;46565:16:0::1;::::0;46632:3:::1;::::0;46654:4:::1;::::0;46460:278:::1;::::0;;-1:-1:-1;;;46460:278:0;;-1:-1:-1;;;;;46565:16:0;;::::1;46460:278;::::0;::::1;::::0;46608:4:::1;46460:278:::0;;;;46632:3;;::::1;46460:278:::0;;;;46654:4;;::::1;46460:278:::0;;;;;;::::1;::::0;;;;;;;;;;;46427:17:::1;::::0;46460:86;::::1;::::0;::::1;::::0;:278;;;;;46369:45:::1;::::0;46460:278;;;;;;;46427:17;46460:86;:278;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;46460:278:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46460:278:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;46460:278:0;;-1:-1:-1;46751:25:0::1;;:::i;:::-;-1:-1:-1::0;46792:216:0::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;46792:216:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;47134:14:::1;::::0;47026:163;;;;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;47163:15:::1;47026:163:::0;;;;;;;;;46792:216;;47026:163:::1;::::0;;;;;;;;::::1;47202:29;::::0;;;:18:::1;:29;::::0;;;;;;;:42;;;;-1:-1:-1;;;;;47202:42:0;;::::1;-1:-1:-1::0;;;;;;47202:42:0;;::::1;;::::0;;;;::::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;;47300;;::::1;::::0;;;:18:::1;:42:::0;;;;;27:10:-1;;23:18;;::::1;45:23:::0;;47353:36:0;;;;;;::::1;::::0;;;47400:21;;::::1;:31:::0;;;47464:14:::1;::::0;;47444:35;;:19:::1;:35:::0;;;;;;;:60;;;;::::1;::::0;;::::1;::::0;;;47515:16;;::::1;::::0;;47564:17:::1;::::0;:30:::1;::::0;47424:7;47564:30:::1;:21;:30;:::i;:::-;47544:17;:50:::0;47607:15:::1;47614:7:::0;47607:6:::1;:15::i;:::-;47633:29;:27;:29::i;:::-;63515:1;;;;;46021:1649:::0;;:::o;62815:160::-;62921:16;;:45;;;-1:-1:-1;;;62921:45:0;;-1:-1:-1;;;62921:45:0;;;;;;62872:14;;-1:-1:-1;;;;;62921:16:0;;:26;;:45;;;;;;;;;;;;;;:16;:45;;;5:2:-1;;;;30:1;27;20:12;12849:78:0;12912:7;;;;12849:78;:::o;44057:30::-;;;;;;;;:::o;59644:298::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;59773:33:::1;::::0;:53:::1;::::0;43140:6:::1;59773:53;:37;:53;:::i;:::-;59738:15;:88;59716:146;;;::::0;;-1:-1:-1;;;59716:146:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;59716:146:0;;;;;;;;;;;;;::::1;;59910:23;::::0;59873:16:::1;:61:::0;;-1:-1:-1;;;;;;59873:61:0::1;-1:-1:-1::0;;;;;59910:23:0;;::::1;59873:61:::0;;;::::1;::::0;;59644:298::o;23028:119::-;-1:-1:-1;;;;;23121:18:0;23094:7;23121:18;;;:9;:18;;;;;;;23028:119::o;10944:148::-;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;11035:6:::1;::::0;11014:40:::1;::::0;11051:1:::1;::::0;-1:-1:-1;;;;;11035:6:0::1;::::0;11014:40:::1;::::0;11051:1;;11014:40:::1;11065:6;:19:::0;;-1:-1:-1;;;;;;11065:19:0::1;::::0;;10944:148::o;61166:252::-;61320:20;;61284:31;;61226:7;;;;61284:57;;;:35;:57;:::i;:::-;61359:31;;61246:95;;-1:-1:-1;61359:51:0;;61246:95;61359:51;:35;:51;:::i;:::-;61352:58;;;61166:252;:::o;58558:223::-;-1:-1:-1;;;;;58709:32:0;58677:7;58709:32;;;:18;:32;;;;;:64;;;;58558:223::o;43560:46::-;;;;:::o;53731:162::-;63368:7;:5;:7::i;:::-;-1:-1:-1;;;;;63354:21:0;:10;-1:-1:-1;;;;;63354:21:0;;:63;;;-1:-1:-1;63410:7:0;;-1:-1:-1;;;;;63410:7:0;63396:10;:21;63354:63;:106;;;-1:-1:-1;63452:8:0;;-1:-1:-1;;;;;63452:8:0;63438:10;:22;63354:106;63332:172;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;;;;53812:33:::1;:31;:33::i;:::-;53856:29;:27;:29::i;64007:98::-:0;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;64077:8:::1;:20:::0;;-1:-1:-1;;;;;;64077:20:0::1;-1:-1:-1::0;;;;;64077:20:0;;;::::1;::::0;;;::::1;::::0;;64007:98::o;10302:79::-;10367:6;;-1:-1:-1;;;;;10367:6:0;10302:79;:::o;58353:197::-;-1:-1:-1;;;;;58499:32:0;;;;;;:18;:32;;;;;;;;;58492:50;;;;;;;;;;;;;;;;;58458:16;;58492:50;;;58499:32;58492:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58353:197;;;:::o;43395:35::-;;;;:::o;62983:122::-;63368:7;:5;:7::i;:::-;-1:-1:-1;;;;;63354:21:0;:10;-1:-1:-1;;;;;63354:21:0;;:63;;;-1:-1:-1;63410:7:0;;-1:-1:-1;;;;;63410:7:0;63396:10;:21;63354:63;:106;;;-1:-1:-1;63452:8:0;;-1:-1:-1;;;;;63452:8:0;63438:10;:22;63354:106;63332:172;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;;;;63063:4:::1;::::0;:34:::1;::::0;;-1:-1:-1;;;63063:34:0;;-1:-1:-1;;;;;63063:34:0;;::::1;;::::0;::::1;::::0;-1:-1:-1;;63063:34:0;;;;;;:4;;;::::1;::::0;:12:::1;::::0;:34;;;;;::::1;::::0;;;;;;;;:4:::1;::::0;:34;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;63063:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;63063:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;;;62983:122:0:o;52271:1361::-;63368:7;:5;:7::i;:::-;-1:-1:-1;;;;;63354:21:0;:10;-1:-1:-1;;;;;63354:21:0;;:63;;;-1:-1:-1;63410:7:0;;-1:-1:-1;;;;;63410:7:0;63396:10;:21;63354:63;:106;;;-1:-1:-1;63452:8:0;;-1:-1:-1;;;;;63452:8:0;63438:10;:22;63354:106;63332:172;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;;;;52481:22:::1;;52454:23;:49;;52432:112;;;::::0;;-1:-1:-1;;;52432:112:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;52432:112:0;;;;;;;;;;;;;::::1;;52588:14;;52563:21;:39;;52555:65;;;::::0;;-1:-1:-1;;;52555:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;52555:65:0;;;;;;;;;;;;;::::1;;52633:23;52659:32;:30;:32::i;:::-;52633:58:::0;-1:-1:-1;52704:27:0::1;52742:37;52823:23:::0;52792:833:::1;52865:21;52861:1;:25;52792:833;;;52944:42;52963:22:::0;;;:19:::1;:22;::::0;;;;;;;;-1:-1:-1;;;;;52963:22:0::1;52944:42:::0;;:18:::1;:42:::0;;;;;;52931:66;;;;;;::::1;::::0;;;;;;;;;;52944:42;;52931:66;::::1;52944:42:::0;52931:66;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;52931:66:0;;-1:-1:-1;53019:9:0::1;::::0;-1:-1:-1;;;;53014:600:0::1;53038:10;:17;53034:1;:21;53014:600;;;53119:2;-1:-1:-1::0;;;;;53119:24:0::1;;53166:10;53177:1;53166:13;;;;;;;;;;;;;;42930:7;53228:15;53119:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;53119:143:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;53119:143:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;53119:143:0;53328:13;;53119:143;;-1:-1:-1;53283:23:0::1;::::0;53309:18:::1;::::0;53283:23;;53328:10;;53339:1;;53328:13;::::1;;;;;;;;;;;53309:33;;;;;;;;;;;53283:59;;53383:133;53486:29;53383:76;53427:7;:31;;;53383:17;;:43;;:76;;;;:::i;:133::-;53363:17;:153:::0;53535:31:::1;;:63:::0;;;53057:3:::1;;53014:600;;;-1:-1:-1::0;52901:3:0::1;;52792:833;;;;63515:1;;;52271:1361:::0;;:::o;21992:87::-;22064:7;22057:14;;;;;;;;-1:-1:-1;;22057:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22031:13;;22057:14;;22064:7;;22057:14;;22064:7;22057:14;;;;;;;;;;;;;;;;;;;;;;;;43483:29;;;;:::o;44565:54::-;;;;;;;;;;;;-1:-1:-1;;;;;44565:54:0;;:::o;25990:269::-;26083:4;26100:129;26109:12;:10;:12::i;:::-;26123:7;26132:96;26171:15;26132:96;;;;;;;;;;;;;;;;;:11;:25;26144:12;:10;:12::i;:::-;-1:-1:-1;;;;;26132:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;26132:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;45301:169::-;63368:7;:5;:7::i;:::-;-1:-1:-1;;;;;63354:21:0;:10;-1:-1:-1;;;;;63354:21:0;;:63;;;-1:-1:-1;63410:7:0;;-1:-1:-1;;;;;63410:7:0;63396:10;:21;63354:63;:106;;;-1:-1:-1;63452:8:0;;-1:-1:-1;;;;;63452:8:0;63438:10;:22;63354:106;63332:172;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;;;;45416:3:::1;::::0;-1:-1:-1;;;;;45416:3:0::1;:12;45429::::0;45443:18:::1;:16;:18::i;:::-;45416:46;;;;;;;;;;;;;-1:-1:-1::0;;;;;45416:46:0::1;-1:-1:-1::0;;;;;45416:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;23360:175:0::0;23446:4;23463:42;23473:12;:10;:12::i;:::-;23487:9;23498:6;23463:9;:42::i;49972:1807::-;63368:7;:5;:7::i;:::-;-1:-1:-1;;;;;63354:21:0;:10;-1:-1:-1;;;;;63354:21:0;;:63;;;-1:-1:-1;63410:7:0;;-1:-1:-1;;;;;63410:7:0;63396:10;:21;63354:63;:106;;;-1:-1:-1;63452:8:0;;-1:-1:-1;;;;;63452:8:0;63438:10;:22;63354:106;63332:172;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;;;;50196:22:::1;;50169:23;:49;;50147:112;;;::::0;;-1:-1:-1;;;50147:112:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50147:112:0;;;;;;;;;;;;;::::1;;50303:14;;50278:21;:39;;50270:65;;;::::0;;-1:-1:-1;;;50270:65:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50270:65:0;;;;;;;;;;;;;::::1;;50392:23;50368:21;:47;50346:110;;;::::0;;-1:-1:-1;;;50346:110:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;50346:110:0;;;;;;;;;;;;;::::1;;50469:30;50502:27;:25;:27::i;:::-;50469:60;;50542:47;50600:46:::0;50664:9:::1;50676:22;;50664:34;;50659:743;50704:14;;50700:1;:18;50659:743;;;50740:20;50763:22:::0;;;:19:::1;:22;::::0;;;;;;;;-1:-1:-1;;;;;50763:22:0::1;50922:32:::0;;;:18:::1;:32:::0;;;;;;50763:22;50922:64:::1;::::0;50842:159:::1;::::0;:39;;:159:::1;:61;:159;:::i;:::-;50800:201;;51018:35;51073:14;-1:-1:-1::0;;;;;51073:29:0::1;;51103:12;51073:43;;;;;;;;;;;;;-1:-1:-1::0;;;;;51073:43:0::1;-1:-1:-1::0;;;;;51073:43:0::1;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;51073:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;51073:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;51073:43:0;-1:-1:-1;;;;;51133:32:0;::::1;;::::0;;;:18:::1;51073:43;51133:32:::0;;;;:82:::1;;:112:::0;;;51073:43;-1:-1:-1;51301:89:0::1;:38:::0;51073:43;51301:89:::1;:60;:89;:::i;:::-;51260:130:::0;-1:-1:-1;;;50720:3:0::1;;50659:743;;;-1:-1:-1::0;51451:31:0::1;::::0;51419:157:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;51550:15:::1;51419:157:::0;;;;;::::1;::::0;;;;;;;::::1;51623:148;51731:39;51623:89;51673:38;51623:31;;:49;;:89;;;;:::i;:::-;:107:::0;:148:::1;:107;:148;:::i;:::-;51589:31;:182:::0;-1:-1:-1;;;;;49972:1807:0:o;63201:84::-;63368:7;:5;:7::i;:::-;-1:-1:-1;;;;;63354:21:0;:10;-1:-1:-1;;;;;63354:21:0;;:63;;;-1:-1:-1;63410:7:0;;-1:-1:-1;;;;;63410:7:0;63396:10;:21;63354:63;:106;;;-1:-1:-1;63452:8:0;;-1:-1:-1;;;;;63452:8:0;63438:10;:22;63354:106;63332:172;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;;;;63267:10:::1;:8;:10::i;47983:1592::-:0;63368:7;:5;:7::i;:::-;-1:-1:-1;;;;;63354:21:0;:10;-1:-1:-1;;;;;63354:21:0;;:63;;;-1:-1:-1;63410:7:0;;-1:-1:-1;;;;;63410:7:0;63396:10;:21;63354:63;:106;;;-1:-1:-1;63452:8:0;;-1:-1:-1;;;;;63452:8:0;63438:10;:22;63354:106;63332:172;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;;;;48109:20:::1;48132:31:::0;;;:19:::1;:31;::::0;;;;;;;;-1:-1:-1;;;;;48132:31:0;;::::1;48204:32:::0;;;:18:::1;:32:::0;;;;;;48382:34;;-1:-1:-1;;;48382:34:0;;;;::::1;;::::0;::::1;::::0;;;48132:31;;48204:32;;48132:31;;48109:20;;;;48132:31;;48382:23:::1;::::0;:34;;;;;48132:31;48382:34;;;;;;48109:20;48132:31;48382:34;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;48382:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;48382:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;48382:34:0;;::::1;::::0;;::::1;::::0;48600:20;;48382:34;;-1:-1:-1;48382:34:0;-1:-1:-1;48561:60:0::1;::::0;48382:34;;48561:25:::1;:60::i;:::-;-1:-1:-1::0;27:10;;39:1:::1;23:18:::0;::::1;45:23:::0;;48634:20:0::1;:39:::0;;;::::1;::::0;;::::1;::::0;;;48708:21:::1;::::0;::::1;::::0;:38:::1;::::0;48734:11;48708:38:::1;:25;:38;:::i;:::-;48684:21;::::0;::::1;:62:::0;48881:41:::1;::::0;::::1;::::0;48831:31:::1;::::0;:102:::1;::::0;::::1;:35;:102;:::i;:::-;48797:31;:136:::0;48988:1:::1;48944:41;::::0;::::1;:45:::0;49067:17:::1;::::0;:34:::1;::::0;49089:11;49067:34:::1;:21;:34;:::i;:::-;49047:17;:54:::0;49149:197:::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;49149:197:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;-1:-1:-1;49114:32:0;;;:18:::1;:32:::0;;;;;:232;;;;-1:-1:-1;;;;;;49114:232:0::1;::::0;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;49114:232:0;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;49364:131;;;;;;;::::1;::::0;;;;;;;;;49469:15:::1;49364:131:::0;;;;;;::::1;::::0;;;;;;;;;::::1;49508:19;49515:11;49508:6;:19::i;63826:94::-:0;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;63894:7:::1;:18:::0;;-1:-1:-1;;;;;;63894:18:0::1;-1:-1:-1::0;;;;;63894:18:0;;;::::1;::::0;;;::::1;::::0;;63826:94::o;43521:32::-;;;;:::o;53901:119::-;63597:20;;63649:15;;63597:49;;43266:7;63597:49;:24;:49;:::i;:::-;:67;63575:145;;;;;-1:-1:-1;;;63575:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53979:33:::1;:31;:33::i;61426:224::-:0;61512:3;;:28;;;-1:-1:-1;;;61512:28:0;;61534:4;61512:28;;;;;;61475:7;;;;-1:-1:-1;;;;;61512:3:0;;;;:13;;:28;;;;;;;;;;;;;;;:3;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;61512:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;61512:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;61512:28:0;61564:19;;61512:28;;-1:-1:-1;61555:28:0;;61551:42;;;61592:1;61585:8;;;;;61551:42;61622:19;;61611:31;;:6;;:31;:10;:31;:::i;23598:151::-;-1:-1:-1;;;;;23714:18:0;;;23687:7;23714:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;23598:151::o;55502:150::-;63597:20;;63649:15;;63597:49;;43266:7;63597:49;:24;:49;:::i;:::-;:67;63575:145;;;;;-1:-1:-1;;;63575:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55619:25:::1;55633:10;55619:13;:25::i;:::-;55502:150:::0;:::o;57876:164::-;57985:16;;:46;;;-1:-1:-1;;;57985:46:0;;-1:-1:-1;;;57985:46:0;;;;;;57934:15;;-1:-1:-1;;;;;57985:16:0;;:26;;:46;;;;;;;;;;;;;;:16;:46;;;5:2:-1;;;;30:1;27;20:12;58789:287:0;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;58916:37:::1;:57:::0;;-1:-1:-1;;;;;;58916:57:0::1;-1:-1:-1::0;;;;;58916:57:0;::::1;;::::0;;59019:15:::1;58916:57;58984:50:::0;59050:18:::1;::::0;::::1;::::0;-1:-1:-1;;59050:18:0::1;58789:287:::0;:::o;55340:154::-;63368:7;:5;:7::i;:::-;-1:-1:-1;;;;;63354:21:0;:10;-1:-1:-1;;;;;63354:21:0;;:63;;;-1:-1:-1;63410:7:0;;-1:-1:-1;;;;;63410:7:0;63396:10;:21;63354:63;:106;;;-1:-1:-1;63452:8:0;;-1:-1:-1;;;;;63452:8:0;63438:10;:22;63354:106;63332:172;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;-1:-1:-1;;;63332:172:0;;;;;;;;;;;;;;;55421:25:::1;55435:10;55421:13;:25::i;:::-;55457:29;:27;:29::i;11247:244::-:0;10524:12;:10;:12::i;:::-;10514:6;;-1:-1:-1;;;;;10514:6:0;;;:22;;;10506:67;;;;;-1:-1:-1;;;10506:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;10506:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;11336:22:0;::::1;11328:73;;;;-1:-1:-1::0;;;11328:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11438:6;::::0;11417:38:::1;::::0;-1:-1:-1;;;;;11417:38:0;;::::1;::::0;11438:6:::1;::::0;11417:38:::1;::::0;11438:6:::1;::::0;11417:38:::1;11466:6;:17:::0;;-1:-1:-1;;;;;;11466:17:0::1;-1:-1:-1::0;;;;;11466:17:0;;;::::1;::::0;;;::::1;::::0;;11247:244::o;8578:106::-;8666:10;8578:106;:::o;29137:346::-;-1:-1:-1;;;;;29239:19:0;;29231:68;;;;-1:-1:-1;;;29231:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29318:21:0;;29310:68;;;;-1:-1:-1;;;29310:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29391:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;29443:32;;;;;;;;;;;;;;;;;29137:346;;;:::o;1396:136::-;1454:7;1481:43;1485:1;1488;1481:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1474:50;1396:136;-1:-1:-1;;;1396:136:0:o;62054:229::-;62161:11;62196:34;62210:6;62218:11;62196:13;:34::i;:::-;62190:40;;62241:34;62271:3;62241:29;:34::i;64333:104::-;64414:15;64391:20;:38;64333:104::o;3209:132::-;3267:7;3294:39;3298:1;3301;3294:39;;;;;;;;;;;;;;;;;:3;:39::i;26749:539::-;-1:-1:-1;;;;;26855:20:0;;26847:70;;;;-1:-1:-1;;;26847:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26936:23:0;;26928:71;;;;-1:-1:-1;;;26928:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27012:47;27033:6;27041:9;27052:6;27012:20;:47::i;:::-;27092:71;27114:6;27092:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27092:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;27072:17:0;;;;;;;:9;:17;;;;;;:91;;;;27197:20;;;;;;;:32;;27222:6;27197:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;27174:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;27245:35;;;;;;;27174:20;;27245:35;;;;;;;;;;;;;26749:539;;;:::o;1827:192::-;1913:7;1949:12;1941:6;;;;1933:29;;;;-1:-1:-1;;;1933:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1933:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1985:5:0;;;1827:192::o;940:181::-;998:7;1030:5;;;1054:6;;;;1046:46;;;;;-1:-1:-1;;;1046:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13400:118;13086:7;;;;13085:8;13077:37;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;-1:-1:-1;;;13077:37:0;;;;;;;;;;;;;;;13460:7:::1;:14:::0;;-1:-1:-1;;13460:14:0::1;13470:4;13460:14;::::0;;13490:20:::1;13497:12;:10;:12::i;:::-;13490:20;::::0;;-1:-1:-1;;;;;13490:20:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;13400:118::o:0;60331:91::-;60383:16;;:31;;;-1:-1:-1;;;60383:31:0;;;;;;;;;;-1:-1:-1;;;;;60383:16:0;;;;:22;;:31;;;;;:16;;:31;;;;;;;;:16;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;60383:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60383:31:0;;;;60331:91;:::o;54028:1109::-;54133:22;;54090:20;54113:43;;;:19;:43;;;;;;;;;-1:-1:-1;;;;;54113:43:0;54269:32;;;:18;:32;;;;;;54113:43;54463:41;;;54413:31;;54113:43;;54269:32;54413:102;;:31;:102;:35;:102;:::i;:::-;54379:31;:136;54570:1;54526:41;;;:45;54593:21;;;;54584:31;;:8;:31::i;:::-;54626:4;;54654:21;;;;54626:50;;;-1:-1:-1;;;54626:50:0;;-1:-1:-1;;;;;54626:50:0;;;;;;;;;;;;;;;;:4;;;;;:13;;:50;;;;;;;;;;;;;;:4;;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;54626:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54626:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;54714:40:0;;;-1:-1:-1;;;54714:40:0;;;;54689:22;;-1:-1:-1;;;;;54714:38:0;;;;;:40;;;;;54626:50;;54714:40;;;;;;;;54689:22;54714:38;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;54714:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54714:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54714:40:0;54807:20;;54714:40;;-1:-1:-1;54765:63:0;;54714:40;;54765:25;:63::i;:::-;-1:-1:-1;54858:22:0;;54846:51;;;;;;;;;;;;;;;;;;;;;;;;55065:22;:24;;;;;;55100:29;:27;:29::i;:::-;54028:1109;;;;:::o;13582:120::-;13285:7;;;;13277:40;;;;;-1:-1:-1;;;13277:40:0;;;;;;;;;;;;-1:-1:-1;;;13277:40:0;;;;;;;;;;;;;;;13641:7:::1;:15:::0;;-1:-1:-1;;13641:15:0::1;::::0;;13672:22:::1;13681:12;:10;:12::i;55660:992::-:0;55723:20;55746:32;;;:19;:32;;;;;;-1:-1:-1;;;;;55746:32:0;55789:26;;:::i;:::-;-1:-1:-1;;;;;55818:32:0;;;;;;:18;:32;;;;;;;;;55789:61;;;;;;;;;;;;;;;;;;;;;;;55818:32;;55789:61;;55818:32;;55789:61;;55818:32;55789:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55789:61:0;;;-1:-1:-1;;55789:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55872:24;;;55789:61;;-1:-1:-1;55871:25:0;55863:53;;;;;-1:-1:-1;;;55863:53:0;;;;;;;;;;;;-1:-1:-1;;;55863:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;55927:32:0;;;;;;:18;:32;;;;;;:47;;:54;;-1:-1:-1;;55927:54:0;55977:4;55927:54;;;56066:22;;-1:-1:-1;;;56066:22:0;;;;55946:12;;55927:32;56066:20;;:22;;;;;;;;;;;55927:32;;56066:22;;;5:2:-1;;;;30:1;27;20:12;5:2;56066:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;56183:20:0;;56101:39;;-1:-1:-1;56183:20:0;-1:-1:-1;56101:39:0;56214:221;56238:10;:17;56234:1;:21;56214:221;;;56311:112;56365:18;:33;56384:10;56395:1;56384:13;;;;;;;;;;;;;;56365:33;;;;;;;;;;;:57;;;56311:31;:53;;:112;;;;:::i;:::-;56277:146;-1:-1:-1;56257:3:0;;56214:221;;;-1:-1:-1;56452:25:0;;;;;;;;;;;;;;;;;56566:17;;:78;;56602:31;56566:78;:21;:78;:::i;:::-;56546:17;:98;-1:-1:-1;;;;;;55660:992:0:o;61658:237::-;61768:11;61815:1;61801:11;:15;:29;;;;;61829:1;61820:6;:10;61801:29;61797:91;;;61853:23;:6;61864:11;61853:23;:10;:23;:::i;61903:143::-;62003:19;;:35;;62027:10;62003:35;:23;:35;:::i;:::-;61981:19;:57;-1:-1:-1;61903:143:0:o;3829:345::-;3915:7;4017:12;4010:5;4002:28;;;;-1:-1:-1;;;4002:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4002:28:0;;4041:9;4057:1;4053;:5;;;;;;;3829:345;-1:-1:-1;;;;;3829:345:0:o;60430:95::-;60484:16;;:33;;;-1:-1:-1;;;60484:33:0;;;;;;;;;;-1:-1:-1;;;;;60484:16:0;;;;:24;;:33;;;;;:16;;:33;;;;;;;;:16;;:33;;;5:2:-1;;;;30:1;27;20:12;42317:22231:0;;;;;;;;;;-1:-1:-1;;;;;42317:22231:0;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://b24383cb511fd1ae69b2c6e5a52fc15828fa5c944584af7ec01782cb4b9a3fc7
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.