ERC-20
Overview
Max Total Supply
98,506,129,548,726.873378506 MSC
Holders
106
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
13,129,560,000 MSCValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
MansionCashToken
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-06-03 */ pragma solidity 0.8.0; // SPDX-License-Identifier: Unlicensed /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } contract MansionCashToken is Context, Ownable, IERC20 { // Libraries using SafeMath for uint256; using Address for address; // Attributes for ERC-20 token string private _name = "MansionCash"; string private _symbol = "MSC"; uint8 private _decimals = 9; mapping (address => uint256) private _balance; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _total = 100000000 * 10**6 * 10**9; // cap 100,000B uint256 private maxTxAmount = 3450000 * 10**6 * 10**9; uint256 private numTokensSellToAddToLiquidity = 345000 * 10**6 * 10**9; uint256 private minHoldingThreshold = 50000 * 10**6 * 10**9; // 50B // MansionCash attributes uint8 public mansionTax = 6; uint8 public burnableFundRate = 3; uint8 public operationalFundRate = 1; uint256 public mansionFund; uint256 public burnableFund; uint256 public operationalFund; uint256 private largePrizeTotal = 0; uint256 private mediumPrizeTotal = 0; uint256 private smallPrizeTotal = 0; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; bool public transactionFee = false; IUniswapV2Router02 public immutable uniSwapV2Router; address public immutable uniswapV2Pair; struct Entity { address _key; bool _isValid; uint256 _createdAt; } mapping (address => uint256) private addressToIndex; mapping (uint256 => Entity) private indexToEntity; uint256 private lastIndexUsed = 0; uint256 private lastEntryAllowed = 0; uint32 public perBatchSize = 100; event GrandPrizeReceivedAddresses ( address addressReceived, uint256 amount ); event MediumPrizeReceivedAddresses ( address[] addressesReceived, uint256 amount ); event SmallPrizePayoutComplete ( uint256 amount ); event SwapAndLiquifyEnabledUpdated(bool enabled); event TransactionFeeEnableUpdated(bool enabled ); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event OperationalFundWithdrawn( uint256 amount, address recepient, string reason ); event StartMansion ( uint256 largePrizeTotal, uint256 mediumPrizeTotal, uint256 lowPrizeTotal ); constructor () { _balance[_msgSender()] = _total; addEntity(_msgSender()); mansionFund = 0; burnableFund = 0; operationalFund = 0; inSwapAndLiquify = false; IUniswapV2Router02 _UniSwapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); uniswapV2Pair = IUniswapV2Factory(_UniSwapV2Router.factory()) .createPair(address(this), _UniSwapV2Router.WETH()); uniSwapV2Router = _UniSwapV2Router; emit Transfer(address(0), _msgSender(), _total); } modifier lockTheSwap { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } // --- section 1 --- : Standard ERC 20 functions function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _total; } function balanceOf(address account) public view override returns (uint256) { return _balance[account]; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } // --- section 2 --- : MansionCash specific logics function burnToken(uint256 amount) public onlyOwner virtual { require(amount <= _balance[address(this)], "Cannot burn more than avilable balancec"); require(amount <= burnableFund, "Cannot burn more than burn fund"); _balance[address(this)] = _balance[address(this)].sub(amount); _total = _total.sub(amount); burnableFund = burnableFund.sub(amount); emit Transfer(address(this), address(0), amount); } function getCommunityMansionCashFund() public view returns (uint256) { uint256 communityFund = burnableFund.add(mansionFund).add(operationalFund); return communityFund; } function getminHoldingThreshold() public view returns (uint256) { return minHoldingThreshold; } function getMaxTxnAmount() public view returns (uint256) { return maxTxAmount; } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } function setTransactionFee(bool _enabled) public onlyOwner { transactionFee = _enabled; emit TransactionFeeEnableUpdated(_enabled); } function setminHoldingThreshold(uint256 amount) public onlyOwner { minHoldingThreshold = amount; } function setMaxTxnAmount(uint256 amount) public onlyOwner { maxTxAmount = amount; } function setBatchSize(uint32 newSize) public onlyOwner { perBatchSize = newSize; } function withdrawOperationFund(uint256 amount, address walletAddress, string memory reason) public onlyOwner() { require(amount < operationalFund, "You cannot withdraw more funds that you have in mansion fund"); require(amount <= _balance[address(this)], "You cannot withdraw more funds that you have in operation fund"); // track operation fund after withdrawal operationalFund = operationalFund.sub(amount); _balance[address(this)] = _balance[address(this)].sub(amount); _balance[walletAddress] = _balance[walletAddress].add(amount); emit OperationalFundWithdrawn(amount, walletAddress, reason); } function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap { uint256 half = contractTokenBalance.div(2); uint256 otherHalf = contractTokenBalance.sub(half); uint256 initialBalance = address(this).balance; swapTokensForEth(half); uint256 newBalance = address(this).balance.sub(initialBalance); addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function swapTokensForEth(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniSwapV2Router.WETH(); _approve(address(this), address(uniSwapV2Router), tokenAmount); // make the swap uniSwapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } //to recieve WETH from Uniswap when swaping receive() external payable {} function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniSwapV2Router), tokenAmount); // add the liquidity uniSwapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ); } // --- section 3 --- : Executions function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _transfer(address fromAddress, address toAddress, uint256 amount) private { require(fromAddress != address(0) && toAddress != address(0), "ERC20: transfer from/to the zero address"); require(amount > 0 && amount <= _balance[fromAddress], "Transfer amount invalid"); if(fromAddress != owner() && toAddress != owner()) require(amount <= maxTxAmount, "Transfer amount exceeds the maxTxAmount."); // This is contract's balance without any reserved funds such as mansion Fund uint256 contractTokenBalance = balanceOf(address(this)).sub(getCommunityMansionCashFund()); bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity; // Dynamically hydrate LP. Standard practice in recent altcoin if ( overMinTokenBalance && !inSwapAndLiquify && fromAddress != uniswapV2Pair && swapAndLiquifyEnabled ) { contractTokenBalance = numTokensSellToAddToLiquidity; swapAndLiquify(contractTokenBalance); } _balance[fromAddress] = _balance[fromAddress].sub(amount); uint256 transactionTokenAmount = _getValues(amount); _balance[toAddress] = _balance[toAddress].add(transactionTokenAmount); // Add and remove wallet address from MANSION eligibility if (_balance[toAddress] >= minHoldingThreshold && toAddress != address(this)){ addEntity(toAddress); } if (_balance[fromAddress] < minHoldingThreshold && fromAddress != address(this)) { removeEntity(fromAddress); } shuffleEntities(amount, transactionTokenAmount); emit Transfer(fromAddress, toAddress, transactionTokenAmount); } function _getValues(uint256 amount) private returns (uint256) { // if not charge fee transaction. if (!transactionFee ){ return amount ; } uint256 mansionTaxFee = _extractMansionFund(amount); uint256 operationalTax = _extractOperationalFund(amount); uint256 burnableFundTax = _extractBurnableFund(amount); uint256 businessTax = operationalTax.add(burnableFundTax).add(mansionTaxFee); uint256 transactionAmount = amount.sub(businessTax); return transactionAmount; } function _extractMansionFund(uint256 amount) private returns (uint256) { uint256 mansionFundContribution = _getExtractableFund(amount, mansionTax); mansionFund = mansionFund.add(mansionFundContribution); _balance[address(this)] = _balance[address(this)].add(mansionFundContribution); return mansionFundContribution; } function _extractOperationalFund(uint256 amount) private returns (uint256) { (uint256 operationalFundContribution) = _getExtractableFund(amount, operationalFundRate); operationalFund = operationalFund.add(operationalFundContribution); _balance[address(this)] = _balance[address(this)].add(operationalFundContribution); return operationalFundContribution; } function _extractBurnableFund(uint256 amount) private returns (uint256) { (uint256 burnableFundContribution) = _getExtractableFund(amount, burnableFundRate); burnableFund = burnableFund.add(burnableFundContribution); _balance[address(this)] = _balance[address(this)].add(burnableFundContribution); return burnableFundContribution; } function _getExtractableFund(uint256 amount, uint8 rate) private pure returns (uint256) { return amount.mul(rate).div(10**2); } // --- Section 4 --- : MANSION functions. // Off-chain bot calls payoutLargeRedistribution, payoutMediumRedistribution, payoutSmallRedistribution in order function startMansion() public onlyOwner returns (bool success) { require (mansionFund > 0, "fund too small"); largePrizeTotal = mansionFund.div(4); mediumPrizeTotal = mansionFund.div(2); smallPrizeTotal = mansionFund.sub(largePrizeTotal).sub(mediumPrizeTotal); lastEntryAllowed = lastIndexUsed; emit StartMansion(largePrizeTotal, mediumPrizeTotal, smallPrizeTotal); return true; } function payoutLargeRedistribution() public onlyOwner() returns (bool success) { require (lastEntryAllowed != 0, "MANSION must be initiated before this function can be called."); uint256 seed = 48; uint256 largePrize = largePrizeTotal; // Uses random number generator from timestamp. However, nobody should know what order addresses are stored due to shffle uint randNum = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, seed))) % lastEntryAllowed; Entity memory bigPrizeEligibleEntity = getEntity(randNum, false); while (bigPrizeEligibleEntity._isValid != true) { // Uses random number generator from timestamp. However, nobody should know what order addresses are stored due to shffle randNum = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, seed))) % lastEntryAllowed; bigPrizeEligibleEntity = getEntity(randNum, false); } address bigPrizeEligibleAddress = bigPrizeEligibleEntity._key; mansionFund = mansionFund.sub(largePrize); _balance[bigPrizeEligibleAddress] = _balance[bigPrizeEligibleAddress].add(largePrize); _balance[address(this)] = _balance[address(this)].sub(largePrize); largePrizeTotal = 0; emit GrandPrizeReceivedAddresses(bigPrizeEligibleAddress, largePrize); return true; } function payoutMediumRedistribution() public onlyOwner() returns (bool success) { require (lastEntryAllowed != 0, "MANSION must be initiated before this function can be called."); // Should be executed after grand prize is received uint256 mediumPrize = mediumPrizeTotal; uint256 eligibleHolderCount = 100; uint256 totalDisbursed = 0; uint256 seed = 48; address[] memory eligibleAddresses = new address[](100); uint8 counter = 0; // Not likely scenarios where there are less than 100 eligible accounts if (lastEntryAllowed <= 100) { // If eligible acccount counts are less than 100, evenly split eligibleHolderCount = lastEntryAllowed; mediumPrize = mediumPrize.div(eligibleHolderCount); while (counter < eligibleHolderCount) { if (indexToEntity[counter + 1]._isValid) { eligibleAddresses[counter] = indexToEntity[counter + 1]._key; totalDisbursed = totalDisbursed.add(mediumPrize); _balance[indexToEntity[counter + 1]._key] = _balance[indexToEntity[counter + 1]._key].add(mediumPrize); counter++; } seed = seed.add(1); } mansionFund = mansionFund.sub(totalDisbursed); _balance[address(this)] = _balance[address(this)].sub(totalDisbursed); // This may be different from totalDisbursed depending on number of eligible accounts. // The primary use of this attribute is more of a flag to indicate the medium prize is disbursed fully. mediumPrizeTotal = 0; emit MediumPrizeReceivedAddresses(eligibleAddresses, mediumPrize); return true; } mediumPrize = mediumPrize.div(eligibleHolderCount); // Max iteration should never be comparably larger than 100 due to how the addresses and indexes are used. while (counter < eligibleHolderCount) { // Uses random number generator from timestamp. However, nobody should know what order addresses are stored due to shffle uint randNum = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, seed))) % lastEntryAllowed; if (indexToEntity[randNum]._isValid) { eligibleAddresses[counter] = indexToEntity[randNum]._key; totalDisbursed = totalDisbursed.add(mediumPrize); _balance[indexToEntity[randNum]._key] = _balance[indexToEntity[randNum]._key].add(mediumPrize); counter++; } seed = seed.add(1); } mansionFund = mansionFund.sub(totalDisbursed); _balance[address(this)] = _balance[address(this)].sub(totalDisbursed); // This may be different from totalDisbursed depending on number of eligible accounts. // The primary use of this attribute is more of a flag to indicate the medium prize is disbursed fully. mediumPrizeTotal = 0; emit MediumPrizeReceivedAddresses(eligibleAddresses, mediumPrize); return true; } function payoutSmallRedistribution(uint256 startIndex) public onlyOwner() returns (bool success) { require (lastEntryAllowed != 0 && startIndex > 0, "Medium prize must be disbursed before this one"); uint256 rewardAmount = smallPrizeTotal.div(lastEntryAllowed); uint256 totalDisbursed = 0; for (uint256 i = startIndex; i < startIndex + perBatchSize; i++) { if (mansionFund < rewardAmount) { break; } // Timestamp being used to prevent duplicate rewards if (indexToEntity[i]._isValid == true) { _balance[indexToEntity[i]._key] = _balance[indexToEntity[i]._key].add(rewardAmount); totalDisbursed = totalDisbursed.add(rewardAmount); } if (i == lastEntryAllowed) { emit SmallPrizePayoutComplete(rewardAmount); smallPrizeTotal = 0; break; } } mansionFund = mansionFund.sub(totalDisbursed); _balance[address(this)] = _balance[address(this)].sub(totalDisbursed); return true; } function EndMansion() public onlyOwner returns (bool success) { // Checking this equates to ALL redistribution events are completed. require (lastEntryAllowed != 0, "All prizes must be disbursed before being able to close MANSION"); smallPrizeTotal = 0; mediumPrizeTotal = 0; largePrizeTotal = 0; lastEntryAllowed = 0; return true; } // --- Section 5 --- function addEntity (address walletAddress) private { if (addressToIndex[walletAddress] != 0) { return; } uint256 index = lastIndexUsed.add(1); indexToEntity[index] = Entity({ _key: walletAddress, _isValid: true, _createdAt: block.timestamp }); addressToIndex[walletAddress] = index; lastIndexUsed = index; } function removeEntity (address walletAddress) private { if (addressToIndex[walletAddress] == 0) { return; } uint256 index = addressToIndex[walletAddress]; addressToIndex[walletAddress] = 0; if (index != lastIndexUsed) { indexToEntity[index] = indexToEntity[lastIndexUsed]; addressToIndex[indexToEntity[lastIndexUsed]._key] = index; } indexToEntity[lastIndexUsed]._isValid = false; lastIndexUsed = lastIndexUsed.sub(1); } function shuffleEntities(uint256 intA, uint256 intB) private { // Interval of 1 to lastIndexUsed - 1 intA = intA.mod(lastIndexUsed - 1) + 1; intB = intB.mod(lastIndexUsed - 1) + 1; Entity memory entityA = indexToEntity[intA]; Entity memory entityB = indexToEntity[intB]; if (entityA._isValid && entityB._isValid) { addressToIndex[entityA._key] = intB; addressToIndex[entityB._key] = intA; indexToEntity[intA] = entityB; indexToEntity[intB] = entityA; } } function getEntityListLength () public view returns (uint256) { return lastIndexUsed; } function getEntity (uint256 index, bool shouldReject) private view returns (Entity memory) { if (shouldReject == true) { require(index <= getEntityListLength(), "Index out of range"); } return indexToEntity[index]; } function getEntityTimeStamp (address walletAddress) public view returns (uint256) { require (addressToIndex[walletAddress] != 0, "Empty!"); return indexToEntity[addressToIndex[walletAddress]]._createdAt; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addressReceived","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"GrandPrizeReceivedAddresses","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"addressesReceived","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MediumPrizeReceivedAddresses","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"recepient","type":"address"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"OperationalFundWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SmallPrizePayoutComplete","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"largePrizeTotal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mediumPrizeTotal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lowPrizeTotal","type":"uint256"}],"name":"StartMansion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapAndLiquifyEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"TransactionFeeEnableUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"EndMansion","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnableFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnableFundRate","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCommunityMansionCashFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEntityListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"}],"name":"getEntityTimeStamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTxnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getminHoldingThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mansionFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mansionTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationalFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationalFundRate","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payoutLargeRedistribution","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"payoutMediumRedistribution","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"}],"name":"payoutSmallRedistribution","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"perBatchSize","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newSize","type":"uint32"}],"name":"setBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setTransactionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setminHoldingThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMansion","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniSwapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"walletAddress","type":"address"},{"internalType":"string","name":"reason","type":"string"}],"name":"withdrawOperationFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610100604052600b60c08190526a09ac2dce6d2dedc86c2e6d60ab1b60e09081526200002f91600191906200049e565b50604080518082019091526003808252624d534360e81b60209092019182526200005c916002916200049e565b506003805460ff19908116600990811790925569152d02c7e14af6800000600690815568bb065e311dd9a800006007556812b3d6381c95c400006008556802b5e3af16b1880000909255600a805462ff00001961030061ff0019929094169094178116929092178316620100001790556000600e819055600f81905560108190556011805490921661010017909216905560148190556015556016805463ffffffff191660641790553480156200011257600080fd5b5060006200011f620003bf565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600654600460006200017a620003bf565b6001600160a01b03168152602081019190915260400160002055620001a8620001a2620003bf565b620003c3565b6000600b819055600c819055600d556011805460ff191690556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91829163c45a015591600480820192602092909190829003018186803b1580156200021057600080fd5b505afa15801562000225573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024b919062000544565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200029457600080fd5b505afa158015620002a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002cf919062000544565b6040518363ffffffff1660e01b8152600401620002ee9291906200056d565b602060405180830381600087803b1580156200030957600080fd5b505af11580156200031e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000344919062000544565b6001600160601b0319606091821b811660a0529082901b1660805262000369620003bf565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600654604051620003b0919062000587565b60405180910390a350620005f2565b3390565b6001600160a01b03811660009081526012602052604090205415620003e85762000486565b60006200040760016014546200048960201b620019d31790919060201c565b604080516060810182526001600160a01b0385811680835260016020808501828152428688019081526000898152601384528881209751885493516001600160a01b031990941697169690961760ff60a01b1916600160a01b921515929092029190911786555194909101939093558152601290915220819055601455505b50565b600062000497828462000590565b9392505050565b828054620004ac90620005b5565b90600052602060002090601f016020900481019282620004d057600085556200051b565b82601f10620004eb57805160ff19168380011785556200051b565b828001600101855582156200051b579182015b828111156200051b578251825591602001919060010190620004fe565b50620005299291506200052d565b5090565b5b808211156200052957600081556001016200052e565b60006020828403121562000556578081fd5b81516001600160a01b038116811462000497578182fd5b6001600160a01b0392831681529116602082015260400190565b90815260200190565b60008219821115620005b057634e487b7160e01b81526011600452602481fd5b500190565b600281046001821680620005ca57607f821691505b60208210811415620005ec57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c60a05160601c6130f762000648600039600081816109dc0152611bd801526000818161104b015281816122bc01528181612392015281816123ce01528181612448015261246f01526130f76000f3fe6080604052600436106102555760003560e01c80639381099a11610139578063b9fc823a116100b6578063d78c67c51161007a578063d78c67c514610648578063d9bf0d221461065d578063dd62ed3e1461067d578063deb3cdf81461069d578063ea54340d146106b2578063f2fde38b146106c75761025c565b8063b9fc823a146105c9578063ba3d9f01146105e9578063c49b9a80146105fe578063c956e0c31461061e578063ccb2abf3146106335761025c565b8063a457c2d7116100fd578063a457c2d71461054a578063a63b7f981461056a578063a8246ef31461057f578063a9059cbb14610594578063b7e73a96146105b45761025c565b80639381099a146104c957806395d89b41146104eb57806399501663146105005780639ed3edf014610520578063a3346f16146105355761025c565b80634b433e0f116101d257806370a082311161019657806370a082311461041f578063715018a61461043f57806374010ece146104545780637b47ec1a146104745780638da5cb5b146104945780638ff0ab7f146104a95761025c565b80634b433e0f146103a95780634dacc6a6146103be5780635fc3a2c9146103d357806369818738146103f55780636a4b05ad1461040a5761025c565b8063313ce56711610219578063313ce56714610310578063395093511461033257806343023cfa1461035257806349bd5a5e146103725780634a74bb02146103945761025c565b806306fdde0314610261578063095ea7b31461028c5780631547f823146102b957806318160ddd146102ce57806323b872dd146102f05761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b506102766106e7565b60405161028391906129d0565b60405180910390f35b34801561029857600080fd5b506102ac6102a7366004612712565b61077a565b60405161028391906129c5565b3480156102c557600080fd5b506102ac610797565b3480156102da57600080fd5b506102e3610891565b6040516102839190612e5f565b3480156102fc57600080fd5b506102ac61030b3660046126d2565b610897565b34801561031c57600080fd5b5061032561091e565b6040516102839190612efe565b34801561033e57600080fd5b506102ac61034d366004612712565b610927565b34801561035e57600080fd5b506102e361036d366004612662565b610975565b34801561037e57600080fd5b506103876109da565b604051610283919061293b565b3480156103a057600080fd5b506102ac6109fe565b3480156103b557600080fd5b506102e3610a0c565b3480156103ca57600080fd5b506102e3610a12565b3480156103df57600080fd5b506103f36103ee366004612775565b610a18565b005b34801561040157600080fd5b50610325610b5a565b34801561041657600080fd5b506102e3610b63565b34801561042b57600080fd5b506102e361043a366004612662565b610b69565b34801561044b57600080fd5b506103f3610b84565b34801561046057600080fd5b506103f361046f36600461275d565b610c0d565b34801561048057600080fd5b506103f361048f36600461275d565b610c51565b3480156104a057600080fd5b50610387610d6b565b3480156104b557600080fd5b506103f36104c4366004612861565b610d7a565b3480156104d557600080fd5b506104de610dd5565b6040516102839190612eed565b3480156104f757600080fd5b50610276610de1565b34801561050c57600080fd5b506102ac61051b36600461275d565b610df0565b34801561052c57600080fd5b506102ac610fcc565b34801561054157600080fd5b506102e3610fdb565b34801561055657600080fd5b506102ac610565366004612712565b610fe1565b34801561057657600080fd5b50610387611049565b34801561058b57600080fd5b506102ac61106d565b3480156105a057600080fd5b506102ac6105af366004612712565b61123d565b3480156105c057600080fd5b506102ac611251565b3480156105d557600080fd5b506103f36105e436600461273d565b6112cb565b3480156105f557600080fd5b506102e361135a565b34801561060a57600080fd5b506103f361061936600461273d565b611360565b34801561062a57600080fd5b506103256113e2565b34801561063f57600080fd5b506102ac6113f0565b34801561065457600080fd5b50610325611863565b34801561066957600080fd5b506103f361067836600461275d565b611872565b34801561068957600080fd5b506102e361069836600461269a565b6118b6565b3480156106a957600080fd5b506102e36118e1565b3480156106be57600080fd5b506102e36118e7565b3480156106d357600080fd5b506103f36106e2366004612662565b611913565b6060600180546106f690612f93565b80601f016020809104026020016040519081016040528092919081815260200182805461072290612f93565b801561076f5780601f106107445761010080835404028352916020019161076f565b820191906000526020600020905b81548152906001019060200180831161075257829003601f168201915b505050505090505b90565b600061078e6107876119e6565b84846119ea565b50600192915050565b60006107a16119e6565b6001600160a01b03166107b2610d6b565b6001600160a01b0316146107e15760405162461bcd60e51b81526004016107d890612ce7565b60405180910390fd5b6000600b54116108035760405162461bcd60e51b81526004016107d890612de9565b600b54610811906004611a9e565b600e55600b54610822906002611a9e565b600f819055600e54600b54610842929161083c9190611aaa565b90611aaa565b6010819055601454601555600e54600f546040517fdfa0ea68b2b3b9756112a42ef782ce284fda97e3c5a0e9eac2d5cf2497b0cfa993610883939291612ed7565b60405180910390a150600190565b60065490565b60006108a4848484611ab6565b610914846108b06119e6565b61090f85604051806060016040528060288152602001613075602891396001600160a01b038a166000908152600560205260408120906108ee6119e6565b6001600160a01b031681526020810191909152604001600020549190611d81565b6119ea565b5060019392505050565b60035460ff1690565b600061078e6109346119e6565b8461090f85600560006109456119e6565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906119d3565b6001600160a01b0381166000908152601260205260408120546109aa5760405162461bcd60e51b81526004016107d890612b8e565b506001600160a01b038116600090815260126020908152604080832054835260139091529020600101545b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601154610100900460ff1681565b60095490565b600b5481565b610a206119e6565b6001600160a01b0316610a31610d6b565b6001600160a01b031614610a575760405162461bcd60e51b81526004016107d890612ce7565b600d548310610a785760405162461bcd60e51b81526004016107d890612bae565b30600090815260046020526040902054831115610aa75760405162461bcd60e51b81526004016107d890612c8a565b600d54610ab49084611aaa565b600d5530600090815260046020526040902054610ad19084611aaa565b30600090815260046020526040808220929092556001600160a01b03841681522054610afd90846119d3565b6001600160a01b0383166000908152600460205260409081902091909155517f3f650de7ee2e52a67d67738174f630780c286b09585da256f97334e3764bb95490610b4d90859085908590612e68565b60405180910390a1505050565b600a5460ff1681565b60145490565b6001600160a01b031660009081526004602052604090205490565b610b8c6119e6565b6001600160a01b0316610b9d610d6b565b6001600160a01b031614610bc35760405162461bcd60e51b81526004016107d890612ce7565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610c156119e6565b6001600160a01b0316610c26610d6b565b6001600160a01b031614610c4c5760405162461bcd60e51b81526004016107d890612ce7565b600755565b610c596119e6565b6001600160a01b0316610c6a610d6b565b6001600160a01b031614610c905760405162461bcd60e51b81526004016107d890612ce7565b30600090815260046020526040902054811115610cbf5760405162461bcd60e51b81526004016107d890612a1a565b600c54811115610ce15760405162461bcd60e51b81526004016107d8906129e3565b30600090815260046020526040902054610cfb9082611aaa565b30600090815260046020526040902055600654610d189082611aaa565b600655600c54610d289082611aaa565b600c5560405160009030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610d60908590612e5f565b60405180910390a350565b6000546001600160a01b031690565b610d826119e6565b6001600160a01b0316610d93610d6b565b6001600160a01b031614610db95760405162461bcd60e51b81526004016107d890612ce7565b6016805463ffffffff191663ffffffff92909216919091179055565b60165463ffffffff1681565b6060600280546106f690612f93565b6000610dfa6119e6565b6001600160a01b0316610e0b610d6b565b6001600160a01b031614610e315760405162461bcd60e51b81526004016107d890612ce7565b60155415801590610e425750600082115b610e5e5760405162461bcd60e51b81526004016107d890612e11565b6000610e77601554601054611a9e90919063ffffffff16565b90506000835b601654610e909063ffffffff1686612f0c565b811015610f875782600b541015610ea657610f87565b600081815260136020526040902054600160a01b900460ff16151560011415610f2a576000818152601360209081526040808320546001600160a01b031683526004909152902054610ef890846119d3565b6000828152601360209081526040808320546001600160a01b031683526004909152902055610f2782846119d3565b91505b601554811415610f75577fad8fb82b9a19477e4da24a41f430d3fd63316dc555145f1bcc7f087d1d4734c883604051610f639190612e5f565b60405180910390a16000601055610f87565b80610f7f81612fce565b915050610e7d565b50600b54610f959082611aaa565b600b5530600090815260046020526040902054610fb29082611aaa565b306000908152600460205260409020555060019392505050565b60115462010000900460ff1681565b600d5481565b600061078e610fee6119e6565b8461090f8560405180606001604052806025815260200161309d60259139600560006110186119e6565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611d81565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006110776119e6565b6001600160a01b0316611088610d6b565b6001600160a01b0316146110ae5760405162461bcd60e51b81526004016107d890612ce7565b6015546110cd5760405162461bcd60e51b81526004016107d890612b31565b600e54601554604051603092916000916110ef90429033908790602001612913565b6040516020818303038152906040528051906020012060001c6111129190613009565b90506000611121826000611dad565b90505b602081015115156001146111815760155442338660405160200161114a93929190612913565b6040516020818303038152906040528051906020012060001c61116d9190613009565b915061117a826000611dad565b9050611124565b8051600b546111909085611aaa565b600b556001600160a01b0381166000908152600460205260409020546111b690856119d3565b6001600160a01b0382166000908152600460205260408082209290925530815220546111e29085611aaa565b3060009081526004602052604080822092909255600e55517f04df60a8ea19ecabae271ed2448d3afc69571f168ac354f2a130a1b2ff4d603490611229908390879061294f565b60405180910390a160019550505050505090565b600061078e61124a6119e6565b8484611ab6565b600061125b6119e6565b6001600160a01b031661126c610d6b565b6001600160a01b0316146112925760405162461bcd60e51b81526004016107d890612ce7565b6015546112b15760405162461bcd60e51b81526004016107d890612d8c565b5060006010819055600f819055600e819055601555600190565b6112d36119e6565b6001600160a01b03166112e4610d6b565b6001600160a01b03161461130a5760405162461bcd60e51b81526004016107d890612ce7565b6011805462ff0000191662010000831515021790556040517f3d03df5d847f027c3787d73bf05d591ea114c9ec9cd05aa5b91cd29c2ac05da69061134f9083906129c5565b60405180910390a150565b60075490565b6113686119e6565b6001600160a01b0316611379610d6b565b6001600160a01b03161461139f5760405162461bcd60e51b81526004016107d890612ce7565b6011805461ff001916610100831515021790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061134f9083906129c5565b600a54610100900460ff1681565b60006113fa6119e6565b6001600160a01b031661140b610d6b565b6001600160a01b0316146114315760405162461bcd60e51b81526004016107d890612ce7565b6015546114505760405162461bcd60e51b81526004016107d890612b31565b600f54604080516064808252610ca0820190925260009060309082908460208201610c8080368337019050509050600060646015541161168d5760155494506114998686611a9e565b95505b848160ff16101561160557601360006114b6836001612f24565b60ff9081168252602082019290925260400160002054600160a01b900416156115f357601360006114e8836001612f24565b60ff16815260200190815260200160002060000160009054906101000a90046001600160a01b0316828260ff168151811061153357634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015261155584876119d3565b93506115a3866004600060138161156d876001612f24565b60ff16815260208082019290925260409081016000908120546001600160a01b03168452918301939093529101902054906119d3565b600460006013816115b5866001612f24565b60ff16815260208082019290925260409081016000908120546001600160a01b03168452918301939093529101902055806115ef81612fe9565b9150505b6115fe8360016119d3565b925061149c565b600b546116129085611aaa565b600b553060009081526004602052604090205461162f9085611aaa565b3060009081526004602052604080822092909255600f55517fed39fa52e1344d828af771e58862d95bc9b17499836a5c2a3db2b7c4bf18fd549061167690849089906129a3565b60405180910390a160019650505050505050610777565b6116978686611a9e565b95505b848160ff1610156117dd5760006015544233866040516020016116bf93929190612913565b6040516020818303038152906040528051906020012060001c6116e29190613009565b600081815260136020526040902054909150600160a01b900460ff16156117ca5760008181526013602052604090205483516001600160a01b0390911690849060ff851690811061174357634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015261176585886119d3565b6000828152601360209081526040808320546001600160a01b03168352600490915290205490955061179790886119d3565b6000828152601360209081526040808320546001600160a01b031683526004909152902055816117c681612fe9565b9250505b6117d58460016119d3565b93505061169a565b600b546117ea9085611aaa565b600b55306000908152600460205260409020546118079085611aaa565b3060009081526004602052604080822092909255600f55517fed39fa52e1344d828af771e58862d95bc9b17499836a5c2a3db2b7c4bf18fd549061184e90849089906129a3565b60405180910390a16001965050505050505090565b600a5462010000900460ff1681565b61187a6119e6565b6001600160a01b031661188b610d6b565b6001600160a01b0316146118b15760405162461bcd60e51b81526004016107d890612ce7565b600955565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b600c5481565b60008061190d600d54611907600b54600c546119d390919063ffffffff16565b906119d3565b91505090565b61191b6119e6565b6001600160a01b031661192c610d6b565b6001600160a01b0316146119525760405162461bcd60e51b81526004016107d890612ce7565b6001600160a01b0381166119785760405162461bcd60e51b81526004016107d890612a61565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006119df8284612f0c565b9392505050565b3390565b6001600160a01b038316611a105760405162461bcd60e51b81526004016107d890612d1c565b6001600160a01b038216611a365760405162461bcd60e51b81526004016107d890612aa7565b6001600160a01b0380841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611a91908590612e5f565b60405180910390a3505050565b60006119df8284612f49565b60006119df8284612f7c565b6001600160a01b03831615801590611ad657506001600160a01b03821615155b611af25760405162461bcd60e51b81526004016107d890612ae9565b600081118015611b1a57506001600160a01b0383166000908152600460205260409020548111155b611b365760405162461bcd60e51b81526004016107d890612c53565b611b3e610d6b565b6001600160a01b0316836001600160a01b031614158015611b785750611b62610d6b565b6001600160a01b0316826001600160a01b031614155b15611b9f57600754811115611b9f5760405162461bcd60e51b81526004016107d890612c0b565b6000611bb5611bac6118e7565b61083c30610b69565b60085490915081108015908190611bcf575060115460ff16155b8015611c0d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b8015611c205750601154610100900460ff165b15611c33576008549150611c3382611e32565b6001600160a01b038516600090815260046020526040902054611c569084611aaa565b6001600160a01b038616600090815260046020526040812091909155611c7b84611eca565b6001600160a01b038616600090815260046020526040902054909150611ca190826119d3565b6001600160a01b038616600090815260046020526040902081905560095411801590611cd657506001600160a01b0385163014155b15611ce457611ce485611f34565b6009546001600160a01b038716600090815260046020526040902054108015611d1657506001600160a01b0386163014155b15611d2457611d2486611fea565b611d2e84826120db565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611d719190612e5f565b60405180910390a3505050505050565b60008184841115611da55760405162461bcd60e51b81526004016107d891906129d0565b505050900390565b611db5612642565b60018215151415611de757611dc8610b63565b831115611de75760405162461bcd60e51b81526004016107d890612d60565b5050600090815260136020908152604091829020825160608101845281546001600160a01b0381168252600160a01b900460ff16151592810192909252600101549181019190915290565b6011805460ff191660011790556000611e4c826002611a9e565b90506000611e5a8383611aaa565b905047611e6683612257565b6000611e724783611aaa565b9050611e7e8382612442565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051611eb193929190612ed7565b60405180910390a150506011805460ff19169055505050565b60115460009062010000900460ff16611ee45750806109d5565b6000611eef83612525565b90506000611efc8461257e565b90506000611f09856125c7565b90506000611f1b8461190785856119d3565b90506000611f298783611aaa565b979650505050505050565b6001600160a01b03811660009081526012602052604090205415611f5757611fe7565b601454600090611f689060016119d3565b604080516060810182526001600160a01b0385811680835260016020808501828152428688019081526000898152601384528881209751885493516001600160a01b031990941697169690961760ff60a01b1916600160a01b921515929092029190911786555194909101939093558152601290915220819055601455505b50565b6001600160a01b03811660009081526012602052604090205461200c57611fe7565b6001600160a01b0381166000908152601260205260408120805491905560145481146120ab57601480546000908152601360209081526040808320858452818420815481546001600160a01b0319166001600160a01b0391821617808355835460ff600160a01b918290041615150260ff60a01b1990911617825560019283015492909101919091559354835280832054909316825260129052208190555b601480546000908152601360205260409020805460ff60a01b19169055546120d4906001611aaa565b6014555050565b6120f460016014546120ed9190612f7c565b8390612610565b6120ff906001612f0c565b915061211a60016014546121139190612f7c565b8290612610565b612125906001612f0c565b600083815260136020818152604080842081516060808201845282546001600160a01b03808216845260ff600160a01b9283900481161515858901908152600196870154868901528b8b52988852988690208651938401875280549182168452919004909716151594810194909452940154908201529051929350909180156121af575080602001515b156122515781516001600160a01b0390811660009081526012602090815260408083208790558451841683528083208890558783526013825280832085518154878501511515600160a01b90810260ff60a01b199389166001600160a01b0319938416178416178455888501516001948501558a87529584902089518154968b0151151590970296909716941693909317909216929092178355908401519101555b50505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061229a57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561231357600080fd5b505afa158015612327573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234b919061267e565b8160018151811061236c57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506123b7307f0000000000000000000000000000000000000000000000000000000000000000846119ea565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac9479061240c908590600090869030904290600401612e9b565b600060405180830381600087803b15801561242657600080fd5b505af115801561243a573d6000803e3d6000fd5b505050505050565b61246d307f0000000000000000000000000000000000000000000000000000000000000000846119ea565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230856000806124aa610d6b565b426040518863ffffffff1660e01b81526004016124cc96959493929190612968565b6060604051808303818588803b1580156124e557600080fd5b505af11580156124f9573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061251e9190612834565b5050505050565b600a54600090819061253b90849060ff1661261c565b600b5490915061254b90826119d3565b600b553060009081526004602052604090205461256890826119d3565b3060009081526004602052604090205592915050565b60008061259a83600a60029054906101000a900460ff1661261c565b600d549091506125aa90826119d3565b600d553060009081526004602052604090205461256890826119d3565b6000806125e383600a60019054906101000a900460ff1661261c565b600c549091506125f390826119d3565b600c553060009081526004602052604090205461256890826119d3565b60006119df8284613009565b60006119df60646126308560ff8616612636565b90611a9e565b60006119df8284612f5d565b604080516060810182526000808252602082018190529181019190915290565b600060208284031215612673578081fd5b81356119df8161305f565b60006020828403121561268f578081fd5b81516119df8161305f565b600080604083850312156126ac578081fd5b82356126b78161305f565b915060208301356126c78161305f565b809150509250929050565b6000806000606084860312156126e6578081fd5b83356126f18161305f565b925060208401356127018161305f565b929592945050506040919091013590565b60008060408385031215612724578182fd5b823561272f8161305f565b946020939093013593505050565b60006020828403121561274e578081fd5b813580151581146119df578182fd5b60006020828403121561276e578081fd5b5035919050565b600080600060608486031215612789578283fd5b8335925060208085013561279c8161305f565b9250604085013567ffffffffffffffff808211156127b8578384fd5b818701915087601f8301126127cb578384fd5b8135818111156127dd576127dd613049565b604051601f8201601f191681018501838111828210171561280057612800613049565b60405281815283820185018a1015612816578586fd5b81858501868301378585838301015280955050505050509250925092565b600080600060608486031215612848578283fd5b8351925060208401519150604084015190509250925092565b600060208284031215612872578081fd5b813563ffffffff811681146119df578182fd5b6000815180845260208085019450808401835b838110156128bd5781516001600160a01b031687529582019590820190600101612898565b509495945050505050565b60008151808452815b818110156128ed576020818501810151868301820152016128d1565b818111156128fe5782602083870101525b50601f01601f19169290920160200192915050565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000604082526129b66040830185612885565b90508260208301529392505050565b901515815260200190565b6000602082526119df60208301846128c8565b6020808252601f908201527f43616e6e6f74206275726e206d6f7265207468616e206275726e2066756e6400604082015260600190565b60208082526027908201527f43616e6e6f74206275726e206d6f7265207468616e206176696c61626c652062604082015266616c616e63656360c81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526028908201527f45524332303a207472616e736665722066726f6d2f746f20746865207a65726f604082015267206164647265737360c01b606082015260800190565b6020808252603d908201527f4d414e53494f4e206d75737420626520696e69746961746564206265666f726560408201527f20746869732066756e6374696f6e2063616e2062652063616c6c65642e000000606082015260800190565b602080825260069082015265456d7074792160d01b604082015260600190565b6020808252603c908201527f596f752063616e6e6f74207769746864726177206d6f72652066756e6473207460408201527f68617420796f75206861766520696e206d616e73696f6e2066756e6400000000606082015260800190565b60208082526028908201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546040820152673c20b6b7bab73a1760c11b606082015260800190565b60208082526017908201527f5472616e7366657220616d6f756e7420696e76616c6964000000000000000000604082015260600190565b6020808252603e908201527f596f752063616e6e6f74207769746864726177206d6f72652066756e6473207460408201527f68617420796f75206861766520696e206f7065726174696f6e2066756e640000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b602080825260129082015271496e646578206f7574206f662072616e676560701b604082015260600190565b6020808252603f908201527f416c6c207072697a6573206d757374206265206469736275727365642062656660408201527f6f7265206265696e672061626c6520746f20636c6f7365204d414e53494f4e00606082015260800190565b6020808252600e908201526d199d5b99081d1bdbc81cdb585b1b60921b604082015260600190565b6020808252602e908201527f4d656469756d207072697a65206d75737420626520646973627572736564206260408201526d65666f72652074686973206f6e6560901b606082015260800190565b90815260200190565b8381526001600160a01b0383166020820152606060408201819052600090612e92908301846128c8565b95945050505050565b600086825285602083015260a06040830152612eba60a0830186612885565b6001600160a01b0394909416606083015250608001529392505050565b9283526020830191909152604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60008219821115612f1f57612f1f61301d565b500190565b600060ff821660ff84168060ff03821115612f4157612f4161301d565b019392505050565b600082612f5857612f58613033565b500490565b6000816000190483118215151615612f7757612f7761301d565b500290565b600082821015612f8e57612f8e61301d565b500390565b600281046001821680612fa757607f821691505b60208210811415612fc857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612fe257612fe261301d565b5060010190565b600060ff821660ff8114156130005761300061301d565b60010192915050565b60008261301857613018613033565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611fe757600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a5ee3a4e61e2ca0f015ea4309021696a96f3f31d5c84981adf201f30cfd20eb964736f6c63430008000033
Deployed Bytecode
0x6080604052600436106102555760003560e01c80639381099a11610139578063b9fc823a116100b6578063d78c67c51161007a578063d78c67c514610648578063d9bf0d221461065d578063dd62ed3e1461067d578063deb3cdf81461069d578063ea54340d146106b2578063f2fde38b146106c75761025c565b8063b9fc823a146105c9578063ba3d9f01146105e9578063c49b9a80146105fe578063c956e0c31461061e578063ccb2abf3146106335761025c565b8063a457c2d7116100fd578063a457c2d71461054a578063a63b7f981461056a578063a8246ef31461057f578063a9059cbb14610594578063b7e73a96146105b45761025c565b80639381099a146104c957806395d89b41146104eb57806399501663146105005780639ed3edf014610520578063a3346f16146105355761025c565b80634b433e0f116101d257806370a082311161019657806370a082311461041f578063715018a61461043f57806374010ece146104545780637b47ec1a146104745780638da5cb5b146104945780638ff0ab7f146104a95761025c565b80634b433e0f146103a95780634dacc6a6146103be5780635fc3a2c9146103d357806369818738146103f55780636a4b05ad1461040a5761025c565b8063313ce56711610219578063313ce56714610310578063395093511461033257806343023cfa1461035257806349bd5a5e146103725780634a74bb02146103945761025c565b806306fdde0314610261578063095ea7b31461028c5780631547f823146102b957806318160ddd146102ce57806323b872dd146102f05761025c565b3661025c57005b600080fd5b34801561026d57600080fd5b506102766106e7565b60405161028391906129d0565b60405180910390f35b34801561029857600080fd5b506102ac6102a7366004612712565b61077a565b60405161028391906129c5565b3480156102c557600080fd5b506102ac610797565b3480156102da57600080fd5b506102e3610891565b6040516102839190612e5f565b3480156102fc57600080fd5b506102ac61030b3660046126d2565b610897565b34801561031c57600080fd5b5061032561091e565b6040516102839190612efe565b34801561033e57600080fd5b506102ac61034d366004612712565b610927565b34801561035e57600080fd5b506102e361036d366004612662565b610975565b34801561037e57600080fd5b506103876109da565b604051610283919061293b565b3480156103a057600080fd5b506102ac6109fe565b3480156103b557600080fd5b506102e3610a0c565b3480156103ca57600080fd5b506102e3610a12565b3480156103df57600080fd5b506103f36103ee366004612775565b610a18565b005b34801561040157600080fd5b50610325610b5a565b34801561041657600080fd5b506102e3610b63565b34801561042b57600080fd5b506102e361043a366004612662565b610b69565b34801561044b57600080fd5b506103f3610b84565b34801561046057600080fd5b506103f361046f36600461275d565b610c0d565b34801561048057600080fd5b506103f361048f36600461275d565b610c51565b3480156104a057600080fd5b50610387610d6b565b3480156104b557600080fd5b506103f36104c4366004612861565b610d7a565b3480156104d557600080fd5b506104de610dd5565b6040516102839190612eed565b3480156104f757600080fd5b50610276610de1565b34801561050c57600080fd5b506102ac61051b36600461275d565b610df0565b34801561052c57600080fd5b506102ac610fcc565b34801561054157600080fd5b506102e3610fdb565b34801561055657600080fd5b506102ac610565366004612712565b610fe1565b34801561057657600080fd5b50610387611049565b34801561058b57600080fd5b506102ac61106d565b3480156105a057600080fd5b506102ac6105af366004612712565b61123d565b3480156105c057600080fd5b506102ac611251565b3480156105d557600080fd5b506103f36105e436600461273d565b6112cb565b3480156105f557600080fd5b506102e361135a565b34801561060a57600080fd5b506103f361061936600461273d565b611360565b34801561062a57600080fd5b506103256113e2565b34801561063f57600080fd5b506102ac6113f0565b34801561065457600080fd5b50610325611863565b34801561066957600080fd5b506103f361067836600461275d565b611872565b34801561068957600080fd5b506102e361069836600461269a565b6118b6565b3480156106a957600080fd5b506102e36118e1565b3480156106be57600080fd5b506102e36118e7565b3480156106d357600080fd5b506103f36106e2366004612662565b611913565b6060600180546106f690612f93565b80601f016020809104026020016040519081016040528092919081815260200182805461072290612f93565b801561076f5780601f106107445761010080835404028352916020019161076f565b820191906000526020600020905b81548152906001019060200180831161075257829003601f168201915b505050505090505b90565b600061078e6107876119e6565b84846119ea565b50600192915050565b60006107a16119e6565b6001600160a01b03166107b2610d6b565b6001600160a01b0316146107e15760405162461bcd60e51b81526004016107d890612ce7565b60405180910390fd5b6000600b54116108035760405162461bcd60e51b81526004016107d890612de9565b600b54610811906004611a9e565b600e55600b54610822906002611a9e565b600f819055600e54600b54610842929161083c9190611aaa565b90611aaa565b6010819055601454601555600e54600f546040517fdfa0ea68b2b3b9756112a42ef782ce284fda97e3c5a0e9eac2d5cf2497b0cfa993610883939291612ed7565b60405180910390a150600190565b60065490565b60006108a4848484611ab6565b610914846108b06119e6565b61090f85604051806060016040528060288152602001613075602891396001600160a01b038a166000908152600560205260408120906108ee6119e6565b6001600160a01b031681526020810191909152604001600020549190611d81565b6119ea565b5060019392505050565b60035460ff1690565b600061078e6109346119e6565b8461090f85600560006109456119e6565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906119d3565b6001600160a01b0381166000908152601260205260408120546109aa5760405162461bcd60e51b81526004016107d890612b8e565b506001600160a01b038116600090815260126020908152604080832054835260139091529020600101545b919050565b7f000000000000000000000000402a1cde58b1273dfc5bfb26a6f83f87177f665081565b601154610100900460ff1681565b60095490565b600b5481565b610a206119e6565b6001600160a01b0316610a31610d6b565b6001600160a01b031614610a575760405162461bcd60e51b81526004016107d890612ce7565b600d548310610a785760405162461bcd60e51b81526004016107d890612bae565b30600090815260046020526040902054831115610aa75760405162461bcd60e51b81526004016107d890612c8a565b600d54610ab49084611aaa565b600d5530600090815260046020526040902054610ad19084611aaa565b30600090815260046020526040808220929092556001600160a01b03841681522054610afd90846119d3565b6001600160a01b0383166000908152600460205260409081902091909155517f3f650de7ee2e52a67d67738174f630780c286b09585da256f97334e3764bb95490610b4d90859085908590612e68565b60405180910390a1505050565b600a5460ff1681565b60145490565b6001600160a01b031660009081526004602052604090205490565b610b8c6119e6565b6001600160a01b0316610b9d610d6b565b6001600160a01b031614610bc35760405162461bcd60e51b81526004016107d890612ce7565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b610c156119e6565b6001600160a01b0316610c26610d6b565b6001600160a01b031614610c4c5760405162461bcd60e51b81526004016107d890612ce7565b600755565b610c596119e6565b6001600160a01b0316610c6a610d6b565b6001600160a01b031614610c905760405162461bcd60e51b81526004016107d890612ce7565b30600090815260046020526040902054811115610cbf5760405162461bcd60e51b81526004016107d890612a1a565b600c54811115610ce15760405162461bcd60e51b81526004016107d8906129e3565b30600090815260046020526040902054610cfb9082611aaa565b30600090815260046020526040902055600654610d189082611aaa565b600655600c54610d289082611aaa565b600c5560405160009030907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610d60908590612e5f565b60405180910390a350565b6000546001600160a01b031690565b610d826119e6565b6001600160a01b0316610d93610d6b565b6001600160a01b031614610db95760405162461bcd60e51b81526004016107d890612ce7565b6016805463ffffffff191663ffffffff92909216919091179055565b60165463ffffffff1681565b6060600280546106f690612f93565b6000610dfa6119e6565b6001600160a01b0316610e0b610d6b565b6001600160a01b031614610e315760405162461bcd60e51b81526004016107d890612ce7565b60155415801590610e425750600082115b610e5e5760405162461bcd60e51b81526004016107d890612e11565b6000610e77601554601054611a9e90919063ffffffff16565b90506000835b601654610e909063ffffffff1686612f0c565b811015610f875782600b541015610ea657610f87565b600081815260136020526040902054600160a01b900460ff16151560011415610f2a576000818152601360209081526040808320546001600160a01b031683526004909152902054610ef890846119d3565b6000828152601360209081526040808320546001600160a01b031683526004909152902055610f2782846119d3565b91505b601554811415610f75577fad8fb82b9a19477e4da24a41f430d3fd63316dc555145f1bcc7f087d1d4734c883604051610f639190612e5f565b60405180910390a16000601055610f87565b80610f7f81612fce565b915050610e7d565b50600b54610f959082611aaa565b600b5530600090815260046020526040902054610fb29082611aaa565b306000908152600460205260409020555060019392505050565b60115462010000900460ff1681565b600d5481565b600061078e610fee6119e6565b8461090f8560405180606001604052806025815260200161309d60259139600560006110186119e6565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611d81565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b60006110776119e6565b6001600160a01b0316611088610d6b565b6001600160a01b0316146110ae5760405162461bcd60e51b81526004016107d890612ce7565b6015546110cd5760405162461bcd60e51b81526004016107d890612b31565b600e54601554604051603092916000916110ef90429033908790602001612913565b6040516020818303038152906040528051906020012060001c6111129190613009565b90506000611121826000611dad565b90505b602081015115156001146111815760155442338660405160200161114a93929190612913565b6040516020818303038152906040528051906020012060001c61116d9190613009565b915061117a826000611dad565b9050611124565b8051600b546111909085611aaa565b600b556001600160a01b0381166000908152600460205260409020546111b690856119d3565b6001600160a01b0382166000908152600460205260408082209290925530815220546111e29085611aaa565b3060009081526004602052604080822092909255600e55517f04df60a8ea19ecabae271ed2448d3afc69571f168ac354f2a130a1b2ff4d603490611229908390879061294f565b60405180910390a160019550505050505090565b600061078e61124a6119e6565b8484611ab6565b600061125b6119e6565b6001600160a01b031661126c610d6b565b6001600160a01b0316146112925760405162461bcd60e51b81526004016107d890612ce7565b6015546112b15760405162461bcd60e51b81526004016107d890612d8c565b5060006010819055600f819055600e819055601555600190565b6112d36119e6565b6001600160a01b03166112e4610d6b565b6001600160a01b03161461130a5760405162461bcd60e51b81526004016107d890612ce7565b6011805462ff0000191662010000831515021790556040517f3d03df5d847f027c3787d73bf05d591ea114c9ec9cd05aa5b91cd29c2ac05da69061134f9083906129c5565b60405180910390a150565b60075490565b6113686119e6565b6001600160a01b0316611379610d6b565b6001600160a01b03161461139f5760405162461bcd60e51b81526004016107d890612ce7565b6011805461ff001916610100831515021790556040517f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc1599061134f9083906129c5565b600a54610100900460ff1681565b60006113fa6119e6565b6001600160a01b031661140b610d6b565b6001600160a01b0316146114315760405162461bcd60e51b81526004016107d890612ce7565b6015546114505760405162461bcd60e51b81526004016107d890612b31565b600f54604080516064808252610ca0820190925260009060309082908460208201610c8080368337019050509050600060646015541161168d5760155494506114998686611a9e565b95505b848160ff16101561160557601360006114b6836001612f24565b60ff9081168252602082019290925260400160002054600160a01b900416156115f357601360006114e8836001612f24565b60ff16815260200190815260200160002060000160009054906101000a90046001600160a01b0316828260ff168151811061153357634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015261155584876119d3565b93506115a3866004600060138161156d876001612f24565b60ff16815260208082019290925260409081016000908120546001600160a01b03168452918301939093529101902054906119d3565b600460006013816115b5866001612f24565b60ff16815260208082019290925260409081016000908120546001600160a01b03168452918301939093529101902055806115ef81612fe9565b9150505b6115fe8360016119d3565b925061149c565b600b546116129085611aaa565b600b553060009081526004602052604090205461162f9085611aaa565b3060009081526004602052604080822092909255600f55517fed39fa52e1344d828af771e58862d95bc9b17499836a5c2a3db2b7c4bf18fd549061167690849089906129a3565b60405180910390a160019650505050505050610777565b6116978686611a9e565b95505b848160ff1610156117dd5760006015544233866040516020016116bf93929190612913565b6040516020818303038152906040528051906020012060001c6116e29190613009565b600081815260136020526040902054909150600160a01b900460ff16156117ca5760008181526013602052604090205483516001600160a01b0390911690849060ff851690811061174357634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015261176585886119d3565b6000828152601360209081526040808320546001600160a01b03168352600490915290205490955061179790886119d3565b6000828152601360209081526040808320546001600160a01b031683526004909152902055816117c681612fe9565b9250505b6117d58460016119d3565b93505061169a565b600b546117ea9085611aaa565b600b55306000908152600460205260409020546118079085611aaa565b3060009081526004602052604080822092909255600f55517fed39fa52e1344d828af771e58862d95bc9b17499836a5c2a3db2b7c4bf18fd549061184e90849089906129a3565b60405180910390a16001965050505050505090565b600a5462010000900460ff1681565b61187a6119e6565b6001600160a01b031661188b610d6b565b6001600160a01b0316146118b15760405162461bcd60e51b81526004016107d890612ce7565b600955565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205490565b600c5481565b60008061190d600d54611907600b54600c546119d390919063ffffffff16565b906119d3565b91505090565b61191b6119e6565b6001600160a01b031661192c610d6b565b6001600160a01b0316146119525760405162461bcd60e51b81526004016107d890612ce7565b6001600160a01b0381166119785760405162461bcd60e51b81526004016107d890612a61565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006119df8284612f0c565b9392505050565b3390565b6001600160a01b038316611a105760405162461bcd60e51b81526004016107d890612d1c565b6001600160a01b038216611a365760405162461bcd60e51b81526004016107d890612aa7565b6001600160a01b0380841660008181526005602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590611a91908590612e5f565b60405180910390a3505050565b60006119df8284612f49565b60006119df8284612f7c565b6001600160a01b03831615801590611ad657506001600160a01b03821615155b611af25760405162461bcd60e51b81526004016107d890612ae9565b600081118015611b1a57506001600160a01b0383166000908152600460205260409020548111155b611b365760405162461bcd60e51b81526004016107d890612c53565b611b3e610d6b565b6001600160a01b0316836001600160a01b031614158015611b785750611b62610d6b565b6001600160a01b0316826001600160a01b031614155b15611b9f57600754811115611b9f5760405162461bcd60e51b81526004016107d890612c0b565b6000611bb5611bac6118e7565b61083c30610b69565b60085490915081108015908190611bcf575060115460ff16155b8015611c0d57507f000000000000000000000000402a1cde58b1273dfc5bfb26a6f83f87177f66506001600160a01b0316856001600160a01b031614155b8015611c205750601154610100900460ff165b15611c33576008549150611c3382611e32565b6001600160a01b038516600090815260046020526040902054611c569084611aaa565b6001600160a01b038616600090815260046020526040812091909155611c7b84611eca565b6001600160a01b038616600090815260046020526040902054909150611ca190826119d3565b6001600160a01b038616600090815260046020526040902081905560095411801590611cd657506001600160a01b0385163014155b15611ce457611ce485611f34565b6009546001600160a01b038716600090815260046020526040902054108015611d1657506001600160a01b0386163014155b15611d2457611d2486611fea565b611d2e84826120db565b846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611d719190612e5f565b60405180910390a3505050505050565b60008184841115611da55760405162461bcd60e51b81526004016107d891906129d0565b505050900390565b611db5612642565b60018215151415611de757611dc8610b63565b831115611de75760405162461bcd60e51b81526004016107d890612d60565b5050600090815260136020908152604091829020825160608101845281546001600160a01b0381168252600160a01b900460ff16151592810192909252600101549181019190915290565b6011805460ff191660011790556000611e4c826002611a9e565b90506000611e5a8383611aaa565b905047611e6683612257565b6000611e724783611aaa565b9050611e7e8382612442565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561848285604051611eb193929190612ed7565b60405180910390a150506011805460ff19169055505050565b60115460009062010000900460ff16611ee45750806109d5565b6000611eef83612525565b90506000611efc8461257e565b90506000611f09856125c7565b90506000611f1b8461190785856119d3565b90506000611f298783611aaa565b979650505050505050565b6001600160a01b03811660009081526012602052604090205415611f5757611fe7565b601454600090611f689060016119d3565b604080516060810182526001600160a01b0385811680835260016020808501828152428688019081526000898152601384528881209751885493516001600160a01b031990941697169690961760ff60a01b1916600160a01b921515929092029190911786555194909101939093558152601290915220819055601455505b50565b6001600160a01b03811660009081526012602052604090205461200c57611fe7565b6001600160a01b0381166000908152601260205260408120805491905560145481146120ab57601480546000908152601360209081526040808320858452818420815481546001600160a01b0319166001600160a01b0391821617808355835460ff600160a01b918290041615150260ff60a01b1990911617825560019283015492909101919091559354835280832054909316825260129052208190555b601480546000908152601360205260409020805460ff60a01b19169055546120d4906001611aaa565b6014555050565b6120f460016014546120ed9190612f7c565b8390612610565b6120ff906001612f0c565b915061211a60016014546121139190612f7c565b8290612610565b612125906001612f0c565b600083815260136020818152604080842081516060808201845282546001600160a01b03808216845260ff600160a01b9283900481161515858901908152600196870154868901528b8b52988852988690208651938401875280549182168452919004909716151594810194909452940154908201529051929350909180156121af575080602001515b156122515781516001600160a01b0390811660009081526012602090815260408083208790558451841683528083208890558783526013825280832085518154878501511515600160a01b90810260ff60a01b199389166001600160a01b0319938416178416178455888501516001948501558a87529584902089518154968b0151151590970296909716941693909317909216929092178355908401519101555b50505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061229a57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561231357600080fd5b505afa158015612327573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234b919061267e565b8160018151811061236c57634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506123b7307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846119ea565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac9479061240c908590600090869030904290600401612e9b565b600060405180830381600087803b15801561242657600080fd5b505af115801561243a573d6000803e3d6000fd5b505050505050565b61246d307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d846119ea565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230856000806124aa610d6b565b426040518863ffffffff1660e01b81526004016124cc96959493929190612968565b6060604051808303818588803b1580156124e557600080fd5b505af11580156124f9573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061251e9190612834565b5050505050565b600a54600090819061253b90849060ff1661261c565b600b5490915061254b90826119d3565b600b553060009081526004602052604090205461256890826119d3565b3060009081526004602052604090205592915050565b60008061259a83600a60029054906101000a900460ff1661261c565b600d549091506125aa90826119d3565b600d553060009081526004602052604090205461256890826119d3565b6000806125e383600a60019054906101000a900460ff1661261c565b600c549091506125f390826119d3565b600c553060009081526004602052604090205461256890826119d3565b60006119df8284613009565b60006119df60646126308560ff8616612636565b90611a9e565b60006119df8284612f5d565b604080516060810182526000808252602082018190529181019190915290565b600060208284031215612673578081fd5b81356119df8161305f565b60006020828403121561268f578081fd5b81516119df8161305f565b600080604083850312156126ac578081fd5b82356126b78161305f565b915060208301356126c78161305f565b809150509250929050565b6000806000606084860312156126e6578081fd5b83356126f18161305f565b925060208401356127018161305f565b929592945050506040919091013590565b60008060408385031215612724578182fd5b823561272f8161305f565b946020939093013593505050565b60006020828403121561274e578081fd5b813580151581146119df578182fd5b60006020828403121561276e578081fd5b5035919050565b600080600060608486031215612789578283fd5b8335925060208085013561279c8161305f565b9250604085013567ffffffffffffffff808211156127b8578384fd5b818701915087601f8301126127cb578384fd5b8135818111156127dd576127dd613049565b604051601f8201601f191681018501838111828210171561280057612800613049565b60405281815283820185018a1015612816578586fd5b81858501868301378585838301015280955050505050509250925092565b600080600060608486031215612848578283fd5b8351925060208401519150604084015190509250925092565b600060208284031215612872578081fd5b813563ffffffff811681146119df578182fd5b6000815180845260208085019450808401835b838110156128bd5781516001600160a01b031687529582019590820190600101612898565b509495945050505050565b60008151808452815b818110156128ed576020818501810151868301820152016128d1565b818111156128fe5782602083870101525b50601f01601f19169290920160200192915050565b92835260609190911b6bffffffffffffffffffffffff19166020830152603482015260540190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000604082526129b66040830185612885565b90508260208301529392505050565b901515815260200190565b6000602082526119df60208301846128c8565b6020808252601f908201527f43616e6e6f74206275726e206d6f7265207468616e206275726e2066756e6400604082015260600190565b60208082526027908201527f43616e6e6f74206275726e206d6f7265207468616e206176696c61626c652062604082015266616c616e63656360c81b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526028908201527f45524332303a207472616e736665722066726f6d2f746f20746865207a65726f604082015267206164647265737360c01b606082015260800190565b6020808252603d908201527f4d414e53494f4e206d75737420626520696e69746961746564206265666f726560408201527f20746869732066756e6374696f6e2063616e2062652063616c6c65642e000000606082015260800190565b602080825260069082015265456d7074792160d01b604082015260600190565b6020808252603c908201527f596f752063616e6e6f74207769746864726177206d6f72652066756e6473207460408201527f68617420796f75206861766520696e206d616e73696f6e2066756e6400000000606082015260800190565b60208082526028908201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546040820152673c20b6b7bab73a1760c11b606082015260800190565b60208082526017908201527f5472616e7366657220616d6f756e7420696e76616c6964000000000000000000604082015260600190565b6020808252603e908201527f596f752063616e6e6f74207769746864726177206d6f72652066756e6473207460408201527f68617420796f75206861766520696e206f7065726174696f6e2066756e640000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b602080825260129082015271496e646578206f7574206f662072616e676560701b604082015260600190565b6020808252603f908201527f416c6c207072697a6573206d757374206265206469736275727365642062656660408201527f6f7265206265696e672061626c6520746f20636c6f7365204d414e53494f4e00606082015260800190565b6020808252600e908201526d199d5b99081d1bdbc81cdb585b1b60921b604082015260600190565b6020808252602e908201527f4d656469756d207072697a65206d75737420626520646973627572736564206260408201526d65666f72652074686973206f6e6560901b606082015260800190565b90815260200190565b8381526001600160a01b0383166020820152606060408201819052600090612e92908301846128c8565b95945050505050565b600086825285602083015260a06040830152612eba60a0830186612885565b6001600160a01b0394909416606083015250608001529392505050565b9283526020830191909152604082015260600190565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60008219821115612f1f57612f1f61301d565b500190565b600060ff821660ff84168060ff03821115612f4157612f4161301d565b019392505050565b600082612f5857612f58613033565b500490565b6000816000190483118215151615612f7757612f7761301d565b500290565b600082821015612f8e57612f8e61301d565b500390565b600281046001821680612fa757607f821691505b60208210811415612fc857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612fe257612fe261301d565b5060010190565b600060ff821660ff8114156130005761300061301d565b60010192915050565b60008261301857613018613033565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611fe757600080fdfe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220a5ee3a4e61e2ca0f015ea4309021696a96f3f31d5c84981adf201f30cfd20eb964736f6c63430008000033
Deployed Bytecode Sourcemap
26104:22120:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29341:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29854:161;;;;;;;;;;-1:-1:-1;29854:161:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39354:469::-;;;;;;;;;;;;;:::i;29622:94::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30202:313::-;;;;;;;;;;-1:-1:-1;30202:313:0;;;;;:::i;:::-;;:::i;29527:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;30674:218::-;;;;;;;;;;-1:-1:-1;30674:218:0;;;;;:::i;:::-;;:::i;48000:219::-;;;;;;;;;;-1:-1:-1;48000:219:0;;;;;:::i;:::-;;:::i;27406:38::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27258:40::-;;;;;;;;;;;;;:::i;31918:109::-;;;;;;;;;;;;;:::i;26987:26::-;;;;;;;;;;;;;:::i;32819:663::-;;;;;;;;;;-1:-1:-1;32819:663:0;;;;;:::i;:::-;;:::i;:::-;;26864:27;;;;;;;;;;;;;:::i;47647:95::-;;;;;;;;;;;;;:::i;29724:118::-;;;;;;;;;;-1:-1:-1;29724:118:0;;;;;:::i;:::-;;:::i;5251:148::-;;;;;;;;;;;;;:::i;32606:97::-;;;;;;;;;;-1:-1:-1;32606:97:0;;;;;:::i;:::-;;:::i;31243:464::-;;;;;;;;;;-1:-1:-1;31243:464:0;;;;;:::i;:::-;;:::i;4600:87::-;;;;;;;;;;;;;:::i;32715:96::-;;;;;;;;;;-1:-1:-1;32715:96:0;;;;;:::i;:::-;;:::i;27718:32::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29432:87::-;;;;;;;;;;;;;:::i;44488:1181::-;;;;;;;;;;-1:-1:-1;44488:1181:0;;;;;:::i;:::-;;:::i;27305:34::-;;;;;;;;;;;;;:::i;27054:30::-;;;;;;;;;;;;;:::i;30900:269::-;;;;;;;;;;-1:-1:-1;30900:269:0;;;;;:::i;:::-;;:::i;27348:51::-;;;;;;;;;;;;;:::i;39835:1458::-;;;;;;;;;;;;;:::i;30027:167::-;;;;;;;;;;-1:-1:-1;30027:167:0;;;;;:::i;:::-;;:::i;45681:411::-;;;;;;;;;;;;;:::i;32317:153::-;;;;;;;;;;-1:-1:-1;32317:153:0;;;;;:::i;:::-;;:::i;32039:94::-;;;;;;;;;;;;;:::i;32141:168::-;;;;;;;;;;-1:-1:-1;32141:168:0;;;;;:::i;:::-;;:::i;26898:33::-;;;;;;;;;;;;;:::i;41305:3171::-;;;;;;;;;;;;;:::i;26938:36::-;;;;;;;;;;;;;:::i;32482:112::-;;;;;;;;;;-1:-1:-1;32482:112:0;;;;;:::i;:::-;;:::i;30523:143::-;;;;;;;;;;-1:-1:-1;30523:143:0;;;;;:::i;:::-;;:::i;27020:27::-;;;;;;;;;;;;;:::i;31719:187::-;;;;;;;;;;;;;:::i;5554:244::-;;;;;;;;;;-1:-1:-1;5554:244:0;;;;;:::i;:::-;;:::i;29341:83::-;29378:13;29411:5;29404:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29341:83;;:::o;29854:161::-;29929:4;29946:39;29955:12;:10;:12::i;:::-;29969:7;29978:6;29946:8;:39::i;:::-;-1:-1:-1;30003:4:0;29854:161;;;;:::o;39354:469::-;39404:12;4831;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;;;;;;;;;39452:1:::1;39438:11;;:15;39429:43;;;;-1:-1:-1::0;;;39429:43:0::1;;;;;;;:::i;:::-;39501:11;::::0;:18:::1;::::0;39517:1:::1;39501:15;:18::i;:::-;39483:15;:36:::0;39549:11:::1;::::0;:18:::1;::::0;39565:1:::1;39549:15;:18::i;:::-;39530:16;:37:::0;;;39612:15:::1;::::0;39596:11:::1;::::0;:54:::1;::::0;39530:37;39596:32:::1;::::0;:11;:15:::1;:32::i;:::-;:36:::0;::::1;:54::i;:::-;39578:15;:72:::0;;;39680:13:::1;::::0;39661:16:::1;:32:::0;39732:15:::1;::::0;39749:16:::1;::::0;39719:64:::1;::::0;::::1;::::0;::::1;::::0;39732:15;39749:16;39719:64:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;39811:4:0::1;39354:469:::0;:::o;29622:94::-;29702:6;;29622:94;:::o;30202:313::-;30300:4;30317:36;30327:6;30335:9;30346:6;30317:9;:36::i;:::-;30364:121;30373:6;30381:12;:10;:12::i;:::-;30395:89;30433:6;30395:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30395:19:0;;;;;;:11;:19;;;;;;30415:12;:10;:12::i;:::-;-1:-1:-1;;;;;30395:33:0;;;;;;;;;;;;-1:-1:-1;30395:33:0;;;:89;:37;:89::i;:::-;30364:8;:121::i;:::-;-1:-1:-1;30503:4:0;30202:313;;;;;:::o;29527:83::-;29593:9;;;;29527:83;:::o;30674:218::-;30762:4;30779:83;30788:12;:10;:12::i;:::-;30802:7;30811:50;30850:10;30811:11;:25;30823:12;:10;:12::i;:::-;-1:-1:-1;;;;;30811:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;30811:25:0;;;:34;;;;;;;;;;;:38;:50::i;48000:219::-;-1:-1:-1;;;;;48099:29:0;;48073:7;48099:29;;;:14;:29;;;;;;48090:54;;;;-1:-1:-1;;;48090:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;48173:29:0;;48159:44;48173:29;;;:14;:29;;;;;;;;;48159:44;;:13;:44;;;;;:55;;;48000:219;;;;:::o;27406:38::-;;;:::o;27258:40::-;;;;;;;;;:::o;31918:109::-;32000:19;;31918:109;:::o;26987:26::-;;;;:::o;32819:663::-;4831:12;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;32958:15:::1;;32949:6;:24;32941:97;;;;-1:-1:-1::0;;;32941:97:0::1;;;;;;;:::i;:::-;33081:4;33064:23;::::0;;;:8:::1;:23;::::0;;;;;33054:33;::::1;;33046:108;;;;-1:-1:-1::0;;;33046:108:0::1;;;;;;;:::i;:::-;33234:15;::::0;:27:::1;::::0;33254:6;33234:19:::1;:27::i;:::-;33216:15;:45:::0;33312:4:::1;33295:23;::::0;;;:8:::1;:23;::::0;;;;;:35:::1;::::0;33323:6;33295:27:::1;:35::i;:::-;33286:4;33269:23;::::0;;;:8:::1;:23;::::0;;;;;:61;;;;-1:-1:-1;;;;;33364:23:0;::::1;::::0;;;;:35:::1;::::0;33392:6;33364:27:::1;:35::i;:::-;-1:-1:-1::0;;;;;33338:23:0;::::1;;::::0;;;:8:::1;:23;::::0;;;;;;:61;;;;33419:55;::::1;::::0;::::1;::::0;33444:6;;33347:13;;33467:6;;33419:55:::1;:::i;:::-;;;;;;;;32819:663:::0;;;:::o;26864:27::-;;;;;;:::o;47647:95::-;47724:13;;47647:95;:::o;29724:118::-;-1:-1:-1;;;;;29817:17:0;29790:7;29817:17;;;:8;:17;;;;;;;29724:118::o;5251:148::-;4831:12;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;5358:1:::1;5342:6:::0;;5321:40:::1;::::0;-1:-1:-1;;;;;5342:6:0;;::::1;::::0;5321:40:::1;::::0;5358:1;;5321:40:::1;5389:1;5372:19:::0;;-1:-1:-1;;;;;;5372:19:0::1;::::0;;5251:148::o;32606:97::-;4831:12;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;32675:11:::1;:20:::0;32606:97::o;31243:464::-;4831:12;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;31349:4:::1;31332:23;::::0;;;:8:::1;:23;::::0;;;;;31322:33;::::1;;31314:85;;;;-1:-1:-1::0;;;31314:85:0::1;;;;;;;:::i;:::-;31428:12;;31418:6;:22;;31410:66;;;;-1:-1:-1::0;;;31410:66:0::1;;;;;;;:::i;:::-;31532:4;31515:23;::::0;;;:8:::1;:23;::::0;;;;;:35:::1;::::0;31543:6;31515:27:::1;:35::i;:::-;31506:4;31489:23;::::0;;;:8:::1;:23;::::0;;;;:61;31570:6:::1;::::0;:18:::1;::::0;31581:6;31570:10:::1;:18::i;:::-;31561:6;:27:::0;31614:12:::1;::::0;:24:::1;::::0;31631:6;31614:16:::1;:24::i;:::-;31599:12;:39:::0;31656:43:::1;::::0;31688:1:::1;::::0;31673:4:::1;::::0;31656:43:::1;::::0;::::1;::::0;31692:6;;31656:43:::1;:::i;:::-;;;;;;;;31243:464:::0;:::o;4600:87::-;4646:7;4673:6;-1:-1:-1;;;;;4673:6:0;4600:87;:::o;32715:96::-;4831:12;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;32781:12:::1;:22:::0;;-1:-1:-1;;32781:22:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;32715:96::o;27718:32::-;;;;;;:::o;29432:87::-;29471:13;29504:7;29497:14;;;;;:::i;44488:1181::-;44571:12;4831;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;44605:16:::1;::::0;:21;;::::1;::::0;:39:::1;;;44643:1;44630:10;:14;44605:39;44596:99;;;;-1:-1:-1::0;;;44596:99:0::1;;;;;;;:::i;:::-;44716:20;44739:37;44759:16;;44739:15;;:19;;:37;;;;:::i;:::-;44716:60:::0;-1:-1:-1;44787:22:0::1;44851:10:::0;44834:650:::1;44880:12;::::0;44867:25:::1;::::0;44880:12:::1;;44867:10:::0;:25:::1;:::i;:::-;44863:1;:29;44834:650;;;44933:12;44919:11;;:26;44914:73;;;44966:5;;44914:73;45071:16;::::0;;;:13:::1;:16;::::0;;;;:25;-1:-1:-1;;;45071:25:0;::::1;;;:33;;45100:4;45071:33;45067:225;;;45159:31;45168:16:::0;;;:13:::1;:16;::::0;;;;;;;:21;-1:-1:-1;;;;;45168:21:0::1;45159:31:::0;;:8:::1;:31:::0;;;;;;:49:::1;::::0;45195:12;45159:35:::1;:49::i;:::-;45125:31;45134:16:::0;;;:13:::1;:16;::::0;;;;;;;:21;-1:-1:-1;;;;;45134:21:0::1;45125:31:::0;;:8:::1;:31:::0;;;;;:83;45244:32:::1;:14:::0;45263:12;45244:18:::1;:32::i;:::-;45227:49;;45067:225;45315:16;;45310:1;:21;45306:167;;;45357:38;45382:12;45357:38;;;;;;:::i;:::-;;;;;;;;45432:1;45414:15;:19:::0;45452:5:::1;;45306:167;44894:3:::0;::::1;::::0;::::1;:::i;:::-;;;;44834:650;;;-1:-1:-1::0;45518:11:0::1;::::0;:31:::1;::::0;45534:14;45518:15:::1;:31::i;:::-;45504:11;:45:::0;45603:4:::1;45586:23;::::0;;;:8:::1;:23;::::0;;;;;:43:::1;::::0;45614:14;45586:27:::1;:43::i;:::-;45577:4;45560:23;::::0;;;:8:::1;:23;::::0;;;;:69;-1:-1:-1;45657:4:0::1;::::0;44488:1181;-1:-1:-1;;;44488:1181:0:o;27305:34::-;;;;;;;;;:::o;27054:30::-;;;;:::o;30900:269::-;30993:4;31010:129;31019:12;:10;:12::i;:::-;31033:7;31042:96;31081:15;31042:96;;;;;;;;;;;;;;;;;:11;:25;31054:12;:10;:12::i;:::-;-1:-1:-1;;;;;31042:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;31042:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;27348:51::-;;;:::o;39835:1458::-;39900:12;4831;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;39934:16:::1;::::0;39925:96:::1;;;;-1:-1:-1::0;;;39925:96:0::1;;;;;;;:::i;:::-;40081:15;::::0;40334:16:::1;::::0;40278:51:::1;::::0;40047:2:::1;::::0;40081:15;40032:12:::1;::::0;40278:51:::1;::::0;40295:15:::1;::::0;40312:10:::1;::::0;40047:2;;40278:51:::1;;;:::i;:::-;;;;;;;;;;;;;40268:62;;;;;;40263:68;;:87;;;;:::i;:::-;40248:102;;40371:36;40410:25;40420:7;40429:5;40410:9;:25::i;:::-;40371:64;;40446:372;40453:31;::::0;::::1;::::0;:39:::1;;40488:4;40453:39;40446:372;;40725:16;;40686:15;40703:10;40715:4;40669:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40659:62;;;;;;40654:68;;:87;;;;:::i;:::-;40644:97;;40781:25;40791:7;40800:5;40781:9;:25::i;:::-;40756:50;;40446:372;;;40872:27:::0;;40934:11:::1;::::0;:27:::1;::::0;40950:10;40934:15:::1;:27::i;:::-;40920:11;:41:::0;-1:-1:-1;;;;;41008:33:0;::::1;;::::0;;;:8:::1;:33;::::0;;;;;:49:::1;::::0;41046:10;41008:37:::1;:49::i;:::-;-1:-1:-1::0;;;;;40972:33:0;::::1;;::::0;;;:8:::1;:33;::::0;;;;;:85;;;;41111:4:::1;41094:23:::0;;;;:39:::1;::::0;41122:10;41094:27:::1;:39::i;:::-;41085:4;41068:23;::::0;;;:8:::1;:23;::::0;;;;;:65;;;;41144:15:::1;:19:::0;41189:64;::::1;::::0;::::1;::::0;41217:23;;41242:10;;41189:64:::1;:::i;:::-;;;;;;;;41281:4;41274:11;;;;;;;39835:1458:::0;:::o;30027:167::-;30105:4;30122:42;30132:12;:10;:12::i;:::-;30146:9;30157:6;30122:9;:42::i;45681:411::-;45729:12;4831;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;45841:16:::1;::::0;45832:98:::1;;;;-1:-1:-1::0;;;45832:98:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;45959:1:0::1;45941:15;:19:::0;;;45971:16:::1;:20:::0;;;46002:15:::1;:19:::0;;;46032:16:::1;:20:::0;-1:-1:-1;45681:411:0;:::o;32317:153::-;4831:12;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;32384:14:::1;:25:::0;;-1:-1:-1;;32384:25:0::1;::::0;;::::1;;;;::::0;;32425:37:::1;::::0;::::1;::::0;::::1;::::0;32384:25;;32425:37:::1;:::i;:::-;;;;;;;;32317:153:::0;:::o;32039:94::-;32114:11;;32039:94;:::o;32141:168::-;4831:12;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;32215:21:::1;:32:::0;;-1:-1:-1;;32215:32:0::1;;::::0;::::1;;;;::::0;;32263:38:::1;::::0;::::1;::::0;::::1;::::0;32215:32;;32263:38:::1;:::i;26898:33::-:0;;;;;;;;;:::o;41305:3171::-;41371:12;4831;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;41405:16:::1;::::0;41396:96:::1;;;;-1:-1:-1::0;;;41396:96:0::1;;;;;;;:::i;:::-;41586:16;::::0;41759:18:::1;::::0;;41643:3:::1;41759:18:::0;;;;;::::1;::::0;;;41564:19:::1;::::0;41709:2:::1;::::0;41564:19;;41643:3;41759:18:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;41759:18:0::1;41722:55;;41788:13;41931:3;41911:16;;:23;41907:1212;;42044:16;::::0;;-1:-1:-1;42083:36:0::1;:11:::0;42044:16;42083:15:::1;:36::i;:::-;42069:50;;42128:468;42145:19;42135:7;:29;;;42128:468;;;42197:13;:26;42211:11;:7:::0;42221:1:::1;42211:11;:::i;:::-;42197:26;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;42197:26:0;:35;-1:-1:-1;;;42197:35:0;::::1;;42193:357;;;42283:13;:26;42297:11;:7:::0;42307:1:::1;42297:11;:::i;:::-;42283:26;;;;;;;;;;;;;:31;;;;;;;;;;-1:-1:-1::0;;;;;42283:31:0::1;42254:17;42272:7;42254:26;;;;;;;;-1:-1:-1::0;;;42254:26:0::1;;;;;;;;;-1:-1:-1::0;;;;;42254:60:0;;::::1;:26;::::0;;::::1;::::0;;;;;;;:60;42351:31:::1;:14:::0;42370:11;42351:18:::1;:31::i;:::-;42334:48:::0;-1:-1:-1;42446:58:0::1;42492:11:::0;42446:8:::1;:41;42455:13;42446:41:::0;42469:11:::1;:7:::0;42479:1:::1;42469:11;:::i;:::-;42455:26;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;42455:26:0;;;:31;-1:-1:-1;;;;;42455:31:0::1;42446:41:::0;;;;::::1;::::0;;;;;;;;;;:45:::1;:58::i;:::-;42402:8;:41;42411:13;42402:41:::0;42425:11:::1;:7:::0;42435:1:::1;42425:11;:::i;:::-;42411:26;;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;42411:26:0;;;:31;-1:-1:-1;;;;;42411:31:0::1;42402:41:::0;;;;::::1;::::0;;;;;;;;:102;42524:9;::::1;::::0;::::1;:::i;:::-;;;;42193:357;42572:11;:4:::0;42581:1:::1;42572:8;:11::i;:::-;42565:18;;42128:468;;;42632:11;::::0;:31:::1;::::0;42648:14;42632:15:::1;:31::i;:::-;42618:11;:45:::0;42718:4:::1;42701:23;::::0;;;:8:::1;:23;::::0;;;;;:43:::1;::::0;42729:14;42701:27:::1;:43::i;:::-;42692:4;42675:23;::::0;;;:8:::1;:23;::::0;;;;;:69;;;;42968:16:::1;:20:::0;43016:60;::::1;::::0;::::1;::::0;43045:17;;43064:11;;43016:60:::1;:::i;:::-;;;;;;;;43106:4;43099:11;;;;;;;;;;41907:1212;43147:36;:11:::0;43163:19;43147:15:::1;:36::i;:::-;43133:50;;43311:677;43328:19;43318:7;:29;;;43311:677;;;43504:12;43590:16;;43551:15;43568:10;43580:4;43534:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43524:62;;;;;;43519:68;;:87;;;;:::i;:::-;43633:22;::::0;;;:13:::1;:22;::::0;;;;:31;:22;;-1:-1:-1;;;;43633:31:0;::::1;;;43629:321;;;43711:22;::::0;;;:13:::1;:22;::::0;;;;:27;43682:26;;-1:-1:-1;;;;;43711:27:0;;::::1;::::0;43682:17;;:26:::1;::::0;::::1;::::0;;::::1;;;-1:-1:-1::0;;;43682:26:0::1;;;;;;;;;-1:-1:-1::0;;;;;43682:56:0;;::::1;:26;::::0;;::::1;::::0;;;;;;;:56;43771:31:::1;:14:::0;43790:11;43771:18:::1;:31::i;:::-;43858:37;43867:22:::0;;;:13:::1;:22;::::0;;;;;;;:27;-1:-1:-1;;;;;43867:27:0::1;43858:37:::0;;:8:::1;:37:::0;;;;;;43754:48;;-1:-1:-1;43858:54:0::1;::::0;43900:11;43858:41:::1;:54::i;:::-;43818:37;43827:22:::0;;;:13:::1;:22;::::0;;;;;;;:27;-1:-1:-1;;;;;43827:27:0::1;43818:37:::0;;:8:::1;:37:::0;;;;;:94;43928:9;::::1;::::0;::::1;:::i;:::-;;;;43629:321;43968:11;:4:::0;43977:1:::1;43968:8;:11::i;:::-;43961:18;;43311:677;;;;44016:11;::::0;:31:::1;::::0;44032:14;44016:15:::1;:31::i;:::-;44002:11;:45:::0;44101:4:::1;44084:23;::::0;;;:8:::1;:23;::::0;;;;;:43:::1;::::0;44112:14;44084:27:::1;:43::i;:::-;44075:4;44058:23;::::0;;;:8:::1;:23;::::0;;;;;:69;;;;44348:16:::1;:20:::0;44388:60;::::1;::::0;::::1;::::0;44417:17;;44436:11;;44388:60:::1;:::i;:::-;;;;;;;;44464:4;44457:11;;;;;;;;41305:3171:::0;:::o;26938:36::-;;;;;;;;;:::o;32482:112::-;4831:12;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;32558:19:::1;:28:::0;32482:112::o;30523:143::-;-1:-1:-1;;;;;30631:18:0;;;30604:7;30631:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;30523:143::o;27020:27::-;;;;:::o;31719:187::-;31779:7;31796:21;31820:50;31854:15;;31820:29;31837:11;;31820:12;;:16;;:29;;;;:::i;:::-;:33;;:50::i;:::-;31796:74;-1:-1:-1;;31719:187:0;:::o;5554:244::-;4831:12;:10;:12::i;:::-;-1:-1:-1;;;;;4820:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;4820:23:0;;4812:68;;;;-1:-1:-1;;;4812:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5643:22:0;::::1;5635:73;;;;-1:-1:-1::0;;;5635:73:0::1;;;;;;;:::i;:::-;5745:6;::::0;;5724:38:::1;::::0;-1:-1:-1;;;;;5724:38:0;;::::1;::::0;5745:6;::::1;::::0;5724:38:::1;::::0;::::1;5773:6;:17:::0;;-1:-1:-1;;;;;;5773:17:0::1;-1:-1:-1::0;;;;;5773:17:0;;;::::1;::::0;;;::::1;::::0;;5554:244::o;8349:98::-;8407:7;8434:5;8438:1;8434;:5;:::i;:::-;8427:12;8349:98;-1:-1:-1;;;8349:98:0:o;605:::-;685:10;605:98;:::o;35173:339::-;-1:-1:-1;;;;;35266:19:0;;35258:68;;;;-1:-1:-1;;;35258:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35345:21:0;;35337:68;;;;-1:-1:-1;;;35337:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35418:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;35472:32;;;;;35448:6;;35472:32;:::i;:::-;;;;;;;;35173:339;;;:::o;9486:98::-;9544:7;9571:5;9575:1;9571;:5;:::i;8730:98::-;8788:7;8815:5;8819:1;8815;:5;:::i;35524:1819::-;-1:-1:-1;;;;;35626:25:0;;;;;;:52;;-1:-1:-1;;;;;;35655:23:0;;;;35626:52;35618:105;;;;-1:-1:-1;;;35618:105:0;;;;;;;:::i;:::-;35751:1;35742:6;:10;:45;;;;-1:-1:-1;;;;;;35766:21:0;;;;;;:8;:21;;;;;;35756:31;;;35742:45;35734:81;;;;-1:-1:-1;;;35734:81:0;;;;;;;:::i;:::-;35844:7;:5;:7::i;:::-;-1:-1:-1;;;;;35829:22:0;:11;-1:-1:-1;;;;;35829:22:0;;;:46;;;;;35868:7;:5;:7::i;:::-;-1:-1:-1;;;;;35855:20:0;:9;-1:-1:-1;;;;;35855:20:0;;;35829:46;35826:138;;;35908:11;;35898:6;:21;;35890:74;;;;-1:-1:-1;;;35890:74:0;;;;;;;:::i;:::-;36064:28;36095:59;36124:29;:27;:29::i;:::-;36095:24;36113:4;36095:9;:24::i;:59::-;36216:29;;36064:90;;-1:-1:-1;36192:53:0;;;;;;;36356;;-1:-1:-1;36393:16:0;;;;36392:17;36356:53;:98;;;;;36441:13;-1:-1:-1;;;;;36426:28:0;:11;-1:-1:-1;;;;;36426:28:0;;;36356:98;:136;;;;-1:-1:-1;36471:21:0;;;;;;;36356:136;36338:296;;;36542:29;;36519:52;;36586:36;36601:20;36586:14;:36::i;:::-;-1:-1:-1;;;;;36678:21:0;;;;;;:8;:21;;;;;;:33;;36704:6;36678:25;:33::i;:::-;-1:-1:-1;;;;;36654:21:0;;;;;;:8;:21;;;;;:57;;;;36755:18;36766:6;36755:10;:18::i;:::-;-1:-1:-1;;;;;36806:19:0;;;;;;:8;:19;;;;;;36722:51;;-1:-1:-1;36806:47:0;;36722:51;36806:23;:47::i;:::-;-1:-1:-1;;;;;36784:19:0;;;;;;:8;:19;;;;;:69;;;36960:19;;-1:-1:-1;36937:42:0;;;:72;;-1:-1:-1;;;;;;36983:26:0;;37004:4;36983:26;;36937:72;36933:121;;;37022:20;37032:9;37022;:20::i;:::-;37092:19;;-1:-1:-1;;;;;37068:21:0;;;;;;:8;:21;;;;;;:43;:75;;;;-1:-1:-1;;;;;;37115:28:0;;37138:4;37115:28;;37068:75;37064:130;;;37157:25;37170:11;37157:12;:25::i;:::-;37214:47;37230:6;37238:22;37214:15;:47::i;:::-;37301:9;-1:-1:-1;;;;;37279:56:0;37288:11;-1:-1:-1;;;;;37279:56:0;;37312:22;37279:56;;;;;;:::i;:::-;;;;;;;;35524:1819;;;;;;:::o;10628:206::-;10714:7;10775:12;10767:6;;;;10759:29;;;;-1:-1:-1;;;10759:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;10810:5:0;;;10628:206::o;47748:246::-;47824:13;;:::i;:::-;47867:4;47851:20;;;;47847:108;;;47902:21;:19;:21::i;:::-;47893:5;:30;;47885:61;;;;-1:-1:-1;;;47885:61:0;;;;;;;:::i;:::-;-1:-1:-1;;47969:20:0;;;;:13;:20;;;;;;;;;47962:27;;;;;;;;;-1:-1:-1;;;;;47962:27:0;;;;-1:-1:-1;;;47962:27:0;;;;;;;;;;;;;;;;;;;;;;;;47748:246::o;33494:478::-;29195:16;:23;;-1:-1:-1;;29195:23:0;29214:4;29195:23;;;:16;33594:27:::1;:20:::0;33619:1:::1;33594:24;:27::i;:::-;33579:42:::0;-1:-1:-1;33632:17:0::1;33652:30;:20:::0;33579:42;33652:24:::1;:30::i;:::-;33632:50:::0;-1:-1:-1;33720:21:0::1;33752:22;33769:4:::0;33752:16:::1;:22::i;:::-;33785:18;33806:41;:21;33832:14:::0;33806:25:::1;:41::i;:::-;33785:62;;33860:35;33873:9;33884:10;33860:12;:35::i;:::-;33921:43;33936:4;33942:10;33954:9;33921:43;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;29241:16:0;:24;;-1:-1:-1;;29241:24:0;;;-1:-1:-1;;;33494:478:0:o;37351:554::-;37469:14;;37404:7;;37469:14;;;;;37464:62;;-1:-1:-1;37507:6:0;37500:13;;37464:62;37533:21;37557:27;37577:6;37557:19;:27::i;:::-;37533:51;;37595:22;37620:31;37644:6;37620:23;:31::i;:::-;37595:56;;37659:23;37685:28;37706:6;37685:20;:28::i;:::-;37659:54;-1:-1:-1;37723:19:0;37745:54;37785:13;37745:35;:14;37659:54;37745:18;:35::i;:54::-;37723:76;-1:-1:-1;37807:25:0;37835:23;:6;37723:76;37835:10;:23::i;:::-;37807:51;37351:554;-1:-1:-1;;;;;;;37351:554:0:o;46130:397::-;-1:-1:-1;;;;;46196:29:0;;;;;;:14;:29;;;;;;:34;46192:73;;46247:7;;46192:73;46291:13;;46275;;46291:20;;46309:1;46291:17;:20::i;:::-;46349:101;;;;;;;;-1:-1:-1;;;;;46349:101:0;;;;;;46403:4;46349:101;;;;;;;46429:15;46349:101;;;;;;-1:-1:-1;46326:20:0;;;:13;:20;;;;;:124;;;;;;-1:-1:-1;;;;;;46326:124:0;;;;;;;;;-1:-1:-1;;;;46326:124:0;-1:-1:-1;;;46326:124:0;;;;;;;;;;;;;;;;;;;;;;46459:29;;:14;:29;;;;:37;;;46326:124;46501:21;-1:-1:-1;46130:397:0;;:::o;46532:540::-;-1:-1:-1;;;;;46598:29:0;;;;;;:14;:29;;;;;;46594:73;;46649:7;;46594:73;-1:-1:-1;;;;;46693:29:0;;46677:13;46693:29;;;:14;:29;;;;;;;46733:33;;;46800:13;;46791:22;;46787:178;;46867:13;;;46853:28;;;;:13;:28;;;;;;;;46830:20;;;;;;:51;;;;-1:-1:-1;;;;;;46830:51:0;-1:-1:-1;;;;;46830:51:0;;;;;;;;;;-1:-1:-1;;;46830:51:0;;;;;;;;-1:-1:-1;;;;46830:51:0;;;;;;;;;;;;;;;;;;;46925:13;;46911:28;;;;;:33;;;;46896:49;;:14;:49;;;:57;;;46787:178;46989:13;;;47015:5;46975:28;;;:13;:28;;;;;:45;;-1:-1:-1;;;;46975:45:0;;;47047:13;:20;;46975:45;47047:17;:20::i;:::-;47031:13;:36;-1:-1:-1;46532:540:0;:::o;47078:563::-;47198:27;47223:1;47207:13;;:17;;;;:::i;:::-;47198:4;;:8;:27::i;:::-;:31;;47228:1;47198:31;:::i;:::-;47191:38;;47244:27;47269:1;47253:13;;:17;;;;:::i;:::-;47244:4;;:8;:27::i;:::-;:31;;47274:1;47244:31;:::i;:::-;47290:21;47314:19;;;:13;:19;;;;;;;;47290:43;;;;;;;;;;-1:-1:-1;;;;;47290:43:0;;;;;;-1:-1:-1;;;47290:43:0;;;;;;;;;;;;;;;;;;;;;;;47365:19;;;;;;;;;;47341:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47403:16;;47237:38;;-1:-1:-1;47290:43:0;;47403:36;;;;;47423:7;:16;;;47403:36;47399:238;;;47468:12;;-1:-1:-1;;;;;47453:28:0;;;;;;;:14;:28;;;;;;;;:35;;;47515:12;;47500:28;;;;;;;:35;;;47558:19;;;:13;:19;;;;;:29;;;;;;;;;;-1:-1:-1;;;47558:29:0;;;-1:-1:-1;;;;47558:29:0;;;-1:-1:-1;;;;;;47558:29:0;;;;;;;;;;;;;;;;;;47599:19;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47399:238;47078:563;;;;:::o;33980:529::-;34070:16;;;34084:1;34070:16;;;;;;;;34046:21;;34070:16;;;;;;;;;;-1:-1:-1;34070:16:0;34046:40;;34115:4;34097;34102:1;34097:7;;;;;;-1:-1:-1;;;34097:7:0;;;;;;;;;;;;;;:23;-1:-1:-1;;;;;34097:23:0;;;-1:-1:-1;;;;;34097:23:0;;;;;34141:15;-1:-1:-1;;;;;34141:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34131:4;34136:1;34131:7;;;;;;-1:-1:-1;;;34131:7:0;;;;;;;;;;;;;;:32;-1:-1:-1;;;;;34131:32:0;;;-1:-1:-1;;;;;34131:32:0;;;;;34176:62;34193:4;34208:15;34226:11;34176:8;:62::i;:::-;34277:224;;-1:-1:-1;;;34277:224:0;;-1:-1:-1;;;;;34277:15:0;:66;;;;:224;;34358:11;;34384:1;;34428:4;;34455;;34475:15;;34277:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33980:529;;:::o;34603:513::-;34751:62;34768:4;34783:15;34801:11;34751:8;:62::i;:::-;34856:15;-1:-1:-1;;;;;34856:31:0;;34895:9;34928:4;34948:11;34974:1;35017;35060:7;:5;:7::i;:::-;35082:15;34856:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;34603:513;;:::o;37913:346::-;38054:10;;37975:7;;;;38026:39;;38046:6;;38054:10;;38026:19;:39::i;:::-;38087:11;;37992:73;;-1:-1:-1;38087:40:0;;37992:73;38087:15;:40::i;:::-;38073:11;:54;38178:4;38161:23;;;;:8;:23;;;;;;:52;;38189:23;38161:27;:52::i;:::-;38152:4;38135:23;;;;:8;:23;;;;;:78;38228:23;37913:346;-1:-1:-1;;37913:346:0:o;38267:388::-;38333:7;38354:35;38393:48;38413:6;38421:19;;;;;;;;;;;38393;:48::i;:::-;38467:15;;38353:88;;-1:-1:-1;38467:48:0;;38353:88;38467:19;:48::i;:::-;38449:15;:66;38566:4;38549:23;;;;:8;:23;;;;;;:56;;38577:27;38549;:56::i;38663:361::-;38726:7;38744:32;38780:45;38800:6;38808:16;;;;;;;;;;;38780:19;:45::i;:::-;38848:12;;38743:82;;-1:-1:-1;38848:42:0;;38743:82;38848:16;:42::i;:::-;38833:12;:57;38941:4;38924:23;;;;:8;:23;;;;;;:53;;38952:24;38924:27;:53::i;10051:98::-;10109:7;10136:5;10140:1;10136;:5;:::i;39032:138::-;39111:7;39135:27;39156:5;39135:16;:6;:16;;;:10;:16::i;:::-;:20;;:27::i;9087:98::-;9145:7;9172:5;9176:1;9172;:5;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;546:402::-;;;675:2;663:9;654:7;650:23;646:32;643:2;;;696:6;688;681:22;643:2;740:9;727:23;759:33;786:5;759:33;:::i;:::-;811:5;-1:-1:-1;868:2:1;853:18;;840:32;881:35;840:32;881:35;:::i;:::-;935:7;925:17;;;633:315;;;;;:::o;953:470::-;;;;1099:2;1087:9;1078:7;1074:23;1070:32;1067:2;;;1120:6;1112;1105:22;1067:2;1164:9;1151:23;1183:33;1210:5;1183:33;:::i;:::-;1235:5;-1:-1:-1;1292:2:1;1277:18;;1264:32;1305:35;1264:32;1305:35;:::i;:::-;1057:366;;1359:7;;-1:-1:-1;;;1413:2:1;1398:18;;;;1385:32;;1057:366::o;1428:327::-;;;1557:2;1545:9;1536:7;1532:23;1528:32;1525:2;;;1578:6;1570;1563:22;1525:2;1622:9;1609:23;1641:33;1668:5;1641:33;:::i;:::-;1693:5;1745:2;1730:18;;;;1717:32;;-1:-1:-1;;;1515:240:1:o;1760:293::-;;1869:2;1857:9;1848:7;1844:23;1840:32;1837:2;;;1890:6;1882;1875:22;1837:2;1934:9;1921:23;1987:5;1980:13;1973:21;1966:5;1963:32;1953:2;;2014:6;2006;1999:22;2058:190;;2170:2;2158:9;2149:7;2145:23;2141:32;2138:2;;;2191:6;2183;2176:22;2138:2;-1:-1:-1;2219:23:1;;2128:120;-1:-1:-1;2128:120:1:o;2253:1163::-;;;;2409:2;2397:9;2388:7;2384:23;2380:32;2377:2;;;2430:6;2422;2415:22;2377:2;2471:9;2458:23;2448:33;;2500:2;2552;2541:9;2537:18;2524:32;2565:33;2592:5;2565:33;:::i;:::-;2617:5;-1:-1:-1;2673:2:1;2658:18;;2645:32;2696:18;2726:14;;;2723:2;;;2758:6;2750;2743:22;2723:2;2801:6;2790:9;2786:22;2776:32;;2846:7;2839:4;2835:2;2831:13;2827:27;2817:2;;2873:6;2865;2858:22;2817:2;2914;2901:16;2936:2;2932;2929:10;2926:2;;;2942:18;;:::i;:::-;2991:2;2985:9;3060:2;3041:13;;-1:-1:-1;;3037:27:1;3025:40;;3021:49;;3085:18;;;3105:22;;;3082:46;3079:2;;;3131:18;;:::i;:::-;3167:2;3160:22;3191:18;;;3228:11;;;3224:20;;3221:33;-1:-1:-1;3218:2:1;;;3272:6;3264;3257:22;3218:2;3333;3328;3324;3320:11;3315:2;3307:6;3303:15;3290:46;3378:6;3373:2;3368;3360:6;3356:15;3352:24;3345:40;3404:6;3394:16;;;;;;;2367:1049;;;;;:::o;3421:316::-;;;;3578:2;3566:9;3557:7;3553:23;3549:32;3546:2;;;3599:6;3591;3584:22;3546:2;3633:9;3627:16;3617:26;;3683:2;3672:9;3668:18;3662:25;3652:35;;3727:2;3716:9;3712:18;3706:25;3696:35;;3536:201;;;;;:::o;3742:296::-;;3853:2;3841:9;3832:7;3828:23;3824:32;3821:2;;;3874:6;3866;3859:22;3821:2;3918:9;3905:23;3968:10;3961:5;3957:22;3950:5;3947:33;3937:2;;3999:6;3991;3984:22;4043:469;;4140:5;4134:12;4167:6;4162:3;4155:19;4193:4;4222:2;4217:3;4213:12;4206:19;;4259:2;4252:5;4248:14;4280:3;4292:195;4306:6;4303:1;4300:13;4292:195;;;4371:13;;-1:-1:-1;;;;;4367:39:1;4355:52;;4427:12;;;;4462:15;;;;4403:1;4321:9;4292:195;;;-1:-1:-1;4503:3:1;;4110:402;-1:-1:-1;;;;;4110:402:1:o;4517:478::-;;4599:5;4593:12;4626:6;4621:3;4614:19;4651:3;4663:162;4677:6;4674:1;4671:13;4663:162;;;4739:4;4795:13;;;4791:22;;4785:29;4767:11;;;4763:20;;4756:59;4692:12;4663:162;;;4843:6;4840:1;4837:13;4834:2;;;4909:3;4902:4;4893:6;4888:3;4884:16;4880:27;4873:40;4834:2;-1:-1:-1;4977:2:1;4956:15;-1:-1:-1;;4952:29:1;4943:39;;;;4984:4;4939:50;;4569:426;-1:-1:-1;;4569:426:1:o;5000:359::-;5185:19;;;5242:2;5238:15;;;;-1:-1:-1;;5234:53:1;5229:2;5220:12;;5213:75;5313:2;5304:12;;5297:28;5350:2;5341:12;;5175:184::o;5364:203::-;-1:-1:-1;;;;;5528:32:1;;;;5510:51;;5498:2;5483:18;;5465:102::o;5572:274::-;-1:-1:-1;;;;;5764:32:1;;;;5746:51;;5828:2;5813:18;;5806:34;5734:2;5719:18;;5701:145::o;5851:607::-;-1:-1:-1;;;;;6210:15:1;;;6192:34;;6257:2;6242:18;;6235:34;;;;6300:2;6285:18;;6278:34;;;;6343:2;6328:18;;6321:34;;;;6392:15;;;6386:3;6371:19;;6364:44;6172:3;6424:19;;6417:35;;;;6141:3;6126:19;;6108:350::o;6463:338::-;;6670:2;6659:9;6652:21;6690:62;6748:2;6737:9;6733:18;6725:6;6690:62;:::i;:::-;6682:70;;6788:6;6783:2;6772:9;6768:18;6761:34;6642:159;;;;;:::o;6806:187::-;6971:14;;6964:22;6946:41;;6934:2;6919:18;;6901:92::o;7233:222::-;;7382:2;7371:9;7364:21;7402:47;7445:2;7434:9;7430:18;7422:6;7402:47;:::i;7460:355::-;7662:2;7644:21;;;7701:2;7681:18;;;7674:30;7740:33;7735:2;7720:18;;7713:61;7806:2;7791:18;;7634:181::o;7820:403::-;8022:2;8004:21;;;8061:2;8041:18;;;8034:30;8100:34;8095:2;8080:18;;8073:62;-1:-1:-1;;;8166:2:1;8151:18;;8144:37;8213:3;8198:19;;7994:229::o;8228:402::-;8430:2;8412:21;;;8469:2;8449:18;;;8442:30;8508:34;8503:2;8488:18;;8481:62;-1:-1:-1;;;8574:2:1;8559:18;;8552:36;8620:3;8605:19;;8402:228::o;8635:398::-;8837:2;8819:21;;;8876:2;8856:18;;;8849:30;8915:34;8910:2;8895:18;;8888:62;-1:-1:-1;;;8981:2:1;8966:18;;8959:32;9023:3;9008:19;;8809:224::o;9038:404::-;9240:2;9222:21;;;9279:2;9259:18;;;9252:30;9318:34;9313:2;9298:18;;9291:62;-1:-1:-1;;;9384:2:1;9369:18;;9362:38;9432:3;9417:19;;9212:230::o;9447:425::-;9649:2;9631:21;;;9688:2;9668:18;;;9661:30;9727:34;9722:2;9707:18;;9700:62;9798:31;9793:2;9778:18;;9771:59;9862:3;9847:19;;9621:251::o;9877:329::-;10079:2;10061:21;;;10118:1;10098:18;;;10091:29;-1:-1:-1;;;10151:2:1;10136:18;;10129:36;10197:2;10182:18;;10051:155::o;10211:424::-;10413:2;10395:21;;;10452:2;10432:18;;;10425:30;10491:34;10486:2;10471:18;;10464:62;10562:30;10557:2;10542:18;;10535:58;10625:3;10610:19;;10385:250::o;10640:404::-;10842:2;10824:21;;;10881:2;10861:18;;;10854:30;10920:34;10915:2;10900:18;;10893:62;-1:-1:-1;;;10986:2:1;10971:18;;10964:38;11034:3;11019:19;;10814:230::o;11049:347::-;11251:2;11233:21;;;11290:2;11270:18;;;11263:30;11329:25;11324:2;11309:18;;11302:53;11387:2;11372:18;;11223:173::o;11401:426::-;11603:2;11585:21;;;11642:2;11622:18;;;11615:30;11681:34;11676:2;11661:18;;11654:62;11752:32;11747:2;11732:18;;11725:60;11817:3;11802:19;;11575:252::o;11832:356::-;12034:2;12016:21;;;12053:18;;;12046:30;12112:34;12107:2;12092:18;;12085:62;12179:2;12164:18;;12006:182::o;12193:400::-;12395:2;12377:21;;;12434:2;12414:18;;;12407:30;12473:34;12468:2;12453:18;;12446:62;-1:-1:-1;;;12539:2:1;12524:18;;12517:34;12583:3;12568:19;;12367:226::o;12598:342::-;12800:2;12782:21;;;12839:2;12819:18;;;12812:30;-1:-1:-1;;;12873:2:1;12858:18;;12851:48;12931:2;12916:18;;12772:168::o;12945:427::-;13147:2;13129:21;;;13186:2;13166:18;;;13159:30;13225:34;13220:2;13205:18;;13198:62;13296:33;13291:2;13276:18;;13269:61;13362:3;13347:19;;13119:253::o;13377:338::-;13579:2;13561:21;;;13618:2;13598:18;;;13591:30;-1:-1:-1;;;13652:2:1;13637:18;;13630:44;13706:2;13691:18;;13551:164::o;13720:410::-;13922:2;13904:21;;;13961:2;13941:18;;;13934:30;14000:34;13995:2;13980:18;;13973:62;-1:-1:-1;;;14066:2:1;14051:18;;14044:44;14120:3;14105:19;;13894:236::o;14135:177::-;14281:25;;;14269:2;14254:18;;14236:76::o;14317:390::-;14504:25;;;-1:-1:-1;;;;;14565:32:1;;14560:2;14545:18;;14538:60;14634:2;14629;14614:18;;14607:30;;;14317:390;;14654:47;;14682:18;;14674:6;14654:47;:::i;:::-;14646:55;14494:213;-1:-1:-1;;;;;14494:213:1:o;14712:588::-;;15011:6;15000:9;14993:25;15054:6;15049:2;15038:9;15034:18;15027:34;15097:3;15092:2;15081:9;15077:18;15070:31;15118:63;15176:3;15165:9;15161:19;15153:6;15118:63;:::i;:::-;-1:-1:-1;;;;;15217:32:1;;;;15212:2;15197:18;;15190:60;-1:-1:-1;15281:3:1;15266:19;15259:35;15110:71;14983:317;-1:-1:-1;;;14983:317:1:o;15305:319::-;15507:25;;;15563:2;15548:18;;15541:34;;;;15606:2;15591:18;;15584:34;15495:2;15480:18;;15462:162::o;15629:192::-;15803:10;15791:23;;;;15773:42;;15761:2;15746:18;;15728:93::o;15826:184::-;15998:4;15986:17;;;;15968:36;;15956:2;15941:18;;15923:87::o;16015:128::-;;16086:1;16082:6;16079:1;16076:13;16073:2;;;16092:18;;:::i;:::-;-1:-1:-1;16128:9:1;;16063:80::o;16148:204::-;;16222:4;16219:1;16215:12;16254:4;16251:1;16247:12;16289:3;16283:4;16279:14;16274:3;16271:23;16268:2;;;16297:18;;:::i;:::-;16333:13;;16194:158;-1:-1:-1;;;16194:158:1:o;16357:120::-;;16423:1;16413:2;;16428:18;;:::i;:::-;-1:-1:-1;16462:9:1;;16403:74::o;16482:168::-;;16588:1;16584;16580:6;16576:14;16573:1;16570:21;16565:1;16558:9;16551:17;16547:45;16544:2;;;16595:18;;:::i;:::-;-1:-1:-1;16635:9:1;;16534:116::o;16655:125::-;;16723:1;16720;16717:8;16714:2;;;16728:18;;:::i;:::-;-1:-1:-1;16765:9:1;;16704:76::o;16785:380::-;16870:1;16860:12;;16917:1;16907:12;;;16928:2;;16982:4;16974:6;16970:17;16960:27;;16928:2;17035;17027:6;17024:14;17004:18;17001:38;16998:2;;;17081:10;17076:3;17072:20;17069:1;17062:31;17116:4;17113:1;17106:15;17144:4;17141:1;17134:15;16998:2;;16840:325;;;:::o;17170:135::-;;-1:-1:-1;;17230:17:1;;17227:2;;;17250:18;;:::i;:::-;-1:-1:-1;17297:1:1;17286:13;;17217:88::o;17310:175::-;;17391:4;17384:5;17380:16;17420:4;17411:7;17408:17;17405:2;;;17428:18;;:::i;:::-;17477:1;17464:15;;17355:130;-1:-1:-1;;17355:130:1:o;17490:112::-;;17548:1;17538:2;;17553:18;;:::i;:::-;-1:-1:-1;17587:9:1;;17528:74::o;17607:127::-;17668:10;17663:3;17659:20;17656:1;17649:31;17699:4;17696:1;17689:15;17723:4;17720:1;17713:15;17739:127;17800:10;17795:3;17791:20;17788:1;17781:31;17831:4;17828:1;17821:15;17855:4;17852:1;17845:15;17871:127;17932:10;17927:3;17923:20;17920:1;17913:31;17963:4;17960:1;17953:15;17987:4;17984:1;17977:15;18003:133;-1:-1:-1;;;;;18080:31:1;;18070:42;;18060:2;;18126:1;18123;18116:12
Swarm Source
ipfs://a5ee3a4e61e2ca0f015ea4309021696a96f3f31d5c84981adf201f30cfd20eb9
Loading...
Loading
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.