Contract
0x3350748459411d148e9c9e2cb3dcb3b4bdc509cb
6
Contract Overview
My Name Tag:
Not Available
TokenTracker:
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Source Code Verified (Exact Match)
Contract Name:
Yakuza2033
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan on 2023-01-31 */ // SPDX-License-Identifier: Unlicensed pragma solidity 0.8.17; // __ __ _ ___ __ ________ // \ \ / /_ _| |___ _ _____ _ |_ ) \__ /__ / // \ V / _` | / / || |_ / _` | / / () |_ \|_ \ // |_|\__,_|_\_\\_,_/__\__,_| /___\__/___/___/ // / __| |_ ___ __ _ _ _ _ _ // \__ \ ' \/ _ \/ _` | || | ' \ // |___/_||_\___/\__, |\_,_|_||_| // |___/ // (•_•) // ( •_•)>⌐■-■ // (⌐■_■) // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) /** * @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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @uniswap/v2-periphery/contracts/interfaces/[email protected] 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); } // File @uniswap/v2-periphery/contracts/interfaces/[email protected] 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; } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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"); (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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @uniswap/v2-core/contracts/interfaces/[email protected] interface IUniswapV2ERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; } // File @uniswap/v2-core/contracts/interfaces/[email protected] 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; } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/utility/Permissions.sol /** * @title A generic permissions-management contract for Yakuza 2033. * * @notice Yakuza 2033 * Telegram: t.me/yakuza2033 * Twitter: yakuza2033 * App: yakuza2033.com * * @author Shogun * Telegram: zeroXshogun * Web: coinlord.finance * * @custom:security-contact Telegram: zeroXshogun */ contract Permissions is Context, Ownable { /// Accounts permitted to modify rules. mapping(address => bool) public appAddresses; modifier onlyApp() { require(appAddresses[_msgSender()] == true, "Caller is not admin"); _; } constructor() {} function setPermission(address account, bool permitted) external onlyOwner { appAddresses[account] = permitted; } } // File contracts/inventory/Bugs.sol /** * @title An ERC-20 contract for Yakuza 2033. * * @dev All token amounts in Wei. * @dev Forked from Mithril (https://bscscan.com/address/0x566fdf5bf13b9642cbdfdd1e5f2a67dc2bc1755a#code). * * @notice Yakuza 2033 * Telegram: t.me/yakuza2033 * Twitter: yakuza2033 * App: yakuza2033.com * * @author Shogun * Telegram: zeroXshogun * Web: coinlord.finance * * @custom:security-contact Telegram: zeroXshogun */ contract Yakuza2033 is IERC20, Permissions { using Address for address; address private _token; //// //// ERC20 //// string public name; string public symbol; uint8 public decimals; uint256 private _totalSupply; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; /// Emitted when new tokens are minted. event Mint(address indexed account, uint256 indexed amount); //// //// LP //// /// @dev Used for approval. IUniswapV2Router02 public router; /// @dev Used for transfer. address public pair; /// Prevents collision of multiple concurrent calls to swap and liquify. uint256 public swapAndLiquifyTrigger; bool private _inSwapAndLiquify; modifier lockTheSwap() { _inSwapAndLiquify = true; _; _inSwapAndLiquify = false; } /// Token and ETH added to LP. event SwapAndLiquify(uint256 tokenIntoLiquidity, uint256 ethIntoLiquidity); //// //// TOKENOMICS: LIMITS //// /// @dev Amount of tokens, in Wei. uint256 public maxTransfer; /// @dev Amount of tokens, in Wei. uint256 public maxWallet; address[] public maxExempt; mapping(address => bool) public _isMaxExempt; //// //// TOKENOMICS: FEES //// address[] public feePayers; mapping(address => bool) public isFeePayer; address[] public feeReceivers; mapping(address => uint8) private _feeReceiversAndRates; address public stablecoin; mapping(address => bool) public receivesStablecoin; //// //// WHITELIST //// bool public whitelistEnabled; mapping(address => uint256) public whitelistBalance; //// //// BLACKLIST //// address[] public blacklist; mapping(address => bool) public isBlacklisted; //// //// INIT //// /** * Deploy contract. */ constructor() { _token = address(this); // ERC20. name = "Yakuza2033"; symbol = "BUGS"; decimals = 18; _totalSupply = 10000000 * (10 ** decimals); // 10m // LP. router = IUniswapV2Router02(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506); // Arbitrum One SushiSwap router. // router = IUniswapV2Router02(0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506); // Goerli SushiSwap router. // router = IUniswapV2Router02(0xD99D1c33F9fC3444f8101754aBC46c52416550D1); // BSC Testnet Pancakeswap router. // router = IUniswapV2Router02(0xab7664500b19a7a2362Ab26081e6DfB971B6F1B0); // Arbitrum Goerli pair = IUniswapV2Factory(router.factory()).createPair( address(this), router.WETH() ); swapAndLiquifyTrigger = _totalSupply / 1000; // Tokenomics: limits. maxTransfer = _totalSupply / 100; maxWallet = _totalSupply / 100; // Tokenomics: fees. stablecoin = 0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8; // Arbitrum One USDC // stablecoin = 0x55a309598ABf543bF76FbB22859938ba2F29C2eA; // Goerli DAI // stablecoin = 0xeD24FC36d5Ee211Ea25A80239Fb8C4Cfd80f12Ee; // BSC Testnet BUSD // stablecoin = 0x42437026bD32BC07914dc1FB35B8009805277915; // Arbitrum Goerli // Whitelist. whitelistEnabled = true; // Initial mint. _balances[owner()] += _totalSupply; emit Transfer(address(0), owner(), _totalSupply); } //// //// ERC20 //// /** * Get current supply of tokens, in Wei. * * @return uint256 of _totalSupply. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * Get amount of tokens owned by `account`, in Wei. * * @param account as address to check. * @return uint256 as the amount of tokens. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * Standardized mint wrapper for App's yielding contracts. * * @dev id param is included so app contracts have consistent mint interface, * @dev regardless of whether minted token is ERC20 or ERC1155. * * @param to as the address to assign the tokens to. * @param id not applicable here, as ERC20 has no ID. * @param amount of tokens to mint. */ function mint(address to, uint256 id, uint256 amount) external onlyApp { _mint(to, amount); } /** * Mint `amount` of tokens to `account`. * * @param account as the address to assign the tokens to. * @param amount as the amount of tokens to create. */ function _mint(address account, uint256 amount) private { require(account != address(0), "Invalid account"); _totalSupply += amount; _balances[account] += amount; emit Mint(account, amount); emit Transfer(address(0), account, amount); } /** * Burn `amount` of `account`'s tokens. * * @dev Only authorized callers. * * @param account as the address to burn from. * @param amount of tokens to burn. */ function burn(address account, uint256 amount) external onlyApp { _burn(account, amount); } /** * Transfers `amount` of tokens from `account` to the zero address. * * @param account as the address to take the tokens from. * @param amount as the amount of tokens to burn. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "Invalid account"); require(_balances[account] >= amount, "Insufficient balance"); unchecked { _balances[account] -= amount; _totalSupply -= amount; } emit Transfer(account, address(0), amount); } //// //// ALLOWANCES //// /** * Get max amount of `owner` tokens that `spender` can move with transferFrom. * * @param owner as address of account owning tokens. * @param spender as address of account moving tokens. * * @return uint256 as max amount of tokens able to be transferred. */ function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } /** * Set max amount of caller's tokens that `spender` can move with transferFrom. * * @param spender as address of account moving tokens. * @param amount as the amount of tokens allowed to be transferred. * * @return bool on success. */ function approve(address spender, uint256 amount) public override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * Set max amount of `owner` tokens that `spender` can move with transferFrom. * * @param owner as address of token owner. * @param spender as address of account moving tokens. * @param amount as the amount of tokens allowed to be transferred. */ function _approve( address owner, address spender, uint256 amount ) internal { 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); } /** * Update `owner`'s allowance for `spender` based on spent `amount`. * * @dev Does not update the allowance amount in case of infinite allowance. * @dev Revert if not enough allowance is available. * * @param owner as address of token owner. * @param spender as address of account moving tokens. * @param amount as the amount of tokens allowed to be transferred. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } //// //// TRANSFERS //// /** * Transfer tokens from caller to `to`. * * @param to as address of receiver. * @param amount of tokens. * * @return bool on success. */ function transfer(address to, uint256 amount) public override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * Transfer `amount` of tokens from `from` to `to`. * * @dev `from` has to have approved caller to spend `amount`. * * @param from as address of sender. * @param to as address of receiver. * @param amount of tokens. * * @return bool on success. */ function transferFrom(address from, address to, uint256 amount) public override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * Determine the context of this transfer. * * @param from address of sender. * @param to address of receiver. * @param amount tokens being transferred. */ function _transfer(address from, address to, uint256 amount) private { require(from != address(0) && to != address(0), "Transfer with zero address"); require(amount <= _balances[from], "Insufficient funds"); require(!isBlacklisted[from] && !isBlacklisted[to], "Blacklisted account"); // Check max limits. if (!_isMaxExempt[from]) { // Non-exempt senders cannot send more than maxTransfer. require(amount <= maxTransfer, "Exceeds max tx"); } if (!_isMaxExempt[to]) { // Non-exempt receivers cannot exceed maxWallet if the sender is non-exempt too. require(_balances[to] + amount <= maxWallet, "Exceeds max wallet"); } // Check whitelist. if (whitelistEnabled) { require(from == pair, "Only LP can send during whitelist"); require(whitelistBalance[to] > 0, "No whitelist balance available"); whitelistBalance[to] -= amount; } // Check LP contribution. if (!_inSwapAndLiquify // Avoid circular liquidity event. && isFeePayer[to] // Only on token sales. && swapAndLiquifyTrigger > 0 // Swap and liquify enabled. && _balances[_token] >= swapAndLiquifyTrigger // Contract's balance of token > trigger. ) { _swapAndLiquify(swapAndLiquifyTrigger); } // Check fee requirement, then transfer. if (from != _token && (isFeePayer[from] || isFeePayer[to])) { _transferWithFees(from, to, amount); } else { _transferWithoutFees(from, to, amount); } } /** * Transfer tokens and take fees. * * @dev Balance changes are checked in _transfer. * * @param from address of sender. * @param to address of receiver. * @param amount of tokens being transferred. */ function _transferWithFees(address from, address to, uint256 amount) private { uint256 amountMinusFees = _takeFees(from, to, amount); unchecked { _balances[from] -= amountMinusFees; _balances[to] += amountMinusFees; } emit Transfer(from, to, amountMinusFees); } /** * Transfer tokens and don't take fees. * * @dev Balance changes are checked in _transfer. * * @param from address of sender. * @param to address of receivers. * @param amount of tokens being transferred. */ function _transferWithoutFees(address from, address to, uint256 amount) private { unchecked { _balances[from] -= amount; _balances[to] += amount; } emit Transfer(from, to, amount); } /** * Move fees from transferred amount to fee receivers. * * @param from address of sender. * @param to address of receiver. * @param amount quantity of tokens being transferred. * * @return uint256 amount to transfer after fees. */ function _takeFees(address from, address to, uint256 amount) private returns (uint256) { uint256 amountMinusFees = amount; uint256 feeReceiversLength = feeReceivers.length; for (uint8 i = 0; i < feeReceiversLength; i++) { uint256 fee = amount * _feeReceiversAndRates[feeReceivers[i]] / 100; amountMinusFees -= fee; _balances[from] -= fee; // Stablecoin receiver gets stablecoin on token sale. if (receivesStablecoin[feeReceivers[i]] && isFeePayer[to]) { uint256 eth = _swapTokenForETH(fee); _swapETHForToken(eth, stablecoin, feeReceivers[i]); } else { // Otherwise fee is in token. _balances[feeReceivers[i]] += fee; emit Transfer(from, feeReceivers[i], fee); } } return amountMinusFees; } //// //// LP //// /** * Add liquidity to the LP pool. * * @dev approve is called to ensure that the router is able to call transferFrom. * * @param tokenAmount quantity of token to transfer. * @param ethAmount quantity of ETH to transfer. */ function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { _approve(_token, address(router), tokenAmount); router.addLiquidityETH{value: ethAmount}( _token, // address token tokenAmount, // uint amountTokenDesired 0, // uint amountTokenMin 0, // uint amountETHMin owner(), // address to block.timestamp // uint deadline ); } /** * Set the quantity of token at which _swapAndLiquify should be called. * * @dev Disable swap and liquify by setting trigger to 0. * * @param trigger quantity of token at which to swap and liquify. */ function setSwapAndLiquifyTrigger(uint256 trigger) external onlyOwner { require(trigger > 0 && trigger < _totalSupply, "Set from 0 to totalSupply"); swapAndLiquifyTrigger = trigger; } /** * Sell half of the contract's token for ETH, and add both to the LP pool. * * @param amount of token to split, swap half of, and add to LP pool. */ function _swapAndLiquify(uint256 amount) private lockTheSwap { uint256 tokenHalf = amount / 2; uint256 ethHalf = amount - tokenHalf; uint256 ethReceived = _swapTokenForETH(ethHalf); _addLiquidity(tokenHalf, ethReceived); emit SwapAndLiquify(tokenHalf, ethReceived); } /** * Sell ETH to buy ERC20 token. * * @param ethAmount quantity of ETH to sell. * @param token address of token to buy. * @param receiver address to send the token to. */ function _swapETHForToken(uint256 ethAmount, address token, address receiver) private { address[] memory path = new address[](2); path[0] = router.WETH(); path[1] = token; router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}( 0, // uint amountOutMin path, // address[] path receiver, // address to block.timestamp + 300 // uint deadline ); } /** * Sell token to buy ETH. * * @param tokenAmount quantity of token to sell. * * @return uint256 amount of ETH from swap. */ function _swapTokenForETH(uint256 tokenAmount) private returns (uint256) { uint256 initBalance = _token.balance; address[] memory path = new address[](2); path[0] = _token; path[1] = router.WETH(); _approve(_token, address(router), tokenAmount); router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, // uint amountIn 0, // uint amountOutMin path, // address[] path _token, // address to block.timestamp // uint deadline ); return _token.balance - initBalance; } //// //// Tokenomics: limits //// /** * Set token transfer and ownership limits. * * @dev Set exemptions from these limits with setMaxLimitsExempt. * * @param maxTransfer_ max amount of transferrable tokens. * @param maxWallet_ max amount of tokens in an account. */ function setMaxLimits(uint256 maxTransfer_, uint256 maxWallet_) external onlyOwner { require( maxTransfer_ >= 0 && maxTransfer_ <= totalSupply() && maxWallet_ >= 0 && maxWallet_ <= totalSupply(), "Set from 0 to total supply." ); maxTransfer = maxTransfer_; maxWallet = maxWallet_; } /** * Set list of addresses exempt from the max transfer and wallet limits. * * @dev Overwrites existing exemptions. * * @param accounts list of exempt accounts. */ function setMaxLimitsExempt(address[] memory accounts) external onlyOwner { // Clear current exemptions mapping. for (uint8 i = 0; i < maxExempt.length; i++) _isMaxExempt[maxExempt[i]] = false; // Update exemptions list. maxExempt = accounts; // Set new exemptions mapping. for (uint8 i = 0; i < accounts.length; i++) _isMaxExempt[accounts[i]] = true; } //// //// Tokenomics: fees /// //// /** * Get the fee rate for a given fee receiver. * * @param receiver address of receiver to query. * * @return uint8 percent fee rate. */ function getFeeRate(address receiver) external view returns (uint8) { return _feeReceiversAndRates[receiver]; } /** * Set fee receivers and rates for fee-paying transfers. * * @dev Address at feeReceivers[i] receives rate at feeRates[i]). * @dev Overwrites existing fee receivers and rates. * * @param feeReceivers_ addresses of fee-receivers. * @param feeRates percent fees for each receiver. */ function setFeeReceiversAndRates(address payable[] memory feeReceivers_, uint8[] memory feeRates) external onlyOwner { require(feeReceivers_.length == feeRates.length, "Array lengths must match"); // Clear current receivers mapping. for (uint8 i = 0; i < feeReceivers.length; i++) _feeReceiversAndRates[feeReceivers[i]] = 0; // Update receivers list. feeReceivers = feeReceivers_; // Count new fees. uint8 totalFees = 0; // Set new receivers mapping. for (uint8 i = 0; i < feeReceivers_.length; i++) { require(feeReceivers_[i] != address(0), "Transfer to address(0)"); _feeReceiversAndRates[feeReceivers_[i]] = feeRates[i]; totalFees += feeRates[i]; } // Check validity of new fees. require(totalFees >= 0 && totalFees <= 100, "Set fees from 0 to 100"); } /** * Set ERC20 token to be used for stablecoin fee receivers. * * @param stablecoin_ address of ERC20 token. */ function setStablecoin(address stablecoin_) external onlyOwner { stablecoin = stablecoin_; } /** * Set whether an account should receive fees in stablecoins. * * @dev account must already be a fee receiver. * * @param account address of fee receiver. * @param _receivesStablecoin true for stablecoin, false for token. */ function setStablecoinReceiver(address account, bool _receivesStablecoin) external onlyOwner { require(_feeReceiversAndRates[account] != 0, "Not a fee receiver"); receivesStablecoin[account] = _receivesStablecoin; } /** * Set the fee payers. * * @dev Overwrites existing fee-payer list. * * @param accounts list of fee-paying addresses. */ function setFeePayers(address[] memory accounts) external onlyOwner { // Clear current payers mapping. for (uint8 i = 0; i < feePayers.length; i++) isFeePayer[feePayers[i]] = false; // Update payers list. feePayers = accounts; // Set new payers mapping. for (uint8 i = 0; i < accounts.length; i++) isFeePayer[accounts[i]] = true; } //// //// WHITELIST //// /** * Enable or disable whitelist check before allowing a transfer. */ function toggleWhitelist() external onlyOwner { whitelistEnabled = !whitelistEnabled; } /** * Toggle an account to the transfer whitelist. * * @param account as address. */ function addToWhitelist(address account) external onlyApp { whitelistBalance[account] = maxWallet; } //// //// BLACKLIST //// /** * Set list of accounts blocked from transfers. * @dev Overwrites existing blacklist. * @param accounts addresses to blacklist. */ function setBlacklist(address[] memory accounts) external onlyOwner { // Clear current blacklist mapping. for (uint8 i = 0; i < blacklist.length; i++) isBlacklisted[blacklist[i]] = false; // Update blacklist list. blacklist = accounts; // Set new blacklist mapping. for (uint8 i = 0; i < accounts.length; i++) isBlacklisted[accounts[i]] = true; } //// //// INTERNAL BALANCES //// /** * Fallback function. * * @dev Receives ETH from router when swapping. */ receive() external payable {} /** * Withdraw ETH to owner. * * @param amount quantity of ETH to withdraw. */ function recoverETH(uint256 amount) external payable onlyOwner { (bool success, ) = payable(owner()).call{value: amount}(''); require(success, 'Transfer failed.'); } /** * Withdraw ERC20 token to owner. * * @param token address of token to withdraw. * @param amount of tokens to withdraw. */ function recoverToken(address token, uint256 amount) external onlyOwner { IERC20(token).transfer(owner(), amount); } }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mint","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":"tokenIntoLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","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":[{"internalType":"address","name":"","type":"address"}],"name":"_isMaxExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"appAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"","type":"uint256"}],"name":"blacklist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feePayers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"feeReceivers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"getFeeRate","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeePayer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxExempt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"receivesStablecoin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"setBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"setFeePayers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"feeReceivers_","type":"address[]"},{"internalType":"uint8[]","name":"feeRates","type":"uint8[]"}],"name":"setFeeReceiversAndRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTransfer_","type":"uint256"},{"internalType":"uint256","name":"maxWallet_","type":"uint256"}],"name":"setMaxLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"setMaxLimitsExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"permitted","type":"bool"}],"name":"setPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stablecoin_","type":"address"}],"name":"setStablecoin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"_receivesStablecoin","type":"bool"}],"name":"setStablecoinReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"trigger","type":"uint256"}],"name":"setSwapAndLiquifyTrigger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stablecoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyTrigger","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001d3362000383565b600280546001600160a01b0319163017905560408051808201909152600a81526959616b757a613230333360b01b60208201526003906200005f908262000478565b50604080518082019091526004808252634255475360e01b60208301529062000089908262000478565b506005805460ff19166012908117909155620000a790600a62000659565b620000b6906298968062000671565b600655600980546001600160a01b031916731b02da8cb0d097eb8d57a175b88c7d8b479975069081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa1580156200011e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200014491906200068b565b6001600160a01b031663c9c6539630600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001cd91906200068b565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200021b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024191906200068b565b600a80546001600160a01b0319166001600160a01b039290921691909117905560065462000273906103e890620006b6565b600b556006546200028790606490620006b6565b600d556006546200029b90606490620006b6565b600e55601580546001600160a01b03191673ff970a61a04b1ca14834a43f5de4533ebddb5cc81790556017805460ff1916600117905560065460076000620002eb6000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002060008282546200031c9190620006d9565b90915550506000546001600160a01b03166001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6006546040516200037591815260200190565b60405180910390a3620006ef565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003fe57607f821691505b6020821081036200041f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200047357600081815260208120601f850160051c810160208610156200044e5750805b601f850160051c820191505b818110156200046f578281556001016200045a565b5050505b505050565b81516001600160401b03811115620004945762000494620003d3565b620004ac81620004a58454620003e9565b8462000425565b602080601f831160018114620004e45760008415620004cb5750858301515b600019600386901b1c1916600185901b1785556200046f565b600085815260208120601f198616915b828110156200051557888601518255948401946001909101908401620004f4565b5085821015620005345787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200059b5781600019048211156200057f576200057f62000544565b808516156200058d57918102915b93841c93908002906200055f565b509250929050565b600082620005b45750600162000653565b81620005c35750600062000653565b8160018114620005dc5760028114620005e75762000607565b600191505062000653565b60ff841115620005fb57620005fb62000544565b50506001821b62000653565b5060208310610133831016604e8410600b84101617156200062c575081810a62000653565b6200063883836200055a565b80600019048211156200064f576200064f62000544565b0290505b92915050565b60006200066a60ff841683620005a3565b9392505050565b808202811582820484141762000653576200065362000544565b6000602082840312156200069e57600080fd5b81516001600160a01b03811681146200066a57600080fd5b600082620006d457634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000653576200065362000544565b612ae680620006ff6000396000f3fe6080604052600436106102765760003560e01c806390de21041161014f578063e088bfc0116100c1578063f1178d171161007a578063f1178d1714610804578063f2fde38b14610824578063f679b3d614610844578063f887ea401461085a578063f8b45b051461087a578063fe575a871461089057600080fd5b8063e088bfc01461073e578063e43252d71461075e578063e770d1991461077e578063e9cbd822146107ae578063ec6263c0146107ce578063ed233ee9146107ee57600080fd5b8063a9059cbb11610113578063a9059cbb14610665578063b29a814014610685578063bf772491146106a5578063d3335553146106c5578063dd62ed3e146106d8578063e084a4b71461071e57600080fd5b806390de2104146105c057806395d89b41146105f05780639d913ef5146106055780639dc29fac14610625578063a8aa1b311461064557600080fd5b80634a7b9558116101e857806362d1ade8116101ac57806362d1ade8146104e957806370a0823114610509578063715018a61461053f5780637e15144b146105545780638198edbf146105695780638da5cb5b146105a257600080fd5b80634a7b95581461042f5780634d08f8011461045f5780634ffbfbe61461048f57806351fb012d146104af5780635b381760146104c957600080fd5b8063163d91981161023a578063163d91981461035757806318160ddd1461037757806323b872dd14610396578063313ce567146103b6578063368e1861146103e25780633b3d17091461040f57600080fd5b806306fdde0314610282578063095ea7b3146102ad5780630f2a0919146102dd578063156e29f614610315578063161bccc41461033757600080fd5b3661027d57005b600080fd5b34801561028e57600080fd5b506102976108c0565b6040516102a4919061242e565b60405180910390f35b3480156102b957600080fd5b506102cd6102c8366004612491565b61094e565b60405190151581526020016102a4565b3480156102e957600080fd5b506102fd6102f83660046124bd565b610968565b6040516001600160a01b0390911681526020016102a4565b34801561032157600080fd5b506103356103303660046124d6565b610992565b005b34801561034357600080fd5b506102fd6103523660046124bd565b6109df565b34801561036357600080fd5b50610335610372366004612519565b6109ef565b34801561038357600080fd5b506006545b6040519081526020016102a4565b3480156103a257600080fd5b506102cd6103b1366004612552565b610a81565b3480156103c257600080fd5b506005546103d09060ff1681565b60405160ff90911681526020016102a4565b3480156103ee57600080fd5b506103886103fd366004612593565b60186020526000908152604090205481565b34801561041b57600080fd5b5061033561042a3660046124bd565b610aa5565b34801561043b57600080fd5b506102cd61044a366004612593565b60106020526000908152604090205460ff1681565b34801561046b57600080fd5b506102cd61047a366004612593565b60166020526000908152604090205460ff1681565b34801561049b57600080fd5b506103356104aa366004612622565b610b0f565b3480156104bb57600080fd5b506017546102cd9060ff1681565b3480156104d557600080fd5b506102fd6104e43660046124bd565b610c10565b3480156104f557600080fd5b50610335610504366004612737565b610c20565b34801561051557600080fd5b50610388610524366004612593565b6001600160a01b031660009081526007602052604090205490565b34801561054b57600080fd5b50610335610e7b565b34801561056057600080fd5b50610335610e8f565b34801561057557600080fd5b506103d0610584366004612593565b6001600160a01b031660009081526014602052604090205460ff1690565b3480156105ae57600080fd5b506000546001600160a01b03166102fd565b3480156105cc57600080fd5b506102cd6105db366004612593565b60016020526000908152604090205460ff1681565b3480156105fc57600080fd5b50610297610eab565b34801561061157600080fd5b506103356106203660046127f9565b610eb8565b34801561063157600080fd5b50610335610640366004612491565b610f35565b34801561065157600080fd5b50600a546102fd906001600160a01b031681565b34801561067157600080fd5b506102cd610680366004612491565b610f74565b34801561069157600080fd5b506103356106a0366004612491565b610f82565b3480156106b157600080fd5b506103356106c0366004612622565b61101c565b6103356106d33660046124bd565b611119565b3480156106e457600080fd5b506103886106f336600461281b565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b34801561072a57600080fd5b506102fd6107393660046124bd565b6111b7565b34801561074a57600080fd5b50610335610759366004612593565b6111c7565b34801561076a57600080fd5b50610335610779366004612593565b6111f1565b34801561078a57600080fd5b506102cd610799366004612593565b60126020526000908152604090205460ff1681565b3480156107ba57600080fd5b506015546102fd906001600160a01b031681565b3480156107da57600080fd5b506103356107e9366004612519565b611245565b3480156107fa57600080fd5b50610388600d5481565b34801561081057600080fd5b5061033561081f366004612622565b611278565b34801561083057600080fd5b5061033561083f366004612593565b611375565b34801561085057600080fd5b50610388600b5481565b34801561086657600080fd5b506009546102fd906001600160a01b031681565b34801561088657600080fd5b50610388600e5481565b34801561089c57600080fd5b506102cd6108ab366004612593565b601a6020526000908152604090205460ff1681565b600380546108cd90612849565b80601f01602080910402602001604051908101604052809291908181526020018280546108f990612849565b80156109465780601f1061091b57610100808354040283529160200191610946565b820191906000526020600020905b81548152906001019060200180831161092957829003601f168201915b505050505081565b60003361095c8185856113ee565b60019150505b92915050565b6019818154811061097857600080fd5b6000918252602090912001546001600160a01b0316905081565b3360009081526001602081905260409091205460ff161515146109d05760405162461bcd60e51b81526004016109c790612883565b60405180910390fd5b6109da8382611513565b505050565b6011818154811061097857600080fd5b6109f7611609565b6001600160a01b03821660009081526014602052604081205460ff169003610a565760405162461bcd60e51b81526020600482015260126024820152712737ba1030903332b2903932b1b2b4bb32b960711b60448201526064016109c7565b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b600033610a8f858285611663565b610a9a8585856116f5565b506001949350505050565b610aad611609565b600081118015610abe575060065481105b610b0a5760405162461bcd60e51b815260206004820152601960248201527f5365742066726f6d203020746f20746f74616c537570706c790000000000000060448201526064016109c7565b600b55565b610b17611609565b60005b600f5460ff82161015610b8957600060106000600f8460ff1681548110610b4357610b436128b0565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191691151591909117905580610b81816128dc565b915050610b1a565b508051610b9d90600f9060208401906123b4565b5060005b81518160ff161015610c0c57600160106000848460ff1681518110610bc857610bc86128b0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610c04816128dc565b915050610ba1565b5050565b6013818154811061097857600080fd5b610c28611609565b8051825114610c795760405162461bcd60e51b815260206004820152601860248201527f4172726179206c656e67746873206d757374206d61746368000000000000000060448201526064016109c7565b60005b60135460ff82161015610cee5760006014600060138460ff1681548110610ca557610ca56128b0565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff191660ff9290921691909117905580610ce6816128dc565b915050610c7c565b508151610d029060139060208501906123b4565b506000805b83518160ff161015610e2d5760006001600160a01b0316848260ff1681518110610d3357610d336128b0565b60200260200101516001600160a01b031603610d8a5760405162461bcd60e51b81526020600482015260166024820152755472616e7366657220746f206164647265737328302960501b60448201526064016109c7565b828160ff1681518110610d9f57610d9f6128b0565b602002602001015160146000868460ff1681518110610dc057610dc06128b0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191660ff928316179055835184918316908110610e0657610e066128b0565b602002602001015182610e1991906128fb565b915080610e25816128dc565b915050610d07565b5060648160ff1611156109da5760405162461bcd60e51b8152602060048201526016602482015275053657420666565732066726f6d203020746f203130360541b60448201526064016109c7565b610e83611609565b610e8d6000611b18565b565b610e97611609565b6017805460ff19811660ff90911615179055565b600480546108cd90612849565b610ec0611609565b6006548211158015610ed0575060015b8015610ede57506006548111155b610f2a5760405162461bcd60e51b815260206004820152601b60248201527f5365742066726f6d203020746f20746f74616c20737570706c792e000000000060448201526064016109c7565b600d91909155600e55565b3360009081526001602081905260409091205460ff16151514610f6a5760405162461bcd60e51b81526004016109c790612883565b610c0c8282611b68565b60003361095c8185856116f5565b610f8a611609565b816001600160a01b031663a9059cbb610fab6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610ff8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109da9190612914565b611024611609565b60005b60195460ff82161015611096576000601a600060198460ff1681548110611050576110506128b0565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff19169115159190911790558061108e816128dc565b915050611027565b5080516110aa9060199060208401906123b4565b5060005b81518160ff161015610c0c576001601a6000848460ff16815181106110d5576110d56128b0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611111816128dc565b9150506110ae565b611121611609565b600080546040516001600160a01b039091169083908381818185875af1925050503d806000811461116e576040519150601f19603f3d011682016040523d82523d6000602084013e611173565b606091505b5050905080610c0c5760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016109c7565b600f818154811061097857600080fd5b6111cf611609565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526001602081905260409091205460ff161515146112265760405162461bcd60e51b81526004016109c790612883565b600e546001600160a01b03909116600090815260186020526040902055565b61124d611609565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b611280611609565b60005b60115460ff821610156112f25760006012600060118460ff16815481106112ac576112ac6128b0565b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055806112ea816128dc565b915050611283565b5080516113069060119060208401906123b4565b5060005b81518160ff161015610c0c57600160126000848460ff1681518110611331576113316128b0565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061136d816128dc565b91505061130a565b61137d611609565b6001600160a01b0381166113e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109c7565b6113eb81611b18565b50565b6001600160a01b0383166114505760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016109c7565b6001600160a01b0382166114b15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016109c7565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03821661155b5760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081858d8dbdd5b9d608a1b60448201526064016109c7565b806006600082825461156d9190612931565b90915550506001600160a01b0382166000908152600760205260408120805483929061159a908490612931565b909155505060405181906001600160a01b038416907f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688590600090a36040518181526001600160a01b03831690600090600080516020612a91833981519152906020015b60405180910390a35050565b6000546001600160a01b03163314610e8d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c7565b6001600160a01b0383811660009081526008602090815260408083209386168352929052205460001981146116ef57818110156116e25760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016109c7565b6116ef84848484036113ee565b50505050565b6001600160a01b0383161580159061171557506001600160a01b03821615155b6117615760405162461bcd60e51b815260206004820152601a60248201527f5472616e736665722077697468207a65726f206164647265737300000000000060448201526064016109c7565b6001600160a01b0383166000908152600760205260409020548111156117be5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b60448201526064016109c7565b6001600160a01b0383166000908152601a602052604090205460ff1615801561180057506001600160a01b0382166000908152601a602052604090205460ff16155b6118425760405162461bcd60e51b8152602060048201526013602482015272109b1858dadb1a5cdd1959081858d8dbdd5b9d606a1b60448201526064016109c7565b6001600160a01b03831660009081526010602052604090205460ff166118a557600d548111156118a55760405162461bcd60e51b815260206004820152600e60248201526d08af0c6cacac8e640dac2f040e8f60931b60448201526064016109c7565b6001600160a01b03821660009081526010602052604090205460ff1661192f57600e546001600160a01b0383166000908152600760205260409020546118ec908390612931565b111561192f5760405162461bcd60e51b8152602060048201526012602482015271115e18d959591cc81b585e081dd85b1b195d60721b60448201526064016109c7565b60175460ff1615611a3457600a546001600160a01b038481169116146119a15760405162461bcd60e51b815260206004820152602160248201527f4f6e6c79204c502063616e2073656e6420647572696e672077686974656c69736044820152601d60fa1b60648201526084016109c7565b6001600160a01b038216600090815260186020526040902054611a065760405162461bcd60e51b815260206004820152601e60248201527f4e6f2077686974656c6973742062616c616e636520617661696c61626c65000060448201526064016109c7565b6001600160a01b03821660009081526018602052604081208054839290611a2e908490612944565b90915550505b600c5460ff16158015611a5f57506001600160a01b03821660009081526012602052604090205460ff165b8015611a6d57506000600b54115b8015611a955750600b546002546001600160a01b031660009081526007602052604090205410155b15611aa557611aa5600b54611c57565b6002546001600160a01b03848116911614801590611afd57506001600160a01b03831660009081526012602052604090205460ff1680611afd57506001600160a01b03821660009081526012602052604090205460ff165b15611b0d576109da838383611ce1565b6109da838383611d51565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216611bb05760405162461bcd60e51b815260206004820152600f60248201526e125b9d985b1a59081858d8dbdd5b9d608a1b60448201526064016109c7565b6001600160a01b038216600090815260076020526040902054811115611c0f5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016109c7565b6001600160a01b03821660008181526007602090815260408083208054869003905560068054869003905551848152919291600080516020612a9183398151915291016115fd565b600c805460ff191660011790556000611c71600283612957565b90506000611c7f8284612944565b90506000611c8c82611da1565b9050611c988382611f3d565b60408051848152602081018390527f28fc98272ce761178794ad6768050fea1648e07f1e2ffe15afd3a290f8381486910160405180910390a15050600c805460ff191690555050565b6000611cee84848461201f565b6001600160a01b03808616600081815260076020526040808220805486900390559287168082529083902080548501905591519293509091600080516020612a9183398151915290611d439085815260200190565b60405180910390a350505050565b6001600160a01b0380841660008181526007602052604080822080548690039055928516808252908390208054850190559151600080516020612a91833981519152906115069085815260200190565b60028054604080518381526060810182526000936001600160a01b0390931631928492602083019080368337505060025482519293506001600160a01b031691839150600090611df357611df36128b0565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611e4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e709190612979565b81600181518110611e8357611e836128b0565b6001600160a01b039283166020918202929092010152600254600954611eae929182169116866113ee565b60095460025460405163791ac94760e01b81526001600160a01b039283169263791ac94792611eeb928992600092889291169042906004016129da565b600060405180830381600087803b158015611f0557600080fd5b505af1158015611f19573d6000803e3d6000fd5b5050600254611f3592508491506001600160a01b031631612944565b949350505050565b600254600954611f5a916001600160a01b039081169116846113ee565b6009546002546001600160a01b039182169163f305d7199184911685600080611f8b6000546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015611ff3573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906120189190612a16565b5050505050565b6013546000908290825b818160ff16101561224d57600060646014600060138560ff1681548110612052576120526128b0565b60009182526020808320909101546001600160a01b031683528201929092526040019020546120849060ff1688612a44565b61208e9190612957565b905061209a8185612944565b6001600160a01b0389166000908152600760205260408120805492965083929091906120c7908490612944565b925050819055506016600060138460ff16815481106120e8576120e86128b0565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16801561213457506001600160a01b03871660009081526012602052604090205460ff165b1561219257600061214482611da1565b6015546013805492935061218c9284926001600160a01b0316919060ff8816908110612172576121726128b0565b6000918252602090912001546001600160a01b0316612258565b5061223a565b806007600060138560ff16815481106121ad576121ad6128b0565b60009182526020808320909101546001600160a01b03168352820192909252604001812080549091906121e1908490612931565b90915550506013805460ff84169081106121fd576121fd6128b0565b600091825260209182902001546040518381526001600160a01b0391821692918b1691600080516020612a91833981519152910160405180910390a35b5080612245816128dc565b915050612029565b509095945050505050565b6040805160028082526060820183526000926020830190803683375050600954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156122c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e69190612979565b816000815181106122f9576122f96128b0565b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061232d5761232d6128b0565b6001600160a01b0392831660209182029290920101526009541663b6f9de95856000848661235d4261012c612931565b6040518663ffffffff1660e01b815260040161237c9493929190612a5b565b6000604051808303818588803b15801561239557600080fd5b505af11580156123a9573d6000803e3d6000fd5b505050505050505050565b828054828255906000526020600020908101928215612409579160200282015b8281111561240957825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906123d4565b50612415929150612419565b5090565b5b80821115612415576000815560010161241a565b600060208083528351808285015260005b8181101561245b5785810183015185820160400152820161243f565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146113eb57600080fd5b600080604083850312156124a457600080fd5b82356124af8161247c565b946020939093013593505050565b6000602082840312156124cf57600080fd5b5035919050565b6000806000606084860312156124eb57600080fd5b83356124f68161247c565b95602085013595506040909401359392505050565b80151581146113eb57600080fd5b6000806040838503121561252c57600080fd5b82356125378161247c565b915060208301356125478161250b565b809150509250929050565b60008060006060848603121561256757600080fd5b83356125728161247c565b925060208401356125828161247c565b929592945050506040919091013590565b6000602082840312156125a557600080fd5b81356125b08161247c565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156125f6576125f66125b7565b604052919050565b600067ffffffffffffffff821115612618576126186125b7565b5060051b60200190565b6000602080838503121561263557600080fd5b823567ffffffffffffffff81111561264c57600080fd5b8301601f8101851361265d57600080fd5b803561267061266b826125fe565b6125cd565b81815260059190911b8201830190838101908783111561268f57600080fd5b928401925b828410156126b65783356126a78161247c565b82529284019290840190612694565b979650505050505050565b600082601f8301126126d257600080fd5b813560206126e261266b836125fe565b82815260059290921b8401810191818101908684111561270157600080fd5b8286015b8481101561272c57803560ff8116811461271f5760008081fd5b8352918301918301612705565b509695505050505050565b6000806040838503121561274a57600080fd5b823567ffffffffffffffff8082111561276257600080fd5b818501915085601f83011261277657600080fd5b8135602061278661266b836125fe565b82815260059290921b840181019181810190898411156127a557600080fd5b948201945b838610156127cc5785356127bd8161247c565b825294820194908201906127aa565b965050860135925050808211156127e257600080fd5b506127ef858286016126c1565b9150509250929050565b6000806040838503121561280c57600080fd5b50508035926020909101359150565b6000806040838503121561282e57600080fd5b82356128398161247c565b915060208301356125478161247c565b600181811c9082168061285d57607f821691505b60208210810361287d57634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526013908201527221b0b63632b91034b9903737ba1030b236b4b760691b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060ff821660ff81036128f2576128f26128c6565b60010192915050565b60ff8181168382160190811115610962576109626128c6565b60006020828403121561292657600080fd5b81516125b08161250b565b80820180821115610962576109626128c6565b81810381811115610962576109626128c6565b60008261297457634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561298b57600080fd5b81516125b08161247c565b600081518084526020808501945080840160005b838110156129cf5781516001600160a01b0316875295820195908201906001016129aa565b509495945050505050565b85815284602082015260a0604082015260006129f960a0830186612996565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215612a2b57600080fd5b8351925060208401519150604084015190509250925092565b8082028115828204841417610962576109626128c6565b848152608060208201526000612a746080830186612996565b6001600160a01b0394909416604083015250606001529291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220b781a2f05055a641d602336f657efc0fd5a802c9321add98dc8440ade75f9b1964736f6c63430008110033
Deployed ByteCode Sourcemap
27691:23423:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27844:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34609:193;;;;;;;;;;-1:-1:-1;34609:193:0;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;34609:193:0;1023:187:1;29557:26:0;;;;;;;;;;-1:-1:-1;29557:26:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1564:32:1;;;1546:51;;1534:2;1519:18;29557:26:0;1400:203:1;32272:130:0;;;;;;;;;;-1:-1:-1;32272:130:0;;;;;:::i;:::-;;:::i;:::-;;29103:26;;;;;;;;;;-1:-1:-1;29103:26:0;;;;;:::i;:::-;;:::i;48368:238::-;;;;;;;;;;-1:-1:-1;48368:238:0;;;;;:::i;:::-;;:::i;31453:100::-;;;;;;;;;;-1:-1:-1;31533:12:0;;31453:100;;;2652:25:1;;;2640:2;2625:18;31453:100:0;2506:177:1;37108:253:0;;;;;;;;;;-1:-1:-1;37108:253:0;;;;;:::i;:::-;;:::i;27898:21::-;;;;;;;;;;-1:-1:-1;27898:21:0;;;;;;;;;;;3321:4:1;3309:17;;;3291:36;;3279:2;3264:18;27898:21:0;3149:184:1;29455:51:0;;;;;;;;;;-1:-1:-1;29455:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;42617:206;;;;;;;;;;-1:-1:-1;42617:206:0;;;;;:::i;:::-;;:::i;29001:44::-;;;;;;;;;;-1:-1:-1;29001:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29319:50;;;;;;;;;;-1:-1:-1;29319:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45760:438;;;;;;;;;;-1:-1:-1;45760:438:0;;;;;:::i;:::-;;:::i;29420:28::-;;;;;;;;;;-1:-1:-1;29420:28:0;;;;;;;;29187:29;;;;;;;;;;-1:-1:-1;29187:29:0;;;;;:::i;:::-;;:::i;46909:920::-;;;;;;;;;;-1:-1:-1;46909:920:0;;;;;:::i;:::-;;:::i;31737:119::-;;;;;;;;;;-1:-1:-1;31737:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;31830:18:0;31803:7;31830:18;;;:9;:18;;;;;;;31737:119;3268:103;;;;;;;;;;;;;:::i;49333:101::-;;;;;;;;;;;;;:::i;46438:125::-;;;;;;;;;;-1:-1:-1;46438:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;46524:31:0;46499:5;46524:31;;;:21;:31;;;;;;;;;46438:125;2620:87;;;;;;;;;;-1:-1:-1;2666:7:0;2693:6;-1:-1:-1;;;;;2693:6:0;2620:87;;26782:44;;;;;;;;;;-1:-1:-1;26782:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27869:20;;;;;;;;;;;;;:::i;45158:388::-;;;;;;;;;;-1:-1:-1;45158:388:0;;;;;:::i;:::-;;:::i;33110:105::-;;;;;;;;;;-1:-1:-1;33110:105:0;;;;;:::i;:::-;;:::i;28344:19::-;;;;;;;;;;-1:-1:-1;28344:19:0;;;;-1:-1:-1;;;;;28344:19:0;;;36599:185;;;;;;;;;;-1:-1:-1;36599:185:0;;;;;:::i;:::-;;:::i;50981:130::-;;;;;;;;;;-1:-1:-1;50981:130:0;;;;;:::i;:::-;;:::i;49884:431::-;;;;;;;;;;-1:-1:-1;49884:431:0;;;;;:::i;:::-;;:::i;50624:188::-;;;;;;:::i;:::-;;:::i;34173:143::-;;;;;;;;;;-1:-1:-1;34173:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;34281:18:0;;;34254:7;34281:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;34173:143;28968:26;;;;;;;;;;-1:-1:-1;28968:26:0;;;;;:::i;:::-;;:::i;47979:106::-;;;;;;;;;;-1:-1:-1;47979:106:0;;;;;:::i;:::-;;:::i;49557:114::-;;;;;;;;;;-1:-1:-1;49557:114:0;;;;;:::i;:::-;;:::i;29136:42::-;;;;;;;;;;-1:-1:-1;29136:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29287:25;;;;;;;;;;-1:-1:-1;29287:25:0;;;;-1:-1:-1;;;;;29287:25:0;;;26983:150;;;;;;;;;;-1:-1:-1;26983:150:0;;;;;:::i;:::-;;:::i;28862:26::-;;;;;;;;;;;;;;;;48779:416;;;;;;;;;;-1:-1:-1;48779:416:0;;;;;:::i;:::-;;:::i;3526:201::-;;;;;;;;;;-1:-1:-1;3526:201:0;;;;;:::i;:::-;;:::i;28450:36::-;;;;;;;;;;;;;;;;28272:32;;;;;;;;;;-1:-1:-1;28272:32:0;;;;-1:-1:-1;;;;;28272:32:0;;;28935:24;;;;;;;;;;;;;;;;29590:45;;;;;;;;;;-1:-1:-1;29590:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;27844:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34609:193::-;34684:4;1278:10;34740:32;1278:10;34756:7;34765:6;34740:8;:32::i;:::-;34790:4;34783:11;;;34609:193;;;;;:::o;29557:26::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29557:26:0;;-1:-1:-1;29557:26:0;:::o;32272:130::-;1278:10;26873:26;;;;:12;:26;;;;;;;;;;;:34;;;26865:66;;;;-1:-1:-1;;;26865:66:0;;;;;;;:::i;:::-;;;;;;;;;32377:17:::1;32383:2;32387:6;32377:5;:17::i;:::-;32272:130:::0;;;:::o;29103:26::-;;;;;;;;;;;;48368:238;2506:13;:11;:13::i;:::-;-1:-1:-1;;;;;48480:30:0;::::1;;::::0;;;:21:::1;:30;::::0;;;;;::::1;;:35:::0;;48472:66:::1;;;::::0;-1:-1:-1;;;48472:66:0;;9034:2:1;48472:66:0::1;::::0;::::1;9016:21:1::0;9073:2;9053:18;;;9046:30;-1:-1:-1;;;9092:18:1;;;9085:48;9150:18;;48472:66:0::1;8832:342:1::0;48472:66:0::1;-1:-1:-1::0;;;;;48549:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:49;;-1:-1:-1;;48549:49:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48368:238::o;37108:253::-;37197:4;1278:10;37255:38;37271:4;1278:10;37286:6;37255:15;:38::i;:::-;37304:27;37314:4;37320:2;37324:6;37304:9;:27::i;:::-;-1:-1:-1;37349:4:0;;37108:253;-1:-1:-1;;;;37108:253:0:o;42617:206::-;2506:13;:11;:13::i;:::-;42716:1:::1;42706:7;:11;:37;;;;;42731:12;;42721:7;:22;42706:37;42698:75;;;::::0;-1:-1:-1;;;42698:75:0;;9381:2:1;42698:75:0::1;::::0;::::1;9363:21:1::0;9420:2;9400:18;;;9393:30;9459:27;9439:18;;;9432:55;9504:18;;42698:75:0::1;9179:349:1::0;42698:75:0::1;42784:21;:31:::0;42617:206::o;45760:438::-;2506:13;:11;:13::i;:::-;45896:7:::1;45891:92;45913:9;:16:::0;45909:20:::1;::::0;::::1;;45891:92;;;45978:5;45949:12;:26;45962:9;45972:1;45962:12;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;45962:12:0::1;45949:26:::0;;;::::1;::::0;;;;;;;;:34;;-1:-1:-1;;45949:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45931:3;::::1;::::0;::::1;:::i;:::-;;;;45891:92;;;-1:-1:-1::0;46030:20:0;;::::1;::::0;:9:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;46106:7;46101:89;46123:8;:15;46119:1;:19;;;46101:89;;;46186:4;46158:12;:25;46171:8;46180:1;46171:11;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;46158:25:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;46158:25:0;:32;;-1:-1:-1;;46158:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46140:3;::::1;::::0;::::1;:::i;:::-;;;;46101:89;;;;45760:438:::0;:::o;29187:29::-;;;;;;;;;;;;46909:920;2506:13;:11;:13::i;:::-;47069:8:::1;:15;47045:13;:20;:39;47037:76;;;::::0;-1:-1:-1;;;47037:76:0;;10179:2:1;47037:76:0::1;::::0;::::1;10161:21:1::0;10218:2;10198:18;;;10191:30;10257:26;10237:18;;;10230:54;10301:18;;47037:76:0::1;9977:348:1::0;47037:76:0::1;47174:7;47169:103;47191:12;:19:::0;47187:23:::1;::::0;::::1;;47169:103;;;47271:1;47230:21;:38;47252:12;47265:1;47252:15;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;47252:15:0::1;47230:38:::0;;;::::1;::::0;;;;;;;;:42;;-1:-1:-1;;47230:42:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;47212:3;::::1;::::0;::::1;:::i;:::-;;;;47169:103;;;-1:-1:-1::0;47318:28:0;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;;47385:15;47459:7:::0;47454:248:::1;47476:13;:20;47472:1;:24;;;47454:248;;;47554:1;-1:-1:-1::0;;;;;47526:30:0::1;:13;47540:1;47526:16;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;47526:30:0::1;::::0;47518:65:::1;;;::::0;-1:-1:-1;;;47518:65:0;;10532:2:1;47518:65:0::1;::::0;::::1;10514:21:1::0;10571:2;10551:18;;;10544:30;-1:-1:-1;;;10590:18:1;;;10583:52;10652:18;;47518:65:0::1;10330:346:1::0;47518:65:0::1;47640:8;47649:1;47640:11;;;;;;;;;;:::i;:::-;;;;;;;47598:21;:39;47620:13;47634:1;47620:16;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;47598:39:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;47598:39:0;:53;;-1:-1:-1;;47598:53:0::1;;::::0;;::::1;;::::0;;47679:11;;;;;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;47666:24;;;;;:::i;:::-;::::0;-1:-1:-1;47498:3:0;::::1;::::0;::::1;:::i;:::-;;;;47454:248;;;-1:-1:-1::0;47791:3:0::1;47778:9;:16;;;;47752:69;;;::::0;-1:-1:-1;;;47752:69:0;;11036:2:1;47752:69:0::1;::::0;::::1;11018:21:1::0;11075:2;11055:18;;;11048:30;-1:-1:-1;;;11094:18:1;;;11087:52;11156:18;;47752:69:0::1;10834:346:1::0;3268:103:0;2506:13;:11;:13::i;:::-;3333:30:::1;3360:1;3333:18;:30::i;:::-;3268:103::o:0;49333:101::-;2506:13;:11;:13::i;:::-;49410:16:::1;::::0;;-1:-1:-1;;49390:36:0;::::1;49410:16;::::0;;::::1;49409:17;49390:36;::::0;;49333:101::o;27869:20::-;;;;;;;:::i;45158:388::-;2506:13;:11;:13::i;:::-;31533:12;;45308::::1;:29;;45274:95;;;;-1:-1:-1::0;45354:15:0;45274:95:::1;:139;;;;-1:-1:-1::0;31533:12:0;;45386:10:::1;:27;;45274:139;45252:216;;;::::0;-1:-1:-1;;;45252:216:0;;11387:2:1;45252:216:0::1;::::0;::::1;11369:21:1::0;11426:2;11406:18;;;11399:30;11465:29;11445:18;;;11438:57;11512:18;;45252:216:0::1;11185:351:1::0;45252:216:0::1;45479:11;:26:::0;;;;45516:9:::1;:22:::0;45158:388::o;33110:105::-;1278:10;26873:26;;;;:12;:26;;;;;;;;;;;:34;;;26865:66;;;;-1:-1:-1;;;26865:66:0;;;;;;;:::i;:::-;33185:22:::1;33191:7;33200:6;33185:5;:22::i;36599:185::-:0;36670:4;1278:10;36726:28;1278:10;36743:2;36747:6;36726:9;:28::i;50981:130::-;2506:13;:11;:13::i;:::-;51071:5:::1;-1:-1:-1::0;;;;;51064:22:0::1;;51087:7;2666::::0;2693:6;-1:-1:-1;;;;;2693:6:0;;2620:87;51087:7:::1;51064:39;::::0;-1:-1:-1;;;;;;51064:39:0::1;::::0;;;;;;-1:-1:-1;;;;;11733:32:1;;;51064:39:0::1;::::0;::::1;11715:51:1::0;11782:18;;;11775:34;;;11688:18;;51064:39:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49884:431::-:0;2506:13;:11;:13::i;:::-;50013:7:::1;50008:93;50030:9;:16:::0;50026:20:::1;::::0;::::1;;50008:93;;;50096:5;50066:13;:27;50080:9;50090:1;50080:12;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;50080:12:0::1;50066:27:::0;;;::::1;::::0;;;;;;;;:35;;-1:-1:-1;;50066:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50048:3;::::1;::::0;::::1;:::i;:::-;;;;50008:93;;;-1:-1:-1::0;50147:20:0;;::::1;::::0;:9:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;50222:7;50217:90;50239:8;:15;50235:1;:19;;;50217:90;;;50303:4;50274:13;:26;50288:8;50297:1;50288:11;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;50274:26:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;50274:26:0;:33;;-1:-1:-1;;50274:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50256:3;::::1;::::0;::::1;:::i;:::-;;;;50217:90;;50624:188:::0;2506:13;:11;:13::i;:::-;50699:12:::1;2693:6:::0;;50717:40:::1;::::0;-1:-1:-1;;;;;2693:6:0;;;;50746;;50699:12;50717:40;50699:12;50717:40;50746:6;2693;50717:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50698:59;;;50776:7;50768:36;;;::::0;-1:-1:-1;;;50768:36:0;;12482:2:1;50768:36:0::1;::::0;::::1;12464:21:1::0;12521:2;12501:18;;;12494:30;-1:-1:-1;;;12540:18:1;;;12533:46;12596:18;;50768:36:0::1;12280:340:1::0;28968:26:0;;;;;;;;;;;;47979:106;2506:13;:11;:13::i;:::-;48053:10:::1;:24:::0;;-1:-1:-1;;;;;;48053:24:0::1;-1:-1:-1::0;;;;;48053:24:0;;;::::1;::::0;;;::::1;::::0;;47979:106::o;49557:114::-;1278:10;26873:26;;;;:12;:26;;;;;;;;;;;:34;;;26865:66;;;;-1:-1:-1;;;26865:66:0;;;;;;;:::i;:::-;49654:9:::1;::::0;-1:-1:-1;;;;;49626:25:0;;::::1;;::::0;;;:16:::1;:25;::::0;;;;:37;49557:114::o;26983:150::-;2506:13;:11;:13::i;:::-;-1:-1:-1;;;;;27092:21:0;;;::::1;;::::0;;;:12:::1;:21;::::0;;;;:33;;-1:-1:-1;;27092:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26983:150::o;48779:416::-;2506:13;:11;:13::i;:::-;48905:7:::1;48900:90;48922:9;:16:::0;48918:20:::1;::::0;::::1;;48900:90;;;48985:5;48958:10;:24;48969:9;48979:1;48969:12;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;48969:12:0::1;48958:24:::0;;;::::1;::::0;;;;;;;;:32;;-1:-1:-1;;48958:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48940:3;::::1;::::0;::::1;:::i;:::-;;;;48900:90;;;-1:-1:-1::0;49033:20:0;;::::1;::::0;:9:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;49105:7;49100:87;49122:8;:15;49118:1;:19;;;49100:87;;;49183:4;49157:10;:23;49168:8;49177:1;49168:11;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;49157:23:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;49157:23:0;:30;;-1:-1:-1;;49157:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;49139:3;::::1;::::0;::::1;:::i;:::-;;;;49100:87;;3526:201:::0;2506:13;:11;:13::i;:::-;-1:-1:-1;;;;;3615:22:0;::::1;3607:73;;;::::0;-1:-1:-1;;;3607:73:0;;12827:2:1;3607:73:0::1;::::0;::::1;12809:21:1::0;12866:2;12846:18;;;12839:30;12905:34;12885:18;;;12878:62;-1:-1:-1;;;12956:18:1;;;12949:36;13002:19;;3607:73:0::1;12625:402:1::0;3607:73:0::1;3691:28;3710:8;3691:18;:28::i;:::-;3526:201:::0;:::o;35101:372::-;-1:-1:-1;;;;;35229:19:0;;35221:68;;;;-1:-1:-1;;;35221:68:0;;13234:2:1;35221:68:0;;;13216:21:1;13273:2;13253:18;;;13246:30;13312:34;13292:18;;;13285:62;-1:-1:-1;;;13363:18:1;;;13356:34;13407:19;;35221:68:0;13032:400:1;35221:68:0;-1:-1:-1;;;;;35308:21:0;;35300:68;;;;-1:-1:-1;;;35300:68:0;;13639:2:1;35300:68:0;;;13621:21:1;13678:2;13658:18;;;13651:30;13717:34;13697:18;;;13690:62;-1:-1:-1;;;13768:18:1;;;13761:32;13810:19;;35300:68:0;13437:398:1;35300:68:0;-1:-1:-1;;;;;35381:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;35433:32;;2652:25:1;;;35433:32:0;;2625:18:1;35433:32:0;;;;;;;;35101:372;;;:::o;32602:290::-;-1:-1:-1;;;;;32677:21:0;;32669:49;;;;-1:-1:-1;;;32669:49:0;;14042:2:1;32669:49:0;;;14024:21:1;14081:2;14061:18;;;14054:30;-1:-1:-1;;;14100:18:1;;;14093:45;14155:18;;32669:49:0;13840:339:1;32669:49:0;32747:6;32731:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;32764:18:0;;;;;;:9;:18;;;;;:28;;32786:6;;32764:18;:28;;32786:6;;32764:28;:::i;:::-;;;;-1:-1:-1;;32810:21:0;;32824:6;;-1:-1:-1;;;;;32810:21:0;;;;;;;;32847:37;;2652:25:1;;;-1:-1:-1;;;;;32847:37:0;;;32864:1;;-1:-1:-1;;;;;;;;;;;32847:37:0;2640:2:1;2625:18;32847:37:0;;;;;;;;32602:290;;:::o;2785:132::-;2666:7;2693:6;-1:-1:-1;;;;;2693:6:0;1278:10;2849:23;2841:68;;;;-1:-1:-1;;;2841:68:0;;14516:2:1;2841:68:0;;;14498:21:1;;;14535:18;;;14528:30;14594:34;14574:18;;;14567:62;14646:18;;2841:68:0;14314:356:1;35909:453:0;-1:-1:-1;;;;;34281:18:0;;;36044:24;34281:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;36111:37:0;;36107:248;;36193:6;36173:16;:26;;36165:68;;;;-1:-1:-1;;;36165:68:0;;14877:2:1;36165:68:0;;;14859:21:1;14916:2;14896:18;;;14889:30;14955:31;14935:18;;;14928:59;15004:18;;36165:68:0;14675:353:1;36165:68:0;36277:51;36286:5;36293:7;36321:6;36302:16;:25;36277:8;:51::i;:::-;36033:329;35909:453;;;:::o;37569:1670::-;-1:-1:-1;;;;;37657:18:0;;;;;;:38;;-1:-1:-1;;;;;;37679:16:0;;;;37657:38;37649:77;;;;-1:-1:-1;;;37649:77:0;;15235:2:1;37649:77:0;;;15217:21:1;15274:2;15254:18;;;15247:30;15313:28;15293:18;;;15286:56;15359:18;;37649:77:0;15033:350:1;37649:77:0;-1:-1:-1;;;;;37755:15:0;;;;;;:9;:15;;;;;;37745:25;;;37737:56;;;;-1:-1:-1;;;37737:56:0;;15590:2:1;37737:56:0;;;15572:21:1;15629:2;15609:18;;;15602:30;-1:-1:-1;;;15648:18:1;;;15641:48;15706:18;;37737:56:0;15388:342:1;37737:56:0;-1:-1:-1;;;;;37813:19:0;;;;;;:13;:19;;;;;;;;37812:20;:42;;;;-1:-1:-1;;;;;;37837:17:0;;;;;;:13;:17;;;;;;;;37836:18;37812:42;37804:74;;;;-1:-1:-1;;;37804:74:0;;15937:2:1;37804:74:0;;;15919:21:1;15976:2;15956:18;;;15949:30;-1:-1:-1;;;15995:18:1;;;15988:49;16054:18;;37804:74:0;15735:343:1;37804:74:0;-1:-1:-1;;;;;37926:18:0;;;;;;:12;:18;;;;;;;;37921:157;;38036:11;;38026:6;:21;;38018:48;;;;-1:-1:-1;;;38018:48:0;;16285:2:1;38018:48:0;;;16267:21:1;16324:2;16304:18;;;16297:30;-1:-1:-1;;;16343:18:1;;;16336:44;16397:18;;38018:48:0;16083:338:1;38018:48:0;-1:-1:-1;;;;;38093:16:0;;;;;;:12;:16;;;;;;;;38088:197;;38241:9;;-1:-1:-1;;;;;38215:13:0;;;;;;:9;:13;;;;;;:22;;38231:6;;38215:22;:::i;:::-;:35;;38207:66;;;;-1:-1:-1;;;38207:66:0;;16628:2:1;38207:66:0;;;16610:21:1;16667:2;16647:18;;;16640:30;-1:-1:-1;;;16686:18:1;;;16679:48;16744:18;;38207:66:0;16426:342:1;38207:66:0;38330:16;;;;38326:234;;;38379:4;;-1:-1:-1;;;;;38371:12:0;;;38379:4;;38371:12;38363:58;;;;-1:-1:-1;;;38363:58:0;;16975:2:1;38363:58:0;;;16957:21:1;17014:2;16994:18;;;16987:30;17053:34;17033:18;;;17026:62;-1:-1:-1;;;17104:18:1;;;17097:31;17145:19;;38363:58:0;16773:397:1;38363:58:0;-1:-1:-1;;;;;38444:20:0;;38467:1;38444:20;;;:16;:20;;;;;;38436:67;;;;-1:-1:-1;;;38436:67:0;;17377:2:1;38436:67:0;;;17359:21:1;17416:2;17396:18;;;17389:30;17455:32;17435:18;;;17428:60;17505:18;;38436:67:0;17175:354:1;38436:67:0;-1:-1:-1;;;;;38518:20:0;;;;;;:16;:20;;;;;:30;;38542:6;;38518:20;:30;;38542:6;;38518:30;:::i;:::-;;;;-1:-1:-1;;38326:234:0;38612:17;;;;38611:18;:84;;;;-1:-1:-1;;;;;;38681:14:0;;;;;;:10;:14;;;;;;;;38611:84;:150;;;;;38760:1;38736:21;;:25;38611:150;:238;;;;-1:-1:-1;38828:21:0;;38817:6;;-1:-1:-1;;;;;38817:6:0;38807:17;;;;:9;:17;;;;;;:42;;38611:238;38607:361;;;38918:38;38934:21;;38918:15;:38::i;:::-;39042:6;;-1:-1:-1;;;;;39034:14:0;;;39042:6;;39034:14;;;;:54;;-1:-1:-1;;;;;;39053:16:0;;;;;;:10;:16;;;;;;;;;:34;;-1:-1:-1;;;;;;39073:14:0;;;;;;:10;:14;;;;;;;;39053:34;39030:202;;;39105:35;39123:4;39129:2;39133:6;39105:17;:35::i;39030:202::-;39182:38;39203:4;39209:2;39213:6;39182:20;:38::i;3887:191::-;3961:16;3980:6;;-1:-1:-1;;;;;3997:17:0;;;-1:-1:-1;;;;;;3997:17:0;;;;;;4030:40;;3980:6;;;;;;;4030:40;;3961:16;4030:40;3950:128;3887:191;:::o;33440:374::-;-1:-1:-1;;;;;33524:21:0;;33516:49;;;;-1:-1:-1;;;33516:49:0;;14042:2:1;33516:49:0;;;14024:21:1;14081:2;14061:18;;;14054:30;-1:-1:-1;;;14100:18:1;;;14093:45;14155:18;;33516:49:0;13840:339:1;33516:49:0;-1:-1:-1;;;;;33586:18:0;;;;;;:9;:18;;;;;;:28;-1:-1:-1;33586:28:0;33578:61;;;;-1:-1:-1;;;33578:61:0;;17869:2:1;33578:61:0;;;17851:21:1;17908:2;17888:18;;;17881:30;-1:-1:-1;;;17927:18:1;;;17920:50;17987:18;;33578:61:0;17667:344:1;33578:61:0;-1:-1:-1;;;;;33675:18:0;;;;;;:9;:18;;;;;;;;:28;;;;;;;33718:12;:22;;;;;;;33769:37;2652:25:1;;;33675:18:0;;;-1:-1:-1;;;;;;;;;;;33769:37:0;2625:18:1;33769:37:0;2506:177:1;43012:317:0;28564:17;:24;;-1:-1:-1;;28564:24:0;28584:4;28564:24;;;:17;43104:10:::1;43113:1;43104:6:::0;:10:::1;:::i;:::-;43084:30:::0;-1:-1:-1;43125:15:0::1;43143:18;43084:30:::0;43143:6;:18:::1;:::i;:::-;43125:36;;43172:19;43194:25;43211:7;43194:16;:25::i;:::-;43172:47;;43230:37;43244:9;43255:11;43230:13;:37::i;:::-;43283:38;::::0;;18412:25:1;;;18468:2;18453:18;;18446:34;;;43283:38:0::1;::::0;18385:18:1;43283:38:0::1;;;;;;;-1:-1:-1::0;;28611:17:0;:25;;-1:-1:-1;;28611:25:0;;;-1:-1:-1;;43012:317:0:o;39504:328::-;39592:23;39618:27;39628:4;39634:2;39638:6;39618:9;:27::i;:::-;-1:-1:-1;;;;;39681:15:0;;;;;;;:9;:15;;;;;;:34;;;;;;;39730:13;;;;;;;;;;:32;;;;;;39789:35;;39592:53;;-1:-1:-1;39730:13:0;;-1:-1:-1;;;;;;;;;;;39789:35:0;;;39592:53;2652:25:1;;2640:2;2625:18;;2506:177;39789:35:0;;;;;;;;39581:251;39504:328;;;:::o;40104:240::-;-1:-1:-1;;;;;40220:15:0;;;;;;;:9;:15;;;;;;:25;;;;;;;40260:13;;;;;;;;;;:23;;;;;;40310:26;;-1:-1:-1;;;;;;;;;;;40310:26:0;;;40239:6;2652:25:1;;2640:2;2625:18;;2506:177;44194:625:0;44300:6;;;44349:16;;;;;;;;;;;44258:7;;-1:-1:-1;;;;;44300:6:0;;;:14;;44258:7;;44349:16;;;;;;;;-1:-1:-1;;44386:6:0;;44376:7;;;;-1:-1:-1;;;;;;44386:6:0;;44376:7;;-1:-1:-1;44386:6:0;;44376:7;;;;:::i;:::-;-1:-1:-1;;;;;44376:16:0;;;:7;;;;;;;;;;:16;;;;44413:6;;:13;;;-1:-1:-1;;;44413:13:0;;;;:6;;;;;:11;;:13;;;;;44376:7;;44413:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44403:4;44408:1;44403:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;44403:23:0;;;:7;;;;;;;;;:23;44448:6;;44464;;44439:46;;44448:6;;;;44464;44473:11;44439:8;:46::i;:::-;44496:6;;44685;;44496:267;;-1:-1:-1;;;44496:267:0;;-1:-1:-1;;;;;44496:6:0;;;;:57;;:267;;44568:11;;44496:6;;44648:4;;44685:6;;;44720:15;;44496:267;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44783:6:0;;:28;;-1:-1:-1;44800:11:0;;-1:-1:-1;;;;;;44783:6:0;:14;:28;:::i;:::-;44776:35;44194:625;-1:-1:-1;;;;44194:625:0:o;41870:494::-;41961:6;;41977;;41952:46;;-1:-1:-1;;;;;41961:6:0;;;;41977;41986:11;41952:8;:46::i;:::-;42011:6;;42066;;-1:-1:-1;;;;;42011:6:0;;;;:22;;42041:9;;42066:6;42112:11;42011:6;;42270:7;2666;2693:6;-1:-1:-1;;;;;2693:6:0;;2620:87;42270:7;42011:345;;;;;;-1:-1:-1;;;;;;42011:345:0;;;-1:-1:-1;;;;;20159:15:1;;;42011:345:0;;;20141:34:1;20191:18;;;20184:34;;;;20234:18;;;20227:34;;;;20277:18;;;20270:34;20341:15;;;20320:19;;;20313:44;42313:15:0;20373:19:1;;;20366:35;20075:19;;42011:345:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;41870:494;;:::o;40639:917::-;40809:12;:19;40717:7;;40763:6;;40717:7;40841:673;40863:18;40859:1;:22;;;40841:673;;;40903:11;40967:3;40926:21;:38;40948:12;40961:1;40948:15;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;40948:15:0;40926:38;;;;;;;;;;;;;40917:47;;40926:38;;40917:6;:47;:::i;:::-;:53;;;;:::i;:::-;40903:67;-1:-1:-1;40985:22:0;40903:67;40985:22;;:::i;:::-;-1:-1:-1;;;;;41022:15:0;;;;;;:9;:15;;;;;:22;;40985;;-1:-1:-1;41041:3:0;;41022:15;;;:22;;41041:3;;41022:22;:::i;:::-;;;;;;;;41132:18;:35;41151:12;41164:1;41151:15;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41151:15:0;41132:35;;;;;;;;;;;;;;;:53;;;;-1:-1:-1;;;;;;41171:14:0;;;;;;:10;:14;;;;;;;;41132:53;41128:375;;;41206:11;41220:21;41237:3;41220:16;:21::i;:::-;41282:10;;41294:12;:15;;41206:35;;-1:-1:-1;41260:50:0;;41206:35;;-1:-1:-1;;;;;41282:10:0;;41294:12;:15;;;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;41294:15:0;41260:16;:50::i;:::-;41187:139;41128:375;;;41424:3;41394:9;:26;41404:12;41417:1;41404:15;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;41404:15:0;41394:26;;;;;;;;;;;;:33;;:26;;41404:15;41394:33;;;;;:::i;:::-;;;;-1:-1:-1;;41466:12:0;:15;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;41451:36;;2652:25:1;;;-1:-1:-1;;;;;41466:15:0;;;;41451:36;;;;-1:-1:-1;;;;;;;;;;;41451:36:0;2625:18:1;41451:36:0;;;;;;;41128:375;-1:-1:-1;40883:3:0;;;;:::i;:::-;;;;40841:673;;;-1:-1:-1;41533:15:0;;40639:917;-1:-1:-1;;;;;40639:917:0:o;43550:468::-;43671:16;;;43685:1;43671:16;;;;;;;;43647:21;;43671:16;;;;;;;;-1:-1:-1;;43708:6:0;;:13;;;-1:-1:-1;;;43708:13:0;;;;43647:40;;-1:-1:-1;;;;;;43708:6:0;;;;:11;;-1:-1:-1;43708:13:0;;;;;;;;;;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43698:4;43703:1;43698:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;43698:23:0;;;-1:-1:-1;;;;;43698:23:0;;;;;43742:5;43732:4;43737:1;43732:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;43732:15:0;;;:7;;;;;;;;;:15;43760:6;;;:57;43825:9;43760:6;43887:4;43924:8;43961:21;:15;43979:3;43961:21;:::i;:::-;43760:250;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43636:382;43550:468;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:548:1;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1215:180::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;-1:-1:-1;1366:23:1;;1215:180;-1:-1:-1;1215:180:1:o;1608:383::-;1685:6;1693;1701;1754:2;1742:9;1733:7;1729:23;1725:32;1722:52;;;1770:1;1767;1760:12;1722:52;1809:9;1796:23;1828:31;1853:5;1828:31;:::i;:::-;1878:5;1930:2;1915:18;;1902:32;;-1:-1:-1;1981:2:1;1966:18;;;1953:32;;1608:383;-1:-1:-1;;;1608:383:1:o;1996:118::-;2082:5;2075:13;2068:21;2061:5;2058:32;2048:60;;2104:1;2101;2094:12;2119:382;2184:6;2192;2245:2;2233:9;2224:7;2220:23;2216:32;2213:52;;;2261:1;2258;2251:12;2213:52;2300:9;2287:23;2319:31;2344:5;2319:31;:::i;:::-;2369:5;-1:-1:-1;2426:2:1;2411:18;;2398:32;2439:30;2398:32;2439:30;:::i;:::-;2488:7;2478:17;;;2119:382;;;;;:::o;2688:456::-;2765:6;2773;2781;2834:2;2822:9;2813:7;2809:23;2805:32;2802:52;;;2850:1;2847;2840:12;2802:52;2889:9;2876:23;2908:31;2933:5;2908:31;:::i;:::-;2958:5;-1:-1:-1;3015:2:1;3000:18;;2987:32;3028:33;2987:32;3028:33;:::i;:::-;2688:456;;3080:7;;-1:-1:-1;;;3134:2:1;3119:18;;;;3106:32;;2688:456::o;3338:247::-;3397:6;3450:2;3438:9;3429:7;3425:23;3421:32;3418:52;;;3466:1;3463;3456:12;3418:52;3505:9;3492:23;3524:31;3549:5;3524:31;:::i;:::-;3574:5;3338:247;-1:-1:-1;;;3338:247:1:o;3590:127::-;3651:10;3646:3;3642:20;3639:1;3632:31;3682:4;3679:1;3672:15;3706:4;3703:1;3696:15;3722:275;3793:2;3787:9;3858:2;3839:13;;-1:-1:-1;;3835:27:1;3823:40;;3893:18;3878:34;;3914:22;;;3875:62;3872:88;;;3940:18;;:::i;:::-;3976:2;3969:22;3722:275;;-1:-1:-1;3722:275:1:o;4002:183::-;4062:4;4095:18;4087:6;4084:30;4081:56;;;4117:18;;:::i;:::-;-1:-1:-1;4162:1:1;4158:14;4174:4;4154:25;;4002:183::o;4190:966::-;4274:6;4305:2;4348;4336:9;4327:7;4323:23;4319:32;4316:52;;;4364:1;4361;4354:12;4316:52;4404:9;4391:23;4437:18;4429:6;4426:30;4423:50;;;4469:1;4466;4459:12;4423:50;4492:22;;4545:4;4537:13;;4533:27;-1:-1:-1;4523:55:1;;4574:1;4571;4564:12;4523:55;4610:2;4597:16;4633:60;4649:43;4689:2;4649:43;:::i;:::-;4633:60;:::i;:::-;4727:15;;;4809:1;4805:10;;;;4797:19;;4793:28;;;4758:12;;;;4833:19;;;4830:39;;;4865:1;4862;4855:12;4830:39;4889:11;;;;4909:217;4925:6;4920:3;4917:15;4909:217;;;5005:3;4992:17;5022:31;5047:5;5022:31;:::i;:::-;5066:18;;4942:12;;;;5104;;;;4909:217;;;5145:5;4190:966;-1:-1:-1;;;;;;;4190:966:1:o;5161:829::-;5213:5;5266:3;5259:4;5251:6;5247:17;5243:27;5233:55;;5284:1;5281;5274:12;5233:55;5320:6;5307:20;5346:4;5370:60;5386:43;5426:2;5386:43;:::i;5370:60::-;5464:15;;;5550:1;5546:10;;;;5534:23;;5530:32;;;5495:12;;;;5574:15;;;5571:35;;;5602:1;5599;5592:12;5571:35;5638:2;5630:6;5626:15;5650:311;5666:6;5661:3;5658:15;5650:311;;;5746:3;5733:17;5794:4;5787:5;5783:16;5776:5;5773:27;5763:125;;5842:1;5871:2;5867;5860:14;5763:125;5901:18;;5939:12;;;;5683;;5650:311;;;-1:-1:-1;5979:5:1;5161:829;-1:-1:-1;;;;;;5161:829:1:o;5995:1219::-;6119:6;6127;6180:2;6168:9;6159:7;6155:23;6151:32;6148:52;;;6196:1;6193;6186:12;6148:52;6236:9;6223:23;6265:18;6306:2;6298:6;6295:14;6292:34;;;6322:1;6319;6312:12;6292:34;6360:6;6349:9;6345:22;6335:32;;6405:7;6398:4;6394:2;6390:13;6386:27;6376:55;;6427:1;6424;6417:12;6376:55;6463:2;6450:16;6485:4;6509:60;6525:43;6565:2;6525:43;:::i;6509:60::-;6603:15;;;6685:1;6681:10;;;;6673:19;;6669:28;;;6634:12;;;;6709:19;;;6706:39;;;6741:1;6738;6731:12;6706:39;6765:11;;;;6785:217;6801:6;6796:3;6793:15;6785:217;;;6881:3;6868:17;6898:31;6923:5;6898:31;:::i;:::-;6942:18;;6818:12;;;;6980;;;;6785:217;;;7021:5;-1:-1:-1;;7064:18:1;;7051:32;;-1:-1:-1;;7095:16:1;;;7092:36;;;7124:1;7121;7114:12;7092:36;;7147:61;7200:7;7189:8;7178:9;7174:24;7147:61;:::i;:::-;7137:71;;;5995:1219;;;;;:::o;7219:248::-;7287:6;7295;7348:2;7336:9;7327:7;7323:23;7319:32;7316:52;;;7364:1;7361;7354:12;7316:52;-1:-1:-1;;7387:23:1;;;7457:2;7442:18;;;7429:32;;-1:-1:-1;7219:248:1:o;7472:388::-;7540:6;7548;7601:2;7589:9;7580:7;7576:23;7572:32;7569:52;;;7617:1;7614;7607:12;7569:52;7656:9;7643:23;7675:31;7700:5;7675:31;:::i;:::-;7725:5;-1:-1:-1;7782:2:1;7767:18;;7754:32;7795:33;7754:32;7795:33;:::i;8099:380::-;8178:1;8174:12;;;;8221;;;8242:61;;8296:4;8288:6;8284:17;8274:27;;8242:61;8349:2;8341:6;8338:14;8318:18;8315:38;8312:161;;8395:10;8390:3;8386:20;8383:1;8376:31;8430:4;8427:1;8420:15;8458:4;8455:1;8448:15;8312:161;;8099:380;;;:::o;8484:343::-;8686:2;8668:21;;;8725:2;8705:18;;;8698:30;-1:-1:-1;;;8759:2:1;8744:18;;8737:49;8818:2;8803:18;;8484:343::o;9533:127::-;9594:10;9589:3;9585:20;9582:1;9575:31;9625:4;9622:1;9615:15;9649:4;9646:1;9639:15;9665:127;9726:10;9721:3;9717:20;9714:1;9707:31;9757:4;9754:1;9747:15;9781:4;9778:1;9771:15;9797:175;9834:3;9878:4;9871:5;9867:16;9907:4;9898:7;9895:17;9892:43;;9915:18;;:::i;:::-;9964:1;9951:15;;9797:175;-1:-1:-1;;9797:175:1:o;10681:148::-;10769:4;10748:12;;;10762;;;10744:31;;10787:13;;10784:39;;;10803:18;;:::i;11820:245::-;11887:6;11940:2;11928:9;11919:7;11915:23;11911:32;11908:52;;;11956:1;11953;11946:12;11908:52;11988:9;11982:16;12007:28;12029:5;12007:28;:::i;14184:125::-;14249:9;;;14270:10;;;14267:36;;;14283:18;;:::i;17534:128::-;17601:9;;;17622:11;;;17619:37;;;17636:18;;:::i;18016:217::-;18056:1;18082;18072:132;;18126:10;18121:3;18117:20;18114:1;18107:31;18161:4;18158:1;18151:15;18189:4;18186:1;18179:15;18072:132;-1:-1:-1;18218:9:1;;18016:217::o;18491:251::-;18561:6;18614:2;18602:9;18593:7;18589:23;18585:32;18582:52;;;18630:1;18627;18620:12;18582:52;18662:9;18656:16;18681:31;18706:5;18681:31;:::i;18747:461::-;18800:3;18838:5;18832:12;18865:6;18860:3;18853:19;18891:4;18920:2;18915:3;18911:12;18904:19;;18957:2;18950:5;18946:14;18978:1;18988:195;19002:6;18999:1;18996:13;18988:195;;;19067:13;;-1:-1:-1;;;;;19063:39:1;19051:52;;19123:12;;;;19158:15;;;;19099:1;19017:9;18988:195;;;-1:-1:-1;19199:3:1;;18747:461;-1:-1:-1;;;;;18747:461:1:o;19213:582::-;19512:6;19501:9;19494:25;19555:6;19550:2;19539:9;19535:18;19528:34;19598:3;19593:2;19582:9;19578:18;19571:31;19475:4;19619:57;19671:3;19660:9;19656:19;19648:6;19619:57;:::i;:::-;-1:-1:-1;;;;;19712:32:1;;;;19707:2;19692:18;;19685:60;-1:-1:-1;19776:3:1;19761:19;19754:35;19611:65;19213:582;-1:-1:-1;;;19213:582:1:o;20412:306::-;20500:6;20508;20516;20569:2;20557:9;20548:7;20544:23;20540:32;20537:52;;;20585:1;20582;20575:12;20537:52;20614:9;20608:16;20598:26;;20664:2;20653:9;20649:18;20643:25;20633:35;;20708:2;20697:9;20693:18;20687:25;20677:35;;20412:306;;;;;:::o;20723:168::-;20796:9;;;20827;;20844:15;;;20838:22;;20824:37;20814:71;;20865:18;;:::i;20896:510::-;21167:6;21156:9;21149:25;21210:3;21205:2;21194:9;21190:18;21183:31;21130:4;21231:57;21283:3;21272:9;21268:19;21260:6;21231:57;:::i;:::-;-1:-1:-1;;;;;21324:32:1;;;;21319:2;21304:18;;21297:60;-1:-1:-1;21388:2:1;21373:18;21366:34;21223:65;20896:510;-1:-1:-1;;20896:510:1:o
Metadata Hash
b781a2f05055a641d602336f657efc0fd5a802c9321add98dc8440ade75f9b19
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.