Feature Tip: Add private address tag to any address under My Name Tag !
Overview
Max Total Supply
537,000,000,000,000 ISLE
Holders
6,495 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 9 Decimals)
Balance
8,900,000,000 ISLEValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
IslandToken
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-26 */ 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 IslandToken is Context, Ownable, IERC20 { // Libraries using SafeMath for uint256; using Address for address; // Attributes for ERC-20 token string private _name = "Island"; string private _symbol = "ISLE"; uint8 private _decimals = 9; mapping (address => uint256) private _balance; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _total = 690000000 * 10**6 * 10**9; uint256 private maxTxAmount = 3450000 * 10**6 * 10**9; uint256 private numTokensSellToAddToLiquidity = 345000 * 10**6 * 10**9; uint256 private minHoldingThreshold = 100 * 10**6 * 10**9; // Island attributes uint8 public sandTax = 5; uint8 public burnableFundRate = 5; uint8 public operationalFundRate = 1; uint256 public sandFund; uint256 public burnableFund; uint256 public operationalFund; uint256 private largePrizeTotal = 0; uint256 private mediumPrizeTotal = 0; uint256 private smallPrizeTotal = 0; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; 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 SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event OperationalFundWithdrawn( uint256 amount, address recepient, string reason ); event StartSand ( uint256 largePrizeTotal, uint256 mediumPrizeTotal, uint256 lowPrizeTotal ); constructor () { _balance[_msgSender()] = _total; addEntity(_msgSender()); sandFund = 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 --- : Island 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 getCommunityIslandFund() public view returns (uint256) { uint256 communityFund = burnableFund.add(sandFund).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 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 island 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 island Fund uint256 contractTokenBalance = balanceOf(address(this)).sub(getCommunityIslandFund()); 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 SAND 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) { uint256 sandTaxFee = _extractSandFund(amount); uint256 operationalTax = _extractOperationalFund(amount); uint256 burnableFundTax = _extractBurnableFund(amount); uint256 businessTax = operationalTax.add(burnableFundTax).add(sandTaxFee); uint256 transactionAmount = amount.sub(businessTax); return transactionAmount; } function _extractSandFund(uint256 amount) private returns (uint256) { uint256 sandFundContribution = _getExtractableFund(amount, sandTax); sandFund = sandFund.add(sandFundContribution); _balance[address(this)] = _balance[address(this)].add(sandFundContribution); return sandFundContribution; } 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 --- : SAND functions. // Off-chain bot calls payoutLargeRedistribution, payoutMediumRedistribution, payoutSmallRedistribution in order function startSand() public onlyOwner returns (bool success) { require (sandFund > 0, "fund too small"); largePrizeTotal = sandFund.div(4); mediumPrizeTotal = sandFund.div(2); smallPrizeTotal = sandFund.sub(largePrizeTotal).sub(mediumPrizeTotal); lastEntryAllowed = lastIndexUsed; emit StartSand(largePrizeTotal, mediumPrizeTotal, smallPrizeTotal); return true; } function payoutLargeRedistribution() public onlyOwner() returns (bool success) { require (lastEntryAllowed != 0, "SAND must be initiated before this function can be called."); uint256 seed = 69; 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; sandFund = sandFund.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, "SAND 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 = 69; 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); } sandFund = sandFund.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); } sandFund = sandFund.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 (sandFund < 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; } } sandFund = sandFund.sub(totalDisbursed); _balance[address(this)] = _balance[address(this)].sub(totalDisbursed); return true; } function EndSand() 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 SAND"); 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":"StartSand","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":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":"EndSand","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":"getCommunityIslandFund","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":"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":[],"name":"sandFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sandTax","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":"uint256","name":"amount","type":"uint256"}],"name":"setminHoldingThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSand","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":[{"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
60c06040526040518060400160405280600681526020017f49736c616e640000000000000000000000000000000000000000000000000000815250600190805190602001906200005192919062000735565b506040518060400160405280600481526020017f49534c4500000000000000000000000000000000000000000000000000000000815250600290805190602001906200009f92919062000735565b506009600360006101000a81548160ff021916908360ff16021790555069921cf9965f520b40000060065568bb065e311dd9a800006007556812b3d6381c95c4000060085567016345785d8a00006009556005600a60006101000a81548160ff021916908360ff1602179055506005600a60016101000a81548160ff021916908360ff1602179055506001600a60026101000a81548160ff021916908360ff1602179055506000600e556000600f5560006010556001601160016101000a81548160ff021916908315150217905550600060145560006015556064601660006101000a81548163ffffffff021916908363ffffffff160217905550348015620001a757600080fd5b506000620001ba6200059b60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600654600460006200026f6200059b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620002cd620002c16200059b60201b60201c565b620005a360201b60201c565b6000600b819055506000600c819055506000600d819055506000601160006101000a81548160ff0219169083151502179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200036057600080fd5b505afa15801562000375573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039b9190620007fc565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620003fe57600080fd5b505afa15801562000413573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004399190620007fc565b6040518363ffffffff1660e01b8152600401620004589291906200084a565b602060405180830381600087803b1580156200047357600080fd5b505af115801562000488573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004ae9190620007fc565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250506200052b6200059b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6006546040516200058c919062000877565b60405180910390a350620009dd565b600033905090565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414620005f1576200071a565b60006200061060016014546200071d60201b62002c3c1790919060201c565b905060405180606001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001600115158152602001428152506013600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff0219169083151502179055506040820151816001015590505080601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601481905550505b50565b600081836200072d919062000894565b905092915050565b82805462000743906200092f565b90600052602060002090601f016020900481019282620007675760008555620007b3565b82601f106200078257805160ff1916838001178555620007b3565b82800160010185558215620007b3579182015b82811115620007b257825182559160200191906001019062000795565b5b509050620007c29190620007c6565b5090565b5b80821115620007e1576000816000905550600101620007c7565b5090565b600081519050620007f681620009c3565b92915050565b6000602082840312156200080f57600080fd5b60006200081f84828501620007e5565b91505092915050565b6200083381620008f1565b82525050565b620008448162000925565b82525050565b600060408201905062000861600083018562000828565b62000870602083018462000828565b9392505050565b60006020820190506200088e600083018462000839565b92915050565b6000620008a18262000925565b9150620008ae8362000925565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620008e657620008e562000965565b5b828201905092915050565b6000620008fe8262000905565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200094857607f821691505b602082108114156200095f576200095e62000994565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b620009ce81620008f1565b8114620009da57600080fd5b50565b60805160601c60a05160601c61593362000a3360003960008181610cdb0152613070015260008181611bbe01528181613ea601528181613fbc01528181613fe30152818161407f01526140a601526159336000f3fe60806040526004361061023e5760003560e01c80638ff0ab7f1161012e578063c49b9a80116100ab578063dd62ed3e1161006f578063dd62ed3e1461089b578063deb3cdf8146108d8578063df7b6d4114610903578063f2fde38b1461092e578063f3a28b0e1461095757610245565b8063c49b9a80146107c8578063c956e0c3146107f1578063ccb2abf31461081c578063d78c67c514610847578063d9bf0d221461087257610245565b8063a457c2d7116100f2578063a457c2d7146106cd578063a63b7f981461070a578063a8246ef314610735578063a9059cbb14610760578063ba3d9f011461079d57610245565b80638ff0ab7f146105e65780639381099a1461060f57806395d89b411461063a5780639950166314610665578063a3346f16146106a257610245565b80634a74bb02116101bc57806370a082311161018057806370a0823114610515578063715018a61461055257806374010ece146105695780637b47ec1a146105925780638da5cb5b146105bb57610245565b80634a74bb02146104405780634b433e0f1461046b5780635fc3a2c9146104965780636a4b05ad146104bf5780636ee303cd146104ea57610245565b8063313ce56711610203578063313ce56714610345578063395093511461037057806340fe117b146103ad57806343023cfa146103d857806349bd5a5e1461041557610245565b80624d75111461024a57806306fdde0314610275578063095ea7b3146102a057806318160ddd146102dd57806323b872dd1461030857610245565b3661024557005b600080fd5b34801561025657600080fd5b5061025f610982565b60405161026c9190615277565b60405180910390f35b34801561028157600080fd5b5061028a610988565b6040516102979190615035565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c29190614649565b610a1a565b6040516102d49190614fff565b60405180910390f35b3480156102e957600080fd5b506102f2610a38565b6040516102ff9190615277565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906145fa565b610a42565b60405161033c9190614fff565b60405180910390f35b34801561035157600080fd5b5061035a610b1b565b604051610367919061537c565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190614649565b610b32565b6040516103a49190614fff565b60405180910390f35b3480156103b957600080fd5b506103c2610be5565b6040516103cf919061537c565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa919061456c565b610bf8565b60405161040c9190615277565b60405180910390f35b34801561042157600080fd5b5061042a610cd9565b6040516104379190614f2a565b60405180910390f35b34801561044c57600080fd5b50610455610cfd565b6040516104629190614fff565b60405180910390f35b34801561047757600080fd5b50610480610d10565b60405161048d9190615277565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b891906146d7565b610d1a565b005b3480156104cb57600080fd5b506104d4610fe1565b6040516104e19190615277565b60405180910390f35b3480156104f657600080fd5b506104ff610feb565b60405161050c9190614fff565b60405180910390f35b34801561052157600080fd5b5061053c6004803603810190610537919061456c565b611168565b6040516105499190615277565b60405180910390f35b34801561055e57600080fd5b506105676111b1565b005b34801561057557600080fd5b50610590600480360381019061058b91906146ae565b6112eb565b005b34801561059e57600080fd5b506105b960048036038101906105b491906146ae565b611371565b005b3480156105c757600080fd5b506105d06115e8565b6040516105dd9190614f2a565b60405180910390f35b3480156105f257600080fd5b5061060d6004803603810190610608919061478d565b611611565b005b34801561061b57600080fd5b506106246116b1565b6040516106319190615361565b60405180910390f35b34801561064657600080fd5b5061064f6116c7565b60405161065c9190615035565b60405180910390f35b34801561067157600080fd5b5061068c600480360381019061068791906146ae565b611759565b6040516106999190614fff565b60405180910390f35b3480156106ae57600080fd5b506106b7611ae9565b6040516106c49190615277565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef9190614649565b611aef565b6040516107019190614fff565b60405180910390f35b34801561071657600080fd5b5061071f611bbc565b60405161072c919061501a565b60405180910390f35b34801561074157600080fd5b5061074a611be0565b6040516107579190614fff565b60405180910390f35b34801561076c57600080fd5b5061078760048036038101906107829190614649565b611efa565b6040516107949190614fff565b60405180910390f35b3480156107a957600080fd5b506107b2611f18565b6040516107bf9190615277565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea9190614685565b611f22565b005b3480156107fd57600080fd5b50610806611ff2565b604051610813919061537c565b60405180910390f35b34801561082857600080fd5b50610831612005565b60405161083e9190614fff565b60405180910390f35b34801561085357600080fd5b5061085c61284b565b604051610869919061537c565b60405180910390f35b34801561087e57600080fd5b50610899600480360381019061089491906146ae565b61285e565b005b3480156108a757600080fd5b506108c260048036038101906108bd91906145be565b6128e4565b6040516108cf9190615277565b60405180910390f35b3480156108e457600080fd5b506108ed61296b565b6040516108fa9190615277565b60405180910390f35b34801561090f57600080fd5b50610918612971565b6040516109259190614fff565b60405180910390f35b34801561093a57600080fd5b506109556004803603810190610950919061456c565b612a5c565b005b34801561096357600080fd5b5061096c612c05565b6040516109799190615277565b60405180910390f35b600b5481565b60606001805461099790615676565b80601f01602080910402602001604051908101604052809291908181526020018280546109c390615676565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b5050505050905090565b6000610a2e610a27612c52565b8484612c5a565b6001905092915050565b6000600654905090565b6000610a4f848484612e25565b610b1084610a5b612c52565b610b0b856040518060600160405280602881526020016158b160289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610ac1612c52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133b09092919063ffffffff16565b612c5a565b600190509392505050565b6000600360009054906101000a900460ff16905090565b6000610bdb610b3f612c52565b84610bd68560056000610b50612c52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b612c5a565b6001905092915050565b600a60009054906101000a900460ff1681565b600080601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c73906150f7565b60405180910390fd5b60136000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548152602001908152602001600020600101549050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b601160019054906101000a900460ff1681565b6000600954905090565b610d22612c52565b73ffffffffffffffffffffffffffffffffffffffff16610d406115e8565b73ffffffffffffffffffffffffffffffffffffffff1614610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d90615177565b60405180910390fd5b600d548310610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190615197565b60405180910390fd5b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054831115610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5390615157565b60405180910390fd5b610e7183600d5461340590919063ffffffff16565b600d81905550610ec983600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5e83600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f3f650de7ee2e52a67d67738174f630780c286b09585da256f97334e3764bb954838383604051610fd493929190615292565b60405180910390a1505050565b6000601454905090565b6000610ff5612c52565b73ffffffffffffffffffffffffffffffffffffffff166110136115e8565b73ffffffffffffffffffffffffffffffffffffffff1614611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090615177565b60405180910390fd5b6000600b54116110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590615217565b60405180910390fd5b6110c46004600b5461341b90919063ffffffff16565b600e819055506110e06002600b5461341b90919063ffffffff16565b600f81905550611111600f54611103600e54600b5461340590919063ffffffff16565b61340590919063ffffffff16565b6010819055506014546015819055507f1763863897cb343909dbb614fe1ee48bf19027eb008815698d751b299c5f6721600e54600f546010546040516111599392919061532a565b60405180910390a16001905090565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111b9612c52565b73ffffffffffffffffffffffffffffffffffffffff166111d76115e8565b73ffffffffffffffffffffffffffffffffffffffff161461122d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122490615177565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6112f3612c52565b73ffffffffffffffffffffffffffffffffffffffff166113116115e8565b73ffffffffffffffffffffffffffffffffffffffff1614611367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135e90615177565b60405180910390fd5b8060078190555050565b611379612c52565b73ffffffffffffffffffffffffffffffffffffffff166113976115e8565b73ffffffffffffffffffffffffffffffffffffffff16146113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e490615177565b60405180910390fd5b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146690615077565b60405180910390fd5b600c548111156114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab90615057565b60405180910390fd5b61150681600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061155e8160065461340590919063ffffffff16565b60068190555061157981600c5461340590919063ffffffff16565b600c81905550600073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115dd9190615277565b60405180910390a350565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611619612c52565b73ffffffffffffffffffffffffffffffffffffffff166116376115e8565b73ffffffffffffffffffffffffffffffffffffffff161461168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490615177565b60405180910390fd5b80601660006101000a81548163ffffffff021916908363ffffffff16021790555050565b601660009054906101000a900463ffffffff1681565b6060600280546116d690615676565b80601f016020809104026020016040519081016040528092919081815260200182805461170290615676565b801561174f5780601f106117245761010080835404028352916020019161174f565b820191906000526020600020905b81548152906001019060200180831161173257829003601f168201915b5050505050905090565b6000611763612c52565b73ffffffffffffffffffffffffffffffffffffffff166117816115e8565b73ffffffffffffffffffffffffffffffffffffffff16146117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce90615177565b60405180910390fd5b6000601554141580156117ea5750600082115b611829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182090615257565b60405180910390fd5b600061184260155460105461341b90919063ffffffff16565b90506000808490505b601660009054906101000a900463ffffffff1663ffffffff168561186f919061544d565b811015611a2d5782600b54101561188557611a2d565b600115156013600083815260200190815260200160002060000160149054906101000a900460ff16151514156119cc5761193d83600460006013600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460006013600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119c98383612c3c90919063ffffffff16565b91505b601554811415611a1a577fad8fb82b9a19477e4da24a41f430d3fd63316dc555145f1bcc7f087d1d4734c883604051611a059190615277565b60405180910390a16000601081905550611a2d565b8080611a25906156a8565b91505061184b565b50611a4381600b5461340590919063ffffffff16565b600b81905550611a9b81600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600192505050919050565b600d5481565b6000611bb2611afc612c52565b84611bad856040518060600160405280602581526020016158d96025913960056000611b26612c52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133b09092919063ffffffff16565b612c5a565b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611bea612c52565b73ffffffffffffffffffffffffffffffffffffffff16611c086115e8565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590615177565b60405180910390fd5b60006015541415611ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9b90615237565b60405180910390fd5b6000604590506000600e5490506000601554423385604051602001611ccb93929190614eed565b6040516020818303038152906040528051906020012060001c611cee9190615749565b90506000611cfd826000613431565b90505b600115158160200151151514611d5f57601554423386604051602001611d2893929190614eed565b6040516020818303038152906040528051906020012060001c611d4b9190615749565b9150611d58826000613431565b9050611d00565b600081600001519050611d7d84600b5461340590919063ffffffff16565b600b81905550611dd584600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e6a84600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600e819055507f04df60a8ea19ecabae271ed2448d3afc69571f168ac354f2a130a1b2ff4d60348185604051611ee6929190614f45565b60405180910390a160019550505050505090565b6000611f0e611f07612c52565b8484612e25565b6001905092915050565b6000600754905090565b611f2a612c52565b73ffffffffffffffffffffffffffffffffffffffff16611f486115e8565b73ffffffffffffffffffffffffffffffffffffffff1614611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590615177565b60405180910390fd5b80601160016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611fe79190614fff565b60405180910390a150565b600a60019054906101000a900460ff1681565b600061200f612c52565b73ffffffffffffffffffffffffffffffffffffffff1661202d6115e8565b73ffffffffffffffffffffffffffffffffffffffff1614612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207a90615177565b60405180910390fd5b600060155414156120c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c090615237565b60405180910390fd5b6000600f549050600060649050600080604590506000606467ffffffffffffffff811115612120577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561214e5781602001602082028036833780820191505090505b50905060006064601554116124d5576015549450612175858761341b90919063ffffffff16565b95505b848160ff1610156123d5576013600060018361219491906154a3565b60ff16815260200190815260200160002060000160149054906101000a900460ff16156123ba57601360006001836121cc91906154a3565b60ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828260ff168151811061223d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061228a8685612c3c90919063ffffffff16565b93506123238660046000601360006001876122a591906154a3565b60ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460006013600060018661233891906154a3565b60ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806123b6906156f1565b9150505b6123ce600184612c3c90919063ffffffff16565b9250612178565b6123ea84600b5461340590919063ffffffff16565b600b8190555061244284600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600f819055507fed39fa52e1344d828af771e58862d95bc9b17499836a5c2a3db2b7c4bf18fd5482876040516124be929190614fcf565b60405180910390a160019650505050505050612848565b6124e8858761341b90919063ffffffff16565b95505b848160ff16101561274c57600060155442338660405160200161251093929190614eed565b6040516020818303038152906040528051906020012060001c6125339190615749565b90506013600082815260200190815260200160002060000160149054906101000a900460ff1615612730576013600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838360ff16815181106125d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061261e8786612c3c90919063ffffffff16565b94506126a887600460006013600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460006013600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550818061272c906156f1565b9250505b612744600185612c3c90919063ffffffff16565b9350506124eb565b61276184600b5461340590919063ffffffff16565b600b819055506127b984600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600f819055507fed39fa52e1344d828af771e58862d95bc9b17499836a5c2a3db2b7c4bf18fd548287604051612835929190614fcf565b60405180910390a1600196505050505050505b90565b600a60029054906101000a900460ff1681565b612866612c52565b73ffffffffffffffffffffffffffffffffffffffff166128846115e8565b73ffffffffffffffffffffffffffffffffffffffff16146128da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d190615177565b60405180910390fd5b8060098190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c5481565b600061297b612c52565b73ffffffffffffffffffffffffffffffffffffffff166129996115e8565b73ffffffffffffffffffffffffffffffffffffffff16146129ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e690615177565b60405180910390fd5b60006015541415612a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2c906151f7565b60405180910390fd5b60006010819055506000600f819055506000600e8190555060006015819055506001905090565b612a64612c52565b73ffffffffffffffffffffffffffffffffffffffff16612a826115e8565b73ffffffffffffffffffffffffffffffffffffffff1614612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90615177565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3f90615097565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080612c33600d54612c25600b54600c54612c3c90919063ffffffff16565b612c3c90919063ffffffff16565b90508091505090565b60008183612c4a919061544d565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc1906151b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d31906150b7565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612e189190615277565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612e8f5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b612ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec5906150d7565b60405180910390fd5b600081118015612f1d5750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111155b612f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5390615137565b60405180910390fd5b612f646115e8565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612fd25750612fa26115e8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561301d5760075481111561301c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301390615117565b60405180910390fd5b5b600061304161302a612c05565b61303330611168565b61340590919063ffffffff16565b9050600060085482101590508080156130675750601160009054906101000a900460ff16155b80156130bf57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156130d75750601160019054906101000a900460ff165b156130eb5760085491506130ea82613532565b5b61313d83600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061318b84613608565b90506131df81600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600954600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561329f57503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b156132ae576132ad8561367d565b5b600954600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410801561332a57503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b1561333957613338866137ee565b5b6133438482613a65565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133a09190615277565b60405180910390a3505050505050565b60008383111582906133f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ef9190615035565b60405180910390fd5b5082840390509392505050565b600081836134139190615565565b905092915050565b6000818361342991906154da565b905092915050565b61343961444d565b6001151582151514156134915761344e610fe1565b831115613490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613487906151d7565b60405180910390fd5b5b601360008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff16151515158152602001600182015481525050905092915050565b6001601160006101000a81548160ff021916908315150217905550600061356360028361341b90919063ffffffff16565b9050600061357a828461340590919063ffffffff16565b9050600047905061358a83613dbb565b600061359f824761340590919063ffffffff16565b90506135ab8382614079565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618482856040516135de9392919061532a565b60405180910390a1505050506000601160006101000a81548160ff02191690831515021790555050565b60008061361483614169565b9050600061362184614240565b9050600061362e85614317565b90506000613657846136498486612c3c90919063ffffffff16565b612c3c90919063ffffffff16565b9050600061366e828861340590919063ffffffff16565b90508095505050505050919050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146136c9576137eb565b60006136e16001601454612c3c90919063ffffffff16565b905060405180606001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001600115158152602001428152506013600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff0219169083151502179055506040820151816001015590505080601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601481905550505b50565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561383b57613a62565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506014548114613a1357601360006014548152602001908152602001600020601360008381526020019081526020016000206000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000820160149054906101000a900460ff168160000160146101000a81548160ff02191690831515021790555060018201548160010155905050806012600060136000601454815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060136000601454815260200190815260200160002060000160146101000a81548160ff021916908315150217905550613a5a600160145461340590919063ffffffff16565b601481905550505b50565b6001613a886001601454613a799190615565565b846143ee90919063ffffffff16565b613a92919061544d565b91506001613ab76001601454613aa89190615565565b836143ee90919063ffffffff16565b613ac1919061544d565b90506000601360008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff1615151515815260200160018201548152505090506000601360008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff16151515158152602001600182015481525050905081602001518015613c0f575080602001515b15613db5578260126000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360126000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806013600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050816013600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908315150217905550604082015181600101559050505b50505050565b6000600267ffffffffffffffff811115613dfe577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015613e2c5781602001602082028036833780820191505090505b5090503081600081518110613e6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613f0a57600080fd5b505afa158015613f1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f429190614595565b81600181518110613f7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613fe1307f000000000000000000000000000000000000000000000000000000000000000084612c5a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140439594939291906152d0565b600060405180830381600087803b15801561405d57600080fd5b505af1158015614071573d6000803e3d6000fd5b505050505050565b6140a4307f000000000000000000000000000000000000000000000000000000000000000084612c5a565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806140ee6115e8565b426040518863ffffffff1660e01b815260040161411096959493929190614f6e565b6060604051808303818588803b15801561412957600080fd5b505af115801561413d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190614162919061473e565b5050505050565b60008061418583600a60009054906101000a900460ff16614404565b905061419c81600b54612c3c90919063ffffffff16565b600b819055506141f481600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080915050919050565b60008061425c83600a60029054906101000a900460ff16614404565b905061427381600d54612c3c90919063ffffffff16565b600d819055506142cb81600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080915050919050565b60008061433383600a60019054906101000a900460ff16614404565b905061434a81600c54612c3c90919063ffffffff16565b600c819055506143a281600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080915050919050565b600081836143fc9190615749565b905092915050565b600061442f60646144218460ff168661443790919063ffffffff16565b61341b90919063ffffffff16565b905092915050565b60008183614445919061550b565b905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600081525090565b6000614499614494846153c8565b615397565b9050828152602081018484840111156144b157600080fd5b6144bc848285615634565b509392505050565b6000813590506144d381615854565b92915050565b6000815190506144e881615854565b92915050565b6000813590506144fd8161586b565b92915050565b600082601f83011261451457600080fd5b8135614524848260208601614486565b91505092915050565b60008135905061453c81615882565b92915050565b60008151905061455181615882565b92915050565b60008135905061456681615899565b92915050565b60006020828403121561457e57600080fd5b600061458c848285016144c4565b91505092915050565b6000602082840312156145a757600080fd5b60006145b5848285016144d9565b91505092915050565b600080604083850312156145d157600080fd5b60006145df858286016144c4565b92505060206145f0858286016144c4565b9150509250929050565b60008060006060848603121561460f57600080fd5b600061461d868287016144c4565b935050602061462e868287016144c4565b925050604061463f8682870161452d565b9150509250925092565b6000806040838503121561465c57600080fd5b600061466a858286016144c4565b925050602061467b8582860161452d565b9150509250929050565b60006020828403121561469757600080fd5b60006146a5848285016144ee565b91505092915050565b6000602082840312156146c057600080fd5b60006146ce8482850161452d565b91505092915050565b6000806000606084860312156146ec57600080fd5b60006146fa8682870161452d565b935050602061470b868287016144c4565b925050604084013567ffffffffffffffff81111561472857600080fd5b61473486828701614503565b9150509250925092565b60008060006060848603121561475357600080fd5b600061476186828701614542565b935050602061477286828701614542565b925050604061478386828701614542565b9150509250925092565b60006020828403121561479f57600080fd5b60006147ad84828501614557565b91505092915050565b60006147c283836147ce565b60208301905092915050565b6147d781615599565b82525050565b6147e681615599565b82525050565b6147fd6147f882615599565b61571b565b82525050565b600061480e82615408565b614818818561542b565b9350614823836153f8565b8060005b8381101561485457815161483b88826147b6565b97506148468361541e565b925050600181019050614827565b5085935050505092915050565b61486a816155ab565b82525050565b614879816155fe565b82525050565b61488881615622565b82525050565b600061489982615413565b6148a3818561543c565b93506148b3818560208601615643565b6148bc81615836565b840191505092915050565b60006148d4601f8361543c565b91507f43616e6e6f74206275726e206d6f7265207468616e206275726e2066756e64006000830152602082019050919050565b600061491460278361543c565b91507f43616e6e6f74206275726e206d6f7265207468616e206176696c61626c65206260008301527f616c616e636563000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061497a60268361543c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149e060228361543c565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a4660288361543c565b91507f45524332303a207472616e736665722066726f6d2f746f20746865207a65726f60008301527f20616464726573730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aac60068361543c565b91507f456d7074792100000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614aec60288361543c565b91507f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008301527f78416d6f756e742e0000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b5260178361543c565b91507f5472616e7366657220616d6f756e7420696e76616c69640000000000000000006000830152602082019050919050565b6000614b92603e8361543c565b91507f596f752063616e6e6f74207769746864726177206d6f72652066756e6473207460008301527f68617420796f75206861766520696e206f7065726174696f6e2066756e6400006020830152604082019050919050565b6000614bf860208361543c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614c38603b8361543c565b91507f596f752063616e6e6f74207769746864726177206d6f72652066756e6473207460008301527f68617420796f75206861766520696e2069736c616e642066756e6400000000006020830152604082019050919050565b6000614c9e60248361543c565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d0460128361543c565b91507f496e646578206f7574206f662072616e676500000000000000000000000000006000830152602082019050919050565b6000614d44603c8361543c565b91507f416c6c207072697a6573206d757374206265206469736275727365642062656660008301527f6f7265206265696e672061626c6520746f20636c6f73652053414e44000000006020830152604082019050919050565b6000614daa600e8361543c565b91507f66756e6420746f6f20736d616c6c0000000000000000000000000000000000006000830152602082019050919050565b6000614dea603a8361543c565b91507f53414e44206d75737420626520696e69746961746564206265666f726520746860008301527f69732066756e6374696f6e2063616e2062652063616c6c65642e0000000000006020830152604082019050919050565b6000614e50602e8361543c565b91507f4d656469756d207072697a65206d75737420626520646973627572736564206260008301527f65666f72652074686973206f6e650000000000000000000000000000000000006020830152604082019050919050565b614eb2816155d7565b82525050565b614ec9614ec4826155d7565b61573f565b82525050565b614ed8816155e1565b82525050565b614ee7816155f1565b82525050565b6000614ef98286614eb8565b602082019150614f0982856147ec565b601482019150614f198284614eb8565b602082019150819050949350505050565b6000602082019050614f3f60008301846147dd565b92915050565b6000604082019050614f5a60008301856147dd565b614f676020830184614ea9565b9392505050565b600060c082019050614f8360008301896147dd565b614f906020830188614ea9565b614f9d604083018761487f565b614faa606083018661487f565b614fb760808301856147dd565b614fc460a0830184614ea9565b979650505050505050565b60006040820190508181036000830152614fe98185614803565b9050614ff86020830184614ea9565b9392505050565b60006020820190506150146000830184614861565b92915050565b600060208201905061502f6000830184614870565b92915050565b6000602082019050818103600083015261504f818461488e565b905092915050565b60006020820190508181036000830152615070816148c7565b9050919050565b6000602082019050818103600083015261509081614907565b9050919050565b600060208201905081810360008301526150b08161496d565b9050919050565b600060208201905081810360008301526150d0816149d3565b9050919050565b600060208201905081810360008301526150f081614a39565b9050919050565b6000602082019050818103600083015261511081614a9f565b9050919050565b6000602082019050818103600083015261513081614adf565b9050919050565b6000602082019050818103600083015261515081614b45565b9050919050565b6000602082019050818103600083015261517081614b85565b9050919050565b6000602082019050818103600083015261519081614beb565b9050919050565b600060208201905081810360008301526151b081614c2b565b9050919050565b600060208201905081810360008301526151d081614c91565b9050919050565b600060208201905081810360008301526151f081614cf7565b9050919050565b6000602082019050818103600083015261521081614d37565b9050919050565b6000602082019050818103600083015261523081614d9d565b9050919050565b6000602082019050818103600083015261525081614ddd565b9050919050565b6000602082019050818103600083015261527081614e43565b9050919050565b600060208201905061528c6000830184614ea9565b92915050565b60006060820190506152a76000830186614ea9565b6152b460208301856147dd565b81810360408301526152c6818461488e565b9050949350505050565b600060a0820190506152e56000830188614ea9565b6152f2602083018761487f565b81810360408301526153048186614803565b905061531360608301856147dd565b6153206080830184614ea9565b9695505050505050565b600060608201905061533f6000830186614ea9565b61534c6020830185614ea9565b6153596040830184614ea9565b949350505050565b60006020820190506153766000830184614ecf565b92915050565b60006020820190506153916000830184614ede565b92915050565b6000604051905081810181811067ffffffffffffffff821117156153be576153bd615807565b5b8060405250919050565b600067ffffffffffffffff8211156153e3576153e2615807565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615458826155d7565b9150615463836155d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156154985761549761577a565b5b828201905092915050565b60006154ae826155f1565b91506154b9836155f1565b92508260ff038211156154cf576154ce61577a565b5b828201905092915050565b60006154e5826155d7565b91506154f0836155d7565b925082615500576154ff6157a9565b5b828204905092915050565b6000615516826155d7565b9150615521836155d7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561555a5761555961577a565b5b828202905092915050565b6000615570826155d7565b915061557b836155d7565b92508282101561558e5761558d61577a565b5b828203905092915050565b60006155a4826155b7565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b600061560982615610565b9050919050565b600061561b826155b7565b9050919050565b600061562d826155d7565b9050919050565b82818337600083830152505050565b60005b83811015615661578082015181840152602081019050615646565b83811115615670576000848401525b50505050565b6000600282049050600182168061568e57607f821691505b602082108114156156a2576156a16157d8565b5b50919050565b60006156b3826155d7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156e6576156e561577a565b5b600182019050919050565b60006156fc826155f1565b915060ff8214156157105761570f61577a565b5b600182019050919050565b60006157268261572d565b9050919050565b600061573882615847565b9050919050565b6000819050919050565b6000615754826155d7565b915061575f836155d7565b92508261576f5761576e6157a9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61585d81615599565b811461586857600080fd5b50565b615874816155ab565b811461587f57600080fd5b50565b61588b816155d7565b811461589657600080fd5b50565b6158a2816155e1565b81146158ad57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220548640fed019a45f4035a770d0eac57947b78451ddc73210d3a8037d23a3d31964736f6c63430008000033
Deployed Bytecode
0x60806040526004361061023e5760003560e01c80638ff0ab7f1161012e578063c49b9a80116100ab578063dd62ed3e1161006f578063dd62ed3e1461089b578063deb3cdf8146108d8578063df7b6d4114610903578063f2fde38b1461092e578063f3a28b0e1461095757610245565b8063c49b9a80146107c8578063c956e0c3146107f1578063ccb2abf31461081c578063d78c67c514610847578063d9bf0d221461087257610245565b8063a457c2d7116100f2578063a457c2d7146106cd578063a63b7f981461070a578063a8246ef314610735578063a9059cbb14610760578063ba3d9f011461079d57610245565b80638ff0ab7f146105e65780639381099a1461060f57806395d89b411461063a5780639950166314610665578063a3346f16146106a257610245565b80634a74bb02116101bc57806370a082311161018057806370a0823114610515578063715018a61461055257806374010ece146105695780637b47ec1a146105925780638da5cb5b146105bb57610245565b80634a74bb02146104405780634b433e0f1461046b5780635fc3a2c9146104965780636a4b05ad146104bf5780636ee303cd146104ea57610245565b8063313ce56711610203578063313ce56714610345578063395093511461037057806340fe117b146103ad57806343023cfa146103d857806349bd5a5e1461041557610245565b80624d75111461024a57806306fdde0314610275578063095ea7b3146102a057806318160ddd146102dd57806323b872dd1461030857610245565b3661024557005b600080fd5b34801561025657600080fd5b5061025f610982565b60405161026c9190615277565b60405180910390f35b34801561028157600080fd5b5061028a610988565b6040516102979190615035565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c29190614649565b610a1a565b6040516102d49190614fff565b60405180910390f35b3480156102e957600080fd5b506102f2610a38565b6040516102ff9190615277565b60405180910390f35b34801561031457600080fd5b5061032f600480360381019061032a91906145fa565b610a42565b60405161033c9190614fff565b60405180910390f35b34801561035157600080fd5b5061035a610b1b565b604051610367919061537c565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190614649565b610b32565b6040516103a49190614fff565b60405180910390f35b3480156103b957600080fd5b506103c2610be5565b6040516103cf919061537c565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa919061456c565b610bf8565b60405161040c9190615277565b60405180910390f35b34801561042157600080fd5b5061042a610cd9565b6040516104379190614f2a565b60405180910390f35b34801561044c57600080fd5b50610455610cfd565b6040516104629190614fff565b60405180910390f35b34801561047757600080fd5b50610480610d10565b60405161048d9190615277565b60405180910390f35b3480156104a257600080fd5b506104bd60048036038101906104b891906146d7565b610d1a565b005b3480156104cb57600080fd5b506104d4610fe1565b6040516104e19190615277565b60405180910390f35b3480156104f657600080fd5b506104ff610feb565b60405161050c9190614fff565b60405180910390f35b34801561052157600080fd5b5061053c6004803603810190610537919061456c565b611168565b6040516105499190615277565b60405180910390f35b34801561055e57600080fd5b506105676111b1565b005b34801561057557600080fd5b50610590600480360381019061058b91906146ae565b6112eb565b005b34801561059e57600080fd5b506105b960048036038101906105b491906146ae565b611371565b005b3480156105c757600080fd5b506105d06115e8565b6040516105dd9190614f2a565b60405180910390f35b3480156105f257600080fd5b5061060d6004803603810190610608919061478d565b611611565b005b34801561061b57600080fd5b506106246116b1565b6040516106319190615361565b60405180910390f35b34801561064657600080fd5b5061064f6116c7565b60405161065c9190615035565b60405180910390f35b34801561067157600080fd5b5061068c600480360381019061068791906146ae565b611759565b6040516106999190614fff565b60405180910390f35b3480156106ae57600080fd5b506106b7611ae9565b6040516106c49190615277565b60405180910390f35b3480156106d957600080fd5b506106f460048036038101906106ef9190614649565b611aef565b6040516107019190614fff565b60405180910390f35b34801561071657600080fd5b5061071f611bbc565b60405161072c919061501a565b60405180910390f35b34801561074157600080fd5b5061074a611be0565b6040516107579190614fff565b60405180910390f35b34801561076c57600080fd5b5061078760048036038101906107829190614649565b611efa565b6040516107949190614fff565b60405180910390f35b3480156107a957600080fd5b506107b2611f18565b6040516107bf9190615277565b60405180910390f35b3480156107d457600080fd5b506107ef60048036038101906107ea9190614685565b611f22565b005b3480156107fd57600080fd5b50610806611ff2565b604051610813919061537c565b60405180910390f35b34801561082857600080fd5b50610831612005565b60405161083e9190614fff565b60405180910390f35b34801561085357600080fd5b5061085c61284b565b604051610869919061537c565b60405180910390f35b34801561087e57600080fd5b50610899600480360381019061089491906146ae565b61285e565b005b3480156108a757600080fd5b506108c260048036038101906108bd91906145be565b6128e4565b6040516108cf9190615277565b60405180910390f35b3480156108e457600080fd5b506108ed61296b565b6040516108fa9190615277565b60405180910390f35b34801561090f57600080fd5b50610918612971565b6040516109259190614fff565b60405180910390f35b34801561093a57600080fd5b506109556004803603810190610950919061456c565b612a5c565b005b34801561096357600080fd5b5061096c612c05565b6040516109799190615277565b60405180910390f35b600b5481565b60606001805461099790615676565b80601f01602080910402602001604051908101604052809291908181526020018280546109c390615676565b8015610a105780601f106109e557610100808354040283529160200191610a10565b820191906000526020600020905b8154815290600101906020018083116109f357829003601f168201915b5050505050905090565b6000610a2e610a27612c52565b8484612c5a565b6001905092915050565b6000600654905090565b6000610a4f848484612e25565b610b1084610a5b612c52565b610b0b856040518060600160405280602881526020016158b160289139600560008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610ac1612c52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133b09092919063ffffffff16565b612c5a565b600190509392505050565b6000600360009054906101000a900460ff16905090565b6000610bdb610b3f612c52565b84610bd68560056000610b50612c52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b612c5a565b6001905092915050565b600a60009054906101000a900460ff1681565b600080601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415610c7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c73906150f7565b60405180910390fd5b60136000601260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548152602001908152602001600020600101549050919050565b7f000000000000000000000000f5b92789f6cdf1b7c0d7252696433cbe34b6135481565b601160019054906101000a900460ff1681565b6000600954905090565b610d22612c52565b73ffffffffffffffffffffffffffffffffffffffff16610d406115e8565b73ffffffffffffffffffffffffffffffffffffffff1614610d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8d90615177565b60405180910390fd5b600d548310610dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd190615197565b60405180910390fd5b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054831115610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5390615157565b60405180910390fd5b610e7183600d5461340590919063ffffffff16565b600d81905550610ec983600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610f5e83600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f3f650de7ee2e52a67d67738174f630780c286b09585da256f97334e3764bb954838383604051610fd493929190615292565b60405180910390a1505050565b6000601454905090565b6000610ff5612c52565b73ffffffffffffffffffffffffffffffffffffffff166110136115e8565b73ffffffffffffffffffffffffffffffffffffffff1614611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090615177565b60405180910390fd5b6000600b54116110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590615217565b60405180910390fd5b6110c46004600b5461341b90919063ffffffff16565b600e819055506110e06002600b5461341b90919063ffffffff16565b600f81905550611111600f54611103600e54600b5461340590919063ffffffff16565b61340590919063ffffffff16565b6010819055506014546015819055507f1763863897cb343909dbb614fe1ee48bf19027eb008815698d751b299c5f6721600e54600f546010546040516111599392919061532a565b60405180910390a16001905090565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111b9612c52565b73ffffffffffffffffffffffffffffffffffffffff166111d76115e8565b73ffffffffffffffffffffffffffffffffffffffff161461122d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122490615177565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6112f3612c52565b73ffffffffffffffffffffffffffffffffffffffff166113116115e8565b73ffffffffffffffffffffffffffffffffffffffff1614611367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135e90615177565b60405180910390fd5b8060078190555050565b611379612c52565b73ffffffffffffffffffffffffffffffffffffffff166113976115e8565b73ffffffffffffffffffffffffffffffffffffffff16146113ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e490615177565b60405180910390fd5b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561146f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146690615077565b60405180910390fd5b600c548111156114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab90615057565b60405180910390fd5b61150681600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061155e8160065461340590919063ffffffff16565b60068190555061157981600c5461340590919063ffffffff16565b600c81905550600073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115dd9190615277565b60405180910390a350565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611619612c52565b73ffffffffffffffffffffffffffffffffffffffff166116376115e8565b73ffffffffffffffffffffffffffffffffffffffff161461168d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168490615177565b60405180910390fd5b80601660006101000a81548163ffffffff021916908363ffffffff16021790555050565b601660009054906101000a900463ffffffff1681565b6060600280546116d690615676565b80601f016020809104026020016040519081016040528092919081815260200182805461170290615676565b801561174f5780601f106117245761010080835404028352916020019161174f565b820191906000526020600020905b81548152906001019060200180831161173257829003601f168201915b5050505050905090565b6000611763612c52565b73ffffffffffffffffffffffffffffffffffffffff166117816115e8565b73ffffffffffffffffffffffffffffffffffffffff16146117d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ce90615177565b60405180910390fd5b6000601554141580156117ea5750600082115b611829576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182090615257565b60405180910390fd5b600061184260155460105461341b90919063ffffffff16565b90506000808490505b601660009054906101000a900463ffffffff1663ffffffff168561186f919061544d565b811015611a2d5782600b54101561188557611a2d565b600115156013600083815260200190815260200160002060000160149054906101000a900460ff16151514156119cc5761193d83600460006013600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460006013600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119c98383612c3c90919063ffffffff16565b91505b601554811415611a1a577fad8fb82b9a19477e4da24a41f430d3fd63316dc555145f1bcc7f087d1d4734c883604051611a059190615277565b60405180910390a16000601081905550611a2d565b8080611a25906156a8565b91505061184b565b50611a4381600b5461340590919063ffffffff16565b600b81905550611a9b81600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600192505050919050565b600d5481565b6000611bb2611afc612c52565b84611bad856040518060600160405280602581526020016158d96025913960056000611b26612c52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133b09092919063ffffffff16565b612c5a565b6001905092915050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000611bea612c52565b73ffffffffffffffffffffffffffffffffffffffff16611c086115e8565b73ffffffffffffffffffffffffffffffffffffffff1614611c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5590615177565b60405180910390fd5b60006015541415611ca4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9b90615237565b60405180910390fd5b6000604590506000600e5490506000601554423385604051602001611ccb93929190614eed565b6040516020818303038152906040528051906020012060001c611cee9190615749565b90506000611cfd826000613431565b90505b600115158160200151151514611d5f57601554423386604051602001611d2893929190614eed565b6040516020818303038152906040528051906020012060001c611d4b9190615749565b9150611d58826000613431565b9050611d00565b600081600001519050611d7d84600b5461340590919063ffffffff16565b600b81905550611dd584600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611e6a84600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600e819055507f04df60a8ea19ecabae271ed2448d3afc69571f168ac354f2a130a1b2ff4d60348185604051611ee6929190614f45565b60405180910390a160019550505050505090565b6000611f0e611f07612c52565b8484612e25565b6001905092915050565b6000600754905090565b611f2a612c52565b73ffffffffffffffffffffffffffffffffffffffff16611f486115e8565b73ffffffffffffffffffffffffffffffffffffffff1614611f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9590615177565b60405180910390fd5b80601160016101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc15981604051611fe79190614fff565b60405180910390a150565b600a60019054906101000a900460ff1681565b600061200f612c52565b73ffffffffffffffffffffffffffffffffffffffff1661202d6115e8565b73ffffffffffffffffffffffffffffffffffffffff1614612083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207a90615177565b60405180910390fd5b600060155414156120c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c090615237565b60405180910390fd5b6000600f549050600060649050600080604590506000606467ffffffffffffffff811115612120577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561214e5781602001602082028036833780820191505090505b50905060006064601554116124d5576015549450612175858761341b90919063ffffffff16565b95505b848160ff1610156123d5576013600060018361219491906154a3565b60ff16815260200190815260200160002060000160149054906101000a900460ff16156123ba57601360006001836121cc91906154a3565b60ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828260ff168151811061223d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061228a8685612c3c90919063ffffffff16565b93506123238660046000601360006001876122a591906154a3565b60ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460006013600060018661233891906154a3565b60ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806123b6906156f1565b9150505b6123ce600184612c3c90919063ffffffff16565b9250612178565b6123ea84600b5461340590919063ffffffff16565b600b8190555061244284600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600f819055507fed39fa52e1344d828af771e58862d95bc9b17499836a5c2a3db2b7c4bf18fd5482876040516124be929190614fcf565b60405180910390a160019650505050505050612848565b6124e8858761341b90919063ffffffff16565b95505b848160ff16101561274c57600060155442338660405160200161251093929190614eed565b6040516020818303038152906040528051906020012060001c6125339190615749565b90506013600082815260200190815260200160002060000160149054906101000a900460ff1615612730576013600082815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838360ff16815181106125d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061261e8786612c3c90919063ffffffff16565b94506126a887600460006013600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460006013600085815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550818061272c906156f1565b9250505b612744600185612c3c90919063ffffffff16565b9350506124eb565b61276184600b5461340590919063ffffffff16565b600b819055506127b984600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600f819055507fed39fa52e1344d828af771e58862d95bc9b17499836a5c2a3db2b7c4bf18fd548287604051612835929190614fcf565b60405180910390a1600196505050505050505b90565b600a60029054906101000a900460ff1681565b612866612c52565b73ffffffffffffffffffffffffffffffffffffffff166128846115e8565b73ffffffffffffffffffffffffffffffffffffffff16146128da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d190615177565b60405180910390fd5b8060098190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c5481565b600061297b612c52565b73ffffffffffffffffffffffffffffffffffffffff166129996115e8565b73ffffffffffffffffffffffffffffffffffffffff16146129ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e690615177565b60405180910390fd5b60006015541415612a35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2c906151f7565b60405180910390fd5b60006010819055506000600f819055506000600e8190555060006015819055506001905090565b612a64612c52565b73ffffffffffffffffffffffffffffffffffffffff16612a826115e8565b73ffffffffffffffffffffffffffffffffffffffff1614612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90615177565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3f90615097565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080612c33600d54612c25600b54600c54612c3c90919063ffffffff16565b612c3c90919063ffffffff16565b90508091505090565b60008183612c4a919061544d565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cc1906151b7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d31906150b7565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612e189190615277565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612e8f5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b612ece576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec5906150d7565b60405180910390fd5b600081118015612f1d5750600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111155b612f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5390615137565b60405180910390fd5b612f646115e8565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612fd25750612fa26115e8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b1561301d5760075481111561301c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301390615117565b60405180910390fd5b5b600061304161302a612c05565b61303330611168565b61340590919063ffffffff16565b9050600060085482101590508080156130675750601160009054906101000a900460ff16155b80156130bf57507f000000000000000000000000f5b92789f6cdf1b7c0d7252696433cbe34b6135473ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b80156130d75750601160019054906101000a900460ff165b156130eb5760085491506130ea82613532565b5b61313d83600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461340590919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600061318b84613608565b90506131df81600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600954600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561329f57503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b156132ae576132ad8561367d565b5b600954600460008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410801561332a57503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614155b1561333957613338866137ee565b5b6133438482613a65565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133a09190615277565b60405180910390a3505050505050565b60008383111582906133f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133ef9190615035565b60405180910390fd5b5082840390509392505050565b600081836134139190615565565b905092915050565b6000818361342991906154da565b905092915050565b61343961444d565b6001151582151514156134915761344e610fe1565b831115613490576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613487906151d7565b60405180910390fd5b5b601360008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff16151515158152602001600182015481525050905092915050565b6001601160006101000a81548160ff021916908315150217905550600061356360028361341b90919063ffffffff16565b9050600061357a828461340590919063ffffffff16565b9050600047905061358a83613dbb565b600061359f824761340590919063ffffffff16565b90506135ab8382614079565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5618482856040516135de9392919061532a565b60405180910390a1505050506000601160006101000a81548160ff02191690831515021790555050565b60008061361483614169565b9050600061362184614240565b9050600061362e85614317565b90506000613657846136498486612c3c90919063ffffffff16565b612c3c90919063ffffffff16565b9050600061366e828861340590919063ffffffff16565b90508095505050505050919050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146136c9576137eb565b60006136e16001601454612c3c90919063ffffffff16565b905060405180606001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001600115158152602001428152506013600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff0219169083151502179055506040820151816001015590505080601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080601481905550505b50565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054141561383b57613a62565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506014548114613a1357601360006014548152602001908152602001600020601360008381526020019081526020016000206000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000820160149054906101000a900460ff168160000160146101000a81548160ff02191690831515021790555060018201548160010155905050806012600060136000601454815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060136000601454815260200190815260200160002060000160146101000a81548160ff021916908315150217905550613a5a600160145461340590919063ffffffff16565b601481905550505b50565b6001613a886001601454613a799190615565565b846143ee90919063ffffffff16565b613a92919061544d565b91506001613ab76001601454613aa89190615565565b836143ee90919063ffffffff16565b613ac1919061544d565b90506000601360008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff1615151515815260200160018201548152505090506000601360008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900460ff16151515158152602001600182015481525050905081602001518015613c0f575080602001515b15613db5578260126000846000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360126000836000015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806013600086815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff02191690831515021790555060408201518160010155905050816013600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548160ff021916908315150217905550604082015181600101559050505b50505050565b6000600267ffffffffffffffff811115613dfe577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015613e2c5781602001602082028036833780820191505090505b5090503081600081518110613e6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015613f0a57600080fd5b505afa158015613f1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f429190614595565b81600181518110613f7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613fe1307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612c5a565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016140439594939291906152d0565b600060405180830381600087803b15801561405d57600080fd5b505af1158015614071573d6000803e3d6000fd5b505050505050565b6140a4307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612c5a565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806140ee6115e8565b426040518863ffffffff1660e01b815260040161411096959493929190614f6e565b6060604051808303818588803b15801561412957600080fd5b505af115801561413d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190614162919061473e565b5050505050565b60008061418583600a60009054906101000a900460ff16614404565b905061419c81600b54612c3c90919063ffffffff16565b600b819055506141f481600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080915050919050565b60008061425c83600a60029054906101000a900460ff16614404565b905061427381600d54612c3c90919063ffffffff16565b600d819055506142cb81600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080915050919050565b60008061433383600a60019054906101000a900460ff16614404565b905061434a81600c54612c3c90919063ffffffff16565b600c819055506143a281600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c3c90919063ffffffff16565b600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080915050919050565b600081836143fc9190615749565b905092915050565b600061442f60646144218460ff168661443790919063ffffffff16565b61341b90919063ffffffff16565b905092915050565b60008183614445919061550b565b905092915050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600015158152602001600081525090565b6000614499614494846153c8565b615397565b9050828152602081018484840111156144b157600080fd5b6144bc848285615634565b509392505050565b6000813590506144d381615854565b92915050565b6000815190506144e881615854565b92915050565b6000813590506144fd8161586b565b92915050565b600082601f83011261451457600080fd5b8135614524848260208601614486565b91505092915050565b60008135905061453c81615882565b92915050565b60008151905061455181615882565b92915050565b60008135905061456681615899565b92915050565b60006020828403121561457e57600080fd5b600061458c848285016144c4565b91505092915050565b6000602082840312156145a757600080fd5b60006145b5848285016144d9565b91505092915050565b600080604083850312156145d157600080fd5b60006145df858286016144c4565b92505060206145f0858286016144c4565b9150509250929050565b60008060006060848603121561460f57600080fd5b600061461d868287016144c4565b935050602061462e868287016144c4565b925050604061463f8682870161452d565b9150509250925092565b6000806040838503121561465c57600080fd5b600061466a858286016144c4565b925050602061467b8582860161452d565b9150509250929050565b60006020828403121561469757600080fd5b60006146a5848285016144ee565b91505092915050565b6000602082840312156146c057600080fd5b60006146ce8482850161452d565b91505092915050565b6000806000606084860312156146ec57600080fd5b60006146fa8682870161452d565b935050602061470b868287016144c4565b925050604084013567ffffffffffffffff81111561472857600080fd5b61473486828701614503565b9150509250925092565b60008060006060848603121561475357600080fd5b600061476186828701614542565b935050602061477286828701614542565b925050604061478386828701614542565b9150509250925092565b60006020828403121561479f57600080fd5b60006147ad84828501614557565b91505092915050565b60006147c283836147ce565b60208301905092915050565b6147d781615599565b82525050565b6147e681615599565b82525050565b6147fd6147f882615599565b61571b565b82525050565b600061480e82615408565b614818818561542b565b9350614823836153f8565b8060005b8381101561485457815161483b88826147b6565b97506148468361541e565b925050600181019050614827565b5085935050505092915050565b61486a816155ab565b82525050565b614879816155fe565b82525050565b61488881615622565b82525050565b600061489982615413565b6148a3818561543c565b93506148b3818560208601615643565b6148bc81615836565b840191505092915050565b60006148d4601f8361543c565b91507f43616e6e6f74206275726e206d6f7265207468616e206275726e2066756e64006000830152602082019050919050565b600061491460278361543c565b91507f43616e6e6f74206275726e206d6f7265207468616e206176696c61626c65206260008301527f616c616e636563000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061497a60268361543c565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149e060228361543c565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614a4660288361543c565b91507f45524332303a207472616e736665722066726f6d2f746f20746865207a65726f60008301527f20616464726573730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aac60068361543c565b91507f456d7074792100000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000614aec60288361543c565b91507f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008301527f78416d6f756e742e0000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b5260178361543c565b91507f5472616e7366657220616d6f756e7420696e76616c69640000000000000000006000830152602082019050919050565b6000614b92603e8361543c565b91507f596f752063616e6e6f74207769746864726177206d6f72652066756e6473207460008301527f68617420796f75206861766520696e206f7065726174696f6e2066756e6400006020830152604082019050919050565b6000614bf860208361543c565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614c38603b8361543c565b91507f596f752063616e6e6f74207769746864726177206d6f72652066756e6473207460008301527f68617420796f75206861766520696e2069736c616e642066756e6400000000006020830152604082019050919050565b6000614c9e60248361543c565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d0460128361543c565b91507f496e646578206f7574206f662072616e676500000000000000000000000000006000830152602082019050919050565b6000614d44603c8361543c565b91507f416c6c207072697a6573206d757374206265206469736275727365642062656660008301527f6f7265206265696e672061626c6520746f20636c6f73652053414e44000000006020830152604082019050919050565b6000614daa600e8361543c565b91507f66756e6420746f6f20736d616c6c0000000000000000000000000000000000006000830152602082019050919050565b6000614dea603a8361543c565b91507f53414e44206d75737420626520696e69746961746564206265666f726520746860008301527f69732066756e6374696f6e2063616e2062652063616c6c65642e0000000000006020830152604082019050919050565b6000614e50602e8361543c565b91507f4d656469756d207072697a65206d75737420626520646973627572736564206260008301527f65666f72652074686973206f6e650000000000000000000000000000000000006020830152604082019050919050565b614eb2816155d7565b82525050565b614ec9614ec4826155d7565b61573f565b82525050565b614ed8816155e1565b82525050565b614ee7816155f1565b82525050565b6000614ef98286614eb8565b602082019150614f0982856147ec565b601482019150614f198284614eb8565b602082019150819050949350505050565b6000602082019050614f3f60008301846147dd565b92915050565b6000604082019050614f5a60008301856147dd565b614f676020830184614ea9565b9392505050565b600060c082019050614f8360008301896147dd565b614f906020830188614ea9565b614f9d604083018761487f565b614faa606083018661487f565b614fb760808301856147dd565b614fc460a0830184614ea9565b979650505050505050565b60006040820190508181036000830152614fe98185614803565b9050614ff86020830184614ea9565b9392505050565b60006020820190506150146000830184614861565b92915050565b600060208201905061502f6000830184614870565b92915050565b6000602082019050818103600083015261504f818461488e565b905092915050565b60006020820190508181036000830152615070816148c7565b9050919050565b6000602082019050818103600083015261509081614907565b9050919050565b600060208201905081810360008301526150b08161496d565b9050919050565b600060208201905081810360008301526150d0816149d3565b9050919050565b600060208201905081810360008301526150f081614a39565b9050919050565b6000602082019050818103600083015261511081614a9f565b9050919050565b6000602082019050818103600083015261513081614adf565b9050919050565b6000602082019050818103600083015261515081614b45565b9050919050565b6000602082019050818103600083015261517081614b85565b9050919050565b6000602082019050818103600083015261519081614beb565b9050919050565b600060208201905081810360008301526151b081614c2b565b9050919050565b600060208201905081810360008301526151d081614c91565b9050919050565b600060208201905081810360008301526151f081614cf7565b9050919050565b6000602082019050818103600083015261521081614d37565b9050919050565b6000602082019050818103600083015261523081614d9d565b9050919050565b6000602082019050818103600083015261525081614ddd565b9050919050565b6000602082019050818103600083015261527081614e43565b9050919050565b600060208201905061528c6000830184614ea9565b92915050565b60006060820190506152a76000830186614ea9565b6152b460208301856147dd565b81810360408301526152c6818461488e565b9050949350505050565b600060a0820190506152e56000830188614ea9565b6152f2602083018761487f565b81810360408301526153048186614803565b905061531360608301856147dd565b6153206080830184614ea9565b9695505050505050565b600060608201905061533f6000830186614ea9565b61534c6020830185614ea9565b6153596040830184614ea9565b949350505050565b60006020820190506153766000830184614ecf565b92915050565b60006020820190506153916000830184614ede565b92915050565b6000604051905081810181811067ffffffffffffffff821117156153be576153bd615807565b5b8060405250919050565b600067ffffffffffffffff8211156153e3576153e2615807565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000615458826155d7565b9150615463836155d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156154985761549761577a565b5b828201905092915050565b60006154ae826155f1565b91506154b9836155f1565b92508260ff038211156154cf576154ce61577a565b5b828201905092915050565b60006154e5826155d7565b91506154f0836155d7565b925082615500576154ff6157a9565b5b828204905092915050565b6000615516826155d7565b9150615521836155d7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561555a5761555961577a565b5b828202905092915050565b6000615570826155d7565b915061557b836155d7565b92508282101561558e5761558d61577a565b5b828203905092915050565b60006155a4826155b7565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b600061560982615610565b9050919050565b600061561b826155b7565b9050919050565b600061562d826155d7565b9050919050565b82818337600083830152505050565b60005b83811015615661578082015181840152602081019050615646565b83811115615670576000848401525b50505050565b6000600282049050600182168061568e57607f821691505b602082108114156156a2576156a16157d8565b5b50919050565b60006156b3826155d7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156156e6576156e561577a565b5b600182019050919050565b60006156fc826155f1565b915060ff8214156157105761570f61577a565b5b600182019050919050565b60006157268261572d565b9050919050565b600061573882615847565b9050919050565b6000819050919050565b6000615754826155d7565b915061575f836155d7565b92508261576f5761576e6157a9565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b61585d81615599565b811461586857600080fd5b50565b615874816155ab565b811461587f57600080fd5b50565b61588b816155d7565b811461589657600080fd5b50565b6158a2816155e1565b81146158ad57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220548640fed019a45f4035a770d0eac57947b78451ddc73210d3a8037d23a3d31964736f6c63430008000033
Deployed Bytecode Sourcemap
26104:21575:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26944:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29193:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29706:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29474:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30054:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29379:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30526:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26824:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47455:219;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27319:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27212:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31757:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32497:662;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47102:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38866:451;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29576:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5251:148;;;;;;;;;;;;;:::i;:::-;;32284:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31090:464;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4600:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32393:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27631:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29284:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43958:1172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27008:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30752:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27261:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39329:1449;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29879:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31878:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31980:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26855:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40790:3156;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26895:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32160:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30375:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26974:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45142:405;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5554:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31566:179;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26944:23;;;;:::o;29193:83::-;29230:13;29263:5;29256:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29193:83;:::o;29706:161::-;29781:4;29798:39;29807:12;:10;:12::i;:::-;29821:7;29830:6;29798:8;:39::i;:::-;29855:4;29848:11;;29706:161;;;;:::o;29474:94::-;29527:7;29554:6;;29547:13;;29474:94;:::o;30054:313::-;30152:4;30169:36;30179:6;30187:9;30198:6;30169:9;:36::i;:::-;30216:121;30225:6;30233:12;:10;:12::i;:::-;30247:89;30285:6;30247:89;;;;;;;;;;;;;;;;;:11;:19;30259:6;30247:19;;;;;;;;;;;;;;;:33;30267:12;:10;:12::i;:::-;30247:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;30216:8;:121::i;:::-;30355:4;30348:11;;30054:313;;;;;:::o;29379:83::-;29420:5;29445:9;;;;;;;;;;;29438:16;;29379:83;:::o;30526:218::-;30614:4;30631:83;30640:12;:10;:12::i;:::-;30654:7;30663:50;30702:10;30663:11;:25;30675:12;:10;:12::i;:::-;30663:25;;;;;;;;;;;;;;;:34;30689:7;30663:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;30631:8;:83::i;:::-;30732:4;30725:11;;30526:218;;;;:::o;26824:24::-;;;;;;;;;;;;;:::o;47455:219::-;47528:7;47587:1;47554:14;:29;47569:13;47554:29;;;;;;;;;;;;;;;;:34;;47545:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;47614:13;:44;47628:14;:29;47643:13;47628:29;;;;;;;;;;;;;;;;47614:44;;;;;;;;;;;:55;;;47607:62;;47455:219;;;:::o;27319:38::-;;;:::o;27212:40::-;;;;;;;;;;;;;:::o;31757:109::-;31812:7;31839:19;;31832:26;;31757:109;:::o;32497:662::-;4831:12;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32636:15:::1;;32627:6;:24;32619:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;32741:8;:23;32758:4;32741:23;;;;;;;;;;;;;;;;32731:6;:33;;32723:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;32911:27;32931:6;32911:15;;:19;;:27;;;;:::i;:::-;32893:15;:45;;;;32972:35;33000:6;32972:8;:23;32989:4;32972:23;;;;;;;;;;;;;;;;:27;;:35;;;;:::i;:::-;32946:8;:23;32963:4;32946:23;;;;;;;;;;;;;;;:61;;;;33041:35;33069:6;33041:8;:23;33050:13;33041:23;;;;;;;;;;;;;;;;:27;;:35;;;;:::i;:::-;33015:8;:23;33024:13;33015:23;;;;;;;;;;;;;;;:61;;;;33096:55;33121:6;33129:13;33144:6;33096:55;;;;;;;;:::i;:::-;;;;;;;;32497:662:::0;;;:::o;47102:95::-;47155:7;47179:13;;47172:20;;47102:95;:::o;38866:451::-;38913:12;4831;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38958:1:::1;38947:8;;:12;38938:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;39007:15;39020:1;39007:8;;:12;;:15;;;;:::i;:::-;38989;:33;;;;39052:15;39065:1;39052:8;;:12;;:15;;;;:::i;:::-;39033:16;:34;;;;39096:51;39130:16;;39096:29;39109:15;;39096:8;;:12;;:29;;;;:::i;:::-;:33;;:51;;;;:::i;:::-;39078:15;:69;;;;39177:13;;39158:16;:32;;;;39216:61;39226:15;;39243:16;;39261:15;;39216:61;;;;;;;;:::i;:::-;;;;;;;;39305:4;39298:11;;38866:451:::0;:::o;29576:118::-;29642:7;29669:8;:17;29678:7;29669:17;;;;;;;;;;;;;;;;29662:24;;29576:118;;;:::o;5251:148::-;4831:12;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5358:1:::1;5321:40;;5342:6;::::0;::::1;;;;;;;;5321:40;;;;;;;;;;;;5389:1;5372:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;5251:148::o:0;32284:97::-;4831:12;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32367:6:::1;32353:11;:20;;;;32284:97:::0;:::o;31090:464::-;4831:12;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31179:8:::1;:23;31196:4;31179:23;;;;;;;;;;;;;;;;31169:6;:33;;31161:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31275:12;;31265:6;:22;;31257:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31362:35;31390:6;31362:8;:23;31379:4;31362:23;;;;;;;;;;;;;;;;:27;;:35;;;;:::i;:::-;31336:8;:23;31353:4;31336:23;;;;;;;;;;;;;;;:61;;;;31417:18;31428:6;31417;;:10;;:18;;;;:::i;:::-;31408:6;:27;;;;31461:24;31478:6;31461:12;;:16;;:24;;;;:::i;:::-;31446:12;:39;;;;31535:1;31503:43;;31520:4;31503:43;;;31539:6;31503:43;;;;;;:::i;:::-;;;;;;;;31090:464:::0;:::o;4600:87::-;4646:7;4673:6;;;;;;;;;;;4666:13;;4600:87;:::o;32393:96::-;4831:12;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32474:7:::1;32459:12;;:22;;;;;;;;;;;;;;;;;;32393:96:::0;:::o;27631:32::-;;;;;;;;;;;;;:::o;29284:87::-;29323:13;29356:7;29349:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29284:87;:::o;43958:1172::-;44041:12;4831;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44095:1:::1;44075:16;;:21;;:39;;;;;44113:1;44100:10;:14;44075:39;44066:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44186:20;44209:37;44229:16;;44209:15;;:19;;:37;;;;:::i;:::-;44186:60;;44257:22;44309:9:::0;44321:10:::1;44309:22;;44304:647;44350:12;;;;;;;;;;;44337:25;;:10;:25;;;;:::i;:::-;44333:1;:29;44304:647;;;44400:12;44389:8;;:23;44384:70;;;44433:5;;44384:70;44567:4;44538:33;;:13;:16;44552:1;44538:16;;;;;;;;;;;:25;;;;;;;;;;;;:33;;;44534:225;;;44626:49;44662:12;44626:8;:31;44635:13;:16;44649:1;44635:16;;;;;;;;;;;:21;;;;;;;;;;;;44626:31;;;;;;;;;;;;;;;;:35;;:49;;;;:::i;:::-;44592:8;:31;44601:13;:16;44615:1;44601:16;;;;;;;;;;;:21;;;;;;;;;;;;44592:31;;;;;;;;;;;;;;;:83;;;;44711:32;44730:12;44711:14;:18;;:32;;;;:::i;:::-;44694:49;;44534:225;44782:16;;44777:1;:21;44773:167;;;44824:38;44849:12;44824:38;;;;;;:::i;:::-;;;;;;;;44899:1;44881:15;:19;;;;44919:5;;44773:167;44364:3;;;;;:::i;:::-;;;;44304:647;;;;44982:28;44995:14;44982:8;;:12;;:28;;;;:::i;:::-;44971:8;:39;;;;45047:43;45075:14;45047:8;:23;45064:4;45047:23;;;;;;;;;;;;;;;;:27;;:43;;;;:::i;:::-;45021:8;:23;45038:4;45021:23;;;;;;;;;;;;;;;:69;;;;45118:4;45111:11;;;;43958:1172:::0;;;:::o;27008:30::-;;;;:::o;30752:269::-;30845:4;30862:129;30871:12;:10;:12::i;:::-;30885:7;30894:96;30933:15;30894:96;;;;;;;;;;;;;;;;;:11;:25;30906:12;:10;:12::i;:::-;30894:25;;;;;;;;;;;;;;;:34;30920:7;30894:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;30862:8;:129::i;:::-;31009:4;31002:11;;30752:269;;;;:::o;27261:51::-;;;:::o;39329:1449::-;39394:12;4831;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39448:1:::1;39428:16;;:21;;39419:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;39523:12;39538:2;39523:17;;39551:18;39572:15;;39551:36;;39739:12;39825:16;;39786:15;39803:10;39815:4;39769:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39759:62;;;;;;39754:68;;:87;;;;:::i;:::-;39739:102;;39862:36;39901:25;39911:7;39920:5;39901:9;:25::i;:::-;39862:64;;39937:372;39979:4;39944:39;;:22;:31;;;:39;;;39937:372;;40216:16;;40177:15;40194:10;40206:4;40160:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40150:62;;;;;;40145:68;;:87;;;;:::i;:::-;40135:97;;40272:25;40282:7;40291:5;40272:9;:25::i;:::-;40247:50;;39937:372;;;40329:31;40363:22;:27;;;40329:61;;40422:24;40435:10;40422:8;;:12;;:24;;;;:::i;:::-;40411:8;:35;;;;40493:49;40531:10;40493:8;:33;40502:23;40493:33;;;;;;;;;;;;;;;;:37;;:49;;;;:::i;:::-;40457:8;:33;40466:23;40457:33;;;;;;;;;;;;;;;:85;;;;40579:39;40607:10;40579:8;:23;40596:4;40579:23;;;;;;;;;;;;;;;;:27;;:39;;;;:::i;:::-;40553:8;:23;40570:4;40553:23;;;;;;;;;;;;;;;:65;;;;40647:1;40629:15;:19;;;;40674:64;40702:23;40727:10;40674:64;;;;;;;:::i;:::-;;;;;;;;40766:4;40759:11;;;;;;;39329:1449:::0;:::o;29879:167::-;29957:4;29974:42;29984:12;:10;:12::i;:::-;29998:9;30009:6;29974:9;:42::i;:::-;30034:4;30027:11;;29879:167;;;;:::o;31878:94::-;31926:7;31953:11;;31946:18;;31878:94;:::o;31980:168::-;4831:12;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32078:8:::1;32054:21;;:32;;;;;;;;;;;;;;;;;;32102:38;32131:8;32102:38;;;;;;:::i;:::-;;;;;;;;31980:168:::0;:::o;26855:33::-;;;;;;;;;;;;;:::o;40790:3156::-;40856:12;4831;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40910:1:::1;40890:16;;:21;;40881:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;41046:19;41068:16;;41046:38;;41095:27;41125:3;41095:33;;41139:22;41176:12:::0;41191:2:::1;41176:17;;41204:34;41255:3;41241:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41204:55;;41270:13;41413:3;41393:16;;:23;41389:1206;;41526:16;;41504:38;;41565:36;41581:19;41565:11;:15;;:36;;;;:::i;:::-;41551:50;;41610:468;41627:19;41617:7;:29;;;41610:468;;;41679:13;:26;41703:1;41693:7;:11;;;;:::i;:::-;41679:26;;;;;;;;;;;;;:35;;;;;;;;;;;;41675:357;;;41765:13;:26;41789:1;41779:7;:11;;;;:::i;:::-;41765:26;;;;;;;;;;;;;:31;;;;;;;;;;;;41736:17;41754:7;41736:26;;;;;;;;;;;;;;;;;;;;;;;:60;;;;;;;;;::::0;::::1;41833:31;41852:11;41833:14;:18;;:31;;;;:::i;:::-;41816:48;;41928:58;41974:11;41928:8;:41;41937:13;:26;41961:1;41951:7;:11;;;;:::i;:::-;41937:26;;;;;;;;;;;;;:31;;;;;;;;;;;;41928:41;;;;;;;;;;;;;;;;:45;;:58;;;;:::i;:::-;41884:8;:41;41893:13;:26;41917:1;41907:7;:11;;;;:::i;:::-;41893:26;;;;;;;;;;;;;:31;;;;;;;;;;;;41884:41;;;;;;;;;;;;;;;:102;;;;42006:9;;;;;:::i;:::-;;;;41675:357;42054:11;42063:1;42054:4;:8;;:11;;;;:::i;:::-;42047:18;;41610:468;;;42111:28;42124:14;42111:8;;:12;;:28;;;;:::i;:::-;42100:8;:39;;;;42177:43;42205:14;42177:8;:23;42194:4;42177:23;;;;;;;;;;;;;;;;:27;;:43;;;;:::i;:::-;42151:8;:23;42168:4;42151:23;;;;;;;;;;;;;;;:69;;;;42463:1;42444:16;:20;;;;42492:60;42521:17;42540:11;42492:60;;;;;;;:::i;:::-;;;;;;;;42582:4;42575:11;;;;;;;;;;41389:1206;42623:36;42639:19;42623:11;:15;;:36;;;;:::i;:::-;42609:50;;42787:677;42804:19;42794:7;:29;;;42787:677;;;42980:12;43066:16;;43027:15;43044:10;43056:4;43010:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43000:62;;;;;;42995:68;;:87;;;;:::i;:::-;42980:102;;43109:13;:22;43123:7;43109:22;;;;;;;;;;;:31;;;;;;;;;;;;43105:321;;;43187:13;:22;43201:7;43187:22;;;;;;;;;;;:27;;;;;;;;;;;;43158:17;43176:7;43158:26;;;;;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;::::0;::::1;43247:31;43266:11;43247:14;:18;;:31;;;;:::i;:::-;43230:48;;43334:54;43376:11;43334:8;:37;43343:13;:22;43357:7;43343:22;;;;;;;;;;;:27;;;;;;;;;;;;43334:37;;;;;;;;;;;;;;;;:41;;:54;;;;:::i;:::-;43294:8;:37;43303:13;:22;43317:7;43303:22;;;;;;;;;;;:27;;;;;;;;;;;;43294:37;;;;;;;;;;;;;;;:94;;;;43404:9;;;;;:::i;:::-;;;;43105:321;43444:11;43453:1;43444:4;:8;;:11;;;;:::i;:::-;43437:18;;42787:677;;;;43489:28;43502:14;43489:8;;:12;;:28;;;;:::i;:::-;43478:8;:39;;;;43554:43;43582:14;43554:8;:23;43571:4;43554:23;;;;;;;;;;;;;;;;:27;;:43;;;;:::i;:::-;43528:8;:23;43545:4;43528:23;;;;;;;;;;;;;;;:69;;;;43837:1;43818:16;:20;;;;43858:60;43887:17;43906:11;43858:60;;;;;;;:::i;:::-;;;;;;;;43934:4;43927:11;;;;;;;;4891:1;40790:3156:::0;:::o;26895:36::-;;;;;;;;;;;;;:::o;32160:112::-;4831:12;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32258:6:::1;32236:19;:28;;;;32160:112:::0;:::o;30375:143::-;30456:7;30483:11;:18;30495:5;30483:18;;;;;;;;;;;;;;;:27;30502:7;30483:27;;;;;;;;;;;;;;;;30476:34;;30375:143;;;;:::o;26974:27::-;;;;:::o;45142:405::-;45187:12;4831;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45319:1:::1;45299:16;;:21;;45290:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45414:1;45396:15;:19;;;;45445:1;45426:16;:20;;;;45475:1;45457:15;:19;;;;45506:1;45487:16;:20;;;;45535:4;45528:11;;45142:405:::0;:::o;5554:244::-;4831:12;:10;:12::i;:::-;4820:23;;:7;:5;:7::i;:::-;:23;;;4812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5663:1:::1;5643:22;;:8;:22;;;;5635:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5753:8;5724:38;;5745:6;::::0;::::1;;;;;;;;5724:38;;;;;;;;;;;;5782:8;5773:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;5554:244:::0;:::o;31566:179::-;31621:7;31638:21;31662:47;31693:15;;31662:26;31679:8;;31662:12;;:16;;:26;;;;:::i;:::-;:30;;:47;;;;:::i;:::-;31638:71;;31724:13;31717:20;;;31566:179;:::o;8349:98::-;8407:7;8438:1;8434;:5;;;;:::i;:::-;8427:12;;8349:98;;;;:::o;605:::-;658:7;685:10;678:17;;605:98;:::o;34850:339::-;34960:1;34943:19;;:5;:19;;;;34935:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35041:1;35022:21;;:7;:21;;;;35014:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35125:6;35095:11;:18;35107:5;35095:18;;;;;;;;;;;;;;;:27;35114:7;35095:27;;;;;;;;;;;;;;;:36;;;;35165:7;35149:32;;35158:5;35149:32;;;35174:6;35149:32;;;;;;:::i;:::-;;;;;;;;34850:339;;;:::o;35201:1810::-;35326:1;35303:25;;:11;:25;;;;:52;;;;;35353:1;35332:23;;:9;:23;;;;35303:52;35295:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;35428:1;35419:6;:10;:45;;;;;35443:8;:21;35452:11;35443:21;;;;;;;;;;;;;;;;35433:6;:31;;35419:45;35411:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35521:7;:5;:7::i;:::-;35506:22;;:11;:22;;;;:46;;;;;35545:7;:5;:7::i;:::-;35532:20;;:9;:20;;;;35506:46;35503:138;;;35585:11;;35575:6;:21;;35567:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;35503:138;35740:28;35771:54;35800:24;:22;:24::i;:::-;35771;35789:4;35771:9;:24::i;:::-;:28;;:54;;;;:::i;:::-;35740:85;;35836:24;35887:29;;35863:20;:53;;35836:80;;36027:19;:53;;;;;36064:16;;;;;;;;;;;36063:17;36027:53;:98;;;;;36112:13;36097:28;;:11;:28;;;;36027:98;:136;;;;;36142:21;;;;;;;;;;;36027:136;36009:296;;;36213:29;;36190:52;;36257:36;36272:20;36257:14;:36::i;:::-;36009:296;36349:33;36375:6;36349:8;:21;36358:11;36349:21;;;;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;36325:8;:21;36334:11;36325:21;;;;;;;;;;;;;;;:57;;;;36393:30;36426:18;36437:6;36426:10;:18::i;:::-;36393:51;;36477:47;36501:22;36477:8;:19;36486:9;36477:19;;;;;;;;;;;;;;;;:23;;:47;;;;:::i;:::-;36455:8;:19;36464:9;36455:19;;;;;;;;;;;;;;;:69;;;;36628:19;;36605:8;:19;36614:9;36605:19;;;;;;;;;;;;;;;;:42;;:72;;;;;36672:4;36651:26;;:9;:26;;;;36605:72;36601:121;;;36690:20;36700:9;36690;:20::i;:::-;36601:121;36760:19;;36736:8;:21;36745:11;36736:21;;;;;;;;;;;;;;;;:43;:75;;;;;36806:4;36783:28;;:11;:28;;;;36736:75;36732:130;;;36825:25;36838:11;36825:12;:25::i;:::-;36732:130;36882:47;36898:6;36906:22;36882:15;:47::i;:::-;36969:9;36947:56;;36956:11;36947:56;;;36980:22;36947:56;;;;;;:::i;:::-;;;;;;;;35201:1810;;;;;;:::o;10628:206::-;10714:7;10772:1;10767;:6;;10775:12;10759:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;10814:1;10810;:5;10803:12;;10628:206;;;;;:::o;8730:98::-;8788:7;8819:1;8815;:5;;;;:::i;:::-;8808:12;;8730:98;;;;:::o;9486:::-;9544:7;9575:1;9571;:5;;;;:::i;:::-;9564:12;;9486:98;;;;:::o;47203:246::-;47279:13;;:::i;:::-;47322:4;47306:20;;:12;:20;;;47302:108;;;47357:21;:19;:21::i;:::-;47348:5;:30;;47340:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47302:108;47424:13;:20;47438:5;47424:20;;;;;;;;;;;47417:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47203:246;;;;:::o;33171:478::-;29066:4;29047:16;;:23;;;;;;;;;;;;;;;;;;33256:12:::1;33271:27;33296:1;33271:20;:24;;:27;;;;:::i;:::-;33256:42;;33309:17;33329:30;33354:4;33329:20;:24;;:30;;;;:::i;:::-;33309:50;;33372:22;33397:21;33372:46;;33429:22;33446:4;33429:16;:22::i;:::-;33462:18;33483:41;33509:14;33483:21;:25;;:41;;;;:::i;:::-;33462:62;;33537:35;33550:9;33561:10;33537:12;:35::i;:::-;33598:43;33613:4;33619:10;33631:9;33598:43;;;;;;;;:::i;:::-;;;;;;;;29081:1;;;;29112:5:::0;29093:16;;:24;;;;;;;;;;;;;;;;;;33171:478;:::o;37019:425::-;37072:7;37089:18;37110:24;37127:6;37110:16;:24::i;:::-;37089:45;;37145:22;37170:31;37194:6;37170:23;:31::i;:::-;37145:56;;37209:23;37235:28;37256:6;37235:20;:28::i;:::-;37209:54;;37273:19;37295:51;37335:10;37295:35;37314:15;37295:14;:18;;:35;;;;:::i;:::-;:39;;:51;;;;:::i;:::-;37273:73;;37354:25;37382:23;37393:11;37382:6;:10;;:23;;;;:::i;:::-;37354:51;;37419:17;37412:24;;;;;;;37019:425;;;:::o;45585:397::-;45684:1;45651:14;:29;45666:13;45651:29;;;;;;;;;;;;;;;;:34;45647:73;;45702:7;;45647:73;45730:13;45746:20;45764:1;45746:13;;:17;;:20;;;;:::i;:::-;45730:36;;45804:101;;;;;;;;45826:13;45804:101;;;;;;45858:4;45804:101;;;;;;45884:15;45804:101;;;45781:13;:20;45795:5;45781:20;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45946:5;45914:14;:29;45929:13;45914:29;;;;;;;;;;;;;;;:37;;;;45972:5;45956:13;:21;;;;45585:397;;;:::o;45987:540::-;46086:1;46053:14;:29;46068:13;46053:29;;;;;;;;;;;;;;;;:34;46049:73;;;46104:7;;46049:73;46132:13;46148:14;:29;46163:13;46148:29;;;;;;;;;;;;;;;;46132:45;;46220:1;46188:14;:29;46203:13;46188:29;;;;;;;;;;;;;;;:33;;;;46255:13;;46246:5;:22;46242:178;;46308:13;:28;46322:13;;46308:28;;;;;;;;;;;46285:13;:20;46299:5;46285:20;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46403:5;46351:14;:49;46366:13;:28;46380:13;;46366:28;;;;;;;;;;;:33;;;;;;;;;;;;46351:49;;;;;;;;;;;;;;;:57;;;;46242:178;46470:5;46430:13;:28;46444:13;;46430:28;;;;;;;;;;;:37;;;:45;;;;;;;;;;;;;;;;;;46502:20;46520:1;46502:13;;:17;;:20;;;;:::i;:::-;46486:13;:36;;;;45987:540;;;:::o;46533:563::-;46683:1;46653:27;46678:1;46662:13;;:17;;;;:::i;:::-;46653:4;:8;;:27;;;;:::i;:::-;:31;;;;:::i;:::-;46646:38;;46729:1;46699:27;46724:1;46708:13;;:17;;;;:::i;:::-;46699:4;:8;;:27;;;;:::i;:::-;:31;;;;:::i;:::-;46692:38;;46745:21;46769:13;:19;46783:4;46769:19;;;;;;;;;;;46745:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46796:21;46820:13;:19;46834:4;46820:19;;;;;;;;;;;46796:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46858:7;:16;;;:36;;;;;46878:7;:16;;;46858:36;46854:238;;;46939:4;46908:14;:28;46923:7;:12;;;46908:28;;;;;;;;;;;;;;;:35;;;;46986:4;46955:14;:28;46970:7;:12;;;46955:28;;;;;;;;;;;;;;;:35;;;;47035:7;47013:13;:19;47027:4;47013:19;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47076:7;47054:13;:19;47068:4;47054:19;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46854:238;46533:563;;;;:::o;33657:529::-;33723:21;33761:1;33747:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33723:40;;33792:4;33774;33779:1;33774:7;;;;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;33818:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33808:4;33813:1;33808:7;;;;;;;;;;;;;;;;;;;;;:32;;;;;;;;;;;33853:62;33870:4;33885:15;33903:11;33853:8;:62::i;:::-;33954:15;:66;;;34035:11;34061:1;34105:4;34132;34152:15;33954:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33657:529;;:::o;34280:513::-;34428:62;34445:4;34460:15;34478:11;34428:8;:62::i;:::-;34533:15;:31;;;34572:9;34605:4;34625:11;34651:1;34694;34737:7;:5;:7::i;:::-;34759:15;34533:252;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;34280:513;;:::o;37452:322::-;37511:7;37528:28;37559:36;37579:6;37587:7;;;;;;;;;;;37559:19;:36::i;:::-;37528:67;;37614:34;37627:20;37614:8;;:12;;:34;;;;:::i;:::-;37603:8;:45;;;;37682:49;37710:20;37682:8;:23;37699:4;37682:23;;;;;;;;;;;;;;;;:27;;:49;;;;:::i;:::-;37656:8;:23;37673:4;37656:23;;;;;;;;;;;;;;;:75;;;;37746:20;37739:27;;;37452:322;;;:::o;37782:388::-;37848:7;37869:35;37908:48;37928:6;37936:19;;;;;;;;;;;37908;:48::i;:::-;37868:88;;37982:48;38002:27;37982:15;;:19;;:48;;;;:::i;:::-;37964:15;:66;;;;38064:56;38092:27;38064:8;:23;38081:4;38064:23;;;;;;;;;;;;;;;;:27;;:56;;;;:::i;:::-;38038:8;:23;38055:4;38038:23;;;;;;;;;;;;;;;:82;;;;38135:27;38128:34;;;37782:388;;;:::o;38178:361::-;38241:7;38259:32;38295:45;38315:6;38323:16;;;;;;;;;;;38295:19;:45::i;:::-;38258:82;;38363:42;38380:24;38363:12;;:16;;:42;;;;:::i;:::-;38348:12;:57;;;;38439:53;38467:24;38439:8;:23;38456:4;38439:23;;;;;;;;;;;;;;;;:27;;:53;;;;:::i;:::-;38413:8;:23;38430:4;38413:23;;;;;;;;;;;;;;;:79;;;;38507:24;38500:31;;;38178:361;;;:::o;10051:98::-;10109:7;10140:1;10136;:5;;;;:::i;:::-;10129:12;;10051:98;;;;:::o;38547:138::-;38626:7;38650:27;38671:5;38650:16;38661:4;38650:16;;:6;:10;;:16;;;;:::i;:::-;:20;;:27;;;;:::i;:::-;38643:34;;38547:138;;;;:::o;9087:98::-;9145:7;9176:1;9172;:5;;;;:::i;:::-;9165:12;;9087:98;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:344:1:-;;110:65;125:49;167:6;125:49;:::i;:::-;110:65;:::i;:::-;101:74;;198:6;191:5;184:21;236:4;229:5;225:16;274:3;265:6;260:3;256:16;253:25;250:2;;;291:1;288;281:12;250:2;304:41;338:6;333:3;328;304:41;:::i;:::-;91:260;;;;;;:::o;357:139::-;;441:6;428:20;419:29;;457:33;484:5;457:33;:::i;:::-;409:87;;;;:::o;502:143::-;;590:6;584:13;575:22;;606:33;633:5;606:33;:::i;:::-;565:80;;;;:::o;651:133::-;;732:6;719:20;710:29;;748:30;772:5;748:30;:::i;:::-;700:84;;;;:::o;804:273::-;;909:3;902:4;894:6;890:17;886:27;876:2;;927:1;924;917:12;876:2;967:6;954:20;992:79;1067:3;1059:6;1052:4;1044:6;1040:17;992:79;:::i;:::-;983:88;;866:211;;;;;:::o;1083:139::-;;1167:6;1154:20;1145:29;;1183:33;1210:5;1183:33;:::i;:::-;1135:87;;;;:::o;1228:143::-;;1316:6;1310:13;1301:22;;1332:33;1359:5;1332:33;:::i;:::-;1291:80;;;;:::o;1377:137::-;;1460:6;1447:20;1438:29;;1476:32;1502:5;1476:32;:::i;:::-;1428:86;;;;:::o;1520:262::-;;1628:2;1616:9;1607:7;1603:23;1599:32;1596:2;;;1644:1;1641;1634:12;1596:2;1687:1;1712:53;1757:7;1748:6;1737:9;1733:22;1712:53;:::i;:::-;1702:63;;1658:117;1586:196;;;;:::o;1788:284::-;;1907:2;1895:9;1886:7;1882:23;1878:32;1875:2;;;1923:1;1920;1913:12;1875:2;1966:1;1991:64;2047:7;2038:6;2027:9;2023:22;1991:64;:::i;:::-;1981:74;;1937:128;1865:207;;;;:::o;2078:407::-;;;2203:2;2191:9;2182:7;2178:23;2174:32;2171:2;;;2219:1;2216;2209:12;2171:2;2262:1;2287:53;2332:7;2323:6;2312:9;2308:22;2287:53;:::i;:::-;2277:63;;2233:117;2389:2;2415:53;2460:7;2451:6;2440:9;2436:22;2415:53;:::i;:::-;2405:63;;2360:118;2161:324;;;;;:::o;2491:552::-;;;;2633:2;2621:9;2612:7;2608:23;2604:32;2601:2;;;2649:1;2646;2639:12;2601:2;2692:1;2717:53;2762:7;2753:6;2742:9;2738:22;2717:53;:::i;:::-;2707:63;;2663:117;2819:2;2845:53;2890:7;2881:6;2870:9;2866:22;2845:53;:::i;:::-;2835:63;;2790:118;2947:2;2973:53;3018:7;3009:6;2998:9;2994:22;2973:53;:::i;:::-;2963:63;;2918:118;2591:452;;;;;:::o;3049:407::-;;;3174:2;3162:9;3153:7;3149:23;3145:32;3142:2;;;3190:1;3187;3180:12;3142:2;3233:1;3258:53;3303:7;3294:6;3283:9;3279:22;3258:53;:::i;:::-;3248:63;;3204:117;3360:2;3386:53;3431:7;3422:6;3411:9;3407:22;3386:53;:::i;:::-;3376:63;;3331:118;3132:324;;;;;:::o;3462:256::-;;3567:2;3555:9;3546:7;3542:23;3538:32;3535:2;;;3583:1;3580;3573:12;3535:2;3626:1;3651:50;3693:7;3684:6;3673:9;3669:22;3651:50;:::i;:::-;3641:60;;3597:114;3525:193;;;;:::o;3724:262::-;;3832:2;3820:9;3811:7;3807:23;3803:32;3800:2;;;3848:1;3845;3838:12;3800:2;3891:1;3916:53;3961:7;3952:6;3941:9;3937:22;3916:53;:::i;:::-;3906:63;;3862:117;3790:196;;;;:::o;3992:665::-;;;;4144:2;4132:9;4123:7;4119:23;4115:32;4112:2;;;4160:1;4157;4150:12;4112:2;4203:1;4228:53;4273:7;4264:6;4253:9;4249:22;4228:53;:::i;:::-;4218:63;;4174:117;4330:2;4356:53;4401:7;4392:6;4381:9;4377:22;4356:53;:::i;:::-;4346:63;;4301:118;4486:2;4475:9;4471:18;4458:32;4517:18;4509:6;4506:30;4503:2;;;4549:1;4546;4539:12;4503:2;4577:63;4632:7;4623:6;4612:9;4608:22;4577:63;:::i;:::-;4567:73;;4429:221;4102:555;;;;;:::o;4663:596::-;;;;4816:2;4804:9;4795:7;4791:23;4787:32;4784:2;;;4832:1;4829;4822:12;4784:2;4875:1;4900:64;4956:7;4947:6;4936:9;4932:22;4900:64;:::i;:::-;4890:74;;4846:128;5013:2;5039:64;5095:7;5086:6;5075:9;5071:22;5039:64;:::i;:::-;5029:74;;4984:129;5152:2;5178:64;5234:7;5225:6;5214:9;5210:22;5178:64;:::i;:::-;5168:74;;5123:129;4774:485;;;;;:::o;5265:260::-;;5372:2;5360:9;5351:7;5347:23;5343:32;5340:2;;;5388:1;5385;5378:12;5340:2;5431:1;5456:52;5500:7;5491:6;5480:9;5476:22;5456:52;:::i;:::-;5446:62;;5402:116;5330:195;;;;:::o;5531:179::-;;5621:46;5663:3;5655:6;5621:46;:::i;:::-;5699:4;5694:3;5690:14;5676:28;;5611:99;;;;:::o;5716:108::-;5793:24;5811:5;5793:24;:::i;:::-;5788:3;5781:37;5771:53;;:::o;5830:118::-;5917:24;5935:5;5917:24;:::i;:::-;5912:3;5905:37;5895:53;;:::o;5954:157::-;6059:45;6079:24;6097:5;6079:24;:::i;:::-;6059:45;:::i;:::-;6054:3;6047:58;6037:74;;:::o;6147:732::-;;6295:54;6343:5;6295:54;:::i;:::-;6365:86;6444:6;6439:3;6365:86;:::i;:::-;6358:93;;6475:56;6525:5;6475:56;:::i;:::-;6554:7;6585:1;6570:284;6595:6;6592:1;6589:13;6570:284;;;6671:6;6665:13;6698:63;6757:3;6742:13;6698:63;:::i;:::-;6691:70;;6784:60;6837:6;6784:60;:::i;:::-;6774:70;;6630:224;6617:1;6614;6610:9;6605:14;;6570:284;;;6574:14;6870:3;6863:10;;6271:608;;;;;;;:::o;6885:109::-;6966:21;6981:5;6966:21;:::i;:::-;6961:3;6954:34;6944:50;;:::o;7000:185::-;7114:64;7172:5;7114:64;:::i;:::-;7109:3;7102:77;7092:93;;:::o;7191:147::-;7286:45;7325:5;7286:45;:::i;:::-;7281:3;7274:58;7264:74;;:::o;7344:364::-;;7460:39;7493:5;7460:39;:::i;:::-;7515:71;7579:6;7574:3;7515:71;:::i;:::-;7508:78;;7595:52;7640:6;7635:3;7628:4;7621:5;7617:16;7595:52;:::i;:::-;7672:29;7694:6;7672:29;:::i;:::-;7667:3;7663:39;7656:46;;7436:272;;;;;:::o;7714:329::-;;7877:67;7941:2;7936:3;7877:67;:::i;:::-;7870:74;;7974:33;7970:1;7965:3;7961:11;7954:54;8034:2;8029:3;8025:12;8018:19;;7860:183;;;:::o;8049:371::-;;8212:67;8276:2;8271:3;8212:67;:::i;:::-;8205:74;;8309:34;8305:1;8300:3;8296:11;8289:55;8375:9;8370:2;8365:3;8361:12;8354:31;8411:2;8406:3;8402:12;8395:19;;8195:225;;;:::o;8426:370::-;;8589:67;8653:2;8648:3;8589:67;:::i;:::-;8582:74;;8686:34;8682:1;8677:3;8673:11;8666:55;8752:8;8747:2;8742:3;8738:12;8731:30;8787:2;8782:3;8778:12;8771:19;;8572:224;;;:::o;8802:366::-;;8965:67;9029:2;9024:3;8965:67;:::i;:::-;8958:74;;9062:34;9058:1;9053:3;9049:11;9042:55;9128:4;9123:2;9118:3;9114:12;9107:26;9159:2;9154:3;9150:12;9143:19;;8948:220;;;:::o;9174:372::-;;9337:67;9401:2;9396:3;9337:67;:::i;:::-;9330:74;;9434:34;9430:1;9425:3;9421:11;9414:55;9500:10;9495:2;9490:3;9486:12;9479:32;9537:2;9532:3;9528:12;9521:19;;9320:226;;;:::o;9552:303::-;;9715:66;9779:1;9774:3;9715:66;:::i;:::-;9708:73;;9811:8;9807:1;9802:3;9798:11;9791:29;9846:2;9841:3;9837:12;9830:19;;9698:157;;;:::o;9861:372::-;;10024:67;10088:2;10083:3;10024:67;:::i;:::-;10017:74;;10121:34;10117:1;10112:3;10108:11;10101:55;10187:10;10182:2;10177:3;10173:12;10166:32;10224:2;10219:3;10215:12;10208:19;;10007:226;;;:::o;10239:321::-;;10402:67;10466:2;10461:3;10402:67;:::i;:::-;10395:74;;10499:25;10495:1;10490:3;10486:11;10479:46;10551:2;10546:3;10542:12;10535:19;;10385:175;;;:::o;10566:394::-;;10729:67;10793:2;10788:3;10729:67;:::i;:::-;10722:74;;10826:34;10822:1;10817:3;10813:11;10806:55;10892:32;10887:2;10882:3;10878:12;10871:54;10951:2;10946:3;10942:12;10935:19;;10712:248;;;:::o;10966:330::-;;11129:67;11193:2;11188:3;11129:67;:::i;:::-;11122:74;;11226:34;11222:1;11217:3;11213:11;11206:55;11287:2;11282:3;11278:12;11271:19;;11112:184;;;:::o;11302:391::-;;11465:67;11529:2;11524:3;11465:67;:::i;:::-;11458:74;;11562:34;11558:1;11553:3;11549:11;11542:55;11628:29;11623:2;11618:3;11614:12;11607:51;11684:2;11679:3;11675:12;11668:19;;11448:245;;;:::o;11699:368::-;;11862:67;11926:2;11921:3;11862:67;:::i;:::-;11855:74;;11959:34;11955:1;11950:3;11946:11;11939:55;12025:6;12020:2;12015:3;12011:12;12004:28;12058:2;12053:3;12049:12;12042:19;;11845:222;;;:::o;12073:316::-;;12236:67;12300:2;12295:3;12236:67;:::i;:::-;12229:74;;12333:20;12329:1;12324:3;12320:11;12313:41;12380:2;12375:3;12371:12;12364:19;;12219:170;;;:::o;12395:392::-;;12558:67;12622:2;12617:3;12558:67;:::i;:::-;12551:74;;12655:34;12651:1;12646:3;12642:11;12635:55;12721:30;12716:2;12711:3;12707:12;12700:52;12778:2;12773:3;12769:12;12762:19;;12541:246;;;:::o;12793:312::-;;12956:67;13020:2;13015:3;12956:67;:::i;:::-;12949:74;;13053:16;13049:1;13044:3;13040:11;13033:37;13096:2;13091:3;13087:12;13080:19;;12939:166;;;:::o;13111:390::-;;13274:67;13338:2;13333:3;13274:67;:::i;:::-;13267:74;;13371:34;13367:1;13362:3;13358:11;13351:55;13437:28;13432:2;13427:3;13423:12;13416:50;13492:2;13487:3;13483:12;13476:19;;13257:244;;;:::o;13507:378::-;;13670:67;13734:2;13729:3;13670:67;:::i;:::-;13663:74;;13767:34;13763:1;13758:3;13754:11;13747:55;13833:16;13828:2;13823:3;13819:12;13812:38;13876:2;13871:3;13867:12;13860:19;;13653:232;;;:::o;13891:118::-;13978:24;13996:5;13978:24;:::i;:::-;13973:3;13966:37;13956:53;;:::o;14015:157::-;14120:45;14140:24;14158:5;14140:24;:::i;:::-;14120:45;:::i;:::-;14115:3;14108:58;14098:74;;:::o;14178:115::-;14263:23;14280:5;14263:23;:::i;:::-;14258:3;14251:36;14241:52;;:::o;14299:112::-;14382:22;14398:5;14382:22;:::i;:::-;14377:3;14370:35;14360:51;;:::o;14417:538::-;;14600:75;14671:3;14662:6;14600:75;:::i;:::-;14700:2;14695:3;14691:12;14684:19;;14713:75;14784:3;14775:6;14713:75;:::i;:::-;14813:2;14808:3;14804:12;14797:19;;14826:75;14897:3;14888:6;14826:75;:::i;:::-;14926:2;14921:3;14917:12;14910:19;;14946:3;14939:10;;14589:366;;;;;;:::o;14961:222::-;;15092:2;15081:9;15077:18;15069:26;;15105:71;15173:1;15162:9;15158:17;15149:6;15105:71;:::i;:::-;15059:124;;;;:::o;15189:332::-;;15348:2;15337:9;15333:18;15325:26;;15361:71;15429:1;15418:9;15414:17;15405:6;15361:71;:::i;:::-;15442:72;15510:2;15499:9;15495:18;15486:6;15442:72;:::i;:::-;15315:206;;;;;:::o;15527:807::-;;15814:3;15803:9;15799:19;15791:27;;15828:71;15896:1;15885:9;15881:17;15872:6;15828:71;:::i;:::-;15909:72;15977:2;15966:9;15962:18;15953:6;15909:72;:::i;:::-;15991:80;16067:2;16056:9;16052:18;16043:6;15991:80;:::i;:::-;16081;16157:2;16146:9;16142:18;16133:6;16081:80;:::i;:::-;16171:73;16239:3;16228:9;16224:19;16215:6;16171:73;:::i;:::-;16254;16322:3;16311:9;16307:19;16298:6;16254:73;:::i;:::-;15781:553;;;;;;;;;:::o;16340:483::-;;16549:2;16538:9;16534:18;16526:26;;16598:9;16592:4;16588:20;16584:1;16573:9;16569:17;16562:47;16626:108;16729:4;16720:6;16626:108;:::i;:::-;16618:116;;16744:72;16812:2;16801:9;16797:18;16788:6;16744:72;:::i;:::-;16516:307;;;;;:::o;16829:210::-;;16954:2;16943:9;16939:18;16931:26;;16967:65;17029:1;17018:9;17014:17;17005:6;16967:65;:::i;:::-;16921:118;;;;:::o;17045:276::-;;17203:2;17192:9;17188:18;17180:26;;17216:98;17311:1;17300:9;17296:17;17287:6;17216:98;:::i;:::-;17170:151;;;;:::o;17327:313::-;;17478:2;17467:9;17463:18;17455:26;;17527:9;17521:4;17517:20;17513:1;17502:9;17498:17;17491:47;17555:78;17628:4;17619:6;17555:78;:::i;:::-;17547:86;;17445:195;;;;:::o;17646:419::-;;17850:2;17839:9;17835:18;17827:26;;17899:9;17893:4;17889:20;17885:1;17874:9;17870:17;17863:47;17927:131;18053:4;17927:131;:::i;:::-;17919:139;;17817:248;;;:::o;18071:419::-;;18275:2;18264:9;18260:18;18252:26;;18324:9;18318:4;18314:20;18310:1;18299:9;18295:17;18288:47;18352:131;18478:4;18352:131;:::i;:::-;18344:139;;18242:248;;;:::o;18496:419::-;;18700:2;18689:9;18685:18;18677:26;;18749:9;18743:4;18739:20;18735:1;18724:9;18720:17;18713:47;18777:131;18903:4;18777:131;:::i;:::-;18769:139;;18667:248;;;:::o;18921:419::-;;19125:2;19114:9;19110:18;19102:26;;19174:9;19168:4;19164:20;19160:1;19149:9;19145:17;19138:47;19202:131;19328:4;19202:131;:::i;:::-;19194:139;;19092:248;;;:::o;19346:419::-;;19550:2;19539:9;19535:18;19527:26;;19599:9;19593:4;19589:20;19585:1;19574:9;19570:17;19563:47;19627:131;19753:4;19627:131;:::i;:::-;19619:139;;19517:248;;;:::o;19771:419::-;;19975:2;19964:9;19960:18;19952:26;;20024:9;20018:4;20014:20;20010:1;19999:9;19995:17;19988:47;20052:131;20178:4;20052:131;:::i;:::-;20044:139;;19942:248;;;:::o;20196:419::-;;20400:2;20389:9;20385:18;20377:26;;20449:9;20443:4;20439:20;20435:1;20424:9;20420:17;20413:47;20477:131;20603:4;20477:131;:::i;:::-;20469:139;;20367:248;;;:::o;20621:419::-;;20825:2;20814:9;20810:18;20802:26;;20874:9;20868:4;20864:20;20860:1;20849:9;20845:17;20838:47;20902:131;21028:4;20902:131;:::i;:::-;20894:139;;20792:248;;;:::o;21046:419::-;;21250:2;21239:9;21235:18;21227:26;;21299:9;21293:4;21289:20;21285:1;21274:9;21270:17;21263:47;21327:131;21453:4;21327:131;:::i;:::-;21319:139;;21217:248;;;:::o;21471:419::-;;21675:2;21664:9;21660:18;21652:26;;21724:9;21718:4;21714:20;21710:1;21699:9;21695:17;21688:47;21752:131;21878:4;21752:131;:::i;:::-;21744:139;;21642:248;;;:::o;21896:419::-;;22100:2;22089:9;22085:18;22077:26;;22149:9;22143:4;22139:20;22135:1;22124:9;22120:17;22113:47;22177:131;22303:4;22177:131;:::i;:::-;22169:139;;22067:248;;;:::o;22321:419::-;;22525:2;22514:9;22510:18;22502:26;;22574:9;22568:4;22564:20;22560:1;22549:9;22545:17;22538:47;22602:131;22728:4;22602:131;:::i;:::-;22594:139;;22492:248;;;:::o;22746:419::-;;22950:2;22939:9;22935:18;22927:26;;22999:9;22993:4;22989:20;22985:1;22974:9;22970:17;22963:47;23027:131;23153:4;23027:131;:::i;:::-;23019:139;;22917:248;;;:::o;23171:419::-;;23375:2;23364:9;23360:18;23352:26;;23424:9;23418:4;23414:20;23410:1;23399:9;23395:17;23388:47;23452:131;23578:4;23452:131;:::i;:::-;23444:139;;23342:248;;;:::o;23596:419::-;;23800:2;23789:9;23785:18;23777:26;;23849:9;23843:4;23839:20;23835:1;23824:9;23820:17;23813:47;23877:131;24003:4;23877:131;:::i;:::-;23869:139;;23767:248;;;:::o;24021:419::-;;24225:2;24214:9;24210:18;24202:26;;24274:9;24268:4;24264:20;24260:1;24249:9;24245:17;24238:47;24302:131;24428:4;24302:131;:::i;:::-;24294:139;;24192:248;;;:::o;24446:419::-;;24650:2;24639:9;24635:18;24627:26;;24699:9;24693:4;24689:20;24685:1;24674:9;24670:17;24663:47;24727:131;24853:4;24727:131;:::i;:::-;24719:139;;24617:248;;;:::o;24871:222::-;;25002:2;24991:9;24987:18;24979:26;;25015:71;25083:1;25072:9;25068:17;25059:6;25015:71;:::i;:::-;24969:124;;;;:::o;25099:533::-;;25306:2;25295:9;25291:18;25283:26;;25319:71;25387:1;25376:9;25372:17;25363:6;25319:71;:::i;:::-;25400:72;25468:2;25457:9;25453:18;25444:6;25400:72;:::i;:::-;25519:9;25513:4;25509:20;25504:2;25493:9;25489:18;25482:48;25547:78;25620:4;25611:6;25547:78;:::i;:::-;25539:86;;25273:359;;;;;;:::o;25638:831::-;;25939:3;25928:9;25924:19;25916:27;;25953:71;26021:1;26010:9;26006:17;25997:6;25953:71;:::i;:::-;26034:80;26110:2;26099:9;26095:18;26086:6;26034:80;:::i;:::-;26161:9;26155:4;26151:20;26146:2;26135:9;26131:18;26124:48;26189:108;26292:4;26283:6;26189:108;:::i;:::-;26181:116;;26307:72;26375:2;26364:9;26360:18;26351:6;26307:72;:::i;:::-;26389:73;26457:3;26446:9;26442:19;26433:6;26389:73;:::i;:::-;25906:563;;;;;;;;:::o;26475:442::-;;26662:2;26651:9;26647:18;26639:26;;26675:71;26743:1;26732:9;26728:17;26719:6;26675:71;:::i;:::-;26756:72;26824:2;26813:9;26809:18;26800:6;26756:72;:::i;:::-;26838;26906:2;26895:9;26891:18;26882:6;26838:72;:::i;:::-;26629:288;;;;;;:::o;26923:218::-;;27052:2;27041:9;27037:18;27029:26;;27065:69;27131:1;27120:9;27116:17;27107:6;27065:69;:::i;:::-;27019:122;;;;:::o;27147:214::-;;27274:2;27263:9;27259:18;27251:26;;27287:67;27351:1;27340:9;27336:17;27327:6;27287:67;:::i;:::-;27241:120;;;;:::o;27367:283::-;;27433:2;27427:9;27417:19;;27475:4;27467:6;27463:17;27582:6;27570:10;27567:22;27546:18;27534:10;27531:34;27528:62;27525:2;;;27593:18;;:::i;:::-;27525:2;27633:10;27629:2;27622:22;27407:243;;;;:::o;27656:332::-;;27808:18;27800:6;27797:30;27794:2;;;27830:18;;:::i;:::-;27794:2;27915:4;27911:9;27904:4;27896:6;27892:17;27888:33;27880:41;;27976:4;27970;27966:15;27958:23;;27723:265;;;:::o;27994:132::-;;28084:3;28076:11;;28114:4;28109:3;28105:14;28097:22;;28066:60;;;:::o;28132:114::-;;28233:5;28227:12;28217:22;;28206:40;;;:::o;28252:99::-;;28338:5;28332:12;28322:22;;28311:40;;;:::o;28357:113::-;;28459:4;28454:3;28450:14;28442:22;;28432:38;;;:::o;28476:184::-;;28609:6;28604:3;28597:19;28649:4;28644:3;28640:14;28625:29;;28587:73;;;;:::o;28666:169::-;;28784:6;28779:3;28772:19;28824:4;28819:3;28815:14;28800:29;;28762:73;;;;:::o;28841:305::-;;28900:20;28918:1;28900:20;:::i;:::-;28895:25;;28934:20;28952:1;28934:20;:::i;:::-;28929:25;;29088:1;29020:66;29016:74;29013:1;29010:81;29007:2;;;29094:18;;:::i;:::-;29007:2;29138:1;29135;29131:9;29124:16;;28885:261;;;;:::o;29152:237::-;;29209:18;29225:1;29209:18;:::i;:::-;29204:23;;29241:18;29257:1;29241:18;:::i;:::-;29236:23;;29331:1;29325:4;29321:12;29318:1;29315:19;29312:2;;;29337:18;;:::i;:::-;29312:2;29381:1;29378;29374:9;29367:16;;29194:195;;;;:::o;29395:185::-;;29452:20;29470:1;29452:20;:::i;:::-;29447:25;;29486:20;29504:1;29486:20;:::i;:::-;29481:25;;29525:1;29515:2;;29530:18;;:::i;:::-;29515:2;29572:1;29569;29565:9;29560:14;;29437:143;;;;:::o;29586:348::-;;29649:20;29667:1;29649:20;:::i;:::-;29644:25;;29683:20;29701:1;29683:20;:::i;:::-;29678:25;;29871:1;29803:66;29799:74;29796:1;29793:81;29788:1;29781:9;29774:17;29770:105;29767:2;;;29878:18;;:::i;:::-;29767:2;29926:1;29923;29919:9;29908:20;;29634:300;;;;:::o;29940:191::-;;30000:20;30018:1;30000:20;:::i;:::-;29995:25;;30034:20;30052:1;30034:20;:::i;:::-;30029:25;;30073:1;30070;30067:8;30064:2;;;30078:18;;:::i;:::-;30064:2;30123:1;30120;30116:9;30108:17;;29985:146;;;;:::o;30137:96::-;;30203:24;30221:5;30203:24;:::i;:::-;30192:35;;30182:51;;;:::o;30239:90::-;;30316:5;30309:13;30302:21;30291:32;;30281:48;;;:::o;30335:126::-;;30412:42;30405:5;30401:54;30390:65;;30380:81;;;:::o;30467:77::-;;30533:5;30522:16;;30512:32;;;:::o;30550:93::-;;30626:10;30619:5;30615:22;30604:33;;30594:49;;;:::o;30649:86::-;;30724:4;30717:5;30713:16;30702:27;;30692:43;;;:::o;30741:180::-;;30851:64;30909:5;30851:64;:::i;:::-;30838:77;;30828:93;;;:::o;30927:140::-;;31037:24;31055:5;31037:24;:::i;:::-;31024:37;;31014:53;;;:::o;31073:121::-;;31164:24;31182:5;31164:24;:::i;:::-;31151:37;;31141:53;;;:::o;31200:154::-;31284:6;31279:3;31274;31261:30;31346:1;31337:6;31332:3;31328:16;31321:27;31251:103;;;:::o;31360:307::-;31428:1;31438:113;31452:6;31449:1;31446:13;31438:113;;;31537:1;31532:3;31528:11;31522:18;31518:1;31513:3;31509:11;31502:39;31474:2;31471:1;31467:10;31462:15;;31438:113;;;31569:6;31566:1;31563:13;31560:2;;;31649:1;31640:6;31635:3;31631:16;31624:27;31560:2;31409:258;;;;:::o;31673:320::-;;31754:1;31748:4;31744:12;31734:22;;31801:1;31795:4;31791:12;31822:18;31812:2;;31878:4;31870:6;31866:17;31856:27;;31812:2;31940;31932:6;31929:14;31909:18;31906:38;31903:2;;;31959:18;;:::i;:::-;31903:2;31724:269;;;;:::o;31999:233::-;;32061:24;32079:5;32061:24;:::i;:::-;32052:33;;32107:66;32100:5;32097:77;32094:2;;;32177:18;;:::i;:::-;32094:2;32224:1;32217:5;32213:13;32206:20;;32042:190;;;:::o;32238:167::-;;32298:22;32314:5;32298:22;:::i;:::-;32289:31;;32342:4;32335:5;32332:15;32329:2;;;32350:18;;:::i;:::-;32329:2;32397:1;32390:5;32386:13;32379:20;;32279:126;;;:::o;32411:100::-;;32479:26;32499:5;32479:26;:::i;:::-;32468:37;;32458:53;;;:::o;32517:94::-;;32585:20;32599:5;32585:20;:::i;:::-;32574:31;;32564:47;;;:::o;32617:79::-;;32685:5;32674:16;;32664:32;;;:::o;32702:176::-;;32751:20;32769:1;32751:20;:::i;:::-;32746:25;;32785:20;32803:1;32785:20;:::i;:::-;32780:25;;32824:1;32814:2;;32829:18;;:::i;:::-;32814:2;32870:1;32867;32863:9;32858:14;;32736:142;;;;:::o;32884:180::-;32932:77;32929:1;32922:88;33029:4;33026:1;33019:15;33053:4;33050:1;33043:15;33070:180;33118:77;33115:1;33108:88;33215:4;33212:1;33205:15;33239:4;33236:1;33229:15;33256:180;33304:77;33301:1;33294:88;33401:4;33398:1;33391:15;33425:4;33422:1;33415:15;33442:180;33490:77;33487:1;33480:88;33587:4;33584:1;33577:15;33611:4;33608:1;33601:15;33628:102;;33720:2;33716:7;33711:2;33704:5;33700:14;33696:28;33686:38;;33676:54;;;:::o;33736:94::-;;33817:5;33813:2;33809:14;33788:35;;33778:52;;;:::o;33836:122::-;33909:24;33927:5;33909:24;:::i;:::-;33902:5;33899:35;33889:2;;33948:1;33945;33938:12;33889:2;33879:79;:::o;33964:116::-;34034:21;34049:5;34034:21;:::i;:::-;34027:5;34024:32;34014:2;;34070:1;34067;34060:12;34014:2;34004:76;:::o;34086:122::-;34159:24;34177:5;34159:24;:::i;:::-;34152:5;34149:35;34139:2;;34198:1;34195;34188:12;34139:2;34129:79;:::o;34214:120::-;34286:23;34303:5;34286:23;:::i;:::-;34279:5;34276:34;34266:2;;34324:1;34321;34314:12;34266:2;34256:78;:::o
Swarm Source
ipfs://548640fed019a45f4035a770d0eac57947b78451ddc73210d3a8037d23a3d319
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.