ERC-20
Overview
Max Total Supply
0.01253339 ERC20 ***
Holders
3
Total Transfers
-
Market
Price
$0.00 @ 0.000000 FTM
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 8 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
Bank
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-09-19 */ // SPDX-License-Identifier: NONE // Eleven.finance bigfoot platform // Telegram: @ElevenFinance pragma solidity 0.5.17; // Part: BankConfig interface BankConfig { /// @dev Return minimum bankCurrency debt size per position. function minDebtSize() external view returns (uint); /// @dev Return the interest rate per second, using 1e18 as denom. function getInterestRate(uint debt, uint floating) external view returns (uint); /// @dev Return the bps rate for reserve pool. function getReservePoolBps() external view returns (uint); /// @dev Return the bps rate for Avada Kill caster. function getKillBps() external view returns (uint); /// @dev Return whether the given address is a bigfoot. function isBigfoot(address bigfoot) external view returns (bool); /// @dev Return whether the given bigfoot accepts more debt. Revert on non-bigfoot. function acceptDebt(address bigfoot) external view returns (bool); /// @dev Return the work factor for the bigfoot + bankCurrency debt, using 1e4 as denom. Revert on non-bigfoot. function workFactor(address bigfoot, uint debt) external view returns (uint); /// @dev Return the kill factor for the bigfoot + bankCurrency debt, using 1e4 as denom. Revert on non-bigfoot. function killFactor(address bigfoot, uint debt) external view returns (uint); } // Part: ERC20Interface interface ERC20Interface { function balanceOf(address user) external view returns (uint); } // Part: Bigfoot interface Bigfoot { /// @dev Work on a (potentially new) position. Optionally send bankCurrency back to Bank. function work( uint id, address user, uint debt, bytes calldata data ) external; /// @dev Return the amount of bankCurrency wei to get back if we are to liquidate the position. function health(uint id) external view returns (uint); /// @dev Liquidate the given position to bankCurrency. Send all bankCurrency back to Bank. function liquidate(uint id) external; } // Part: Initializable /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ 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 protect an initializer function from being invoked twice. */ modifier initializer() { require( _initializing || _isConstructor() || !_initialized, 'Initializable: contract is already 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); uint cs; // solhint-disable-next-line no-inline-assembly assembly { cs := extcodesize(self) } return cs == 0; } } // Part: OpenZeppelin/[email protected]/IERC20 /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ 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. * * > 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); } // Part: OpenZeppelin/[email protected]/Math /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // Part: OpenZeppelin/[email protected]/SafeMath /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); 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-solidity/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) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); 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) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // Part: Governable contract Governable is Initializable { address public governor; // The current governor. address public pendingGovernor; // The address pending to become the governor once accepted. modifier onlyGov() { require(msg.sender == governor, 'not the governor'); _; } /// @dev Initialize the bank smart contract, using msg.sender as the first governor. function __Governable__init() internal initializer { governor = msg.sender; pendingGovernor = address(0); } /// @dev Set the pending governor, which will be the governor once accepted. /// @param _pendingGovernor The address to become the pending governor. function setPendingGovernor(address _pendingGovernor) external onlyGov { pendingGovernor = _pendingGovernor; } /// @dev Accept to become the new governor. Must be called by the pending governor. function acceptGovernor() external { require(msg.sender == pendingGovernor, 'not the pending governor'); pendingGovernor = address(0); governor = msg.sender; } } // Part: OpenZeppelin/[email protected]/ERC20 /** * @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 `ERC20Mintable`. * * *For a detailed writeup see our guide [How to implement supply * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).* * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an `Approval` event is emitted on calls to `transferFrom`. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard `decreaseAllowance` and `increaseAllowance` * functions have been added to mitigate the well-known issues around setting * allowances. See `IERC20.approve`. */ contract ERC20 is IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See `IERC20.totalSupply`. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See `IERC20.balanceOf`. */ function balanceOf(address account) public view 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 returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @dev See `IERC20.allowance`. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See `IERC20.approve`. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public returns (bool) { _approve(msg.sender, spender, value); 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 `value`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount)); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to `approve` that can be used as a mitigation for * problems described in `IERC20.approve`. * * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][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 returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue)); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to `transfer`, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a `Transfer` event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount); _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 { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destoys `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 value) internal { require(account != address(0), "ERC20: burn from the zero address"); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @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 value) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = value; emit Approval(owner, spender, value); } /** * @dev Destoys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See `_burn` and `_approve`. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount)); } } // Part: ReentrancyGuardUpgradeSafe /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. */ contract ReentrancyGuardUpgradeSafe is Initializable { // counter to allow mutex lock with only one SSTORE operation uint private _guardCounter; function __ReentrancyGuardUpgradeSafe__init() internal initializer { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint localCounter = _guardCounter; _; require(localCounter == _guardCounter, 'ReentrancyGuard: reentrant call'); } uint[50] private ______gap; } // Part: SafeToken library SafeToken { function myBalance(address token) internal view returns (uint) { return ERC20Interface(token).balanceOf(address(this)); } function balanceOf(address token, address user) internal view returns (uint) { return ERC20Interface(token).balanceOf(user); } function safeApprove( address token, address to, uint value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!safeApprove'); } function safeTransfer( address token, address to, uint value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!safeTransfer'); } function safeTransferFrom( address token, address from, address to, uint value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), '!safeTransferFrom'); } function safeTransferBNB(address to, uint value) internal { (bool success, ) = to.call.value(value)(new bytes(0)); require(success, '!safeTransferBNB'); } } interface IElevenVault{ function depositAll() external; function withdraw(uint amount) external; function withdrawAll() external; function getPricePerFullShare() external view returns(uint); } interface CurvePool{ function exchange_underlying(int128 i, int128 j, uint256 dx, uint256 min_dy) external returns(uint256); } contract Bank is Initializable, ERC20, ReentrancyGuardUpgradeSafe, Governable { /// @notice Libraries using SafeToken for address; using SafeMath for uint; /// @notice Events event AddDebt(uint indexed id, uint debtShare); event RemoveDebt(uint indexed id, uint debtShare); event Work(uint indexed id, uint loan); event Kill(uint indexed id, address indexed killer, uint prize, uint left); // @notice Graveyard struct Death{ uint height; uint id; uint debt; uint size; uint returned; } mapping(address=>Death[]) public graveyard; address public bankcurrency; address public vault; string public name; string public symbol; uint8 public decimals; struct Position { address bigfoot; address owner; uint debtShare; } BankConfig public config; mapping(uint => Position) public positions; uint public nextPositionID; uint public glbDebtShare; uint public glbDebtVal; uint public lastAccrueTime; uint public reservePool; /// @dev Require that the caller must be an EOA account to avoid flash loans. modifier onlyEOA() { require(msg.sender == tx.origin, 'not eoa'); _; } /// @dev Add more debt to the global debt pool. modifier accrue(uint msgValue) { if (now > lastAccrueTime) { uint interest = pendingInterest(msgValue); uint toReserve = interest.mul(config.getReservePoolBps()).div(10000); reservePool = reservePool.add(toReserve); glbDebtVal = glbDebtVal.add(interest); lastAccrueTime = now; } _; } function initialize(BankConfig _config, address _bankToken, address _vault, string calldata _name, string calldata _symbol, uint8 _decimals) external initializer { bankcurrency = _bankToken; vault = _vault; __Governable__init(); __ReentrancyGuardUpgradeSafe__init(); config = _config; lastAccrueTime = now; nextPositionID = 1; name = _name; symbol = _symbol; decimals = _decimals; approve(); } // @dev approve tokens to be spent by contracts function approve() internal{ bankcurrency.safeApprove(vault, uint(-1)); } // @dev deposit unutilized funds to vault function depositToVault() internal{ IElevenVault(vault).depositAll(); } // @dev just in case dev forgot something or has to recover something function additionalApprove(address _token, address _spender) onlyGov external{ require(_token != bankcurrency && _token != vault, "no rugs allowed"); _token.safeApprove(_spender, uint(-1)); } // @dev bank currency in vault function insideVaultBankCurrency() public view returns(uint){ uint bal = vault.myBalance(); uint pps = IElevenVault(vault).getPricePerFullShare(); return bal.mul(pps).div(1e18); } // @dev getpricepershare, used in front function getPricePerFullShare() public view returns(uint){ return uint(1 ether).mul(totalBankCurrency()).div(totalSupply()); } // @dev withdraws from vault with no errors function safeWithdrawFromFarm(uint _amount) internal{ if(_amount < insideVaultBankCurrency()) IElevenVault(vault).withdraw(_amount.mul(1e18).div(IElevenVault(vault).getPricePerFullShare().add(1))); else IElevenVault(vault).withdrawAll(); } // @dev transfer from bank currency and/or 11unusedbankcurrency with no errors function safeTransferBankCurrency(address _receiver, uint _amount) internal{ uint inside = bankcurrency.myBalance(); if(inside>=_amount) bankcurrency.safeTransfer(_receiver, _amount); else { safeWithdrawFromFarm(_amount.sub(inside)); if(bankcurrency.myBalance()<_amount) bankcurrency.safeTransfer(_receiver, bankcurrency.myBalance()); else bankcurrency.safeTransfer(_receiver, _amount); } } // @dev Total bank currency inside the contract bankCurrencyer on the vault or not function bankCurrencyBalance() public view returns (uint) { return bankcurrency.myBalance().add(insideVaultBankCurrency()); } /// @dev Return the pending interest that will be accrued in the next call. /// @param msgValue Balance value to subtract off pool3Balance() when called from payable functions. function pendingInterest(uint msgValue) public view returns (uint) { if (now > lastAccrueTime) { uint timePast = now.sub(lastAccrueTime); uint balance = bankCurrencyBalance().sub(msgValue); uint ratePerSec = config.getInterestRate(glbDebtVal, balance); return ratePerSec.mul(glbDebtVal).mul(timePast).div(1e18); } else { return 0; } } /// @dev Return the bankCurrency debt value given the debt share. Be careful of unaccrued interests. /// @param debtShare The debt share to be converted. function debtShareToVal(uint debtShare) public view returns (uint) { if (glbDebtShare == 0) return debtShare; // When there's no share, 1 share = 1 val. return debtShare.mul(glbDebtVal).div(glbDebtShare); } /// @dev Return the debt share for the given debt value. Be careful of unaccrued interests. /// @param debtVal The debt value to be converted. function debtValToShare(uint debtVal) public view returns (uint) { if (glbDebtShare == 0) return debtVal; // When there's no share, 1 share = 1 val. return debtVal.mul(glbDebtShare).div(glbDebtVal).add(1); } /// @dev Return bankCurrency value and debt of the given position. Be careful of unaccrued interests. /// @param id The position ID to query. function positionInfo(uint id) public view returns (uint, uint) { Position storage pos = positions[id]; return (Bigfoot(pos.bigfoot).health(id), debtShareToVal(pos.debtShare)); } /// @dev Return the total bankCurrency entitled to the token holders. Be careful of unaccrued interests. function totalBankCurrency() public view returns (uint) { return bankCurrencyBalance().add(glbDebtVal).sub(reservePool); } /// @dev Add more bankCurrency to the bank. Hope to get some good returns. function deposit(uint[] calldata amounts) external accrue(0) nonReentrant { uint total = totalBankCurrency(); uint diff = transferBankCurrency(amounts); uint share = total == 0 ? diff : diff.mul(totalSupply()).div(total); _mint(msg.sender, share); require(totalSupply() >= 1e6, 'deposit: total supply too low'); depositToVault(); } /// @dev Withdraw bankCurrency from the bank by burning the share tokens. function withdraw(uint share, uint8) external accrue(0) nonReentrant { uint amount = share.mul(totalBankCurrency()).div(totalSupply()); require(amount <= bankCurrencyBalance(), "Utilization too high, withdraw an smaller amount"); _burn(msg.sender, share); safeTransferBankCurrency(msg.sender, amount); uint supply = totalSupply(); require(supply == 0 || supply >= 1e6, 'withdraw: total supply too low'); } // @dev Don't do this unless you know what you're doing function emergencyWithdraw() external{ uint share = balanceOf(msg.sender); uint amount = share.mul(totalBankCurrency()).div(totalSupply()); _burn(msg.sender, share); safeTransferBankCurrency(msg.sender, amount); } // @dev Deposit dollars, convert to bankCurrency and stake in vault function transferBankCurrency(uint[] memory amounts) internal returns(uint){ uint bfrbankCurrency = bankcurrency.myBalance(); if(amounts[0]>0) bankcurrency.safeTransferFrom(msg.sender, address(this), amounts[0]); uint aftrbankCurrency = bankcurrency.myBalance(); return (aftrbankCurrency.sub(bfrbankCurrency)); } /// @dev Create a new farming position to unlock your yield farming potential. /// @param id The ID of the position to unlock the earning. Use ZERO for new position. /// @param bigfoot The address of the authorized bigfoot to work for this position. /// @param loan The amount of bankCurrency to borrow from the pool. /// @param maxReturn The max amount of bankCurrency to return to the pool. /// @param data The calldata to pass along to the bigfoot for more working context. function work( uint id, address bigfoot, uint loan, uint maxReturn, uint[] calldata amounts, bytes calldata data ) external onlyEOA nonReentrant accrue(0){ // 1. Sanity check the input position, or add a new position of ID is 0. if (id == 0) { id = nextPositionID++; positions[id].bigfoot = bigfoot; positions[id].owner = msg.sender; } else { require(id < nextPositionID, 'bad position id'); require(positions[id].bigfoot == bigfoot, 'bad position bigfoot'); require(positions[id].owner == msg.sender, 'not position owner'); } emit Work(id, loan); // 2. Make sure the bigfoot can accept more debt and remove the existing debt. require(config.isBigfoot(bigfoot), 'not a bigfoot'); require(loan == 0 || config.acceptDebt(bigfoot), 'bigfoot not accept more debt'); uint debt = _removeDebt(id).add(loan); // 3. Perform the actual work, using a new scope to avoid stack-too-deep errors. uint back; { uint sendBankCurrency = transferBankCurrency(amounts).add(loan); require(sendBankCurrency <= bankCurrencyBalance(), 'insufficient CURRENCY in the bank'); uint beforeBankCurrency = bankCurrencyBalance().sub(sendBankCurrency); safeTransferBankCurrency(bigfoot, sendBankCurrency); Bigfoot(bigfoot).work(id, msg.sender, debt, data); back = bankCurrencyBalance().sub(beforeBankCurrency); } // 4. Check and update position debt. uint lessDebt = Math.min(debt, Math.min(back, maxReturn)); debt = debt.sub(lessDebt); if (debt > 0) { require(debt >= config.minDebtSize(), 'too small debt size'); uint health = Bigfoot(bigfoot).health(id); uint workFactor = config.workFactor(bigfoot, debt); require(health.mul(workFactor) >= debt.mul(10000), 'bad work factor'); _addDebt(id, debt); } // 5. Return excess bankCurrency back. if (back > lessDebt) safeTransferBankCurrency(msg.sender, back - lessDebt); // 6. Deposit back unused to vault depositToVault(); // 7. Check total debt share/value not too small require(glbDebtShare >= 1e6, 'remaining global debt share too small'); require(glbDebtVal >= 1e6, 'remaining global debt value too small'); } /// @dev Kill the given to the position. Liquidate it immediately if killFactor condition is met. /// @param id The position ID to be killed. function kill(uint id) external onlyEOA accrue(0) nonReentrant { // 1. Verify that the position is eligible for liquidation. Position storage pos = positions[id]; require(pos.debtShare > 0, 'no debt'); uint debt = _removeDebt(id); uint health = Bigfoot(pos.bigfoot).health(id); uint killFactor = config.killFactor(pos.bigfoot, debt); require(health.mul(killFactor) < debt.mul(10000), "can't liquidate"); // 2. Perform liquidation and compute the amount of bankCurrency received. uint beforeBankCurrency = bankCurrencyBalance(); Bigfoot(pos.bigfoot).liquidate(id); uint back = bankCurrencyBalance().sub(beforeBankCurrency); uint prize = back.mul(config.getKillBps()).div(10000); uint rest = back.sub(prize); // 3. Clear position debt and return funds to liquidator and position owner. if (prize > 0) safeTransferBankCurrency(msg.sender, prize); uint left = rest > debt ? rest - debt : 0; if (left > 0) safeTransferBankCurrency(pos.owner, left); // 4. Deposit remaining to vault depositToVault(); emit Kill(id, msg.sender, prize, left); graveyard[pos.owner].push(Death(block.number, id, debt, health, left)); } /// @dev Internal function to add the given debt value to the given position. function _addDebt(uint id, uint debtVal) internal { Position storage pos = positions[id]; uint debtShare = debtValToShare(debtVal); pos.debtShare = pos.debtShare.add(debtShare); glbDebtShare = glbDebtShare.add(debtShare); glbDebtVal = glbDebtVal.add(debtVal); emit AddDebt(id, debtShare); } /// @dev Internal function to clear the debt of the given position. Return the debt value. function _removeDebt(uint id) internal returns (uint) { Position storage pos = positions[id]; uint debtShare = pos.debtShare; if (debtShare > 0) { uint debtVal = debtShareToVal(debtShare); pos.debtShare = 0; glbDebtShare = glbDebtShare.sub(debtShare); glbDebtVal = glbDebtVal.sub(debtVal); emit RemoveDebt(id, debtShare); return debtVal; } else { return 0; } } /// @dev Update bank configuration to a new address. Must only be called by owner. /// @param _config The new configurator address. function updateConfig(BankConfig _config) external onlyGov { config = _config; } /// @dev Withdraw bankCurrency reserve for underwater positions to the given address. /// @param to The address to transfer bankCurrency to. /// @param value The number of bankCurrency tokens to withdraw. Must not exceed `reservePool`. function withdrawReserve(address to, uint value) external onlyGov nonReentrant { reservePool = reservePool.sub(value); require(value<=bankCurrencyBalance(), "not enough funds"); safeTransferBankCurrency(to, value); } /// @dev Reduce bankCurrency reserve, effectively giving them to the depositors. /// @param value The number of bankCurrency reserve to reduce. function reduceReserve(uint value) external onlyGov { reservePool = reservePool.sub(value); } /// @dev Recover ERC20 tokens that were accidentally sent to this smart contract. /// @param token The token contract. Can be anything. This contract should not hold ERC20 tokens. /// @param to The address to send the tokens to. /// @param value The number of tokens to transfer to `to`. function recover( address token, address to, uint value ) external onlyGov nonReentrant { token.safeTransfer(to, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtShare","type":"uint256"}],"name":"AddDebt","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":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"killer","type":"address"},{"indexed":false,"internalType":"uint256","name":"prize","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"left","type":"uint256"}],"name":"Kill","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtShare","type":"uint256"}],"name":"RemoveDebt","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":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loan","type":"uint256"}],"name":"Work","type":"event"},{"constant":false,"inputs":[],"name":"acceptGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"additionalApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bankCurrencyBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bankcurrency","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"config","outputs":[{"internalType":"contract BankConfig","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"debtShare","type":"uint256"}],"name":"debtShareToVal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"debtVal","type":"uint256"}],"name":"debtValToShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"emergencyWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"glbDebtShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"glbDebtVal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"graveyard","outputs":[{"internalType":"uint256","name":"height","type":"uint256"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"debt","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"returned","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract BankConfig","name":"_config","type":"address"},{"internalType":"address","name":"_bankToken","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"insideVaultBankCurrency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"lastAccrueTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextPositionID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingGovernor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"msgValue","type":"uint256"}],"name":"pendingInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"positionInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"positions","outputs":[{"internalType":"address","name":"bigfoot","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"debtShare","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"recover","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"reduceReserve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"reservePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_pendingGovernor","type":"address"}],"name":"setPendingGovernor","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalBankCurrency","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract BankConfig","name":"_config","type":"address"}],"name":"updateConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"share","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawReserve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"bigfoot","type":"address"},{"internalType":"uint256","name":"loan","type":"uint256"},{"internalType":"uint256","name":"maxReturn","type":"uint256"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"work","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613b4d806100206000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80636cc919c811610151578063a9059cbb116100c3578063e3056a3411610087578063e3056a3414610940578063e58bb63914610948578063ea7d530f14610950578063f235757f1461096d578063f60290e414610993578063fbfa77cf146109b057610274565b8063a9059cbb146107e2578063c6f7a6eb1461080e578063d29a0025146108ed578063db2e21bc1461090a578063dd62ed3e1461091257610274565b8063903d429611610115578063903d42961461073157806395d89b411461075757806399fbab881461075f5780639ffe7973146107a6578063a457c2d7146107ae578063a6cb8f7d146107da57610274565b80636cc919c81461069f57806370a08231146106c557806377c7b8fc146106eb57806379502c55146106f357806389097a6a146106fb57610274565b806323af9b2f116101ea578063313ce567116101ae578063313ce567146105ba57806339509351146105d857806342294bfe14610604578063598b8e711461060c5780636b6216ad1461067a5780636b735cca1461069757610274565b806323af9b2f1461052957806323b872dd1461053157806329a1f362146105675780632da7271b146105955780632fc11c0f1461059d57610274565b806315b994871161023c57806315b994871461037c57806318160ddd146103d35780631c58ce14146103db5780631c824905146104095780631ec82cb814610411578063238b4bc51461044757610274565b80630266f0441461027957806306fdde0314610293578063095ea7b3146103105780630c340a24146103505780630f82519914610374575b600080fd5b6102816109b8565b60408051918252519081900360200190f35b61029b6109be565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d55781810151838201526020016102bd565b50505050905090810190601f1680156103025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61033c6004803603604081101561032657600080fd5b506001600160a01b038135169060200135610a4c565b604080519115158252519081900360200190f35b610358610a63565b604080516001600160a01b039092168252519081900360200190f35b610281610a72565b6103a86004803603604081101561039257600080fd5b506001600160a01b038135169060200135610a78565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b610281610ac3565b610407600480360360408110156103f157600080fd5b506001600160a01b038135169060200135610aca565b005b610281610bdf565b6104076004803603606081101561042757600080fd5b506001600160a01b03813581169160208101359091169060400135610be5565b610407600480360360c081101561045d57600080fd5b6001600160a01b0382358116926020810135821692604082013590921691810190608081016060820135600160201b81111561049857600080fd5b8201836020820111156104aa57600080fd5b803590602001918460018302840111600160201b831117156104cb57600080fd5b919390929091602081019035600160201b8111156104e857600080fd5b8201836020820111156104fa57600080fd5b803590602001918460018302840111600160201b8311171561051b57600080fd5b91935091503560ff16610ca6565b610281610dea565b61033c6004803603606081101561054757600080fd5b506001600160a01b03813581169160208101359091169060400135610e1d565b6104076004803603604081101561057d57600080fd5b506001600160a01b0381358116916020013516610e74565b610281610f55565b610281600480360360208110156105b357600080fd5b503561101e565b6105c261113a565b6040805160ff9092168252519081900360200190f35b61033c600480360360408110156105ee57600080fd5b506001600160a01b038135169060200135611143565b61035861117f565b6104076004803603602081101561062257600080fd5b810190602081018135600160201b81111561063c57600080fd5b82018360208201111561064e57600080fd5b803590602001918460208302840111600160201b8311171561066f57600080fd5b50909250905061118e565b6104076004803603602081101561069057600080fd5b50356113ab565b610281611416565b610407600480360360208110156106b557600080fd5b50356001600160a01b031661142c565b610281600480360360208110156106db57600080fd5b50356001600160a01b03166114a6565b6102816114c1565b6103586114ee565b6107186004803603602081101561071157600080fd5b5035611502565b6040805192835260208301919091528051918290030190f35b6104076004803603604081101561074757600080fd5b508035906020013560ff1661159f565b61029b611786565b61077c6004803603602081101561077557600080fd5b50356117e1565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b61028161180f565b61033c600480360360408110156107c457600080fd5b506001600160a01b038135169060200135611815565b610281611851565b61033c600480360360408110156107f857600080fd5b506001600160a01b038135169060200135611857565b610407600480360360c081101561082457600080fd5b8135916001600160a01b036020820135169160408201359160608101359181019060a081016080820135600160201b81111561085f57600080fd5b82018360208201111561087157600080fd5b803590602001918460208302840111600160201b8311171561089257600080fd5b919390929091602081019035600160201b8111156108af57600080fd5b8201836020820111156108c157600080fd5b803590602001918460018302840111600160201b831117156108e257600080fd5b509092509050611864565b6104076004803603602081101561090357600080fd5b5035612171565b6104076126b9565b6102816004803603604081101561092857600080fd5b506001600160a01b03813581169160200135166126f4565b61035861271f565b61040761272e565b6102816004803603602081101561096657600080fd5b50356127ad565b6104076004803603602081101561098357600080fd5b50356001600160a01b03166127dc565b610281600480360360208110156109a957600080fd5b5035612850565b610358612884565b60445481565b603c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610a445780601f10610a1957610100808354040283529160200191610a44565b820191906000526020600020905b815481529060010190602001808311610a2757829003601f168201915b505050505081565b6000610a59338484612893565b5060015b92915050565b6037546001600160a01b031681565b60415481565b60396020528160005260406000208181548110610a9157fe5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b6003545b90565b6037546001600160a01b03163314610b1c576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b6004805460010190819055604454610b3a908363ffffffff61297f16565b604455610b45610dea565b821115610b8c576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b604482015290519081900360640190fd5b610b9683836129dc565b6004548114610bda576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b505050565b60405481565b6037546001600160a01b03163314610c37576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b6004805460010190819055610c5c6001600160a01b038516848463ffffffff612aa516565b6004548114610ca0576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b50505050565b600054610100900460ff1680610cbf5750610cbf612bff565b80610ccd575060005460ff16155b610d085760405162461bcd60e51b815260040180806020018281038252602e8152602001806139e6602e913960400191505060405180910390fd5b600054610100900460ff16158015610d33576000805460ff1961ff0019909116610100171660011790555b603a80546001600160a01b03808b166001600160a01b031992831617909255603b8054928a1692909116919091179055610d6b612c05565b610d73612cc5565b603e8054610100600160a81b0319166101006001600160a01b038c1602179055426043556001604055610da8603c87876138c7565b50610db5603d85856138c7565b50603e805460ff191660ff8416179055610dcd612d6b565b8015610ddf576000805461ff00191690555b505050505050505050565b6000610e18610df7610f55565b603a54610e0c906001600160a01b0316612d92565b9063ffffffff612e0e16565b905090565b6000610e2a848484612e6f565b6001600160a01b038416600090815260026020908152604080832033808552925290912054610e6a918691610e65908663ffffffff61297f16565b612893565b5060019392505050565b6037546001600160a01b03163314610ec6576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b603a546001600160a01b03838116911614801590610ef25750603b546001600160a01b03838116911614155b610f35576040805162461bcd60e51b815260206004820152600f60248201526e1b9bc81c9d59dcc8185b1b1bddd959608a1b604482015290519081900360640190fd5b610f516001600160a01b0383168260001963ffffffff612fb316565b5050565b603b546000908190610f6f906001600160a01b0316612d92565b90506000603b60009054906101000a90046001600160a01b03166001600160a01b03166377c7b8fc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fc157600080fd5b505afa158015610fd5573d6000803e3d6000fd5b505050506040513d6020811015610feb57600080fd5b50519050611017670de0b6b3a764000061100b848463ffffffff61310516565b9063ffffffff61315e16565b9250505090565b60006043544211156111315760006110416043544261297f90919063ffffffff16565b9050600061105d84611051610dea565b9063ffffffff61297f16565b90506000603e60019054906101000a90046001600160a01b03166001600160a01b031663c6dfa13f604254846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156110c457600080fd5b505afa1580156110d8573d6000803e3d6000fd5b505050506040513d60208110156110ee57600080fd5b505160425490915061112790670de0b6b3a76400009061100b90869061111b90869063ffffffff61310516565b9063ffffffff61310516565b9350505050611135565b5060005b919050565b603e5460ff1681565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610a59918590610e65908663ffffffff612e0e16565b603a546001600160a01b031681565b600060435442111561126f5760006111a58261101e565b9050600061123961271061100b603e60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561120057600080fd5b505afa158015611214573d6000803e3d6000fd5b505050506040513d602081101561122a57600080fd5b5051859063ffffffff61310516565b60445490915061124f908263ffffffff612e0e16565b604455604254611265908363ffffffff612e0e16565b6042555050426043555b60048054600101908190556000611284611416565b905060006112c48686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131c892505050565b9050600082156112ef576112ea8361100b6112dd610ac3565b859063ffffffff61310516565b6112f1565b815b90506112fd338261326a565b620f4240611309610ac3565b101561135c576040805162461bcd60e51b815260206004820152601d60248201527f6465706f7369743a20746f74616c20737570706c7920746f6f206c6f77000000604482015290519081900360640190fd5b61136461335c565b5050506004548114610ca0576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b6037546001600160a01b031633146113fd576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b604454611410908263ffffffff61297f16565b60445550565b6000610e18604454611051604254610e0c610dea565b6037546001600160a01b0316331461147e576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b603e80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b031660009081526001602052604090205490565b6000610e186114ce610ac3565b61100b6114d9611416565b670de0b6b3a76400009063ffffffff61310516565b603e5461010090046001600160a01b031681565b6000818152603f60209081526040808320805482516303c1db6b60e51b8152600481018790529251859492936001600160a01b039092169263783b6d609260248082019391829003018186803b15801561155b57600080fd5b505afa15801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b50516002820154611595906127ad565b9250925050915091565b60006043544211156116475760006115b68261101e565b9050600061161161271061100b603e60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561120057600080fd5b604454909150611627908263ffffffff612e0e16565b60445560425461163d908363ffffffff612e0e16565b6042555050426043555b6004805460010190819055600061167761165f610ac3565b61100b61166a611416565b889063ffffffff61310516565b9050611681610dea565b8111156116bf5760405162461bcd60e51b8152600401808060200182810382526030815260200180613ac56030913960400191505060405180910390fd5b6116c933866133c0565b6116d333826129dc565b60006116dd610ac3565b90508015806116ef5750620f42408110155b611740576040805162461bcd60e51b815260206004820152601e60248201527f77697468647261773a20746f74616c20737570706c7920746f6f206c6f770000604482015290519081900360640190fd5b50506004548114610ca0576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b603d805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610a445780601f10610a1957610100808354040283529160200191610a44565b603f602052600090815260409020805460018201546002909201546001600160a01b03918216929091169083565b60435481565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610a59918590610e65908663ffffffff61297f16565b60425481565b6000610a59338484612e6f565b3332146118a2576040805162461bcd60e51b81526020600482015260076024820152666e6f7420656f6160c81b604482015290519081900360640190fd5b60048054600101908190556043546000904211156119565760006118c58261101e565b9050600061192061271061100b603e60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561120057600080fd5b604454909150611936908263ffffffff612e0e16565b60445560425461194c908363ffffffff612e0e16565b6042555050426043555b896119a25760408054600180820183556000828152603f6020529290922080546001600160a01b038d166001600160a01b03199182161782559201805490921633179091559950611ab2565b6040548a106119ea576040805162461bcd60e51b815260206004820152600f60248201526e189859081c1bdcda5d1a5bdb881a59608a1b604482015290519081900360640190fd5b60008a8152603f60205260409020546001600160a01b038a8116911614611a4f576040805162461bcd60e51b8152602060048201526014602482015273189859081c1bdcda5d1a5bdb88189a59d99bdbdd60621b604482015290519081900360640190fd5b60008a8152603f60205260409020600101546001600160a01b03163314611ab2576040805162461bcd60e51b81526020600482015260126024820152713737ba103837b9b4ba34b7b71037bbb732b960711b604482015290519081900360640190fd5b6040805189815290518b917f73c4ef442856bea52a6b34a83f35484ee65828010254ec27766c5a8c13db6c84919081900360200190a2603e546040805163c530054960e01b81526001600160a01b038c8116600483015291516101009093049091169163c530054991602480820192602092909190829003018186803b158015611b3b57600080fd5b505afa158015611b4f573d6000803e3d6000fd5b505050506040513d6020811015611b6557600080fd5b5051611ba8576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081848189a59d99bdbdd609a1b604482015290519081900360640190fd5b871580611c2d5750603e546040805161237f60e41b81526001600160a01b038c81166004830152915161010090930490911691620237f091602480820192602092909190829003018186803b158015611c0057600080fd5b505afa158015611c14573d6000803e3d6000fd5b505050506040513d6020811015611c2a57600080fd5b50515b611c7e576040805162461bcd60e51b815260206004820152601c60248201527f626967666f6f74206e6f7420616363657074206d6f7265206465627400000000604482015290519081900360640190fd5b6000611c8d89610e0c8d61349b565b9050600080611cd28b610e0c8b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131c892505050565b9050611cdc610dea565b811115611d1a5760405162461bcd60e51b81526004018080602001828103825260218152602001806139606021913960400191505060405180910390fd5b6000611d2882611051610dea565b9050611d348d836129dc565b8c6001600160a01b03166348db8cc48f33878c8c6040518663ffffffff1660e01b815260040180868152602001856001600160a01b03166001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015611dd057600080fd5b505af1158015611de4573d6000803e3d6000fd5b50505050611df481611051610dea565b925050506000611e0d83611e08848d613540565b613540565b9050611e1f838263ffffffff61297f16565b9250821561208557603e60019054906101000a90046001600160a01b03166001600160a01b031663e1ed42866040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7557600080fd5b505afa158015611e89573d6000803e3d6000fd5b505050506040513d6020811015611e9f57600080fd5b5051831015611eeb576040805162461bcd60e51b8152602060048201526013602482015272746f6f20736d616c6c20646562742073697a6560681b604482015290519081900360640190fd5b60008c6001600160a01b031663783b6d608f6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611f3157600080fd5b505afa158015611f45573d6000803e3d6000fd5b505050506040513d6020811015611f5b57600080fd5b810190808051906020019092919050505090506000603e60019054906101000a90046001600160a01b03166001600160a01b031663ad58e5738f876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b158015611fe357600080fd5b505afa158015611ff7573d6000803e3d6000fd5b505050506040513d602081101561200d57600080fd5b505190506120238561271063ffffffff61310516565b612033838363ffffffff61310516565b1015612078576040805162461bcd60e51b815260206004820152600f60248201526e3130b2103bb7b935903330b1ba37b960891b604482015290519081900360640190fd5b6120828f86613556565b50505b8082111561209957612099338284036129dc565b6120a161335c565b620f424060415410156120e55760405162461bcd60e51b8152600401808060200182810382526025815260200180613a146025913960400191505060405180910390fd5b620f424060425410156121295760405162461bcd60e51b8152600401808060200182810382526025815260200180613a396025913960400191505060405180910390fd5b505050506004548114610ddf576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b3332146121af576040805162461bcd60e51b81526020600482015260076024820152666e6f7420656f6160c81b604482015290519081900360640190fd5b60006043544211156122575760006121c68261101e565b9050600061222161271061100b603e60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561120057600080fd5b604454909150612237908263ffffffff612e0e16565b60445560425461224d908363ffffffff612e0e16565b6042555050426043555b60048054600101908190556000838152603f6020526040902060028101546122b0576040805162461bcd60e51b81526020600482015260076024820152661b9bc81919589d60ca1b604482015290519081900360640190fd5b60006122bb8561349b565b8254604080516303c1db6b60e51b81526004810189905290519293506000926001600160a01b039092169163783b6d6091602480820192602092909190829003018186803b15801561230c57600080fd5b505afa158015612320573d6000803e3d6000fd5b505050506040513d602081101561233657600080fd5b5051603e548454604080516313f6321b60e01b81526001600160a01b039283166004820152602481018790529051939450600093610100909304909116916313f6321b91604480820192602092909190829003018186803b15801561239a57600080fd5b505afa1580156123ae573d6000803e3d6000fd5b505050506040513d60208110156123c457600080fd5b505190506123da8361271063ffffffff61310516565b6123ea838363ffffffff61310516565b1061242e576040805162461bcd60e51b815260206004820152600f60248201526e63616e2774206c697175696461746560881b604482015290519081900360640190fd5b6000612438610dea565b8554604080516301057c4960e61b8152600481018c905290519293506001600160a01b039091169163415f12409160248082019260009290919082900301818387803b15801561248757600080fd5b505af115801561249b573d6000803e3d6000fd5b5050505060006124ad82611051610dea565b9050600061250861271061100b603e60019054906101000a90046001600160a01b03166001600160a01b03166328ae433e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561120057600080fd5b9050600061251c838363ffffffff61297f16565b9050811561252e5761252e33836129dc565b600087821161253e576000612542565b8782035b90508015612562576001890154612562906001600160a01b0316826129dc565b61256a61335c565b6040805184815260208101839052815133928f927fa150a1ba7e1c4b72a15f8cb872406ce63950404709b67fbfe52b36792f483a39929081900390910190a3603960008a60010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000206040518060a001604052804381526020018e81526020018a8152602001898152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401555050505050505050505050506004548114610bda576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b60006126c4336114a6565b905060006126de6126d3610ac3565b61100b6112dd611416565b90506126ea33836133c0565b610f5133826129dc565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6038546001600160a01b031681565b6038546001600160a01b0316331461278d576040805162461bcd60e51b815260206004820152601860248201527f6e6f74207468652070656e64696e6720676f7665726e6f720000000000000000604482015290519081900360640190fd5b603880546001600160a01b03199081169091556037805490911633179055565b6000604154600014156127c1575080611135565b610a5d60415461100b6042548561310590919063ffffffff16565b6037546001600160a01b0316331461282e576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b603880546001600160a01b0319166001600160a01b0392909216919091179055565b600060415460001415612864575080611135565b610a5d6001610e0c60425461100b6041548761310590919063ffffffff16565b603b546001600160a01b031681565b6001600160a01b0383166128d85760405162461bcd60e51b8152600401808060200182810382526024815260200180613af56024913960400191505060405180910390fd5b6001600160a01b03821661291d5760405162461bcd60e51b81526004018080602001828103825260228152602001806139c46022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000828211156129d6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b603a546000906129f4906001600160a01b0316612d92565b9050818110612a1f57603a54612a1a906001600160a01b0316848463ffffffff612aa516565b610bda565b612a37612a32838363ffffffff61297f16565b6135f3565b603a548290612a4e906001600160a01b0316612d92565b1015612a8857603a54612a1a908490612a6f906001600160a01b0316612d92565b603a546001600160a01b0316919063ffffffff612aa516565b603a54610bda906001600160a01b0316848463ffffffff612aa516565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612b225780518252601f199092019160209182019101612b03565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612b84576040519150601f19603f3d011682016040523d82523d6000602084013e612b89565b606091505b5091509150818015612bb7575080511580612bb75750808060200190516020811015612bb457600080fd5b50515b612bf8576040805162461bcd60e51b815260206004820152600d60248201526c10b9b0b332aa3930b739b332b960991b604482015290519081900360640190fd5b5050505050565b303b1590565b600054610100900460ff1680612c1e5750612c1e612bff565b80612c2c575060005460ff16155b612c675760405162461bcd60e51b815260040180806020018281038252602e8152602001806139e6602e913960400191505060405180910390fd5b600054610100900460ff16158015612c92576000805460ff1961ff0019909116610100171660011790555b603780546001600160a01b031990811633179091556038805490911690558015612cc2576000805461ff00191690555b50565b600054610100900460ff1680612cde5750612cde612bff565b80612cec575060005460ff16155b612d275760405162461bcd60e51b815260040180806020018281038252602e8152602001806139e6602e913960400191505060405180910390fd5b600054610100900460ff16158015612d52576000805460ff1961ff0019909116610100171660011790555b60016004558015612cc2576000805461ff001916905550565b603b54603a54612d90916001600160a01b03918216911660001963ffffffff612fb316565b565b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015612ddc57600080fd5b505afa158015612df0573d6000803e3d6000fd5b505050506040513d6020811015612e0657600080fd5b505192915050565b600082820183811015612e68576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038316612eb45760405162461bcd60e51b8152600401808060200182810382526025815260200180613aa06025913960400191505060405180910390fd5b6001600160a01b038216612ef95760405162461bcd60e51b81526004018080602001828103825260238152602001806139816023913960400191505060405180910390fd5b6001600160a01b038316600090815260016020526040902054612f22908263ffffffff61297f16565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612f57908263ffffffff612e0e16565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b602083106130305780518252601f199092019160209182019101613011565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613092576040519150601f19603f3d011682016040523d82523d6000602084013e613097565b606091505b50915091508180156130c55750805115806130c557508080602001905160208110156130c257600080fd5b50515b612bf8576040805162461bcd60e51b815260206004820152600c60248201526b2173616665417070726f766560a01b604482015290519081900360640190fd5b60008261311457506000610a5d565b8282028284828161312157fe5b0414612e685760405162461bcd60e51b8152600401808060200182810382526021815260200180613a5e6021913960400191505060405180910390fd5b60008082116131b4576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816131bf57fe5b04949350505050565b603a5460009081906131e2906001600160a01b0316612d92565b90506000836000815181106131f357fe5b602002602001015111156132385761323833308560008151811061321357fe5b6020908102919091010151603a546001600160a01b031692919063ffffffff61376016565b603a54600090613250906001600160a01b0316612d92565b9050613262818363ffffffff61297f16565b949350505050565b6001600160a01b0382166132c5576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6003546132d8908263ffffffff612e0e16565b6003556001600160a01b038216600090815260016020526040902054613304908263ffffffff612e0e16565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b603b60009054906101000a90046001600160a01b03166001600160a01b031663de5f62686040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156133ac57600080fd5b505af1158015610ca0573d6000803e3d6000fd5b6001600160a01b0382166134055760405162461bcd60e51b8152600401808060200182810382526021815260200180613a7f6021913960400191505060405180910390fd5b600354613418908263ffffffff61297f16565b6003556001600160a01b038216600090815260016020526040902054613444908263ffffffff61297f16565b6001600160a01b0383166000818152600160209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b6000818152603f60205260408120600281015480156135355760006134bf826127ad565b600060028501556041549091506134dc908363ffffffff61297f16565b6041556042546134f2908263ffffffff61297f16565b60425560408051838152905186917fc141cd58846e97354928242dcc7ddd92a6a0ecf03bdb5d3a411d260b9abc3272919081900360200190a29250611135915050565b600092505050611135565b600081831061354f5781612e68565b5090919050565b6000828152603f602052604081209061356e83612850565b6002830154909150613586908263ffffffff612e0e16565b600283015560415461359e908263ffffffff612e0e16565b6041556042546135b4908463ffffffff612e0e16565b60425560408051828152905185917f43b70d61bab6f8bfcf27c791452876c7da386b19652e19b8f21e8927aa6577ab919081900360200190a250505050565b6135fb610f55565b8110156136fc57603b5460408051631df1ee3f60e21b815290516001600160a01b0390921691632e1a7d4d916136a9916136919160019186916377c7b8fc916004808301926020929190829003018186803b15801561365957600080fd5b505afa15801561366d573d6000803e3d6000fd5b505050506040513d602081101561368357600080fd5b50519063ffffffff612e0e16565b61100b85670de0b6b3a764000063ffffffff61310516565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156136df57600080fd5b505af11580156136f3573d6000803e3d6000fd5b50505050612cc2565b603b60009054906101000a90046001600160a01b03166001600160a01b031663853828b66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561374c57600080fd5b505af1158015612bf8573d6000803e3d6000fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106137e55780518252601f1990920191602091820191016137c6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613847576040519150601f19603f3d011682016040523d82523d6000602084013e61384c565b606091505b509150915081801561387a57508051158061387a575080806020019051602081101561387757600080fd5b50515b6138bf576040805162461bcd60e51b815260206004820152601160248201527021736166655472616e7366657246726f6d60781b604482015290519081900360640190fd5b505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106139085782800160ff19823516178555613935565b82800160010185558215613935579182015b8281111561393557823582559160200191906001019061391a565b50613941929150613945565b5090565b610ac791905b80821115613941576000815560010161394b56fe696e73756666696369656e742043555252454e435920696e207468652062616e6b45524332303a207472616e7366657220746f20746865207a65726f20616464726573735265656e7472616e637947756172643a207265656e7472616e742063616c6c0045524332303a20617070726f766520746f20746865207a65726f2061646472657373496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656472656d61696e696e6720676c6f62616c206465627420736861726520746f6f20736d616c6c72656d61696e696e6720676c6f62616c20646562742076616c756520746f6f20736d616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573735574696c697a6174696f6e20746f6f20686967682c20776974686472617720616e20736d616c6c657220616d6f756e7445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a72315820b95c0683914f71b7521494eaa42b2669eed3f422668321463aeb1f0004b6a13c64736f6c63430005110032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102745760003560e01c80636cc919c811610151578063a9059cbb116100c3578063e3056a3411610087578063e3056a3414610940578063e58bb63914610948578063ea7d530f14610950578063f235757f1461096d578063f60290e414610993578063fbfa77cf146109b057610274565b8063a9059cbb146107e2578063c6f7a6eb1461080e578063d29a0025146108ed578063db2e21bc1461090a578063dd62ed3e1461091257610274565b8063903d429611610115578063903d42961461073157806395d89b411461075757806399fbab881461075f5780639ffe7973146107a6578063a457c2d7146107ae578063a6cb8f7d146107da57610274565b80636cc919c81461069f57806370a08231146106c557806377c7b8fc146106eb57806379502c55146106f357806389097a6a146106fb57610274565b806323af9b2f116101ea578063313ce567116101ae578063313ce567146105ba57806339509351146105d857806342294bfe14610604578063598b8e711461060c5780636b6216ad1461067a5780636b735cca1461069757610274565b806323af9b2f1461052957806323b872dd1461053157806329a1f362146105675780632da7271b146105955780632fc11c0f1461059d57610274565b806315b994871161023c57806315b994871461037c57806318160ddd146103d35780631c58ce14146103db5780631c824905146104095780631ec82cb814610411578063238b4bc51461044757610274565b80630266f0441461027957806306fdde0314610293578063095ea7b3146103105780630c340a24146103505780630f82519914610374575b600080fd5b6102816109b8565b60408051918252519081900360200190f35b61029b6109be565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102d55781810151838201526020016102bd565b50505050905090810190601f1680156103025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61033c6004803603604081101561032657600080fd5b506001600160a01b038135169060200135610a4c565b604080519115158252519081900360200190f35b610358610a63565b604080516001600160a01b039092168252519081900360200190f35b610281610a72565b6103a86004803603604081101561039257600080fd5b506001600160a01b038135169060200135610a78565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b610281610ac3565b610407600480360360408110156103f157600080fd5b506001600160a01b038135169060200135610aca565b005b610281610bdf565b6104076004803603606081101561042757600080fd5b506001600160a01b03813581169160208101359091169060400135610be5565b610407600480360360c081101561045d57600080fd5b6001600160a01b0382358116926020810135821692604082013590921691810190608081016060820135600160201b81111561049857600080fd5b8201836020820111156104aa57600080fd5b803590602001918460018302840111600160201b831117156104cb57600080fd5b919390929091602081019035600160201b8111156104e857600080fd5b8201836020820111156104fa57600080fd5b803590602001918460018302840111600160201b8311171561051b57600080fd5b91935091503560ff16610ca6565b610281610dea565b61033c6004803603606081101561054757600080fd5b506001600160a01b03813581169160208101359091169060400135610e1d565b6104076004803603604081101561057d57600080fd5b506001600160a01b0381358116916020013516610e74565b610281610f55565b610281600480360360208110156105b357600080fd5b503561101e565b6105c261113a565b6040805160ff9092168252519081900360200190f35b61033c600480360360408110156105ee57600080fd5b506001600160a01b038135169060200135611143565b61035861117f565b6104076004803603602081101561062257600080fd5b810190602081018135600160201b81111561063c57600080fd5b82018360208201111561064e57600080fd5b803590602001918460208302840111600160201b8311171561066f57600080fd5b50909250905061118e565b6104076004803603602081101561069057600080fd5b50356113ab565b610281611416565b610407600480360360208110156106b557600080fd5b50356001600160a01b031661142c565b610281600480360360208110156106db57600080fd5b50356001600160a01b03166114a6565b6102816114c1565b6103586114ee565b6107186004803603602081101561071157600080fd5b5035611502565b6040805192835260208301919091528051918290030190f35b6104076004803603604081101561074757600080fd5b508035906020013560ff1661159f565b61029b611786565b61077c6004803603602081101561077557600080fd5b50356117e1565b604080516001600160a01b0394851681529290931660208301528183015290519081900360600190f35b61028161180f565b61033c600480360360408110156107c457600080fd5b506001600160a01b038135169060200135611815565b610281611851565b61033c600480360360408110156107f857600080fd5b506001600160a01b038135169060200135611857565b610407600480360360c081101561082457600080fd5b8135916001600160a01b036020820135169160408201359160608101359181019060a081016080820135600160201b81111561085f57600080fd5b82018360208201111561087157600080fd5b803590602001918460208302840111600160201b8311171561089257600080fd5b919390929091602081019035600160201b8111156108af57600080fd5b8201836020820111156108c157600080fd5b803590602001918460018302840111600160201b831117156108e257600080fd5b509092509050611864565b6104076004803603602081101561090357600080fd5b5035612171565b6104076126b9565b6102816004803603604081101561092857600080fd5b506001600160a01b03813581169160200135166126f4565b61035861271f565b61040761272e565b6102816004803603602081101561096657600080fd5b50356127ad565b6104076004803603602081101561098357600080fd5b50356001600160a01b03166127dc565b610281600480360360208110156109a957600080fd5b5035612850565b610358612884565b60445481565b603c805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610a445780601f10610a1957610100808354040283529160200191610a44565b820191906000526020600020905b815481529060010190602001808311610a2757829003601f168201915b505050505081565b6000610a59338484612893565b5060015b92915050565b6037546001600160a01b031681565b60415481565b60396020528160005260406000208181548110610a9157fe5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b6003545b90565b6037546001600160a01b03163314610b1c576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b6004805460010190819055604454610b3a908363ffffffff61297f16565b604455610b45610dea565b821115610b8c576040805162461bcd60e51b815260206004820152601060248201526f6e6f7420656e6f7567682066756e647360801b604482015290519081900360640190fd5b610b9683836129dc565b6004548114610bda576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b505050565b60405481565b6037546001600160a01b03163314610c37576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b6004805460010190819055610c5c6001600160a01b038516848463ffffffff612aa516565b6004548114610ca0576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b50505050565b600054610100900460ff1680610cbf5750610cbf612bff565b80610ccd575060005460ff16155b610d085760405162461bcd60e51b815260040180806020018281038252602e8152602001806139e6602e913960400191505060405180910390fd5b600054610100900460ff16158015610d33576000805460ff1961ff0019909116610100171660011790555b603a80546001600160a01b03808b166001600160a01b031992831617909255603b8054928a1692909116919091179055610d6b612c05565b610d73612cc5565b603e8054610100600160a81b0319166101006001600160a01b038c1602179055426043556001604055610da8603c87876138c7565b50610db5603d85856138c7565b50603e805460ff191660ff8416179055610dcd612d6b565b8015610ddf576000805461ff00191690555b505050505050505050565b6000610e18610df7610f55565b603a54610e0c906001600160a01b0316612d92565b9063ffffffff612e0e16565b905090565b6000610e2a848484612e6f565b6001600160a01b038416600090815260026020908152604080832033808552925290912054610e6a918691610e65908663ffffffff61297f16565b612893565b5060019392505050565b6037546001600160a01b03163314610ec6576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b603a546001600160a01b03838116911614801590610ef25750603b546001600160a01b03838116911614155b610f35576040805162461bcd60e51b815260206004820152600f60248201526e1b9bc81c9d59dcc8185b1b1bddd959608a1b604482015290519081900360640190fd5b610f516001600160a01b0383168260001963ffffffff612fb316565b5050565b603b546000908190610f6f906001600160a01b0316612d92565b90506000603b60009054906101000a90046001600160a01b03166001600160a01b03166377c7b8fc6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fc157600080fd5b505afa158015610fd5573d6000803e3d6000fd5b505050506040513d6020811015610feb57600080fd5b50519050611017670de0b6b3a764000061100b848463ffffffff61310516565b9063ffffffff61315e16565b9250505090565b60006043544211156111315760006110416043544261297f90919063ffffffff16565b9050600061105d84611051610dea565b9063ffffffff61297f16565b90506000603e60019054906101000a90046001600160a01b03166001600160a01b031663c6dfa13f604254846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b1580156110c457600080fd5b505afa1580156110d8573d6000803e3d6000fd5b505050506040513d60208110156110ee57600080fd5b505160425490915061112790670de0b6b3a76400009061100b90869061111b90869063ffffffff61310516565b9063ffffffff61310516565b9350505050611135565b5060005b919050565b603e5460ff1681565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610a59918590610e65908663ffffffff612e0e16565b603a546001600160a01b031681565b600060435442111561126f5760006111a58261101e565b9050600061123961271061100b603e60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561120057600080fd5b505afa158015611214573d6000803e3d6000fd5b505050506040513d602081101561122a57600080fd5b5051859063ffffffff61310516565b60445490915061124f908263ffffffff612e0e16565b604455604254611265908363ffffffff612e0e16565b6042555050426043555b60048054600101908190556000611284611416565b905060006112c48686808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131c892505050565b9050600082156112ef576112ea8361100b6112dd610ac3565b859063ffffffff61310516565b6112f1565b815b90506112fd338261326a565b620f4240611309610ac3565b101561135c576040805162461bcd60e51b815260206004820152601d60248201527f6465706f7369743a20746f74616c20737570706c7920746f6f206c6f77000000604482015290519081900360640190fd5b61136461335c565b5050506004548114610ca0576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b6037546001600160a01b031633146113fd576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b604454611410908263ffffffff61297f16565b60445550565b6000610e18604454611051604254610e0c610dea565b6037546001600160a01b0316331461147e576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b603e80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b031660009081526001602052604090205490565b6000610e186114ce610ac3565b61100b6114d9611416565b670de0b6b3a76400009063ffffffff61310516565b603e5461010090046001600160a01b031681565b6000818152603f60209081526040808320805482516303c1db6b60e51b8152600481018790529251859492936001600160a01b039092169263783b6d609260248082019391829003018186803b15801561155b57600080fd5b505afa15801561156f573d6000803e3d6000fd5b505050506040513d602081101561158557600080fd5b50516002820154611595906127ad565b9250925050915091565b60006043544211156116475760006115b68261101e565b9050600061161161271061100b603e60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561120057600080fd5b604454909150611627908263ffffffff612e0e16565b60445560425461163d908363ffffffff612e0e16565b6042555050426043555b6004805460010190819055600061167761165f610ac3565b61100b61166a611416565b889063ffffffff61310516565b9050611681610dea565b8111156116bf5760405162461bcd60e51b8152600401808060200182810382526030815260200180613ac56030913960400191505060405180910390fd5b6116c933866133c0565b6116d333826129dc565b60006116dd610ac3565b90508015806116ef5750620f42408110155b611740576040805162461bcd60e51b815260206004820152601e60248201527f77697468647261773a20746f74616c20737570706c7920746f6f206c6f770000604482015290519081900360640190fd5b50506004548114610ca0576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b603d805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610a445780601f10610a1957610100808354040283529160200191610a44565b603f602052600090815260409020805460018201546002909201546001600160a01b03918216929091169083565b60435481565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610a59918590610e65908663ffffffff61297f16565b60425481565b6000610a59338484612e6f565b3332146118a2576040805162461bcd60e51b81526020600482015260076024820152666e6f7420656f6160c81b604482015290519081900360640190fd5b60048054600101908190556043546000904211156119565760006118c58261101e565b9050600061192061271061100b603e60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561120057600080fd5b604454909150611936908263ffffffff612e0e16565b60445560425461194c908363ffffffff612e0e16565b6042555050426043555b896119a25760408054600180820183556000828152603f6020529290922080546001600160a01b038d166001600160a01b03199182161782559201805490921633179091559950611ab2565b6040548a106119ea576040805162461bcd60e51b815260206004820152600f60248201526e189859081c1bdcda5d1a5bdb881a59608a1b604482015290519081900360640190fd5b60008a8152603f60205260409020546001600160a01b038a8116911614611a4f576040805162461bcd60e51b8152602060048201526014602482015273189859081c1bdcda5d1a5bdb88189a59d99bdbdd60621b604482015290519081900360640190fd5b60008a8152603f60205260409020600101546001600160a01b03163314611ab2576040805162461bcd60e51b81526020600482015260126024820152713737ba103837b9b4ba34b7b71037bbb732b960711b604482015290519081900360640190fd5b6040805189815290518b917f73c4ef442856bea52a6b34a83f35484ee65828010254ec27766c5a8c13db6c84919081900360200190a2603e546040805163c530054960e01b81526001600160a01b038c8116600483015291516101009093049091169163c530054991602480820192602092909190829003018186803b158015611b3b57600080fd5b505afa158015611b4f573d6000803e3d6000fd5b505050506040513d6020811015611b6557600080fd5b5051611ba8576040805162461bcd60e51b815260206004820152600d60248201526c1b9bdd081848189a59d99bdbdd609a1b604482015290519081900360640190fd5b871580611c2d5750603e546040805161237f60e41b81526001600160a01b038c81166004830152915161010090930490911691620237f091602480820192602092909190829003018186803b158015611c0057600080fd5b505afa158015611c14573d6000803e3d6000fd5b505050506040513d6020811015611c2a57600080fd5b50515b611c7e576040805162461bcd60e51b815260206004820152601c60248201527f626967666f6f74206e6f7420616363657074206d6f7265206465627400000000604482015290519081900360640190fd5b6000611c8d89610e0c8d61349b565b9050600080611cd28b610e0c8b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506131c892505050565b9050611cdc610dea565b811115611d1a5760405162461bcd60e51b81526004018080602001828103825260218152602001806139606021913960400191505060405180910390fd5b6000611d2882611051610dea565b9050611d348d836129dc565b8c6001600160a01b03166348db8cc48f33878c8c6040518663ffffffff1660e01b815260040180868152602001856001600160a01b03166001600160a01b03168152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015611dd057600080fd5b505af1158015611de4573d6000803e3d6000fd5b50505050611df481611051610dea565b925050506000611e0d83611e08848d613540565b613540565b9050611e1f838263ffffffff61297f16565b9250821561208557603e60019054906101000a90046001600160a01b03166001600160a01b031663e1ed42866040518163ffffffff1660e01b815260040160206040518083038186803b158015611e7557600080fd5b505afa158015611e89573d6000803e3d6000fd5b505050506040513d6020811015611e9f57600080fd5b5051831015611eeb576040805162461bcd60e51b8152602060048201526013602482015272746f6f20736d616c6c20646562742073697a6560681b604482015290519081900360640190fd5b60008c6001600160a01b031663783b6d608f6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015611f3157600080fd5b505afa158015611f45573d6000803e3d6000fd5b505050506040513d6020811015611f5b57600080fd5b810190808051906020019092919050505090506000603e60019054906101000a90046001600160a01b03166001600160a01b031663ad58e5738f876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b158015611fe357600080fd5b505afa158015611ff7573d6000803e3d6000fd5b505050506040513d602081101561200d57600080fd5b505190506120238561271063ffffffff61310516565b612033838363ffffffff61310516565b1015612078576040805162461bcd60e51b815260206004820152600f60248201526e3130b2103bb7b935903330b1ba37b960891b604482015290519081900360640190fd5b6120828f86613556565b50505b8082111561209957612099338284036129dc565b6120a161335c565b620f424060415410156120e55760405162461bcd60e51b8152600401808060200182810382526025815260200180613a146025913960400191505060405180910390fd5b620f424060425410156121295760405162461bcd60e51b8152600401808060200182810382526025815260200180613a396025913960400191505060405180910390fd5b505050506004548114610ddf576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b3332146121af576040805162461bcd60e51b81526020600482015260076024820152666e6f7420656f6160c81b604482015290519081900360640190fd5b60006043544211156122575760006121c68261101e565b9050600061222161271061100b603e60019054906101000a90046001600160a01b03166001600160a01b03166309956f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561120057600080fd5b604454909150612237908263ffffffff612e0e16565b60445560425461224d908363ffffffff612e0e16565b6042555050426043555b60048054600101908190556000838152603f6020526040902060028101546122b0576040805162461bcd60e51b81526020600482015260076024820152661b9bc81919589d60ca1b604482015290519081900360640190fd5b60006122bb8561349b565b8254604080516303c1db6b60e51b81526004810189905290519293506000926001600160a01b039092169163783b6d6091602480820192602092909190829003018186803b15801561230c57600080fd5b505afa158015612320573d6000803e3d6000fd5b505050506040513d602081101561233657600080fd5b5051603e548454604080516313f6321b60e01b81526001600160a01b039283166004820152602481018790529051939450600093610100909304909116916313f6321b91604480820192602092909190829003018186803b15801561239a57600080fd5b505afa1580156123ae573d6000803e3d6000fd5b505050506040513d60208110156123c457600080fd5b505190506123da8361271063ffffffff61310516565b6123ea838363ffffffff61310516565b1061242e576040805162461bcd60e51b815260206004820152600f60248201526e63616e2774206c697175696461746560881b604482015290519081900360640190fd5b6000612438610dea565b8554604080516301057c4960e61b8152600481018c905290519293506001600160a01b039091169163415f12409160248082019260009290919082900301818387803b15801561248757600080fd5b505af115801561249b573d6000803e3d6000fd5b5050505060006124ad82611051610dea565b9050600061250861271061100b603e60019054906101000a90046001600160a01b03166001600160a01b03166328ae433e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561120057600080fd5b9050600061251c838363ffffffff61297f16565b9050811561252e5761252e33836129dc565b600087821161253e576000612542565b8782035b90508015612562576001890154612562906001600160a01b0316826129dc565b61256a61335c565b6040805184815260208101839052815133928f927fa150a1ba7e1c4b72a15f8cb872406ce63950404709b67fbfe52b36792f483a39929081900390910190a3603960008a60010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020016000206040518060a001604052804381526020018e81526020018a8152602001898152602001838152509080600181540180825580915050906001820390600052602060002090600502016000909192909190915060008201518160000155602082015181600101556040820151816002015560608201518160030155608082015181600401555050505050505050505050506004548114610bda576040805162461bcd60e51b815260206004820152601f60248201526000805160206139a4833981519152604482015290519081900360640190fd5b60006126c4336114a6565b905060006126de6126d3610ac3565b61100b6112dd611416565b90506126ea33836133c0565b610f5133826129dc565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6038546001600160a01b031681565b6038546001600160a01b0316331461278d576040805162461bcd60e51b815260206004820152601860248201527f6e6f74207468652070656e64696e6720676f7665726e6f720000000000000000604482015290519081900360640190fd5b603880546001600160a01b03199081169091556037805490911633179055565b6000604154600014156127c1575080611135565b610a5d60415461100b6042548561310590919063ffffffff16565b6037546001600160a01b0316331461282e576040805162461bcd60e51b815260206004820152601060248201526f3737ba103a34329033b7bb32b93737b960811b604482015290519081900360640190fd5b603880546001600160a01b0319166001600160a01b0392909216919091179055565b600060415460001415612864575080611135565b610a5d6001610e0c60425461100b6041548761310590919063ffffffff16565b603b546001600160a01b031681565b6001600160a01b0383166128d85760405162461bcd60e51b8152600401808060200182810382526024815260200180613af56024913960400191505060405180910390fd5b6001600160a01b03821661291d5760405162461bcd60e51b81526004018080602001828103825260228152602001806139c46022913960400191505060405180910390fd5b6001600160a01b03808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6000828211156129d6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b603a546000906129f4906001600160a01b0316612d92565b9050818110612a1f57603a54612a1a906001600160a01b0316848463ffffffff612aa516565b610bda565b612a37612a32838363ffffffff61297f16565b6135f3565b603a548290612a4e906001600160a01b0316612d92565b1015612a8857603a54612a1a908490612a6f906001600160a01b0316612d92565b603a546001600160a01b0316919063ffffffff612aa516565b603a54610bda906001600160a01b0316848463ffffffff612aa516565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b60208310612b225780518252601f199092019160209182019101612b03565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612b84576040519150601f19603f3d011682016040523d82523d6000602084013e612b89565b606091505b5091509150818015612bb7575080511580612bb75750808060200190516020811015612bb457600080fd5b50515b612bf8576040805162461bcd60e51b815260206004820152600d60248201526c10b9b0b332aa3930b739b332b960991b604482015290519081900360640190fd5b5050505050565b303b1590565b600054610100900460ff1680612c1e5750612c1e612bff565b80612c2c575060005460ff16155b612c675760405162461bcd60e51b815260040180806020018281038252602e8152602001806139e6602e913960400191505060405180910390fd5b600054610100900460ff16158015612c92576000805460ff1961ff0019909116610100171660011790555b603780546001600160a01b031990811633179091556038805490911690558015612cc2576000805461ff00191690555b50565b600054610100900460ff1680612cde5750612cde612bff565b80612cec575060005460ff16155b612d275760405162461bcd60e51b815260040180806020018281038252602e8152602001806139e6602e913960400191505060405180910390fd5b600054610100900460ff16158015612d52576000805460ff1961ff0019909116610100171660011790555b60016004558015612cc2576000805461ff001916905550565b603b54603a54612d90916001600160a01b03918216911660001963ffffffff612fb316565b565b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015612ddc57600080fd5b505afa158015612df0573d6000803e3d6000fd5b505050506040513d6020811015612e0657600080fd5b505192915050565b600082820183811015612e68576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038316612eb45760405162461bcd60e51b8152600401808060200182810382526025815260200180613aa06025913960400191505060405180910390fd5b6001600160a01b038216612ef95760405162461bcd60e51b81526004018080602001828103825260238152602001806139816023913960400191505060405180910390fd5b6001600160a01b038316600090815260016020526040902054612f22908263ffffffff61297f16565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612f57908263ffffffff612e0e16565b6001600160a01b0380841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b602083106130305780518252601f199092019160209182019101613011565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613092576040519150601f19603f3d011682016040523d82523d6000602084013e613097565b606091505b50915091508180156130c55750805115806130c557508080602001905160208110156130c257600080fd5b50515b612bf8576040805162461bcd60e51b815260206004820152600c60248201526b2173616665417070726f766560a01b604482015290519081900360640190fd5b60008261311457506000610a5d565b8282028284828161312157fe5b0414612e685760405162461bcd60e51b8152600401808060200182810382526021815260200180613a5e6021913960400191505060405180910390fd5b60008082116131b4576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816131bf57fe5b04949350505050565b603a5460009081906131e2906001600160a01b0316612d92565b90506000836000815181106131f357fe5b602002602001015111156132385761323833308560008151811061321357fe5b6020908102919091010151603a546001600160a01b031692919063ffffffff61376016565b603a54600090613250906001600160a01b0316612d92565b9050613262818363ffffffff61297f16565b949350505050565b6001600160a01b0382166132c5576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6003546132d8908263ffffffff612e0e16565b6003556001600160a01b038216600090815260016020526040902054613304908263ffffffff612e0e16565b6001600160a01b03831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b603b60009054906101000a90046001600160a01b03166001600160a01b031663de5f62686040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156133ac57600080fd5b505af1158015610ca0573d6000803e3d6000fd5b6001600160a01b0382166134055760405162461bcd60e51b8152600401808060200182810382526021815260200180613a7f6021913960400191505060405180910390fd5b600354613418908263ffffffff61297f16565b6003556001600160a01b038216600090815260016020526040902054613444908263ffffffff61297f16565b6001600160a01b0383166000818152600160209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b6000818152603f60205260408120600281015480156135355760006134bf826127ad565b600060028501556041549091506134dc908363ffffffff61297f16565b6041556042546134f2908263ffffffff61297f16565b60425560408051838152905186917fc141cd58846e97354928242dcc7ddd92a6a0ecf03bdb5d3a411d260b9abc3272919081900360200190a29250611135915050565b600092505050611135565b600081831061354f5781612e68565b5090919050565b6000828152603f602052604081209061356e83612850565b6002830154909150613586908263ffffffff612e0e16565b600283015560415461359e908263ffffffff612e0e16565b6041556042546135b4908463ffffffff612e0e16565b60425560408051828152905185917f43b70d61bab6f8bfcf27c791452876c7da386b19652e19b8f21e8927aa6577ab919081900360200190a250505050565b6135fb610f55565b8110156136fc57603b5460408051631df1ee3f60e21b815290516001600160a01b0390921691632e1a7d4d916136a9916136919160019186916377c7b8fc916004808301926020929190829003018186803b15801561365957600080fd5b505afa15801561366d573d6000803e3d6000fd5b505050506040513d602081101561368357600080fd5b50519063ffffffff612e0e16565b61100b85670de0b6b3a764000063ffffffff61310516565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156136df57600080fd5b505af11580156136f3573d6000803e3d6000fd5b50505050612cc2565b603b60009054906101000a90046001600160a01b03166001600160a01b031663853828b66040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561374c57600080fd5b505af1158015612bf8573d6000803e3d6000fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b602083106137e55780518252601f1990920191602091820191016137c6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613847576040519150601f19603f3d011682016040523d82523d6000602084013e61384c565b606091505b509150915081801561387a57508051158061387a575080806020019051602081101561387757600080fd5b50515b6138bf576040805162461bcd60e51b815260206004820152601160248201527021736166655472616e7366657246726f6d60781b604482015290519081900360640190fd5b505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106139085782800160ff19823516178555613935565b82800160010185558215613935579182015b8281111561393557823582559160200191906001019061391a565b50613941929150613945565b5090565b610ac791905b80821115613941576000815560010161394b56fe696e73756666696369656e742043555252454e435920696e207468652062616e6b45524332303a207472616e7366657220746f20746865207a65726f20616464726573735265656e7472616e637947756172643a207265656e7472616e742063616c6c0045524332303a20617070726f766520746f20746865207a65726f2061646472657373496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a656472656d61696e696e6720676c6f62616c206465627420736861726520746f6f20736d616c6c72656d61696e696e6720676c6f62616c20646562742076616c756520746f6f20736d616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573735574696c697a6174696f6e20746f6f20686967682c20776974686472617720616e20736d616c6c657220616d6f756e7445524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373a265627a7a72315820b95c0683914f71b7521494eaa42b2669eed3f422668321463aeb1f0004b6a13c64736f6c63430005110032
Deployed Bytecode Sourcemap
24386:14345:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24386:14345:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25430:23;;;:::i;:::-;;;;;;;;;;;;;;;;25059:18;;;:::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;25059:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15349:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15349:148:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;11834:23;;;:::i;:::-;;;;-1:-1:-1;;;;;11834:23:0;;;;;;;;;;;;;;25343:24;;;:::i;24951:42::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24951:42:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14372:91;;;:::i;37779:234::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;37779:234:0;;;;;;;;:::i;:::-;;25310:26;;;:::i;38580:148::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;38580:148:0;;;;;;;;;;;;;;;;;:::i;26027:451::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;26027:451:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;26027:451:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26027:451:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;26027:451:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;26027:451:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26027:451:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;26027:451:0;;-1:-1:-1;26027:451:0;-1:-1:-1;26027:451:0;;;;:::i;28408:133::-;;;:::i;15968:256::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15968:256:0;;;;;;;;;;;;;;;;;:::i;26829:204::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26829:204:0;;;;;;;;;;:::i;27075:197::-;;;:::i;28730:387::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28730:387:0;;:::i;25107:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16633:206;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16633:206:0;;;;;;;;:::i;25000:27::-;;;:::i;30556:365::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30556:365:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;30556:365:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30556:365:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;30556:365:0;;-1:-1:-1;30556:365:0;-1:-1:-1;30556:365:0;:::i;38173:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38173:101:0;;:::i;30336:130::-;;;:::i;37442:88::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37442:88:0;-1:-1:-1;;;;;37442:88:0;;:::i;14526:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14526:110:0;-1:-1:-1;;;;;14526:110:0;;:::i;27323:136::-;;;:::i;25226:24::-;;;:::i;30031:191::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30031:191:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31004:438;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31004:438:0;;;;;;;;;:::i;25082:20::-;;;:::i;25259:42::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25259:42:0;;:::i;:::-;;;;-1:-1:-1;;;;;25259:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25399:26;;;:::i;17342:216::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17342:216:0;;;;;;;;:::i;25372:22::-;;;:::i;14849:156::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14849:156:0;;;;;;;;:::i;32662:2309::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;32662:2309:0;;;-1:-1:-1;;;;;32662:2309:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;32662:2309:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32662:2309:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;32662:2309:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;32662:2309:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32662:2309:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;32662:2309:0;;-1:-1:-1;32662:2309:0;-1:-1:-1;32662:2309:0;:::i;35125:1222::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35125:1222:0;;:::i;31509:236::-;;;:::i;15068:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15068:134:0;;;;;;;;;;:::i;11887:30::-;;;:::i;12662:177::-;;;:::i;29283:219::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29283:219:0;;:::i;12451:118::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12451:118:0;-1:-1:-1;;;;;12451:118:0;;:::i;29657:220::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29657:220:0;;:::i;25032:20::-;;;:::i;25430:23::-;;;;:::o;25059:18::-;;;;;;;;;;;;;;;-1:-1:-1;;25059:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15349:148::-;15414:4;15431:36;15440:10;15452:7;15461:5;15431:8;:36::i;:::-;-1:-1:-1;15485:4:0;15349:148;;;;;:::o;11834:23::-;;;-1:-1:-1;;;;;11834:23:0;;:::o;25343:24::-;;;;:::o;24951:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24951:42:0;;-1:-1:-1;24951:42:0;;;:::o;14372:91::-;14443:12;;14372:91;;:::o;37779:234::-;12033:8;;-1:-1:-1;;;;;12033:8:0;12019:10;:22;12011:51;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;;;;22235:13;:18;;22252:1;22235:18;;;;;37879:11;;:22;;37895:5;37879:22;:15;:22;:::i;:::-;37865:11;:36;37923:21;:19;:21::i;:::-;37916:5;:28;;37908:57;;;;;-1:-1:-1;;;37908:57:0;;;;;;;;;;;;-1:-1:-1;;;37908:57:0;;;;;;;;;;;;;;;37972:35;37997:2;38001:5;37972:24;:35::i;:::-;22332:13;;22316:12;:29;22308:73;;;;;-1:-1:-1;;;22308:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22308:73:0;;;;;;;;;;;;;;;12069:1;37779:234;;:::o;25310:26::-;;;;:::o;38580:148::-;12033:8;;-1:-1:-1;;;;;12033:8:0;12019:10;:22;12011:51;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;;;;22235:13;:18;;22252:1;22235:18;;;;;38693:29;-1:-1:-1;;;;;38693:18:0;;38712:2;38716:5;38693:29;:18;:29;:::i;:::-;22332:13;;22316:12;:29;22308:73;;;;;-1:-1:-1;;;22308:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22308:73:0;;;;;;;;;;;;;;;12069:1;38580:148;;;:::o;26027:451::-;3420:13;;;;;;;;:33;;;3437:16;:14;:16::i;:::-;3420:50;;;-1:-1:-1;3458:12:0;;;;3457:13;3420:50;3404:130;;;;-1:-1:-1;;;3404:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3543:19;3566:13;;;;;;3565:14;3586:85;;;;3615:13;:20;;-1:-1:-1;;;;3615:20:0;;;;;3644:19;3631:4;3644:19;;;3586:85;26196:12;:25;;-1:-1:-1;;;;;26196:25:0;;;-1:-1:-1;;;;;;26196:25:0;;;;;;;26228:5;:14;;;;;;;;;;;;;;;26249:20;:18;:20::i;:::-;26276:36;:34;:36::i;:::-;26319:6;:16;;-1:-1:-1;;;;;;26319:16:0;;-1:-1:-1;;;;;26319:16:0;;;;;;26359:3;26342:14;:20;-1:-1:-1;26369:14:0;:18;26394:12;:4;26401:5;;26394:12;:::i;:::-;-1:-1:-1;26413:16:0;:6;26422:7;;26413:16;:::i;:::-;-1:-1:-1;26436:8:0;:20;;-1:-1:-1;;26436:20:0;;;;;;;26463:9;:7;:9::i;:::-;3693:14;3689:58;;;3734:5;3718:21;;-1:-1:-1;;3718:21:0;;;3689:58;26027:451;;;;;;;;;:::o;28408:133::-;28460:4;28480:55;28509:25;:23;:25::i;:::-;28480:12;;:24;;-1:-1:-1;;;;;28480:12:0;:22;:24::i;:::-;:28;:55;:28;:55;:::i;:::-;28473:62;;28408:133;:::o;15968:256::-;16057:4;16074:36;16084:6;16092:9;16103:6;16074:9;:36::i;:::-;-1:-1:-1;;;;;16150:19:0;;;;;;:11;:19;;;;;;;;16138:10;16150:31;;;;;;;;;16121:73;;16130:6;;16150:43;;16186:6;16150:43;:35;:43;:::i;:::-;16121:8;:73::i;:::-;-1:-1:-1;16212:4:0;15968:256;;;;;:::o;26829:204::-;12033:8;;-1:-1:-1;;;;;12033:8:0;12019:10;:22;12011:51;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;;;;26931:12;;-1:-1:-1;;;;;26921:22:0;;;26931:12;;26921:22;;;;:41;;-1:-1:-1;26957:5:0;;-1:-1:-1;;;;;26947:15:0;;;26957:5;;26947:15;;26921:41;26913:69;;;;;-1:-1:-1;;;26913:69:0;;;;;;;;;;;;-1:-1:-1;;;26913:69:0;;;;;;;;;;;;;;;26989:38;-1:-1:-1;;;;;26989:18:0;;27008:8;-1:-1:-1;;26989:38:0;:18;:38;:::i;:::-;26829:204;;:::o;27075:197::-;27153:5;;27130:4;;;;27153:17;;-1:-1:-1;;;;;27153:5:0;:15;:17::i;:::-;27142:28;;27177:8;27201:5;;;;;;;;;-1:-1:-1;;;;;27201:5:0;-1:-1:-1;;;;;27188:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27188:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27188:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27188:42:0;;-1:-1:-1;27244:22:0;27261:4;27244:12;:3;27188:42;27244:12;:7;:12;:::i;:::-;:16;:22;:16;:22;:::i;:::-;27237:29;;;;27075:197;:::o;28730:387::-;28791:4;28814:14;;28808:3;:20;28804:308;;;28839:13;28855:23;28863:14;;28855:3;:7;;:23;;;;:::i;:::-;28839:39;;28887:12;28902:35;28928:8;28902:21;:19;:21::i;:::-;:25;:35;:25;:35;:::i;:::-;28887:50;;28946:15;28964:6;;;;;;;;;-1:-1:-1;;;;;28964:6:0;-1:-1:-1;;;;;28964:22:0;;28987:10;;28999:7;28964:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28964:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28964:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28964:43:0;29038:10;;28964:43;;-1:-1:-1;29023:50:0;;29068:4;;29023:40;;29054:8;;29023:26;;28964:43;;29023:26;:14;:26;:::i;:::-;:30;:40;:30;:40;:::i;:50::-;29016:57;;;;;;;28804:308;-1:-1:-1;29103:1:0;28804:308;28730:387;;;:::o;25107:21::-;;;;;;:::o;16633:206::-;16739:10;16713:4;16760:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;16760:32:0;;;;;;;;;;16713:4;;16730:79;;16751:7;;16760:48;;16797:10;16760:48;:36;:48;:::i;25000:27::-;;;-1:-1:-1;;;;;25000:27:0;;:::o;30556:365::-;30614:1;25729:14;;25723:3;:20;25719:285;;;25754:13;25770:25;25786:8;25770:15;:25::i;:::-;25754:41;;25804:14;25821:51;25866:5;25821:40;25834:6;;;;;;;;;-1:-1:-1;;;;;25834:6:0;-1:-1:-1;;;;;25834:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25834:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25834:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25834:26:0;25821:8;;:40;:12;:40;:::i;:51::-;25895:11;;25804:68;;-1:-1:-1;25895:26:0;;25804:68;25895:26;:15;:26;:::i;:::-;25881:11;:40;25943:10;;:24;;25958:8;25943:24;:14;:24;:::i;:::-;25930:10;:37;-1:-1:-1;;25993:3:0;25976:14;:20;25719:285;22235:13;:18;;22252:1;22235:18;;;;;:13;30651:19;:17;:19::i;:::-;30638:32;;30677:9;30689:29;30710:7;;30689:29;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;30689:20:0;;-1:-1:-1;;;30689:29:0:i;:::-;30677:41;-1:-1:-1;30725:10:0;30738;;:54;;30758:34;30786:5;30758:23;30767:13;:11;:13::i;:::-;30758:4;;:23;:8;:23;:::i;:34::-;30738:54;;;30751:4;30738:54;30725:67;;30799:24;30805:10;30817:5;30799;:24::i;:::-;30855:3;30838:13;:11;:13::i;:::-;:20;;30830:62;;;;;-1:-1:-1;;;30830:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30899:16;:14;:16::i;:::-;22300:1;;;22332:13;;22316:12;:29;22308:73;;;;;-1:-1:-1;;;22308:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22308:73:0;;;;;;;;;;;;;;38173:101;12033:8;;-1:-1:-1;;;;;12033:8:0;12019:10;:22;12011:51;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;;;;38246:11;;:22;;38262:5;38246:22;:15;:22;:::i;:::-;38232:11;:36;-1:-1:-1;38173:101:0:o;30336:130::-;30386:4;30406:54;30448:11;;30406:37;30432:10;;30406:21;:19;:21::i;37442:88::-;12033:8;;-1:-1:-1;;;;;12033:8:0;12019:10;:22;12011:51;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;;;;37508:6;:16;;-1:-1:-1;;;;;37508:16:0;;;;;-1:-1:-1;;;;;;37508:16:0;;;;;;;;;37442:88::o;14526:110::-;-1:-1:-1;;;;;14610:18:0;14583:7;14610:18;;;:9;:18;;;;;;;14526:110::o;27323:136::-;27375:4;27396:57;27439:13;:11;:13::i;:::-;27396:38;27414:19;:17;:19::i;:::-;27401:7;;27396:38;:17;:38;:::i;25226:24::-;;;;;;-1:-1:-1;;;;;25226:24:0;;:::o;30031:191::-;30083:4;30125:13;;;:9;:13;;;;;;;;30161:11;;30153:31;;-1:-1:-1;;;30153:31:0;;;;;;;;;;30083:4;;30125:13;;-1:-1:-1;;;;;30161:11:0;;;;30153:27;;:31;;;;;;;;;;;30161:11;30153:31;;;5:2:-1;;;;30:1;27;20:12;5:2;30153:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30153:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30153:31:0;30201:13;;;;30186:29;;:14;:29::i;:::-;30145:71;;;;;30031:191;;;:::o;31004:438::-;31057:1;25729:14;;25723:3;:20;25719:285;;;25754:13;25770:25;25786:8;25770:15;:25::i;:::-;25754:41;;25804:14;25821:51;25866:5;25821:40;25834:6;;;;;;;;;-1:-1:-1;;;;;25834:6:0;-1:-1:-1;;;;;25834:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;25821:51:0;25895:11;;25804:68;;-1:-1:-1;25895:26:0;;25804:68;25895:26;:15;:26;:::i;:::-;25881:11;:40;25943:10;;:24;;25958:8;25943:24;:14;:24;:::i;:::-;25930:10;:37;-1:-1:-1;;25993:3:0;25976:14;:20;25719:285;22235:13;:18;;22252:1;22235:18;;;;;:13;31094:49;31129:13;:11;:13::i;:::-;31094:30;31104:19;:17;:19::i;:::-;31094:5;;:30;:9;:30;:::i;:49::-;31080:63;;31168:21;:19;:21::i;:::-;31158:6;:31;;31150:92;;;;-1:-1:-1;;;31150:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31249:24;31255:10;31267:5;31249;:24::i;:::-;31280:44;31305:10;31317:6;31280:24;:44::i;:::-;31331:11;31345:13;:11;:13::i;:::-;31331:27;-1:-1:-1;31373:11:0;;;:28;;;31398:3;31388:6;:13;;31373:28;31365:71;;;;;-1:-1:-1;;;31365:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22300:1;;22332:13;;22316:12;:29;22308:73;;;;;-1:-1:-1;;;22308:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22308:73:0;;;;;;;;;;;;;;25082:20;;;;;;;;;;;;;;;-1:-1:-1;;25082:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25259:42;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25259:42:0;;;;;;;;;:::o;25399:26::-;;;;:::o;17342:216::-;17453:10;17427:4;17474:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;17474:32:0;;;;;;;;;;17427:4;;17444:84;;17465:7;;17474:53;;17511:15;17474:53;:36;:53;:::i;25372:22::-;;;;:::o;14849:156::-;14918:4;14935:40;14945:10;14957:9;14968:6;14935:9;:40::i;32662:2309::-;25575:10;25589:9;25575:23;25567:43;;;;;-1:-1:-1;;;25567:43:0;;;;;;;;;;;;-1:-1:-1;;;25567:43:0;;;;;;;;;;;;;;;22235:13;:18;;22252:1;22235:18;;;;;25729:14;;22235:13;;25723:3;:20;25719:285;;;25754:13;25770:25;25786:8;25770:15;:25::i;:::-;25754:41;;25804:14;25821:51;25866:5;25821:40;25834:6;;;;;;;;;-1:-1:-1;;;;;25834:6:0;-1:-1:-1;;;;;25834:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;25821:51:0;25895:11;;25804:68;;-1:-1:-1;25895:26:0;;25804:68;25895:26;:15;:26;:::i;:::-;25881:11;:40;25943:10;;:24;;25958:8;25943:24;:14;:24;:::i;:::-;25930:10;:37;-1:-1:-1;;25993:3:0;25976:14;:20;25719:285;32939:7;32935:349;;32962:14;:16;;;;;;;;:14;32987:13;;;:9;:13;;;;;;:31;;-1:-1:-1;;;;;32987:31:0;;-1:-1:-1;;;;;;32987:31:0;;;;;;33027:19;;:32;;;;;33049:10;33027:32;;;;32962:16;-1:-1:-1;32935:349:0;;;33095:14;;33090:2;:19;33082:47;;;;;-1:-1:-1;;;33082:47:0;;;;;;;;;;;;-1:-1:-1;;;33082:47:0;;;;;;;;;;;;;;;33146:13;;;;:9;:13;;;;;:21;-1:-1:-1;;;;;33146:32:0;;;:21;;:32;33138:65;;;;;-1:-1:-1;;;33138:65:0;;;;;;;;;;;;-1:-1:-1;;;33138:65:0;;;;;;;;;;;;;;;33220:13;;;;:9;:13;;;;;:19;;;-1:-1:-1;;;;;33220:19:0;33243:10;33220:33;33212:64;;;;;-1:-1:-1;;;33212:64:0;;;;;;;;;;;;-1:-1:-1;;;33212:64:0;;;;;;;;;;;;;;;33295:14;;;;;;;;33300:2;;33295:14;;;;;;;;;;33408:6;;:25;;;-1:-1:-1;;;33408:25:0;;-1:-1:-1;;;;;33408:25:0;;;;;;;;;:6;;;;;;;;:16;;:25;;;;;;;;;;;;;;;:6;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;33408:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33408:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33408:25:0;33400:51;;;;;-1:-1:-1;;;33400:51:0;;;;;;;;;;;;-1:-1:-1;;;33400:51:0;;;;;;;;;;;;;;;33466:9;;;:39;;-1:-1:-1;33479:6:0;;:26;;;-1:-1:-1;;;33479:26:0;;-1:-1:-1;;;;;33479:26:0;;;;;;;;;:6;;;;;;;;:17;;:26;;;;;;;;;;;;;;;:6;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;33479:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33479:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33479:26:0;33466:39;33458:80;;;;;-1:-1:-1;;;33458:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;33545:9;33557:25;33577:4;33557:15;33569:2;33557:11;:15::i;:25::-;33545:37;;33675:9;33700:21;33724:39;33758:4;33724:29;33745:7;;33724:29;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;33724:20:0;;-1:-1:-1;;;33724:29:0:i;:39::-;33700:63;;33800:21;:19;:21::i;:::-;33780:16;:41;;33772:87;;;;-1:-1:-1;;;33772:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33868:23;33894:43;33920:16;33894:21;:19;:21::i;:43::-;33868:69;;33946:51;33971:7;33980:16;33946:24;:51::i;:::-;34014:7;-1:-1:-1;;;;;34006:21:0;;34028:2;34032:10;34044:4;34050;;34006:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34006:49:0;-1:-1:-1;;;;;34006:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;34006:49:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34006:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34006:49:0;;;;34071:45;34097:18;34071:21;:19;:21::i;:45::-;34064:52;;26010:1;;34173:13;34189:41;34198:4;34204:25;34213:4;34219:9;34204:8;:25::i;:::-;34189:8;:41::i;:::-;34173:57;-1:-1:-1;34244:18:0;:4;34173:57;34244:18;:8;:18;:::i;:::-;34237:25;-1:-1:-1;34273:8:0;;34269:305;;34308:6;;;;;;;;;-1:-1:-1;;;;;34308:6:0;-1:-1:-1;;;;;34308:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34308:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34308:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34308:20:0;34300:28;;;34292:60;;;;;-1:-1:-1;;;34292:60:0;;;;;;;;;;;;-1:-1:-1;;;34292:60:0;;;;;;;;;;;;;;;34361:11;34383:7;-1:-1:-1;;;;;34375:23:0;;34399:2;34375:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34375:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34375:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34375:27:0;;;;;;;;;;;;;;;;34361:41;;34411:15;34429:6;;;;;;;;;-1:-1:-1;;;;;34429:6:0;-1:-1:-1;;;;;34429:17:0;;34447:7;34456:4;34429:32;;;;;;;;;;;;;-1:-1:-1;;;;;34429:32:0;-1:-1:-1;;;;;34429:32:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34429:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34429:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34429:32:0;;-1:-1:-1;34504:15:0;:4;34513:5;34504:15;:8;:15;:::i;:::-;34478:22;:6;34489:10;34478:22;:10;:22;:::i;:::-;:41;;34470:69;;;;;-1:-1:-1;;;34470:69:0;;;;;;;;;;;;-1:-1:-1;;;34470:69:0;;;;;;;;;;;;;;;34548:18;34557:2;34561:4;34548:8;:18::i;:::-;34269:305;;;34635:8;34628:4;:15;34624:74;;;34645:53;34670:10;34689:8;34682:4;:15;34645:24;:53::i;:::-;34745:16;:14;:16::i;:::-;34846:3;34830:12;;:19;;34822:69;;;;-1:-1:-1;;;34822:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34920:3;34906:10;;:17;;34898:67;;;;-1:-1:-1;;;34898:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26010:1;;;22300;22332:13;;22316:12;:29;22308:73;;;;;-1:-1:-1;;;22308:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22308:73:0;;;;;;;;;;;;;;35125:1222;25575:10;25589:9;25575:23;25567:43;;;;;-1:-1:-1;;;25567:43:0;;;;;;;;;;;;-1:-1:-1;;;25567:43:0;;;;;;;;;;;;;;;35172:1;25729:14;;25723:3;:20;25719:285;;;25754:13;25770:25;25786:8;25770:15;:25::i;:::-;25754:41;;25804:14;25821:51;25866:5;25821:40;25834:6;;;;;;;;;-1:-1:-1;;;;;25834:6:0;-1:-1:-1;;;;;25834:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;25821:51:0;25895:11;;25804:68;;-1:-1:-1;25895:26:0;;25804:68;25895:26;:15;:26;:::i;:::-;25881:11;:40;25943:10;;:24;;25958:8;25943:24;:14;:24;:::i;:::-;25930:10;:37;-1:-1:-1;;25993:3:0;25976:14;:20;25719:285;22235:13;:18;;22252:1;22235:18;;;;;:13;35283;;;:9;:13;;;;;35311;;;;35303:37;;;;;-1:-1:-1;;;35303:37:0;;;;;;;;;;;;-1:-1:-1;;;35303:37:0;;;;;;;;;;;;;;;35347:9;35359:15;35371:2;35359:11;:15::i;:::-;35403:11;;35395:31;;;-1:-1:-1;;;35395:31:0;;;;;;;;;;35347:27;;-1:-1:-1;35381:11:0;;-1:-1:-1;;;;;35403:11:0;;;;35395:27;;:31;;;;;;;;;;;;;;;35403:11;35395:31;;;5:2:-1;;;;30:1;27;20:12;5:2;35395:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35395:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35395:31:0;35451:6;;35469:11;;35451:36;;;-1:-1:-1;;;35451:36:0;;-1:-1:-1;;;;;35469:11:0;;;35451:36;;;;;;;;;;;;35395:31;;-1:-1:-1;;;35451:6:0;;;;;;;;:17;;:36;;;;;35395:31;;35451:36;;;;;;;;:6;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;35451:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35451:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35451:36:0;;-1:-1:-1;35527:15:0;:4;35536:5;35527:15;:8;:15;:::i;:::-;35502:22;:6;35513:10;35502:22;:10;:22;:::i;:::-;:40;35494:68;;;;;-1:-1:-1;;;35494:68:0;;;;;;;;;;;;-1:-1:-1;;;35494:68:0;;;;;;;;;;;;;;;35655:23;35681:21;:19;:21::i;:::-;35717:11;;35709:34;;;-1:-1:-1;;;35709:34:0;;;;;;;;;;35655:47;;-1:-1:-1;;;;;;35717:11:0;;;;35709:30;;:34;;;;;35717:11;;35709:34;;;;;;;;35717:11;;35709:34;;;5:2:-1;;;;30:1;27;20:12;5:2;35709:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35709:34:0;;;;35750:9;35762:45;35788:18;35762:21;:19;:21::i;:45::-;35750:57;;35814:10;35827:40;35861:5;35827:29;35836:6;;;;;;;;;-1:-1:-1;;;;;35836:6:0;-1:-1:-1;;;;;35836:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;35827:40:0;35814:53;-1:-1:-1;35874:9:0;35886:15;:4;35814:53;35886:15;:8;:15;:::i;:::-;35874:27;-1:-1:-1;35994:9:0;;35990:58;;36005:43;36030:10;36042:5;36005:24;:43::i;:::-;36055:9;36074:4;36067;:11;:29;;36095:1;36067:29;;;36088:4;36081;:11;36067:29;36055:41;-1:-1:-1;36107:8:0;;36103:55;;36142:9;;;;36117:41;;-1:-1:-1;;;;;36142:9:0;36153:4;36117:24;:41::i;:::-;36203:16;:14;:16::i;:::-;36231:33;;;;;;;;;;;;;;36240:10;;36236:2;;36231:33;;;;;;;;;;;36271:9;:20;36281:3;:9;;;;;;;;;;-1:-1:-1;;;;;36281:9:0;-1:-1:-1;;;;;36271:20:0;-1:-1:-1;;;;;36271:20:0;;;;;;;;;;;;36297:43;;;;;;;;36303:12;36297:43;;;;36317:2;36297:43;;;;36321:4;36297:43;;;;36327:6;36297:43;;;;36335:4;36297:43;;;36271:70;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;36271:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22300:1;;;;;;;;;22332:13;;22316:12;:29;22308:73;;;;;-1:-1:-1;;;22308:73:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22308:73:0;;;;;;;;;;;;;;31509:236;31553:10;31566:21;31576:10;31566:9;:21::i;:::-;31553:34;;31594:11;31608:49;31643:13;:11;:13::i;:::-;31608:30;31618:19;:17;:19::i;31608:49::-;31594:63;;31664:24;31670:10;31682:5;31664;:24::i;:::-;31695:44;31720:10;31732:6;31695:24;:44::i;15068:134::-;-1:-1:-1;;;;;15167:18:0;;;15140:7;15167:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15068:134::o;11887:30::-;;;-1:-1:-1;;;;;11887:30:0;;:::o;12662:177::-;12726:15;;-1:-1:-1;;;;;12726:15:0;12712:10;:29;12704:66;;;;;-1:-1:-1;;;12704:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12777:15;:28;;-1:-1:-1;;;;;;12777:28:0;;;;;;12812:8;:21;;;;;12823:10;12812:21;;;12662:177::o;29283:219::-;29344:4;29361:12;;29377:1;29361:17;29357:39;;;-1:-1:-1;29387:9:0;29380:16;;29357:39;29453:43;29483:12;;29453:25;29467:10;;29453:9;:13;;:25;;;;:::i;12451:118::-;12033:8;;-1:-1:-1;;;;;12033:8:0;12019:10;:22;12011:51;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;-1:-1:-1;;;12011:51:0;;;;;;;;;;;;;;;12529:15;:34;;-1:-1:-1;;;;;;12529:34:0;-1:-1:-1;;;;;12529:34:0;;;;;;;;;;12451:118::o;29657:220::-;29716:4;29733:12;;29749:1;29733:17;29729:37;;;-1:-1:-1;29759:7:0;29752:14;;29729:37;29823:48;29869:1;29823:41;29853:10;;29823:25;29835:12;;29823:7;:11;;:25;;;;:::i;25032:20::-;;;-1:-1:-1;;;;;25032:20:0;;:::o;20144:335::-;-1:-1:-1;;;;;20237:19:0;;20229:68;;;;-1:-1:-1;;;20229:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20316:21:0;;20308:68;;;;-1:-1:-1;;;20308:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20389:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;20440:31;;;;;;;;;;;;;;;;;20144:335;;;:::o;9447:184::-;9505:7;9538:1;9533;:6;;9525:49;;;;;-1:-1:-1;;;9525:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9597:5:0;;;9447:184::o;27860:452::-;27956:12;;27942:11;;27956:24;;-1:-1:-1;;;;;27956:12:0;:22;:24::i;:::-;27942:38;;27998:7;27990:6;:15;27987:320;;28007:12;;:45;;-1:-1:-1;;;;;28007:12:0;28033:9;28044:7;28007:45;:25;:45;:::i;:::-;27987:320;;;28073:41;28094:19;:7;28106:6;28094:19;:11;:19;:::i;:::-;28073:20;:41::i;:::-;28126:12;;28151:7;;28126:24;;-1:-1:-1;;;;;28126:12:0;:22;:24::i;:::-;:32;28123:176;;;28206:12;;28169:62;;28195:9;;28206:24;;-1:-1:-1;;;;;28206:12:0;:22;:24::i;:::-;28169:12;;-1:-1:-1;;;;;28169:12:0;;:62;;:25;:62;:::i;28123:176::-;28254:12;;:45;;-1:-1:-1;;;;;28254:12:0;28280:9;28291:7;28254:45;:25;:45;:::i;23099:349::-;23306:45;;;-1:-1:-1;;;;;23306:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;23306:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;23295:57:0;;;;23260:12;;23274:17;;23295:10;;;;23306:45;23295:57;;;25:18:-1;23295:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23295:57:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23259:93:0;;;;23367:7;:57;;;;-1:-1:-1;23379:11:0;;:16;;:44;;;23410:4;23399:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23399:24:0;23379:44;23359:83;;;;;-1:-1:-1;;;23359:83:0;;;;;;;;;;;;-1:-1:-1;;;23359:83:0;;;;;;;;;;;;;;;23099:349;;;;;:::o;3841:571::-;4259:4;4362:17;4399:7;3841:571;:::o;12170:120::-;3420:13;;;;;;;;:33;;;3437:16;:14;:16::i;:::-;3420:50;;;-1:-1:-1;3458:12:0;;;;3457:13;3420:50;3404:130;;;;-1:-1:-1;;;3404:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3543:19;3566:13;;;;;;3565:14;3586:85;;;;3615:13;:20;;-1:-1:-1;;;;3615:20:0;;;;;3644:19;3631:4;3644:19;;;3586:85;12228:8;:21;;-1:-1:-1;;;;;;12228:21:0;;;12239:10;12228:21;;;;12256:15;:28;;;;;;;3689:58;;;;3734:5;3718:21;;-1:-1:-1;;3718:21:0;;;3689:58;12170:120;:::o;21606:230::-;3420:13;;;;;;;;:33;;;3437:16;:14;:16::i;:::-;3420:50;;;-1:-1:-1;3458:12:0;;;;3457:13;3420:50;3404:130;;;;-1:-1:-1;;;3404:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3543:19;3566:13;;;;;;3565:14;3586:85;;;;3615:13;:20;;-1:-1:-1;;;;3615:20:0;;;;;3644:19;3631:4;3644:19;;;3586:85;21829:1;21813:13;:17;3689:58;;;;3734:5;3718:21;;-1:-1:-1;;3718:21:0;;;21606:230;:::o;26537:81::-;26596:5;;26571:12;;:41;;-1:-1:-1;;;;;26571:12:0;;;;26596:5;-1:-1:-1;;26571:41:0;:24;:41;:::i;:::-;26537:81::o;22472:129::-;22549:46;;;-1:-1:-1;;;22549:46:0;;22589:4;22549:46;;;;;;22529:4;;-1:-1:-1;;;;;22549:31:0;;;;;:46;;;;;;;;;;;;;;;:31;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;22549:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22549:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22549:46:0;;22472:129;-1:-1:-1;;22472:129:0:o;8991:181::-;9049:7;9081:5;;;9105:6;;;;9097:46;;;;;-1:-1:-1;;;9097:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9163:1;8991:181;-1:-1:-1;;;8991:181:0:o;18048:429::-;-1:-1:-1;;;;;18146:20:0;;18138:70;;;;-1:-1:-1;;;18138:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18227:23:0;;18219:71;;;;-1:-1:-1;;;18219:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18323:17:0;;;;;;:9;:17;;;;;;:29;;18345:6;18323:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;18303:17:0;;;;;;;:9;:17;;;;;;:49;;;;18386:20;;;;;;;:32;;18411:6;18386:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;18363:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;18434:35;;;;;;;18363:20;;18434:35;;;;;;;;;;;;;18048:429;;;:::o;22747:346::-;22952:45;;;-1:-1:-1;;;;;22952:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;22952:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;22941:57:0;;;;22906:12;;22920:17;;22941:10;;;;22952:45;22941:57;;;25:18:-1;22941:57:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;22941:57:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;22905:93:0;;;;23013:7;:57;;;;-1:-1:-1;23025:11:0;;:16;;:44;;;23056:4;23045:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23045:24:0;23025:44;23005:82;;;;;-1:-1:-1;;;23005:82:0;;;;;;;;;;;;-1:-1:-1;;;23005:82:0;;;;;;;;;;;;;;9882:470;9940:7;10184:6;10180:47;;-1:-1:-1;10214:1:0;10207:8;;10180:47;10251:5;;;10255:1;10251;:5;:1;10275:5;;;;;:10;10267:56;;;;-1:-1:-1;;;10267:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10820:333;10878:7;10977:1;10973;:5;10965:44;;;;;-1:-1:-1;;;10965:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11020:9;11036:1;11032;:5;;;;;;;10820:333;-1:-1:-1;;;;10820:333:0:o;31824:335::-;31929:12;;31894:4;;;;31929:24;;-1:-1:-1;;;;;31929:12:0;:22;:24::i;:::-;31906:47;;31974:1;31963:7;31971:1;31963:10;;;;;;;;;;;;;;:12;31960:85;;;31977:68;32007:10;32027:4;32034:7;32042:1;32034:10;;;;;;;;;;;;;;;;;;31977:12;;-1:-1:-1;;;;;31977:12:0;;:68;;;:29;:68;:::i;:::-;32076:12;;32052:21;;32076:24;;-1:-1:-1;;;;;32076:12:0;:22;:24::i;:::-;32052:48;-1:-1:-1;32115:37:0;32052:48;32136:15;32115:37;:20;:37;:::i;:::-;32107:46;31824:335;-1:-1:-1;;;;31824:335:0:o;18758:308::-;-1:-1:-1;;;;;18834:21:0;;18826:65;;;;;-1:-1:-1;;;18826:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18919:12;;:24;;18936:6;18919:24;:16;:24;:::i;:::-;18904:12;:39;-1:-1:-1;;;;;18975:18:0;;;;;;:9;:18;;;;;;:30;;18998:6;18975:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;18954:18:0;;;;;;:9;:18;;;;;;;;:51;;;;19021:37;;;;;;;18954:18;;;;19021:37;;;;;;;;;;18758:308;;:::o;26671:79::-;26725:5;;;;;;;;;-1:-1:-1;;;;;26725:5:0;-1:-1:-1;;;;;26712:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26712:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;19398:306:0;-1:-1:-1;;;;;19473:21:0;;19465:67;;;;-1:-1:-1;;;19465:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19560:12;;:23;;19577:5;19560:23;:16;:23;:::i;:::-;19545:12;:38;-1:-1:-1;;;;;19615:18:0;;;;;;:9;:18;;;;;;:29;;19638:5;19615:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;19594:18:0;;;;;;:9;:18;;;;;;;;:50;;;;19660:36;;;;;;;19594:18;;19660:36;;;;;;;;;;;19398:306;;:::o;36857:437::-;36905:4;36941:13;;;:9;:13;;;;;36978;;;;37002;;36998:291;;37026:12;37041:25;37056:9;37041:14;:25::i;:::-;37091:1;37075:13;;;:17;37116:12;;37026:40;;-1:-1:-1;37116:27:0;;37133:9;37116:27;:16;:27;:::i;:::-;37101:12;:42;37165:10;;:23;;37180:7;37165:23;:14;:23;:::i;:::-;37152:10;:36;37202:25;;;;;;;;37213:2;;37202:25;;;;;;;;;;37243:7;-1:-1:-1;37236:14:0;;-1:-1:-1;;37236:14:0;36998:291;37280:1;37273:8;;;;;;7671:106;7729:7;7760:1;7756;:5;:13;;7768:1;7756:13;;;-1:-1:-1;7764:1:0;;7749:20;-1:-1:-1;7671:106:0:o;36434:323::-;36491:20;36514:13;;;:9;:13;;;;;;36551:23;36566:7;36551:14;:23::i;:::-;36597:13;;;;36534:40;;-1:-1:-1;36597:28:0;;36534:40;36597:28;:17;:28;:::i;:::-;36581:13;;;:44;36647:12;;:27;;36664:9;36647:27;:16;:27;:::i;:::-;36632:12;:42;36694:10;;:23;;36709:7;36694:23;:14;:23;:::i;:::-;36681:10;:36;36729:22;;;;;;;;36737:2;;36729:22;;;;;;;;;;36434:323;;;;:::o;27514:252::-;27586:25;:23;:25::i;:::-;27576:7;:35;27573:187;;;27626:5;;27664:42;;;-1:-1:-1;;;27664:42:0;;;;-1:-1:-1;;;;;27626:5:0;;;;27613:28;;27642:72;;27664:49;;27626:5;;;;27664:40;;:42;;;;;;;;;;;;;;27626:5;27664:42;;;5:2:-1;;;;30:1;27;20:12;5:2;27664:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27664:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27664:42:0;;:49;:46;:49;:::i;:::-;27642:17;:7;27654:4;27642:17;:11;:17;:::i;:72::-;27613:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27613:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27613:102:0;;;;27573:187;;;27740:5;;;;;;;;;-1:-1:-1;;;;;27740:5:0;-1:-1:-1;;;;;27727:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27727:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;23454:401:0;23703:51;;;-1:-1:-1;;;;;23703:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;23703:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;23692:63:0;;;;23650:12;;23664:17;;23692:10;;;;23703:51;23692:63;;;25:18:-1;23692:63:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23692:63:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;23649:106:0;;;;23770:7;:57;;;;-1:-1:-1;23782:11:0;;:16;;:44;;;23813:4;23802:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23802:24:0;23782:44;23762:87;;;;;-1:-1:-1;;;23762:87:0;;;;;;;;;;;;-1:-1:-1;;;23762:87:0;;;;;;;;;;;;;;;23454:401;;;;;;:::o;24386:14345::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24386:14345:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24386:14345:0;;;-1:-1:-1;24386:14345:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://b95c0683914f71b7521494eaa42b2669eed3f422668321463aeb1f0004b6a13c
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.