ERC-20
Marketplace
Overview
Max Total Supply
10,000,000 DIFI
Holders
375 (0.00%)
Market
Price
$0.00 @ 0.000000 ETH (+1.33%)
Onchain Market Cap
$3,461.60
Circulating Supply Market Cap
$3,461.59
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|---|---|---|---|---|
1 | ![]() | FZFRZDAADSYXUWK5IBV9CAMNLMMX9DRUTFMEJBQM751U-SO11111111111111111111111111111111111111112 | $0.0003 0.0000002 Eth | $256.77 1,015,974.403 FZFRZDAADSYXUWK5IBV9CAMNLMMX9DRUTFMEJBQM751U | 100.0000% |
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
DividendTokenWithAntibot
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-12-21 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } } pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated( address indexed token0, address indexed token1, address pair, uint256 ); 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(uint256) external view returns (address pair); function allPairsLength() external view returns (uint256); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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 functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `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); /** * @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); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ 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); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } interface IERC20Upgradeable { /** * @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); /** * @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); } abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { // If the contract is initializing we ignore whether _initialized is set in order to support multiple // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the // contract may have been reentered. require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} modifier, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } } interface IERC20MetadataUpgradeable is IERC20Upgradeable { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, _allowances[owner][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = _allowances[owner][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Spend `amount` form the allowance of `owner` toward `spender`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ 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); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[45] private __gap; } 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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } } abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } pragma solidity ^0.8.18; library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); /** * @dev Multiplies two int256 variables and fails on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; // Detect overflow when multiplying MIN_INT256 with -1 require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } /** * @dev Division of two int256 variables and fails on overflow. */ function div(int256 a, int256 b) internal pure returns (int256) { // Prevent overflow when dividing MIN_INT256 by -1 require(b != -1 || a != MIN_INT256); // Solidity already throws when dividing by 0. return a / b; } /** * @dev Subtracts two int256 variables and fails on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two int256 variables and fails on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } /** * @dev Converts to absolute value, and fails on overflow. */ function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } function toUint256Safe(int256 a) internal pure returns (uint256) { require(a >= 0); return uint256(a); } } library SafeMathUint { function toInt256Safe(uint256 a) internal pure returns (int256) { int256 b = int256(a); require(b >= 0); return b; } } library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint256) values; mapping(address => uint256) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) public view returns (uint256) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) public view returns (int256) { if (!map.inserted[key]) { return -1; } return int256(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint256 index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint256) { return map.keys.length; } function set( Map storage map, address key, uint256 val ) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint256 index = map.indexOf[key]; uint256 lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } } interface DividendPayingTokenInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) external view returns (uint256); /// @notice Withdraws the ether distributed to the sender. /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer. /// MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0. function withdrawDividend() external; /// @dev This event MUST emit when ether is distributed to token holders. /// @param from The address which sends ether to this contract. /// @param weiAmount The amount of distributed ether in wei. event DividendsDistributed(address indexed from, uint256 weiAmount); /// @dev This event MUST emit when an address withdraws their dividend. /// @param to The address which withdraws ether from this contract. /// @param weiAmount The amount of withdrawn ether in wei. event DividendWithdrawn(address indexed to, uint256 weiAmount); } interface DividendPayingTokenOptionalInterface { /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) external view returns (uint256); /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) external view returns (uint256); /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) external view returns (uint256); } contract DividendPayingToken is ERC20Upgradeable, OwnableUpgradeable, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface { using SafeMath for uint256; using SafeMathUint for uint256; using SafeMathInt for int256; using SafeERC20 for IERC20; address public rewardToken; // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small. // For more discussion about choosing the value of `magnitude`, // see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728 uint256 internal constant magnitude = 2**128; uint256 internal magnifiedDividendPerShare; // About dividendCorrection: // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with: // `dividendOf(_user) = dividendPerShare * balanceOf(_user)`. // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens), // `dividendOf(_user)` should not be changed, // but the computed value of `dividendPerShare * balanceOf(_user)` is changed. // To keep the `dividendOf(_user)` unchanged, we add a correction term: // `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`, // where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed: // `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`. // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed. mapping(address => int256) internal magnifiedDividendCorrections; mapping(address => uint256) internal withdrawnDividends; uint256 public totalDividendsDistributed; function __DividendPayingToken_init( address _rewardToken, string memory _name, string memory _symbol ) internal onlyInitializing { __Ownable_init(); __ERC20_init(_name, _symbol); rewardToken = _rewardToken; } function distributeCAKEDividends(uint256 amount) public onlyOwner { require(totalSupply() > 0); if (amount > 0) { magnifiedDividendPerShare = magnifiedDividendPerShare.add( (amount).mul(magnitude) / totalSupply() ); emit DividendsDistributed(msg.sender, amount); totalDividendsDistributed = totalDividendsDistributed.add(amount); } } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function withdrawDividend() public virtual override { _withdrawDividendOfUser(payable(msg.sender)); } /// @notice Withdraws the ether distributed to the sender. /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0. function _withdrawDividendOfUser(address payable user) internal returns (uint256) { uint256 _withdrawableDividend = withdrawableDividendOf(user); if (_withdrawableDividend > 0) { withdrawnDividends[user] = withdrawnDividends[user].add( _withdrawableDividend ); emit DividendWithdrawn(user, _withdrawableDividend); IERC20(rewardToken).safeTransfer( user, _withdrawableDividend ); return _withdrawableDividend; } return 0; } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function dividendOf(address _owner) public view override returns (uint256) { return withdrawableDividendOf(_owner); } /// @notice View the amount of dividend in wei that an address can withdraw. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` can withdraw. function withdrawableDividendOf(address _owner) public view override returns (uint256) { return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]); } /// @notice View the amount of dividend in wei that an address has withdrawn. /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has withdrawn. function withdrawnDividendOf(address _owner) public view override returns (uint256) { return withdrawnDividends[_owner]; } /// @notice View the amount of dividend in wei that an address has earned in total. /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner) /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude /// @param _owner The address of a token holder. /// @return The amount of dividend in wei that `_owner` has earned in total. function accumulativeDividendOf(address _owner) public view override returns (uint256) { return magnifiedDividendPerShare .mul(balanceOf(_owner)) .toInt256Safe() .add(magnifiedDividendCorrections[_owner]) .toUint256Safe() / magnitude; } /// @dev Internal function that transfer tokens from one address to another. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param from The address to transfer from. /// @param to The address to transfer to. /// @param value The amount to be transferred. function _transfer( address from, address to, uint256 value ) internal virtual override { require(false); int256 _magCorrection = magnifiedDividendPerShare .mul(value) .toInt256Safe(); magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from] .add(_magCorrection); magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub( _magCorrection ); } /// @dev Internal function that mints tokens to an account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account that will receive the created tokens. /// @param value The amount that will be created. function _mint(address account, uint256 value) internal override { super._mint(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe()); } /// @dev Internal function that burns an amount of the token of a given account. /// Update magnifiedDividendCorrections to keep dividends unchanged. /// @param account The account whose tokens will be burnt. /// @param value The amount that will be burnt. function _burn(address account, uint256 value) internal override { super._burn(account, value); magnifiedDividendCorrections[account] = magnifiedDividendCorrections[ account ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe()); } function _setBalance(address account, uint256 newBalance) internal { uint256 currentBalance = balanceOf(account); if (newBalance > currentBalance) { uint256 mintAmount = newBalance.sub(currentBalance); _mint(account, mintAmount); } else if (newBalance < currentBalance) { uint256 burnAmount = currentBalance.sub(newBalance); _burn(account, burnAmount); } } } contract DividendTokenDividendTracker is OwnableUpgradeable, DividendPayingToken { using SafeMath for uint256; using SafeMathInt for int256; using IterableMapping for IterableMapping.Map; IterableMapping.Map private tokenHoldersMap; uint256 public lastProcessedIndex; mapping(address => bool) public excludedFromDividends; mapping(address => uint256) public lastClaimTimes; uint256 public claimWait; uint256 public minimumTokenBalanceForDividends; event ExcludeFromDividends(address indexed account); event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue); event Claim( address indexed account, uint256 amount, bool indexed automatic ); constructor() { } function initialize( address rewardToken_, uint256 minimumTokenBalanceForDividends_ ) external initializer { DividendPayingToken.__DividendPayingToken_init( rewardToken_, "DIVIDEND_TRACKER", "DIVIDEND_TRACKER" ); claimWait = 3600; minimumTokenBalanceForDividends = minimumTokenBalanceForDividends_; } function _transfer( address, address, uint256 ) internal pure override { require(false, "Dividend_Tracker: No transfers allowed"); } function withdrawDividend() public pure override { require( false, "Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main BABYTOKEN contract." ); } function excludeFromDividends(address account) external onlyOwner { require(!excludedFromDividends[account]); excludedFromDividends[account] = true; _setBalance(account, 0); tokenHoldersMap.remove(account); emit ExcludeFromDividends(account); } function isExcludedFromDividends(address account) public view returns (bool) { return excludedFromDividends[account]; } function updateClaimWait(uint256 newClaimWait) external onlyOwner { require( newClaimWait >= 3600 && newClaimWait <= 86400, "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours" ); require( newClaimWait != claimWait, "Dividend_Tracker: Cannot update claimWait to same value" ); emit ClaimWaitUpdated(newClaimWait, claimWait); claimWait = newClaimWait; } function updateMinimumTokenBalanceForDividends(uint256 amount) external onlyOwner { minimumTokenBalanceForDividends = amount; } function getLastProcessedIndex() external view returns (uint256) { return lastProcessedIndex; } function getNumberOfTokenHolders() external view returns (uint256) { return tokenHoldersMap.keys.length; } function getAccount(address _account) public view returns ( address account, int256 index, int256 iterationsUntilProcessed, uint256 withdrawableDividends, uint256 totalDividends, uint256 lastClaimTime, uint256 nextClaimTime, uint256 secondsUntilAutoClaimAvailable ) { account = _account; index = tokenHoldersMap.getIndexOfKey(account); iterationsUntilProcessed = -1; if (index >= 0) { if (uint256(index) > lastProcessedIndex) { iterationsUntilProcessed = index.sub( int256(lastProcessedIndex) ); } else { uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ? tokenHoldersMap.keys.length.sub(lastProcessedIndex) : 0; iterationsUntilProcessed = index.add( int256(processesUntilEndOfArray) ); } } withdrawableDividends = withdrawableDividendOf(account); totalDividends = accumulativeDividendOf(account); lastClaimTime = lastClaimTimes[account]; nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0; secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ? nextClaimTime.sub(block.timestamp) : 0; } function getAccountAtIndex(uint256 index) public view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256 ) { if (index >= tokenHoldersMap.size()) { return (address(0), -1, -1, 0, 0, 0, 0, 0); } address account = tokenHoldersMap.getKeyAtIndex(index); return getAccount(account); } function canAutoClaim(uint256 lastClaimTime) private view returns (bool) { if (lastClaimTime > block.timestamp) { return false; } return block.timestamp.sub(lastClaimTime) >= claimWait; } function setBalance(address payable account, uint256 newBalance) external onlyOwner { if (excludedFromDividends[account]) { return; } if (newBalance >= minimumTokenBalanceForDividends) { _setBalance(account, newBalance); tokenHoldersMap.set(account, newBalance); } else { _setBalance(account, 0); tokenHoldersMap.remove(account); } processAccount(account, true); } function process(uint256 gas) public returns ( uint256, uint256, uint256 ) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if (numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while (gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if (_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if (canAutoClaim(lastClaimTimes[account])) { if (processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if (gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); } function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) { uint256 amount = _withdrawDividendOfUser(account); if (amount > 0) { lastClaimTimes[account] = block.timestamp; emit Claim(account, amount, automatic); return true; } return false; } } interface IGemAntiBot { function setTokenOwner(address owner) external; function onPreTransferCheck( address from, address to, uint256 amount ) external; } interface IFee { function payFee( uint256 _tokenType ) external payable; } interface IUniswapV2Caller { function swapExactTokensForTokensSupportingFeeOnTransferTokens( address router, uint256 amountIn, uint256 amountOutMin, address[] calldata path, uint256 deadline ) external; } contract DividendTokenWithAntibot is ERC20, Ownable { using SafeERC20 for IERC20; uint256 private constant MAX = ~uint256(0); IUniswapV2Caller public constant uniswapV2Caller = IUniswapV2Caller(0x1CcFE8c40eF259566433716002E379dFfFbf5a3e); IFee public constant feeContract = IFee(0xfd6439AEfF9d2389856B7486b9e74a6DacaDcDCe); address public tokenForMarketingFee; address public gemAntiBot; bool public antiBotEnabled; uint8 private _decimals; address public baseTokenForPair; address public uniswapV2Router; address public uniswapV2Pair; bool private swapping; address public dividendTracker; address public rewardToken; uint256 public swapTokensAtAmount; uint16 public sellRewardFee; uint16 public buyRewardFee; uint16 public sellLiquidityFee; uint16 public buyLiquidityFee; uint16 public sellMarketingFee; uint16 public buyMarketingFee; address public _marketingWalletAddress; uint256 public gasForProcessing; uint256 public maxWallet; uint256 public maxTransactionAmount; mapping(address => bool) private _isExcludedFromFees; mapping(address => bool) public isExcludedFromMaxTransactionAmount; uint256 private _liquidityFeeTokens; uint256 private _marketingFeeTokens; mapping(address => bool) public automatedMarketMakerPairs; event UpdateDividendTracker( address indexed newAddress, address indexed oldAddress ); event UpdateUniswapV2Router( address indexed newAddress, address indexed oldAddress ); event ExcludeFromFees(address indexed account, bool isExcluded); event UpdateSwapTokensAtAmount(uint256 newSwapTokensAtAmount, uint256 oldSwapTokensAtAmount); event SetAutomatedMarketMakerPair(address indexed pair, bool value); event UpdateMaxWallet(uint256 newMaxWallet, uint256 oldMaxWallet); event UpdateMaxTransactionAmount(uint256 newMaxTransactionAmount, uint256 oldMaxTransactionAmount); event LiquidityWalletUpdated( address indexed newLiquidityWallet, address indexed oldLiquidityWallet ); event MarketingWalletUpdated( address indexed newMarketingWallet, address indexed oldMarketingWallet ); event TokenForMarketingFeeUpdated( address indexed newTokenForMarketingFee, address indexed oldTokenForMarketingFee); event ExcludedFromMaxTransactionAmount(address indexed account, bool isExcluded); event GasForProcessingUpdated( uint256 indexed newValue, uint256 indexed oldValue ); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SendDividends(uint256 tokensSwapped, uint256 amount); event ProcessedDividendTracker( uint256 iterations, uint256 claims, uint256 lastProcessedIndex, bool indexed automatic, uint256 gas, address indexed processor ); event UpdateLiquidityFee( uint16 newSellLiquidityFee, uint16 newBuyLiquidityFee, uint16 oldSellLiquidityFee, uint16 oldBuyLiquidityFee ); event UpdateMarketingFee( uint16 newSellMarketingFee, uint16 newBuyMarketingFee, uint16 oldSellMarketingFee, uint16 oldBuyMarketingFee ); event UpdateRewardFee( uint16 newSellRewardFee, uint16 newBuyRewardFee, uint16 oldSellRewardFee, uint16 oldBuyRewardFee ); constructor( string memory name_, string memory symbol_, uint8 decimals_, uint256 totalSupply_, uint256 _maxWallet, uint256 _maxTransactionAmount, address[6] memory addrs, // reward, router, marketing wallet, lp wallet, dividendTracker uint16[6] memory feeSettings, // rewards, liquidity, marketing uint256 minimumTokenBalanceForDividends_, uint8 _tokenForMarketingFee ) payable ERC20(name_, symbol_) { feeContract.payFee{value: msg.value}(3); _decimals = decimals_; rewardToken = addrs[0]; _marketingWalletAddress = addrs[2]; emit MarketingWalletUpdated(_marketingWalletAddress, address(0)); gemAntiBot = addrs[5]; IGemAntiBot(gemAntiBot).setTokenOwner(msg.sender); antiBotEnabled = true; baseTokenForPair=addrs[4]; sellLiquidityFee = feeSettings[0]; buyLiquidityFee = feeSettings[1]; emit UpdateLiquidityFee( sellLiquidityFee, buyLiquidityFee, 0, 0 ); sellMarketingFee = feeSettings[2]; buyMarketingFee = feeSettings[3]; emit UpdateMarketingFee( sellMarketingFee, buyMarketingFee, 0, 0 ); sellRewardFee = feeSettings[4]; buyRewardFee = feeSettings[5]; emit UpdateRewardFee( sellRewardFee, buyRewardFee, 0, 0 ); require(sellLiquidityFee+sellMarketingFee+sellRewardFee <= 200, "sell fee <= 20%"); require(buyLiquidityFee+buyMarketingFee+buyRewardFee <= 200, "buy fee <= 20%"); if(_tokenForMarketingFee==0){ tokenForMarketingFee=address(this); }else if(_tokenForMarketingFee==1){ tokenForMarketingFee=baseTokenForPair; }else{ tokenForMarketingFee=rewardToken; } emit TokenForMarketingFeeUpdated(tokenForMarketingFee, address(0)); swapTokensAtAmount = totalSupply_/(10000); emit UpdateSwapTokensAtAmount(swapTokensAtAmount, 0); gasForProcessing = 300000; emit GasForProcessingUpdated(gasForProcessing, 0); dividendTracker = payable(Clones.clone(addrs[3])); emit UpdateDividendTracker( dividendTracker, address(0) ); DividendTokenDividendTracker(dividendTracker).initialize( rewardToken, minimumTokenBalanceForDividends_ ); require(_maxTransactionAmount>=totalSupply_ / 10000, "maxTransactionAmount >= total supply / 10000"); require(_maxWallet>=totalSupply_ / 10000, "maxWallet >= total supply / 10000"); maxWallet=_maxWallet; emit UpdateMaxWallet(maxWallet, 0); maxTransactionAmount=_maxTransactionAmount; emit UpdateMaxTransactionAmount(maxTransactionAmount, 0); uniswapV2Router = addrs[1]; if(baseTokenForPair != IUniswapV2Router02(uniswapV2Router).WETH()){ IERC20(baseTokenForPair).approve(uniswapV2Router, MAX); } _approve(address(this), address(uniswapV2Caller), MAX); _approve(address(this), uniswapV2Router, MAX); emit UpdateUniswapV2Router( uniswapV2Router, address(0) ); uniswapV2Pair = IUniswapV2Factory(IUniswapV2Router02(uniswapV2Router).factory()) .createPair(address(this), baseTokenForPair); _setAutomatedMarketMakerPair(uniswapV2Pair, true); DividendTokenDividendTracker(dividendTracker).excludeFromDividends(dividendTracker); DividendTokenDividendTracker(dividendTracker).excludeFromDividends(address(this)); DividendTokenDividendTracker(dividendTracker).excludeFromDividends(owner()); DividendTokenDividendTracker(dividendTracker).excludeFromDividends(address(0xdead)); DividendTokenDividendTracker(dividendTracker).excludeFromDividends(uniswapV2Router); excludeFromFees(owner(), true); excludeFromFees(_marketingWalletAddress, true); excludeFromFees(address(this), true); excludeFromFees(address(0xdead), true); isExcludedFromMaxTransactionAmount[address(0xdead)]=true; isExcludedFromMaxTransactionAmount[address(this)]=true; isExcludedFromMaxTransactionAmount[_marketingWalletAddress]=true; isExcludedFromMaxTransactionAmount[owner()]=true; _mint(owner(), totalSupply_); } receive() external payable {} function setUsingAntiBot(bool enabled_) external onlyOwner { antiBotEnabled = enabled_; } function setSwapTokensAtAmount(uint256 amount) external onlyOwner { require(amount > 0, "swapTokensAtAmount > 0"); emit UpdateSwapTokensAtAmount(amount, swapTokensAtAmount); swapTokensAtAmount = amount; } function updateMaxWallet(uint256 _maxWallet) external onlyOwner { require(_maxWallet>=totalSupply() / 10000, "maxWallet >= total supply / 10000"); emit UpdateMaxWallet(_maxWallet, maxWallet); maxWallet = _maxWallet; } function updateMaxTransactionAmount(uint256 _maxTransactionAmount) external onlyOwner { require(_maxTransactionAmount>=totalSupply() / 10000, "maxTransactionAmount >= total supply / 10000"); emit UpdateMaxTransactionAmount(_maxTransactionAmount, maxTransactionAmount); maxTransactionAmount = _maxTransactionAmount; } function updateDividendTracker(address newAddress) public onlyOwner { require( newAddress != dividendTracker, "The dividend tracker already has that address" ); address newDividendTracker =payable(newAddress); require( DividendTokenDividendTracker(newDividendTracker).owner() == address(this), "The new dividend tracker must be owned by the DIVIDENEDTOKEN token contract" ); DividendTokenDividendTracker(newDividendTracker).excludeFromDividends(newDividendTracker); DividendTokenDividendTracker(newDividendTracker).excludeFromDividends(address(this)); DividendTokenDividendTracker(newDividendTracker).excludeFromDividends(owner()); DividendTokenDividendTracker(newDividendTracker).excludeFromDividends(uniswapV2Router); DividendTokenDividendTracker(newDividendTracker).excludeFromDividends(uniswapV2Pair); emit UpdateDividendTracker(newAddress, dividendTracker); dividendTracker = newDividendTracker; } function updateUniswapV2Pair(address _baseTokenForPair) external onlyOwner { baseTokenForPair=_baseTokenForPair; uniswapV2Pair = IUniswapV2Factory(IUniswapV2Router02(uniswapV2Router).factory()).createPair( address(this), baseTokenForPair ); if(baseTokenForPair != IUniswapV2Router02(uniswapV2Router).WETH()){ IERC20(baseTokenForPair).approve(uniswapV2Router, MAX); } _setAutomatedMarketMakerPair(uniswapV2Pair, true); } function updateUniswapV2Router(address newAddress) public onlyOwner { require( newAddress != uniswapV2Router, "The router already has that address" ); emit UpdateUniswapV2Router(newAddress, uniswapV2Router); uniswapV2Pair = IUniswapV2Factory(IUniswapV2Router02(newAddress).factory()) .createPair(address(this), baseTokenForPair); uniswapV2Router = newAddress; if(baseTokenForPair != IUniswapV2Router02(uniswapV2Router).WETH()){ IERC20(baseTokenForPair).approve(uniswapV2Router, MAX); } _approve(address(this), uniswapV2Router, MAX); if (!DividendTokenDividendTracker(dividendTracker).isExcludedFromDividends(uniswapV2Router)) DividendTokenDividendTracker(dividendTracker).excludeFromDividends(uniswapV2Router); _setAutomatedMarketMakerPair(uniswapV2Pair, true); } function excludeFromFees(address account, bool excluded) public onlyOwner { require(_isExcludedFromFees[account] != excluded, "already"); _isExcludedFromFees[account] = excluded; emit ExcludeFromFees(account, excluded); } function decimals() public view override returns (uint8) { return _decimals; } function setMarketingWallet(address payable wallet) external onlyOwner { require(_marketingWalletAddress!=wallet, "already"); emit MarketingWalletUpdated(_marketingWalletAddress, wallet); _marketingWalletAddress = wallet; } function updateTokenForMarketingFee(address _tokenForMarketingFee) external onlyOwner { require(tokenForMarketingFee!=_tokenForMarketingFee, "already"); emit TokenForMarketingFeeUpdated(_tokenForMarketingFee, tokenForMarketingFee); tokenForMarketingFee = _tokenForMarketingFee; } function updateLiquidityFee( uint16 _sellLiquidityFee, uint16 _buyLiquidityFee ) external onlyOwner { require( _sellLiquidityFee+sellMarketingFee+sellRewardFee <= 200, "sell fee <= 20%" ); require( _buyLiquidityFee+buyMarketingFee+buyRewardFee <= 200, "buy fee <= 20%" ); emit UpdateLiquidityFee( _sellLiquidityFee, _buyLiquidityFee, sellLiquidityFee, buyLiquidityFee ); sellLiquidityFee = _sellLiquidityFee; buyLiquidityFee = _buyLiquidityFee; } function updateMarketingFee( uint16 _sellMarketingFee, uint16 _buyMarketingFee ) external onlyOwner { require( _sellMarketingFee+sellLiquidityFee+sellRewardFee <= 200, "sell fee <= 20%" ); require( _buyMarketingFee+buyLiquidityFee+buyRewardFee <= 200, "buy fee <= 20%" ); emit UpdateMarketingFee( _sellMarketingFee, _buyMarketingFee, sellMarketingFee, buyMarketingFee ); sellMarketingFee = _sellMarketingFee; buyMarketingFee = _buyMarketingFee; } function updateRewardFee( uint16 _sellRewardFee, uint16 _buyRewardFee ) external onlyOwner { require( _sellRewardFee+(sellLiquidityFee)+(sellMarketingFee) <= 200, "sell fee <= 20%" ); require( _buyRewardFee+(buyLiquidityFee)+(buyMarketingFee) <= 200, "buy fee <= 20%" ); emit UpdateRewardFee( _sellRewardFee, _buyRewardFee, sellRewardFee, buyRewardFee); sellRewardFee = _sellRewardFee; buyRewardFee = _buyRewardFee; } function setAutomatedMarketMakerPair(address pair, bool value) public onlyOwner { require( pair != uniswapV2Pair, "The main pair cannot be removed from automatedMarketMakerPairs" ); _setAutomatedMarketMakerPair(pair, value); } function _setAutomatedMarketMakerPair(address pair, bool value) private { require( automatedMarketMakerPairs[pair] != value, "Automated market maker pair is already set to that value" ); automatedMarketMakerPairs[pair] = value; isExcludedFromMaxTransactionAmount[pair] = value; if (value && !DividendTokenDividendTracker(dividendTracker).isExcludedFromDividends(pair)) { DividendTokenDividendTracker(dividendTracker).excludeFromDividends(pair); } emit SetAutomatedMarketMakerPair(pair, value); } function excludeFromMaxTransactionAmount(address account, bool isEx) external onlyOwner { require(isExcludedFromMaxTransactionAmount[account]!=isEx, "already"); isExcludedFromMaxTransactionAmount[account] = isEx; emit ExcludedFromMaxTransactionAmount(account, isEx); } function updateGasForProcessing(uint256 newValue) public onlyOwner { require( newValue >= 200000 && newValue <= 500000, "gasForProcessing must be between 200,000 and 500,000" ); require( newValue != gasForProcessing, "Cannot update gasForProcessing to same value" ); emit GasForProcessingUpdated(newValue, gasForProcessing); gasForProcessing = newValue; } function updateClaimWait(uint256 claimWait) external onlyOwner { DividendTokenDividendTracker(dividendTracker).updateClaimWait(claimWait); } function getClaimWait() external view returns (uint256) { return DividendTokenDividendTracker(dividendTracker).claimWait(); } function updateMinimumTokenBalanceForDividends(uint256 amount) external onlyOwner { DividendTokenDividendTracker(dividendTracker).updateMinimumTokenBalanceForDividends(amount); } function getMinimumTokenBalanceForDividends() external view returns (uint256) { return DividendTokenDividendTracker(dividendTracker).minimumTokenBalanceForDividends(); } function getTotalDividendsDistributed() external view returns (uint256) { return DividendTokenDividendTracker(dividendTracker).totalDividendsDistributed(); } function isExcludedFromFees(address account) public view returns (bool) { return _isExcludedFromFees[account]; } function withdrawableDividendOf(address account) public view returns (uint256) { return DividendTokenDividendTracker(dividendTracker).withdrawableDividendOf(account); } function dividendTokenBalanceOf(address account) public view returns (uint256) { return DividendTokenDividendTracker(dividendTracker).balanceOf(account); } function excludeFromDividends(address account) external onlyOwner { DividendTokenDividendTracker(dividendTracker).excludeFromDividends(account); } function isExcludedFromDividends(address account) public view returns (bool) { return DividendTokenDividendTracker(dividendTracker).isExcludedFromDividends(account); } function getAccountDividendsInfo(address account) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256 ) { return DividendTokenDividendTracker(dividendTracker).getAccount(account); } function getAccountDividendsInfoAtIndex(uint256 index) external view returns ( address, int256, int256, uint256, uint256, uint256, uint256, uint256 ) { return DividendTokenDividendTracker(dividendTracker).getAccountAtIndex(index); } function processDividendTracker(uint256 gas) external { ( uint256 iterations, uint256 claims, uint256 lastProcessedIndex ) = DividendTokenDividendTracker(dividendTracker).process(gas); emit ProcessedDividendTracker( iterations, claims, lastProcessedIndex, false, gas, msg.sender ); } function claim() external { DividendTokenDividendTracker(dividendTracker).processAccount(payable(msg.sender), false); } function getLastProcessedIndex() external view returns (uint256) { return DividendTokenDividendTracker(dividendTracker).getLastProcessedIndex(); } function getNumberOfDividendTokenHolders() external view returns (uint256) { return DividendTokenDividendTracker(dividendTracker).getNumberOfTokenHolders(); } function _transfer( address from, address to, uint256 amount ) internal override { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); require(amount>0, "ERC20: transfer zero amount"); if (!swapping && antiBotEnabled && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) { IGemAntiBot(gemAntiBot).onPreTransferCheck(from, to, amount); } uint256 contractTokenBalance = balanceOf(address(this)); bool canSwap = contractTokenBalance >= swapTokensAtAmount; if ( canSwap && !swapping && !automatedMarketMakerPairs[from] && from != owner() && to != owner() ) { swapping = true; if(_marketingFeeTokens>0) swapAndSendToFee(_marketingFeeTokens); if(_liquidityFeeTokens>0) swapAndLiquify(_liquidityFeeTokens); uint256 sellTokens = balanceOf(address(this)); if(sellTokens>0) swapAndSendDividends(sellTokens); _marketingFeeTokens=0; _liquidityFeeTokens=0; swapping = false; } bool takeFee = !swapping; if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) { takeFee = false; } uint256 _liquidityFee; uint256 _marketingFee; uint256 _rewardFee; if (takeFee) { if (automatedMarketMakerPairs[from]) { _rewardFee = amount*(buyRewardFee)/(1000); _liquidityFee = amount*(buyLiquidityFee)/(1000); _marketingFee = amount*(buyMarketingFee)/(1000); } else if (automatedMarketMakerPairs[to]) { _rewardFee = amount*(sellRewardFee)/(1000); _liquidityFee = amount*(sellLiquidityFee)/(1000); _marketingFee = amount*(sellMarketingFee)/(1000); } _liquidityFeeTokens = _liquidityFeeTokens+_liquidityFee; _marketingFeeTokens = _marketingFeeTokens+_marketingFee; uint256 _feeTotal=_rewardFee+_liquidityFee+_marketingFee; amount=amount-(_feeTotal); if(_feeTotal>0) super._transfer(from, address(this), _feeTotal); } super._transfer(from, to, amount); try DividendTokenDividendTracker(dividendTracker).setBalance(payable(from), balanceOf(from)) {} catch {} try DividendTokenDividendTracker(dividendTracker).setBalance(payable(to), balanceOf(to)) {} catch {} if (!swapping) { if (!isExcludedFromMaxTransactionAmount[from]) { require( amount < maxTransactionAmount, "ERC20: exceeds transfer limit" ); } if (!isExcludedFromMaxTransactionAmount[to]) { require( balanceOf(to) < maxWallet, "ERC20: exceeds max wallet limit" ); } uint256 gas = gasForProcessing; try DividendTokenDividendTracker(dividendTracker).process(gas) returns ( uint256 iterations, uint256 claims, uint256 lastProcessedIndex ) { emit ProcessedDividendTracker( iterations, claims, lastProcessedIndex, true, gas, msg.sender ); } catch {} } } function swapAndSendToFee(uint256 tokens) private { if(tokenForMarketingFee==rewardToken){ uint256 initialCAKEBalance = IERC20(rewardToken).balanceOf( address(this) ); swapTokensForCake(tokens); uint256 newBalance = (IERC20(rewardToken).balanceOf(address(this)))-( initialCAKEBalance ); IERC20(rewardToken).safeTransfer(_marketingWalletAddress, newBalance); }else if(tokenForMarketingFee==baseTokenForPair){ uint256 initialBalance = baseTokenForPair==IUniswapV2Router02(uniswapV2Router).WETH() ? address(this).balance : IERC20(baseTokenForPair).balanceOf(address(this)); swapTokensForBaseToken(tokens); uint256 newBalance = baseTokenForPair==IUniswapV2Router02(uniswapV2Router).WETH() ? address(this).balance-initialBalance : IERC20(baseTokenForPair).balanceOf(address(this))-initialBalance; if(baseTokenForPair==IUniswapV2Router02(uniswapV2Router).WETH()){ (bool success, )=address(_marketingWalletAddress).call{value: newBalance}(""); }else{ IERC20(baseTokenForPair).safeTransfer(_marketingWalletAddress, newBalance); } }else{ _transfer(address(this), _marketingWalletAddress, tokens); } } function swapAndLiquify(uint256 tokens) private { uint256 half = tokens/(2); uint256 otherHalf = tokens-(half); uint256 initialBalance = baseTokenForPair==IUniswapV2Router02(uniswapV2Router).WETH() ? address(this).balance : IERC20(baseTokenForPair).balanceOf(address(this)); swapTokensForBaseToken(half); uint256 newBalance = baseTokenForPair==IUniswapV2Router02(uniswapV2Router).WETH() ? address(this).balance-initialBalance : IERC20(baseTokenForPair).balanceOf(address(this))-initialBalance; addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } function swapTokensForBaseToken(uint256 tokenAmount) private { address[] memory path = new address[](2); path[0] = address(this); path[1] = baseTokenForPair; if (path[1] == IUniswapV2Router02(uniswapV2Router).WETH()){ IUniswapV2Router02(uniswapV2Router).swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of BaseToken path, address(this), block.timestamp ); }else{ uniswapV2Caller.swapExactTokensForTokensSupportingFeeOnTransferTokens( uniswapV2Router, tokenAmount, 0, // accept any amount of BaseToken path, block.timestamp ); } } function swapTokensForCake(uint256 tokenAmount) private { if(baseTokenForPair!=rewardToken){ address[] memory path = new address[](3); path[0] = address(this); path[1] = baseTokenForPair; path[2] = rewardToken; IUniswapV2Router02(uniswapV2Router).swapExactTokensForTokensSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); }else{ address[] memory path = new address[](2); path[0] = address(this); path[1] = rewardToken; uniswapV2Caller.swapExactTokensForTokensSupportingFeeOnTransferTokens( uniswapV2Router, tokenAmount, 0, // accept any amount of BaseToken path, block.timestamp ); } } function addLiquidity(uint256 tokenAmount, uint256 baseTokenAmount) private { if (baseTokenForPair == IUniswapV2Router02(uniswapV2Router).WETH()) IUniswapV2Router02(uniswapV2Router).addLiquidityETH{value: baseTokenAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable address(0xdead), block.timestamp ); else{ IUniswapV2Router02(uniswapV2Router).addLiquidity( address(this), baseTokenForPair, tokenAmount, baseTokenAmount, 0, 0, address(0xdead), block.timestamp ); } } function swapAndSendDividends(uint256 tokens) private { swapTokensForCake(tokens); uint256 dividends = IERC20(rewardToken).balanceOf(address(this)); IERC20(rewardToken).safeTransfer( dividendTracker, dividends ); DividendTokenDividendTracker(dividendTracker).distributeCAKEDividends(dividends); emit SendDividends(tokens, dividends); } function withdrawETH() external onlyOwner { (bool success, )=address(owner()).call{value: address(this).balance}(""); require(success, "Failed in withdrawal"); } function withdrawToken(address token) external onlyOwner{ require(address(this) != token, "Not allowed"); IERC20(token).safeTransfer(owner(), IERC20(token).balanceOf(address(this))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"},{"internalType":"uint256","name":"_maxTransactionAmount","type":"uint256"},{"internalType":"address[6]","name":"addrs","type":"address[6]"},{"internalType":"uint16[6]","name":"feeSettings","type":"uint16[6]"},{"internalType":"uint256","name":"minimumTokenBalanceForDividends_","type":"uint256"},{"internalType":"uint8","name":"_tokenForMarketingFee","type":"uint8"}],"stateMutability":"payable","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":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"}],"name":"MarketingWalletUpdated","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":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newTokenForMarketingFee","type":"address"},{"indexed":true,"internalType":"address","name":"oldTokenForMarketingFee","type":"address"}],"name":"TokenForMarketingFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newSellLiquidityFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newBuyLiquidityFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldSellLiquidityFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldBuyLiquidityFee","type":"uint16"}],"name":"UpdateLiquidityFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newSellMarketingFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newBuyMarketingFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldSellMarketingFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldBuyMarketingFee","type":"uint16"}],"name":"UpdateMarketingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxTransactionAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxTransactionAmount","type":"uint256"}],"name":"UpdateMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxWallet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxWallet","type":"uint256"}],"name":"UpdateMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newSellRewardFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newBuyRewardFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldSellRewardFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldBuyRewardFee","type":"uint16"}],"name":"UpdateRewardFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSwapTokensAtAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldSwapTokensAtAmount","type":"uint256"}],"name":"UpdateSwapTokensAtAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"_marketingWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiBotEnabled","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenForPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeContract","outputs":[{"internalType":"contract IFee","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gemAntiBot","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled_","type":"bool"}],"name":"setUsingAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","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":"tokenForMarketingFee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"uniswapV2Caller","outputs":[{"internalType":"contract IUniswapV2Caller","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_buyLiquidityFee","type":"uint16"}],"name":"updateLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_buyMarketingFee","type":"uint16"}],"name":"updateMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransactionAmount","type":"uint256"}],"name":"updateMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellRewardFee","type":"uint16"},{"internalType":"uint16","name":"_buyRewardFee","type":"uint16"}],"name":"updateRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenForMarketingFee","type":"address"}],"name":"updateTokenForMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_baseTokenForPair","type":"address"}],"name":"updateUniswapV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405260405162006ac938038062006ac9833981016040819052620000269162001644565b89896003620000368382620017b2565b506004620000458282620017b2565b505050620000626200005c62000e2160201b60201c565b62000e25565b604051636944d6f160e11b81526003600482015273fd6439aeff9d2389856b7486b9e74a6dacadcdce9063d289ade29034906024016000604051808303818588803b158015620000b157600080fd5b505af1158015620000c6573d6000803e3d6000fd5b50506007805460ff60a81b1916600160a81b60ff8e160217905550508451600c80546001600160a01b0319166001600160a01b03928316179055604080870151600e80546001600160601b03166c01000000000000000000000000928516830217908190559151600094509104909116907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc67908390a360a0840151600780546001600160a01b039092166001600160a01b0319909216821790556040516318e02bd960e01b81523360048201526318e02bd990602401600060405180830381600087803b158015620001b757600080fd5b505af1158015620001cc573d6000803e3d6000fd5b50506007805460ff60a01b1916600160a01b1790555050608084810151600880546001600160a01b0319166001600160a01b039092169190911790558351600e805460208088015163ffffffff60201b1990921661ffff94851664010000000090810261ffff60301b191691909117660100000000000093861684021793849055604080519185048616825292909304909316928201929092526000818301819052606082015290517f95c5c99557725e816faf752c6675d63483841c28a7a009ed792470a9cb4dea23929181900390910190a1604083810151600e805460608088015163ffffffff60401b1990921661ffff9485166801000000000000000090810261ffff60501b1916919091176a01000000000000000000009386168402179384905585519084048516815291909204909216602083015260008284018190529082015290517f1d6b62961d401d548eb1549c97109c0b905ccd7af9c3777d3076cc8438fdfe659181900360800190a1608083810151600e805460a087015161ffff93841663ffffffff19909216821762010000918516820290811793849055604080519186169093178152920490921660208201526000818301819052606082015290517f0a21d45dab14d5d2f53ae98d95d951cd627fcf1b5bc485174326568b5e0a4572929181900390910190a1600e5460c89061ffff80821691620003ee9168010000000000000000820481169164010000000090041662001894565b620003fa919062001894565b61ffff161115620004445760405162461bcd60e51b815260206004820152600f60248201526e73656c6c20666565203c3d2032302560881b60448201526064015b60405180910390fd5b600e5460c89061ffff6201000082048116916200047d916a01000000000000000000008204811691660100000000000090041662001894565b62000489919062001894565b61ffff161115620004ce5760405162461bcd60e51b815260206004820152600e60248201526d62757920666565203c3d2032302560901b60448201526064016200043b565b8060ff16600003620004f257600680546001600160a01b0319163017905562000549565b8060ff166001036200052657600854600680546001600160a01b0319166001600160a01b0390921691909117905562000549565b600c54600680546001600160a01b0319166001600160a01b039092169190911790555b6006546040516000916001600160a01b0316907fe2b5774aa87aa100c6ec40513e7bc1d6f3c22e7abfdcd1e87401c3c791bde9ae908390a36200058f61271088620018b9565b600d81905560408051918252600060208301527f1d3afd1a2942d06995fdb024306050a7b24ad00572be70ce8b1bea325780d28b910160405180910390a1620493e0600f819055604051600091907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db7908390a36200061f846003602002015162000e7760201b62002e061760201c565b600b80546001600160a01b0319166001600160a01b03929092169182179055604051600091907f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a8908390a3600b54600c5460405163cd6dc68760e01b81526001600160a01b0391821660048201526024810185905291169063cd6dc68790604401600060405180830381600087803b158015620006bb57600080fd5b505af1158015620006d0573d6000803e3d6000fd5b5050505061271087620006e49190620018b9565b8510156200074a5760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b60648201526084016200043b565b6200075861271088620018b9565b861015620007b35760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b60648201526084016200043b565b601086905560408051878152600060208201527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601185905560408051868152600060208201527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1602084810151600980546001600160a01b0319166001600160a01b039092169182179055604080516315ab88c960e31b81529051919263ad5c4648926004808401938290030181865afa1580156200088b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008b19190620018dc565b6008546001600160a01b03908116911614620009465760085460095460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156200091e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000944919062001901565b505b6200096930731ccfe8c40ef259566433716002e379dfffbf5a3e60001962000f26565b600954620009859030906001600160a01b031660001962000f26565b6009546040516000916001600160a01b0316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e908390a3600960009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000a11573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a379190620018dc565b6008546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000a89573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000aaf9190620018dc565b600a80546001600160a01b0319166001600160a01b0392909216918217905562000adb9060016200104e565b600b5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b15801562000b2257600080fd5b505af115801562000b37573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b15801562000b8157600080fd5b505af115801562000b96573d6000803e3d6000fd5b5050600b546001600160a01b031691506331e79db0905062000bc06005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801562000c0257600080fd5b505af115801562000c17573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b15801562000c6357600080fd5b505af115801562000c78573d6000803e3d6000fd5b5050600b5460095460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b15801562000cc657600080fd5b505af115801562000cdb573d6000803e3d6000fd5b5050505062000cfb62000cf36200125360201b60201c565b600162001262565b600e5462000d24906c0100000000000000000000000090046001600160a01b0316600162001262565b62000d3130600162001262565b62000d4061dead600162001262565b601360208190527f2264e2d7bacabe6058f5009f42467b9be28015e7760f87409562384c94ac271c805460ff19908116600190811790925530600090815260408082208054841685179055600e546c0100000000000000000000000090046001600160a01b0316825281208054909216831790915590919062000dcb6005546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905562000e1162000e0a6005546001600160a01b031690565b8862001373565b5050505050505050505062001941565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b03811662000f215760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c65640000000000000000000060448201526064016200043b565b919050565b6001600160a01b03831662000f8a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200043b565b6001600160a01b03821662000fed5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200043b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821660009081526016602052604090205481151560ff909116151503620010e65760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084016200043b565b6001600160a01b038216600090815260166020908152604080832080548515801560ff19928316811790935560139094529190932080549091169092179091558190620011a15750600b5460405163c705c56960e01b81526001600160a01b0384811660048301529091169063c705c56990602401602060405180830381865afa15801562001179573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200119f919062001901565b155b156200120957600b5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015620011ef57600080fd5b505af115801562001204573d6000803e3d6000fd5b505050505b816001600160a01b03167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab8260405162001247911515815260200190565b60405180910390a25050565b6005546001600160a01b031690565b6005546001600160a01b03163314620012be5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200043b565b6001600160a01b03821660009081526012602052604090205481151560ff9091161515036200131a5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b60448201526064016200043b565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910162001247565b6001600160a01b038216620013cb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200043b565b8060026000828254620013df919062001925565b90915550506001600160a01b038216600090815260208190526040812080548392906200140e90849062001925565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200149857620014986200145d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620014c957620014c96200145d565b604052919050565b600082601f830112620014e357600080fd5b81516001600160401b03811115620014ff57620014ff6200145d565b602062001515601f8301601f191682016200149e565b82815285828487010111156200152a57600080fd5b60005b838110156200154a5785810183015182820184015282016200152d565b506000928101909101919091529392505050565b805160ff8116811462000f2157600080fd5b80516001600160a01b038116811462000f2157600080fd5b600082601f8301126200159a57600080fd5b620015a462001473565b8060c0840185811115620015b757600080fd5b845b81811015620015dc57620015cd8162001570565b845260209384019301620015b9565b509095945050505050565b600082601f830112620015f957600080fd5b6200160362001473565b8060c08401858111156200161657600080fd5b845b81811015620015dc57805161ffff81168114620016355760008081fd5b84526020938401930162001618565b6000806000806000806000806000806102808b8d0312156200166557600080fd5b8a516001600160401b03808211156200167d57600080fd5b6200168b8e838f01620014d1565b9b5060208d0151915080821115620016a257600080fd5b50620016b18d828e01620014d1565b995050620016c260408c016200155e565b975060608b0151965060808b0151955060a08b01519450620016e88c60c08d0162001588565b9350620016fa8c6101808d01620015e7565b92506102408b01519150620017136102608c016200155e565b90509295989b9194979a5092959850565b600181811c908216806200173957607f821691505b6020821081036200175a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200145857600081815260208120601f850160051c81016020861015620017895750805b601f850160051c820191505b81811015620017aa5782815560010162001795565b505050505050565b81516001600160401b03811115620017ce57620017ce6200145d565b620017e681620017df845462001724565b8462001760565b602080601f8311600181146200181e5760008415620018055750858301515b600019600386901b1c1916600185901b178555620017aa565b600085815260208120601f198616915b828110156200184f578886015182559484019460019091019084016200182e565b50858210156200186e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b61ffff818116838216019080821115620018b257620018b26200187e565b5092915050565b600082620018d757634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215620018ef57600080fd5b620018fa8262001570565b9392505050565b6000602082840312156200191457600080fd5b81518015158114620018fa57600080fd5b808201808211156200193b576200193b6200187e565b92915050565b61517880620019516000396000f3fe6080604052600436106104145760003560e01c80638da5cb5b1161021e578063c8c8ebe411610123578063e9481eee116100ab578063f27fd2541161007a578063f27fd25414610d00578063f2fde38b14610d20578063f637434214610d40578063f7c618c114610d63578063f8b45b0514610d8357600080fd5b8063e9481eee14610c6e578063e98030c714610c9e578063f0a568c014610cbe578063f11a24d314610cde57600080fd5b8063dd62ed3e116100f2578063dd62ed3e14610bcd578063de0aad5314610c13578063e086e5ec14610c2e578063e2f4560514610c43578063e7841ec014610c5957600080fd5b8063c8c8ebe414610b56578063cf089e1314610b6c578063d68f8cde14610b8c578063d8c6404b14610bac57600080fd5b8063a8b9d240116101a6578063afa4f3b211610175578063afa4f3b214610ab1578063b62496f514610ad1578063bdd4f29f14610b01578063c024666814610b16578063c705c56914610b3657600080fd5b8063a8b9d240146109ec578063a9059cbb14610a0c578063aa49802314610a2c578063ad56c13c14610a4c57600080fd5b806395d89b41116101ed57806395d89b411461096c5780639a7a23d6146109815780639c1b8af5146109a1578063a26579ad146109b7578063a457c2d7146109cc57600080fd5b80638da5cb5b146108ec57806391c1004a1461090a578063921369131461092a578063948384dc1461094c57600080fd5b80634144d9e41161032457806370a08231116102ac5780637c75ad3a1161027b5780637c75ad3a146108445780637cf84bd71461086c578063871c128d1461088c57806388bdd9be146108ac57806389476069146108cc57600080fd5b806370a08231146107b7578063715018a6146107ed57806377ec7449146108025780637bce5a041461082257600080fd5b80635d098b38116102f35780635d098b381461072257806364b0f6531461074257806365b8dbc0146107575780636843cd8414610777578063700bb1911461079757600080fd5b80634144d9e41461068d57806349bd5a5e146106b45780634e71d92d146106d45780634fbee193146106e957600080fd5b806323b872dd116103a757806330bb4cff1161037657806330bb4cff146105ec578063313ce5671461060157806331e79db01461062d578063395093511461064d5780633ad3e6ff1461066d57600080fd5b806323b872dd1461056c5780632ae2f1211461058c5780632c1f5216146105ac5780632d5fd55a146105cc57600080fd5b80630dcb2e89116103e35780630dcb2e89146104eb5780631694505e1461050d57806318160ddd1461052d5780631c499ab01461054c57600080fd5b806306e297121461042057806306fdde0314610465578063095ea7b3146104875780630cfe2f3f146104b757600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b5061044873fd6439aeff9d2389856b7486b9e74a6dacadcdce81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561047157600080fd5b5061047a610d99565b60405161045c9190614ba4565b34801561049357600080fd5b506104a76104a2366004614bec565b610e2b565b604051901515815260200161045c565b3480156104c357600080fd5b50600e546104d89062010000900461ffff1681565b60405161ffff909116815260200161045c565b3480156104f757600080fd5b5061050b610506366004614c18565b610e45565b005b34801561051957600080fd5b50600954610448906001600160a01b031681565b34801561053957600080fd5b506002545b60405190815260200161045c565b34801561055857600080fd5b5061050b610567366004614c18565b610eda565b34801561057857600080fd5b506104a7610587366004614c31565b610fb5565b34801561059857600080fd5b5061050b6105a7366004614c80565b610fdb565b3480156105b857600080fd5b50600b54610448906001600160a01b031681565b3480156105d857600080fd5b5061050b6105e7366004614cb9565b6110a5565b3480156105f857600080fd5b5061053e6110ed565b34801561060d57600080fd5b50600754600160a81b900460ff1660405160ff909116815260200161045c565b34801561063957600080fd5b5061050b610648366004614cd6565b611160565b34801561065957600080fd5b506104a7610668366004614bec565b6111bc565b34801561067957600080fd5b50600654610448906001600160a01b031681565b34801561069957600080fd5b50600e5461044890600160601b90046001600160a01b031681565b3480156106c057600080fd5b50600a54610448906001600160a01b031681565b3480156106e057600080fd5b5061050b6111fb565b3480156106f557600080fd5b506104a7610704366004614cd6565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561072e57600080fd5b5061050b61073d366004614cd6565b611273565b34801561074e57600080fd5b5061053e61133f565b34801561076357600080fd5b5061050b610772366004614cd6565b611389565b34801561078357600080fd5b5061053e610792366004614cd6565b611754565b3480156107a357600080fd5b5061050b6107b2366004614c18565b6117c4565b3480156107c357600080fd5b5061053e6107d2366004614cd6565b6001600160a01b031660009081526020819052604090205490565b3480156107f957600080fd5b5061050b611896565b34801561080e57600080fd5b50600754610448906001600160a01b031681565b34801561082e57600080fd5b50600e546104d890600160501b900461ffff1681565b34801561085057600080fd5b50610448731ccfe8c40ef259566433716002e379dfffbf5a3e81565b34801561087857600080fd5b50600854610448906001600160a01b031681565b34801561089857600080fd5b5061050b6108a7366004614c18565b6118cc565b3480156108b857600080fd5b5061050b6108c7366004614cd6565b611a0e565b3480156108d857600080fd5b5061050b6108e7366004614cd6565b611df7565b3480156108f857600080fd5b506005546001600160a01b0316610448565b34801561091657600080fd5b5061050b610925366004614cd6565b611ef5565b34801561093657600080fd5b50600e546104d890600160401b900461ffff1681565b34801561095857600080fd5b5061050b610967366004614d05565b612143565b34801561097857600080fd5b5061047a612292565b34801561098d57600080fd5b5061050b61099c366004614c80565b6122a1565b3480156109ad57600080fd5b5061053e600f5481565b3480156109c357600080fd5b5061053e61235d565b3480156109d857600080fd5b506104a76109e7366004614bec565b6123a7565b3480156109f857600080fd5b5061053e610a07366004614cd6565b612444565b348015610a1857600080fd5b506104a7610a27366004614bec565b612477565b348015610a3857600080fd5b5061050b610a47366004614c18565b612485565b348015610a5857600080fd5b50610a6c610a67366004614cd6565b61256b565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161045c565b348015610abd57600080fd5b5061050b610acc366004614c18565b612606565b348015610add57600080fd5b506104a7610aec366004614cd6565b60166020526000908152604090205460ff1681565b348015610b0d57600080fd5b5061053e6126bb565b348015610b2257600080fd5b5061050b610b31366004614c80565b612705565b348015610b4257600080fd5b506104a7610b51366004614cd6565b6127c7565b348015610b6257600080fd5b5061053e60115481565b348015610b7857600080fd5b5061050b610b87366004614d05565b612836565b348015610b9857600080fd5b5061050b610ba7366004614d05565b61299a565b348015610bb857600080fd5b506007546104a790600160a01b900460ff1681565b348015610bd957600080fd5b5061053e610be8366004614d38565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610c1f57600080fd5b50600e546104d89061ffff1681565b348015610c3a57600080fd5b5061050b612afe565b348015610c4f57600080fd5b5061053e600d5481565b348015610c6557600080fd5b5061053e612bd3565b348015610c7a57600080fd5b506104a7610c89366004614cd6565b60136020526000908152604090205460ff1681565b348015610caa57600080fd5b5061050b610cb9366004614c18565b612c1d565b348015610cca57600080fd5b5061050b610cd9366004614cd6565b612c78565b348015610cea57600080fd5b50600e546104d890600160301b900461ffff1681565b348015610d0c57600080fd5b50610a6c610d1b366004614c18565b612d2c565b348015610d2c57600080fd5b5061050b610d3b366004614cd6565b612d6e565b348015610d4c57600080fd5b50600e546104d890640100000000900461ffff1681565b348015610d6f57600080fd5b50600c54610448906001600160a01b031681565b348015610d8f57600080fd5b5061053e60105481565b606060038054610da890614d66565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd490614d66565b8015610e215780601f10610df657610100808354040283529160200191610e21565b820191906000526020600020905b815481529060010190602001808311610e0457829003601f168201915b5050505050905090565b600033610e39818585612ea3565b60019150505b92915050565b6005546001600160a01b03163314610e785760405162461bcd60e51b8152600401610e6f90614da0565b60405180910390fd5b600b54604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e89906024015b600060405180830381600087803b158015610ebf57600080fd5b505af1158015610ed3573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610f045760405162461bcd60e51b8152600401610e6f90614da0565b612710610f1060025490565b610f1a9190614deb565b811015610f735760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b6064820152608401610e6f565b6010546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601055565b600033610fc3858285612fc7565b610fce858585613059565b60019150505b9392505050565b6005546001600160a01b031633146110055760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b03821660009081526013602052604090205481151560ff9091161515036110455760405162461bcd60e51b8152600401610e6f90614e0d565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b6005546001600160a01b031633146110cf5760405162461bcd60e51b8152600401610e6f90614da0565b60078054911515600160a01b0260ff60a01b19909216919091179055565b600b54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b9190614e2e565b905090565b6005546001600160a01b0316331461118a5760405162461bcd60e51b8152600401610e6f90614da0565b600b5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610ea5565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610e3990829086906111f6908790614e47565b612ea3565b600b5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561124c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112709190614e5a565b50565b6005546001600160a01b0316331461129d5760405162461bcd60e51b8152600401610e6f90614da0565b600e546001600160a01b03808316600160601b90920416036112d15760405162461bcd60e51b8152600401610e6f90614e0d565b600e546040516001600160a01b0380841692600160601b900416907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600e80546001600160a01b03909216600160601b026bffffffffffffffffffffffff909216919091179055565b600b54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b031633146113b35760405162461bcd60e51b8152600401610e6f90614da0565b6009546001600160a01b039081169082160361141d5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610e6f565b6009546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba9190614e77565b6008546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f9190614e77565b600a80546001600160a01b039283166001600160a01b031991821617909155600980549284169290911682179055604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc9190614e77565b6008546001600160a01b0390811691161461164d5760085460095460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164b9190614e5a565b505b6009546116679030906001600160a01b0316600019612ea3565b600b5460095460405163c705c56960e01b81526001600160a01b03918216600482015291169063c705c56990602401602060405180830381865afa1580156116b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d79190614e5a565b61173d57600b5460095460405163031e79db60e41b81526001600160a01b0391821660048201529116906331e79db090602401600060405180830381600087803b15801561172457600080fd5b505af1158015611738573d6000803e3d6000fd5b505050505b600a54611270906001600160a01b031660016137bc565b600b546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3f9190614e2e565b600b546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183b9190614e94565b604080518481526020810184905290810182905260608101889052929550909350915033906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146118c05760405162461bcd60e51b8152600401610e6f90614da0565b6118ca60006139ab565b565b6005546001600160a01b031633146118f65760405162461bcd60e51b8152600401610e6f90614da0565b62030d40811015801561190c57506207a1208111155b6119755760405162461bcd60e51b815260206004820152603460248201527f676173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b6064820152608401610e6f565b600f5481036119db5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610e6f565b600f5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3600f55565b6005546001600160a01b03163314611a385760405162461bcd60e51b8152600401610e6f90614da0565b600b546001600160a01b0390811690821603611aac5760405162461bcd60e51b815260206004820152602d60248201527f546865206469766964656e6420747261636b657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610e6f565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1d9190614e77565b6001600160a01b031614611bad5760405162461bcd60e51b815260206004820152604b60248201527f546865206e6577206469766964656e6420747261636b6572206d75737420626560448201527f206f776e656420627920746865204449564944454e4544544f4b454e20746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a401610e6f565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611bef57600080fd5b505af1158015611c03573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611c4857600080fd5b505af1158015611c5c573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611c816005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611cc257600080fd5b505af1158015611cd6573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d2157600080fd5b505af1158015611d35573d6000803e3d6000fd5b5050600a5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d8057600080fd5b505af1158015611d94573d6000803e3d6000fd5b5050600b546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600b80546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03163314611e215760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b0381163003611e675760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610e6f565b611270611e7c6005546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee49190614e2e565b6001600160a01b03841691906139fd565b6005546001600160a01b03163314611f1f5760405162461bcd60e51b8152600401610e6f90614da0565b600880546001600160a01b0319166001600160a01b03838116919091179091556009546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa158015611f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa59190614e77565b6008546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201a9190614e77565b600a80546001600160a01b0319166001600160a01b03928316179055600954604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c9190614e77565b6008546001600160a01b0390811691161461173d5760085460095460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015612107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212b9190614e5a565b50600a54611270906001600160a01b031660016137bc565b6005546001600160a01b0316331461216d5760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff600160401b8204811691612194916401000000009091041685614ec2565b61219e9190614ec2565b61ffff1611156121c05760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff600160501b82048116916121e691600160301b9091041684614ec2565b6121f09190614ec2565b61ffff1611156122125760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff8581168252848116602083015280841682840152620100009093049092166060830152517f0a21d45dab14d5d2f53ae98d95d951cd627fcf1b5bc485174326568b5e0a45729181900360800190a1600e805461ffff928316620100000263ffffffff199091169290931691909117919091179055565b606060048054610da890614d66565b6005546001600160a01b031633146122cb5760405162461bcd60e51b8152600401610e6f90614da0565b600a546001600160a01b039081169083160361234f5760405162461bcd60e51b815260206004820152603e60248201527f546865206d61696e20706169722063616e6e6f742062652072656d6f7665642060448201527f66726f6d206175746f6d617465644d61726b65744d616b6572506169727300006064820152608401610e6f565b61235982826137bc565b5050565b600b5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561242c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e6f565b6124398286868403612ea3565b506001949350505050565b600b546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611783565b600033610e39818585613059565b6005546001600160a01b031633146124af5760405162461bcd60e51b8152600401610e6f90614da0565b6127106124bb60025490565b6124c59190614deb565b8110156125295760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b6064820152608401610e6f565b6011546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601155565b600b5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156125c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125eb9190614f35565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146126305760405162461bcd60e51b8152600401610e6f90614da0565b600081116126795760405162461bcd60e51b8152602060048201526016602482015275073776170546f6b656e734174416d6f756e74203e20360541b6044820152606401610e6f565b600d546040805183815260208101929092527f1d3afd1a2942d06995fdb024306050a7b24ad00572be70ce8b1bea325780d28b910160405180910390a1600d55565b600b5460408051632f842d8560e21b815290516000926001600160a01b03169163be10b6149160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b0316331461272f5760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b03821660009081526012602052604090205481151560ff90911615150361276f5760405162461bcd60e51b8152600401610e6f90614e0d565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611099565b600b5460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa158015612812573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3f9190614e5a565b6005546001600160a01b031633146128605760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff80821691612881916401000000009091041685614ec2565b61288b9190614ec2565b61ffff1611156128ad5760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff6201000082048116916128d291600160301b9091041684614ec2565b6128dc9190614ec2565b61ffff1611156128fe5760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff85811682528481166020830152600160401b8404811682840152600160501b9093049092166060830152517f1d6b62961d401d548eb1549c97109c0b905ccd7af9c3777d3076cc8438fdfe659181900360800190a1600e80546bffffffff00000000000000001916600160401b61ffff9485160261ffff60501b191617600160501b9290931691909102919091179055565b6005546001600160a01b031633146129c45760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff808216916129e491600160401b9091041685614ec2565b6129ee9190614ec2565b61ffff161115612a105760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff620100008204811691612a3591600160501b9091041684614ec2565b612a3f9190614ec2565b61ffff161115612a615760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff858116825284811660208301526401000000008404811682840152600160301b9093049092166060830152517f95c5c99557725e816faf752c6675d63483841c28a7a009ed792470a9cb4dea239181900360800190a1600e805467ffffffff00000000191664010000000061ffff9485160267ffff000000000000191617600160301b9290931691909102919091179055565b6005546001600160a01b03163314612b285760405162461bcd60e51b8152600401610e6f90614da0565b6000612b3c6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114612b86576040519150601f19603f3d011682016040523d82523d6000602084013e612b8b565b606091505b50509050806112705760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610e6f565b600b546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b03163314612c475760405162461bcd60e51b8152600401610e6f90614da0565b600b5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610ea5565b6005546001600160a01b03163314612ca25760405162461bcd60e51b8152600401610e6f90614da0565b6006546001600160a01b03808316911603612ccf5760405162461bcd60e51b8152600401610e6f90614e0d565b6006546040516001600160a01b03918216918316907fe2b5774aa87aa100c6ec40513e7bc1d6f3c22e7abfdcd1e87401c3c791bde9ae90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600b54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016125a9565b6005546001600160a01b03163314612d985760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b038116612dfd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e6f565b611270816139ab565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116612e9e5760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610e6f565b919050565b6001600160a01b038316612f055760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e6f565b6001600160a01b038216612f665760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e6f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461305357818110156130465760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e6f565b6130538484848403612ea3565b50505050565b6001600160a01b03831661307f5760405162461bcd60e51b8152600401610e6f90614f9f565b6001600160a01b0382166130a55760405162461bcd60e51b8152600401610e6f90614fe4565b600081116130f55760405162461bcd60e51b815260206004820152601b60248201527f45524332303a207472616e73666572207a65726f20616d6f756e7400000000006044820152606401610e6f565b600a54600160a01b900460ff161580156131185750600754600160a01b900460ff165b801561313d57506001600160a01b03831660009081526012602052604090205460ff16155b801561316257506001600160a01b03821660009081526012602052604090205460ff16155b156131d65760075460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b1580156131bd57600080fd5b505af11580156131d1573d6000803e3d6000fd5b505050505b30600090815260208190526040902054600d54811080159081906132045750600a54600160a01b900460ff16155b801561322957506001600160a01b03851660009081526016602052604090205460ff16155b801561324357506005546001600160a01b03868116911614155b801561325d57506005546001600160a01b03858116911614155b156132d357600a805460ff60a01b1916600160a01b1790556015541561328857613288601554613a54565b6014541561329b5761329b601454613edb565b3060009081526020819052604090205480156132ba576132ba81614160565b5060006015819055601455600a805460ff60a01b191690555b600a546001600160a01b03861660009081526012602052604090205460ff600160a01b90920482161591168061332157506001600160a01b03851660009081526012602052604090205460ff165b1561332a575060005b600080600083156134c4576001600160a01b03891660009081526016602052604090205460ff16156133d457600e546103e8906133719062010000900461ffff1689615027565b61337b9190614deb565b600e549091506103e89061339a90600160301b900461ffff1689615027565b6133a49190614deb565b600e549093506103e8906133c390600160501b900461ffff1689615027565b6133cd9190614deb565b915061346a565b6001600160a01b03881660009081526016602052604090205460ff161561346a57600e546103e89061340a9061ffff1689615027565b6134149190614deb565b600e549091506103e89061343490640100000000900461ffff1689615027565b61343e9190614deb565b600e549093506103e89061345d90600160401b900461ffff1689615027565b6134679190614deb565b91505b826014546134789190614e47565b601455601554613489908390614e47565b6015556000826134998584614e47565b6134a39190614e47565b90506134af818961503e565b975080156134c2576134c28a3083614292565b505b6134cf898989614292565b600b546001600160a01b031663e30443bc8a613500816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561354657600080fd5b505af1925050508015613557575060015b50600b546001600160a01b031663e30443bc89613589816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156135cf57600080fd5b505af19250505080156135e0575060015b50600a54600160a01b900460ff166137b1576001600160a01b03891660009081526013602052604090205460ff166136635760115487106136635760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610e6f565b6001600160a01b03881660009081526013602052604090205460ff166136ec576010546001600160a01b038916600090815260208190526040902054106136ec5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610e6f565b600f54600b546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613759575060408051601f3d908101601f1916820190925261375691810190614e94565b60015b156137af5760408051848152602081018490529081018290526060810185905233906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050505050565b6001600160a01b03821660009081526016602052604090205481151560ff9091161515036138525760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610e6f565b6001600160a01b038216600090815260166020908152604080832080548515801560ff199283168117909355601390945291909320805490911690921790915581906139095750600b5460405163c705c56960e01b81526001600160a01b0384811660048301529091169063c705c56990602401602060405180830381865afa1580156138e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139079190614e5a565b155b1561396e57600b5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561395557600080fd5b505af1158015613969573d6000803e3d6000fd5b505050505b816001600160a01b03167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82604051611099911515815260200190565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613a4f9084906143e6565b505050565b600c546006546001600160a01b03918216911603613b8657600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad99190614e2e565b9050613ae4826144b8565b600c546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a0823190602401602060405180830381865afa158015613b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b559190614e2e565b613b5f919061503e565b600e54600c54919250613a4f916001600160a01b0390811691600160601b900416836139fd565b6008546006546001600160a01b03918216911603613ebc57600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614e77565b6008546001600160a01b03908116911614613c92576008546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8d9190614e2e565b613c94565b475b9050613c9f826146a5565b600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d0d9190614e77565b6008546001600160a01b03908116911614613d9d576008546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa158015613d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d8e9190614e2e565b613d98919061503e565b613da7565b613da7824761503e565b9050600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e209190614e77565b6008546001600160a01b03918216911603613e9757600e54604051600091600160601b90046001600160a01b03169083908381818185875af1925050503d8060008114613e89576040519150601f19603f3d011682016040523d82523d6000602084013e613e8e565b606091505b50505050505050565b600e54600854613a4f916001600160a01b0391821691600160601b90910416836139fd565b600e54611270903090600160601b90046001600160a01b031683613059565b6000613ee8600283614deb565b90506000613ef6828461503e565b90506000600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f719190614e77565b6008546001600160a01b03908116911614613ff7576008546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff29190614e2e565b613ff9565b475b9050614004836146a5565b600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614e77565b6008546001600160a01b03908116911614614102576008546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa1580156140cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140f39190614e2e565b6140fd919061503e565b61410c565b61410c824761503e565b9050614118838261483e565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b614169816144b8565b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156141b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d69190614e2e565b600b54600c549192506141f6916001600160a01b039081169116836139fd565b600b5460405163ba72a95560e01b8152600481018390526001600160a01b039091169063ba72a95590602401600060405180830381600087803b15801561423c57600080fd5b505af1158015614250573d6000803e3d6000fd5b505060408051858152602081018590527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15050565b6001600160a01b0383166142b85760405162461bcd60e51b8152600401610e6f90614f9f565b6001600160a01b0382166142de5760405162461bcd60e51b8152600401610e6f90614fe4565b6001600160a01b038316600090815260208190526040902054818110156143565760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e6f565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061438d908490614e47565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516143d991815260200190565b60405180910390a3613053565b600061443b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149ff9092919063ffffffff16565b805190915015613a4f57808060200190518101906144599190614e5a565b613a4f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e6f565b600c546008546001600160a01b039081169116146145e5576040805160038082526080820190925260009160208201606080368337019050509050308160008151811061450757614507615051565b6001600160a01b03928316602091820292909201015260085482519116908290600190811061453857614538615051565b6001600160a01b039283166020918202929092010152600c5482519116908290600290811061456957614569615051565b6001600160a01b039283166020918202929092010152600954604051635c11d79560e01b8152911690635c11d795906145af9085906000908690309042906004016150ab565b600060405180830381600087803b1580156145c957600080fd5b505af11580156145dd573d6000803e3d6000fd5b505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061461a5761461a615051565b6001600160a01b039283166020918202929092010152600c5482519116908290600190811061464b5761464b615051565b6001600160a01b039283166020918202929092010152600954604051637274ca1b60e11b8152731ccfe8c40ef259566433716002e379dfffbf5a3e9263e4e99436926145af929116908690600090879042906004016150e7565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106146da576146da615051565b6001600160a01b03928316602091820292909201015260085482519116908290600190811061470b5761470b615051565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614764573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147889190614e77565b6001600160a01b0316816001815181106147a4576147a4615051565b60200260200101516001600160a01b0316036147f35760095460405163791ac94760e01b81526001600160a01b039091169063791ac947906145af9085906000908690309042906004016150ab565b600954604051637274ca1b60e11b8152731ccfe8c40ef259566433716002e379dfffbf5a3e9163e4e99436916145af916001600160a01b0316908690600090879042906004016150e7565b600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148b59190614e77565b6008546001600160a01b0391821691160361495d5760095460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614938573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ed39190614e94565b60095460085460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af11580156149db573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed39190614e94565b6060614a0e8484600085614a16565b949350505050565b606082471015614a775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610e6f565b6001600160a01b0385163b614ace5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e6f565b600080866001600160a01b03168587604051614aea9190615126565b60006040518083038185875af1925050503d8060008114614b27576040519150601f19603f3d011682016040523d82523d6000602084013e614b2c565b606091505b5091509150614b3c828286614b47565b979650505050505050565b60608315614b56575081610fd4565b825115614b665782518084602001fd5b8160405162461bcd60e51b8152600401610e6f9190614ba4565b60005b83811015614b9b578181015183820152602001614b83565b50506000910152565b6020815260008251806020840152614bc3816040850160208701614b80565b601f01601f19169190910160400192915050565b6001600160a01b038116811461127057600080fd5b60008060408385031215614bff57600080fd5b8235614c0a81614bd7565b946020939093013593505050565b600060208284031215614c2a57600080fd5b5035919050565b600080600060608486031215614c4657600080fd5b8335614c5181614bd7565b92506020840135614c6181614bd7565b929592945050506040919091013590565b801515811461127057600080fd5b60008060408385031215614c9357600080fd5b8235614c9e81614bd7565b91506020830135614cae81614c72565b809150509250929050565b600060208284031215614ccb57600080fd5b8135610fd481614c72565b600060208284031215614ce857600080fd5b8135610fd481614bd7565b803561ffff81168114612e9e57600080fd5b60008060408385031215614d1857600080fd5b614d2183614cf3565b9150614d2f60208401614cf3565b90509250929050565b60008060408385031215614d4b57600080fd5b8235614d5681614bd7565b91506020830135614cae81614bd7565b600181811c90821680614d7a57607f821691505b602082108103614d9a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082614e0857634e487b7160e01b600052601260045260246000fd5b500490565b602080825260079082015266616c726561647960c81b604082015260600190565b600060208284031215614e4057600080fd5b5051919050565b80820180821115610e3f57610e3f614dd5565b600060208284031215614e6c57600080fd5b8151610fd481614c72565b600060208284031215614e8957600080fd5b8151610fd481614bd7565b600080600060608486031215614ea957600080fd5b8351925060208401519150604084015190509250925092565b61ffff818116838216019080821115614edd57614edd614dd5565b5092915050565b6020808252600f908201526e73656c6c20666565203c3d2032302560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2032302560901b604082015260600190565b600080600080600080600080610100898b031215614f5257600080fd5b8851614f5d81614bd7565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610e3f57610e3f614dd5565b81810381811115610e3f57610e3f614dd5565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156150a05781516001600160a01b03168752958201959082019060010161507b565b509495945050505050565b85815284602082015260a0604082015260006150ca60a0830186615067565b6001600160a01b0394909416606083015250608001529392505050565b60018060a01b038616815284602082015283604082015260a06060820152600061511460a0830185615067565b90508260808301529695505050505050565b60008251615138818460208701614b80565b919091019291505056fea2646970667358221220aed8129ac5bee9795d0fb8c1d42daa497eee6c6ba191204e72d32ea6853c144364736f6c63430008120033000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000001dffeda047048bcb535dafec0e46449db53d671000000000000000000000000077f3cfe2e139c1d3b7950150923e8628e3e9733000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005d73f4b0d6e65323af1955c5f7ceb9a8fa2f3d8e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000a968163f0a57b4000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d4469676974616c2046696c65730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044449464900000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106104145760003560e01c80638da5cb5b1161021e578063c8c8ebe411610123578063e9481eee116100ab578063f27fd2541161007a578063f27fd25414610d00578063f2fde38b14610d20578063f637434214610d40578063f7c618c114610d63578063f8b45b0514610d8357600080fd5b8063e9481eee14610c6e578063e98030c714610c9e578063f0a568c014610cbe578063f11a24d314610cde57600080fd5b8063dd62ed3e116100f2578063dd62ed3e14610bcd578063de0aad5314610c13578063e086e5ec14610c2e578063e2f4560514610c43578063e7841ec014610c5957600080fd5b8063c8c8ebe414610b56578063cf089e1314610b6c578063d68f8cde14610b8c578063d8c6404b14610bac57600080fd5b8063a8b9d240116101a6578063afa4f3b211610175578063afa4f3b214610ab1578063b62496f514610ad1578063bdd4f29f14610b01578063c024666814610b16578063c705c56914610b3657600080fd5b8063a8b9d240146109ec578063a9059cbb14610a0c578063aa49802314610a2c578063ad56c13c14610a4c57600080fd5b806395d89b41116101ed57806395d89b411461096c5780639a7a23d6146109815780639c1b8af5146109a1578063a26579ad146109b7578063a457c2d7146109cc57600080fd5b80638da5cb5b146108ec57806391c1004a1461090a578063921369131461092a578063948384dc1461094c57600080fd5b80634144d9e41161032457806370a08231116102ac5780637c75ad3a1161027b5780637c75ad3a146108445780637cf84bd71461086c578063871c128d1461088c57806388bdd9be146108ac57806389476069146108cc57600080fd5b806370a08231146107b7578063715018a6146107ed57806377ec7449146108025780637bce5a041461082257600080fd5b80635d098b38116102f35780635d098b381461072257806364b0f6531461074257806365b8dbc0146107575780636843cd8414610777578063700bb1911461079757600080fd5b80634144d9e41461068d57806349bd5a5e146106b45780634e71d92d146106d45780634fbee193146106e957600080fd5b806323b872dd116103a757806330bb4cff1161037657806330bb4cff146105ec578063313ce5671461060157806331e79db01461062d578063395093511461064d5780633ad3e6ff1461066d57600080fd5b806323b872dd1461056c5780632ae2f1211461058c5780632c1f5216146105ac5780632d5fd55a146105cc57600080fd5b80630dcb2e89116103e35780630dcb2e89146104eb5780631694505e1461050d57806318160ddd1461052d5780631c499ab01461054c57600080fd5b806306e297121461042057806306fdde0314610465578063095ea7b3146104875780630cfe2f3f146104b757600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b5061044873fd6439aeff9d2389856b7486b9e74a6dacadcdce81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561047157600080fd5b5061047a610d99565b60405161045c9190614ba4565b34801561049357600080fd5b506104a76104a2366004614bec565b610e2b565b604051901515815260200161045c565b3480156104c357600080fd5b50600e546104d89062010000900461ffff1681565b60405161ffff909116815260200161045c565b3480156104f757600080fd5b5061050b610506366004614c18565b610e45565b005b34801561051957600080fd5b50600954610448906001600160a01b031681565b34801561053957600080fd5b506002545b60405190815260200161045c565b34801561055857600080fd5b5061050b610567366004614c18565b610eda565b34801561057857600080fd5b506104a7610587366004614c31565b610fb5565b34801561059857600080fd5b5061050b6105a7366004614c80565b610fdb565b3480156105b857600080fd5b50600b54610448906001600160a01b031681565b3480156105d857600080fd5b5061050b6105e7366004614cb9565b6110a5565b3480156105f857600080fd5b5061053e6110ed565b34801561060d57600080fd5b50600754600160a81b900460ff1660405160ff909116815260200161045c565b34801561063957600080fd5b5061050b610648366004614cd6565b611160565b34801561065957600080fd5b506104a7610668366004614bec565b6111bc565b34801561067957600080fd5b50600654610448906001600160a01b031681565b34801561069957600080fd5b50600e5461044890600160601b90046001600160a01b031681565b3480156106c057600080fd5b50600a54610448906001600160a01b031681565b3480156106e057600080fd5b5061050b6111fb565b3480156106f557600080fd5b506104a7610704366004614cd6565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561072e57600080fd5b5061050b61073d366004614cd6565b611273565b34801561074e57600080fd5b5061053e61133f565b34801561076357600080fd5b5061050b610772366004614cd6565b611389565b34801561078357600080fd5b5061053e610792366004614cd6565b611754565b3480156107a357600080fd5b5061050b6107b2366004614c18565b6117c4565b3480156107c357600080fd5b5061053e6107d2366004614cd6565b6001600160a01b031660009081526020819052604090205490565b3480156107f957600080fd5b5061050b611896565b34801561080e57600080fd5b50600754610448906001600160a01b031681565b34801561082e57600080fd5b50600e546104d890600160501b900461ffff1681565b34801561085057600080fd5b50610448731ccfe8c40ef259566433716002e379dfffbf5a3e81565b34801561087857600080fd5b50600854610448906001600160a01b031681565b34801561089857600080fd5b5061050b6108a7366004614c18565b6118cc565b3480156108b857600080fd5b5061050b6108c7366004614cd6565b611a0e565b3480156108d857600080fd5b5061050b6108e7366004614cd6565b611df7565b3480156108f857600080fd5b506005546001600160a01b0316610448565b34801561091657600080fd5b5061050b610925366004614cd6565b611ef5565b34801561093657600080fd5b50600e546104d890600160401b900461ffff1681565b34801561095857600080fd5b5061050b610967366004614d05565b612143565b34801561097857600080fd5b5061047a612292565b34801561098d57600080fd5b5061050b61099c366004614c80565b6122a1565b3480156109ad57600080fd5b5061053e600f5481565b3480156109c357600080fd5b5061053e61235d565b3480156109d857600080fd5b506104a76109e7366004614bec565b6123a7565b3480156109f857600080fd5b5061053e610a07366004614cd6565b612444565b348015610a1857600080fd5b506104a7610a27366004614bec565b612477565b348015610a3857600080fd5b5061050b610a47366004614c18565b612485565b348015610a5857600080fd5b50610a6c610a67366004614cd6565b61256b565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161045c565b348015610abd57600080fd5b5061050b610acc366004614c18565b612606565b348015610add57600080fd5b506104a7610aec366004614cd6565b60166020526000908152604090205460ff1681565b348015610b0d57600080fd5b5061053e6126bb565b348015610b2257600080fd5b5061050b610b31366004614c80565b612705565b348015610b4257600080fd5b506104a7610b51366004614cd6565b6127c7565b348015610b6257600080fd5b5061053e60115481565b348015610b7857600080fd5b5061050b610b87366004614d05565b612836565b348015610b9857600080fd5b5061050b610ba7366004614d05565b61299a565b348015610bb857600080fd5b506007546104a790600160a01b900460ff1681565b348015610bd957600080fd5b5061053e610be8366004614d38565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610c1f57600080fd5b50600e546104d89061ffff1681565b348015610c3a57600080fd5b5061050b612afe565b348015610c4f57600080fd5b5061053e600d5481565b348015610c6557600080fd5b5061053e612bd3565b348015610c7a57600080fd5b506104a7610c89366004614cd6565b60136020526000908152604090205460ff1681565b348015610caa57600080fd5b5061050b610cb9366004614c18565b612c1d565b348015610cca57600080fd5b5061050b610cd9366004614cd6565b612c78565b348015610cea57600080fd5b50600e546104d890600160301b900461ffff1681565b348015610d0c57600080fd5b50610a6c610d1b366004614c18565b612d2c565b348015610d2c57600080fd5b5061050b610d3b366004614cd6565b612d6e565b348015610d4c57600080fd5b50600e546104d890640100000000900461ffff1681565b348015610d6f57600080fd5b50600c54610448906001600160a01b031681565b348015610d8f57600080fd5b5061053e60105481565b606060038054610da890614d66565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd490614d66565b8015610e215780601f10610df657610100808354040283529160200191610e21565b820191906000526020600020905b815481529060010190602001808311610e0457829003601f168201915b5050505050905090565b600033610e39818585612ea3565b60019150505b92915050565b6005546001600160a01b03163314610e785760405162461bcd60e51b8152600401610e6f90614da0565b60405180910390fd5b600b54604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e89906024015b600060405180830381600087803b158015610ebf57600080fd5b505af1158015610ed3573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610f045760405162461bcd60e51b8152600401610e6f90614da0565b612710610f1060025490565b610f1a9190614deb565b811015610f735760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b6064820152608401610e6f565b6010546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601055565b600033610fc3858285612fc7565b610fce858585613059565b60019150505b9392505050565b6005546001600160a01b031633146110055760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b03821660009081526013602052604090205481151560ff9091161515036110455760405162461bcd60e51b8152600401610e6f90614e0d565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b6005546001600160a01b031633146110cf5760405162461bcd60e51b8152600401610e6f90614da0565b60078054911515600160a01b0260ff60a01b19909216919091179055565b600b54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b9190614e2e565b905090565b6005546001600160a01b0316331461118a5760405162461bcd60e51b8152600401610e6f90614da0565b600b5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610ea5565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610e3990829086906111f6908790614e47565b612ea3565b600b5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561124c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112709190614e5a565b50565b6005546001600160a01b0316331461129d5760405162461bcd60e51b8152600401610e6f90614da0565b600e546001600160a01b03808316600160601b90920416036112d15760405162461bcd60e51b8152600401610e6f90614e0d565b600e546040516001600160a01b0380841692600160601b900416907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600e80546001600160a01b03909216600160601b026bffffffffffffffffffffffff909216919091179055565b600b54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b031633146113b35760405162461bcd60e51b8152600401610e6f90614da0565b6009546001600160a01b039081169082160361141d5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610e6f565b6009546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba9190614e77565b6008546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f9190614e77565b600a80546001600160a01b039283166001600160a01b031991821617909155600980549284169290911682179055604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc9190614e77565b6008546001600160a01b0390811691161461164d5760085460095460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164b9190614e5a565b505b6009546116679030906001600160a01b0316600019612ea3565b600b5460095460405163c705c56960e01b81526001600160a01b03918216600482015291169063c705c56990602401602060405180830381865afa1580156116b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d79190614e5a565b61173d57600b5460095460405163031e79db60e41b81526001600160a01b0391821660048201529116906331e79db090602401600060405180830381600087803b15801561172457600080fd5b505af1158015611738573d6000803e3d6000fd5b505050505b600a54611270906001600160a01b031660016137bc565b600b546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3f9190614e2e565b600b546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183b9190614e94565b604080518481526020810184905290810182905260608101889052929550909350915033906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146118c05760405162461bcd60e51b8152600401610e6f90614da0565b6118ca60006139ab565b565b6005546001600160a01b031633146118f65760405162461bcd60e51b8152600401610e6f90614da0565b62030d40811015801561190c57506207a1208111155b6119755760405162461bcd60e51b815260206004820152603460248201527f676173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b6064820152608401610e6f565b600f5481036119db5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610e6f565b600f5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3600f55565b6005546001600160a01b03163314611a385760405162461bcd60e51b8152600401610e6f90614da0565b600b546001600160a01b0390811690821603611aac5760405162461bcd60e51b815260206004820152602d60248201527f546865206469766964656e6420747261636b657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610e6f565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1d9190614e77565b6001600160a01b031614611bad5760405162461bcd60e51b815260206004820152604b60248201527f546865206e6577206469766964656e6420747261636b6572206d75737420626560448201527f206f776e656420627920746865204449564944454e4544544f4b454e20746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a401610e6f565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611bef57600080fd5b505af1158015611c03573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611c4857600080fd5b505af1158015611c5c573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611c816005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611cc257600080fd5b505af1158015611cd6573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d2157600080fd5b505af1158015611d35573d6000803e3d6000fd5b5050600a5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d8057600080fd5b505af1158015611d94573d6000803e3d6000fd5b5050600b546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600b80546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03163314611e215760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b0381163003611e675760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610e6f565b611270611e7c6005546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee49190614e2e565b6001600160a01b03841691906139fd565b6005546001600160a01b03163314611f1f5760405162461bcd60e51b8152600401610e6f90614da0565b600880546001600160a01b0319166001600160a01b03838116919091179091556009546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa158015611f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa59190614e77565b6008546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201a9190614e77565b600a80546001600160a01b0319166001600160a01b03928316179055600954604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c9190614e77565b6008546001600160a01b0390811691161461173d5760085460095460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015612107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212b9190614e5a565b50600a54611270906001600160a01b031660016137bc565b6005546001600160a01b0316331461216d5760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff600160401b8204811691612194916401000000009091041685614ec2565b61219e9190614ec2565b61ffff1611156121c05760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff600160501b82048116916121e691600160301b9091041684614ec2565b6121f09190614ec2565b61ffff1611156122125760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff8581168252848116602083015280841682840152620100009093049092166060830152517f0a21d45dab14d5d2f53ae98d95d951cd627fcf1b5bc485174326568b5e0a45729181900360800190a1600e805461ffff928316620100000263ffffffff199091169290931691909117919091179055565b606060048054610da890614d66565b6005546001600160a01b031633146122cb5760405162461bcd60e51b8152600401610e6f90614da0565b600a546001600160a01b039081169083160361234f5760405162461bcd60e51b815260206004820152603e60248201527f546865206d61696e20706169722063616e6e6f742062652072656d6f7665642060448201527f66726f6d206175746f6d617465644d61726b65744d616b6572506169727300006064820152608401610e6f565b61235982826137bc565b5050565b600b5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561242c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e6f565b6124398286868403612ea3565b506001949350505050565b600b546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611783565b600033610e39818585613059565b6005546001600160a01b031633146124af5760405162461bcd60e51b8152600401610e6f90614da0565b6127106124bb60025490565b6124c59190614deb565b8110156125295760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b6064820152608401610e6f565b6011546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601155565b600b5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156125c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125eb9190614f35565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146126305760405162461bcd60e51b8152600401610e6f90614da0565b600081116126795760405162461bcd60e51b8152602060048201526016602482015275073776170546f6b656e734174416d6f756e74203e20360541b6044820152606401610e6f565b600d546040805183815260208101929092527f1d3afd1a2942d06995fdb024306050a7b24ad00572be70ce8b1bea325780d28b910160405180910390a1600d55565b600b5460408051632f842d8560e21b815290516000926001600160a01b03169163be10b6149160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b0316331461272f5760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b03821660009081526012602052604090205481151560ff90911615150361276f5760405162461bcd60e51b8152600401610e6f90614e0d565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611099565b600b5460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa158015612812573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3f9190614e5a565b6005546001600160a01b031633146128605760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff80821691612881916401000000009091041685614ec2565b61288b9190614ec2565b61ffff1611156128ad5760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff6201000082048116916128d291600160301b9091041684614ec2565b6128dc9190614ec2565b61ffff1611156128fe5760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff85811682528481166020830152600160401b8404811682840152600160501b9093049092166060830152517f1d6b62961d401d548eb1549c97109c0b905ccd7af9c3777d3076cc8438fdfe659181900360800190a1600e80546bffffffff00000000000000001916600160401b61ffff9485160261ffff60501b191617600160501b9290931691909102919091179055565b6005546001600160a01b031633146129c45760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff808216916129e491600160401b9091041685614ec2565b6129ee9190614ec2565b61ffff161115612a105760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff620100008204811691612a3591600160501b9091041684614ec2565b612a3f9190614ec2565b61ffff161115612a615760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff858116825284811660208301526401000000008404811682840152600160301b9093049092166060830152517f95c5c99557725e816faf752c6675d63483841c28a7a009ed792470a9cb4dea239181900360800190a1600e805467ffffffff00000000191664010000000061ffff9485160267ffff000000000000191617600160301b9290931691909102919091179055565b6005546001600160a01b03163314612b285760405162461bcd60e51b8152600401610e6f90614da0565b6000612b3c6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114612b86576040519150601f19603f3d011682016040523d82523d6000602084013e612b8b565b606091505b50509050806112705760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610e6f565b600b546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b03163314612c475760405162461bcd60e51b8152600401610e6f90614da0565b600b5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610ea5565b6005546001600160a01b03163314612ca25760405162461bcd60e51b8152600401610e6f90614da0565b6006546001600160a01b03808316911603612ccf5760405162461bcd60e51b8152600401610e6f90614e0d565b6006546040516001600160a01b03918216918316907fe2b5774aa87aa100c6ec40513e7bc1d6f3c22e7abfdcd1e87401c3c791bde9ae90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600b54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016125a9565b6005546001600160a01b03163314612d985760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b038116612dfd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e6f565b611270816139ab565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116612e9e5760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610e6f565b919050565b6001600160a01b038316612f055760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e6f565b6001600160a01b038216612f665760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e6f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461305357818110156130465760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e6f565b6130538484848403612ea3565b50505050565b6001600160a01b03831661307f5760405162461bcd60e51b8152600401610e6f90614f9f565b6001600160a01b0382166130a55760405162461bcd60e51b8152600401610e6f90614fe4565b600081116130f55760405162461bcd60e51b815260206004820152601b60248201527f45524332303a207472616e73666572207a65726f20616d6f756e7400000000006044820152606401610e6f565b600a54600160a01b900460ff161580156131185750600754600160a01b900460ff165b801561313d57506001600160a01b03831660009081526012602052604090205460ff16155b801561316257506001600160a01b03821660009081526012602052604090205460ff16155b156131d65760075460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b1580156131bd57600080fd5b505af11580156131d1573d6000803e3d6000fd5b505050505b30600090815260208190526040902054600d54811080159081906132045750600a54600160a01b900460ff16155b801561322957506001600160a01b03851660009081526016602052604090205460ff16155b801561324357506005546001600160a01b03868116911614155b801561325d57506005546001600160a01b03858116911614155b156132d357600a805460ff60a01b1916600160a01b1790556015541561328857613288601554613a54565b6014541561329b5761329b601454613edb565b3060009081526020819052604090205480156132ba576132ba81614160565b5060006015819055601455600a805460ff60a01b191690555b600a546001600160a01b03861660009081526012602052604090205460ff600160a01b90920482161591168061332157506001600160a01b03851660009081526012602052604090205460ff165b1561332a575060005b600080600083156134c4576001600160a01b03891660009081526016602052604090205460ff16156133d457600e546103e8906133719062010000900461ffff1689615027565b61337b9190614deb565b600e549091506103e89061339a90600160301b900461ffff1689615027565b6133a49190614deb565b600e549093506103e8906133c390600160501b900461ffff1689615027565b6133cd9190614deb565b915061346a565b6001600160a01b03881660009081526016602052604090205460ff161561346a57600e546103e89061340a9061ffff1689615027565b6134149190614deb565b600e549091506103e89061343490640100000000900461ffff1689615027565b61343e9190614deb565b600e549093506103e89061345d90600160401b900461ffff1689615027565b6134679190614deb565b91505b826014546134789190614e47565b601455601554613489908390614e47565b6015556000826134998584614e47565b6134a39190614e47565b90506134af818961503e565b975080156134c2576134c28a3083614292565b505b6134cf898989614292565b600b546001600160a01b031663e30443bc8a613500816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561354657600080fd5b505af1925050508015613557575060015b50600b546001600160a01b031663e30443bc89613589816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156135cf57600080fd5b505af19250505080156135e0575060015b50600a54600160a01b900460ff166137b1576001600160a01b03891660009081526013602052604090205460ff166136635760115487106136635760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610e6f565b6001600160a01b03881660009081526013602052604090205460ff166136ec576010546001600160a01b038916600090815260208190526040902054106136ec5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610e6f565b600f54600b546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613759575060408051601f3d908101601f1916820190925261375691810190614e94565b60015b156137af5760408051848152602081018490529081018290526060810185905233906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050505050565b6001600160a01b03821660009081526016602052604090205481151560ff9091161515036138525760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610e6f565b6001600160a01b038216600090815260166020908152604080832080548515801560ff199283168117909355601390945291909320805490911690921790915581906139095750600b5460405163c705c56960e01b81526001600160a01b0384811660048301529091169063c705c56990602401602060405180830381865afa1580156138e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139079190614e5a565b155b1561396e57600b5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561395557600080fd5b505af1158015613969573d6000803e3d6000fd5b505050505b816001600160a01b03167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82604051611099911515815260200190565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613a4f9084906143e6565b505050565b600c546006546001600160a01b03918216911603613b8657600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad99190614e2e565b9050613ae4826144b8565b600c546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a0823190602401602060405180830381865afa158015613b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b559190614e2e565b613b5f919061503e565b600e54600c54919250613a4f916001600160a01b0390811691600160601b900416836139fd565b6008546006546001600160a01b03918216911603613ebc57600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614e77565b6008546001600160a01b03908116911614613c92576008546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8d9190614e2e565b613c94565b475b9050613c9f826146a5565b600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d0d9190614e77565b6008546001600160a01b03908116911614613d9d576008546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa158015613d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d8e9190614e2e565b613d98919061503e565b613da7565b613da7824761503e565b9050600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e209190614e77565b6008546001600160a01b03918216911603613e9757600e54604051600091600160601b90046001600160a01b03169083908381818185875af1925050503d8060008114613e89576040519150601f19603f3d011682016040523d82523d6000602084013e613e8e565b606091505b50505050505050565b600e54600854613a4f916001600160a01b0391821691600160601b90910416836139fd565b600e54611270903090600160601b90046001600160a01b031683613059565b6000613ee8600283614deb565b90506000613ef6828461503e565b90506000600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f719190614e77565b6008546001600160a01b03908116911614613ff7576008546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff29190614e2e565b613ff9565b475b9050614004836146a5565b600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614e77565b6008546001600160a01b03908116911614614102576008546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa1580156140cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140f39190614e2e565b6140fd919061503e565b61410c565b61410c824761503e565b9050614118838261483e565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b614169816144b8565b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156141b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d69190614e2e565b600b54600c549192506141f6916001600160a01b039081169116836139fd565b600b5460405163ba72a95560e01b8152600481018390526001600160a01b039091169063ba72a95590602401600060405180830381600087803b15801561423c57600080fd5b505af1158015614250573d6000803e3d6000fd5b505060408051858152602081018590527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15050565b6001600160a01b0383166142b85760405162461bcd60e51b8152600401610e6f90614f9f565b6001600160a01b0382166142de5760405162461bcd60e51b8152600401610e6f90614fe4565b6001600160a01b038316600090815260208190526040902054818110156143565760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e6f565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061438d908490614e47565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516143d991815260200190565b60405180910390a3613053565b600061443b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149ff9092919063ffffffff16565b805190915015613a4f57808060200190518101906144599190614e5a565b613a4f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e6f565b600c546008546001600160a01b039081169116146145e5576040805160038082526080820190925260009160208201606080368337019050509050308160008151811061450757614507615051565b6001600160a01b03928316602091820292909201015260085482519116908290600190811061453857614538615051565b6001600160a01b039283166020918202929092010152600c5482519116908290600290811061456957614569615051565b6001600160a01b039283166020918202929092010152600954604051635c11d79560e01b8152911690635c11d795906145af9085906000908690309042906004016150ab565b600060405180830381600087803b1580156145c957600080fd5b505af11580156145dd573d6000803e3d6000fd5b505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061461a5761461a615051565b6001600160a01b039283166020918202929092010152600c5482519116908290600190811061464b5761464b615051565b6001600160a01b039283166020918202929092010152600954604051637274ca1b60e11b8152731ccfe8c40ef259566433716002e379dfffbf5a3e9263e4e99436926145af929116908690600090879042906004016150e7565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106146da576146da615051565b6001600160a01b03928316602091820292909201015260085482519116908290600190811061470b5761470b615051565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614764573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147889190614e77565b6001600160a01b0316816001815181106147a4576147a4615051565b60200260200101516001600160a01b0316036147f35760095460405163791ac94760e01b81526001600160a01b039091169063791ac947906145af9085906000908690309042906004016150ab565b600954604051637274ca1b60e11b8152731ccfe8c40ef259566433716002e379dfffbf5a3e9163e4e99436916145af916001600160a01b0316908690600090879042906004016150e7565b600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148b59190614e77565b6008546001600160a01b0391821691160361495d5760095460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614938573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ed39190614e94565b60095460085460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af11580156149db573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed39190614e94565b6060614a0e8484600085614a16565b949350505050565b606082471015614a775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610e6f565b6001600160a01b0385163b614ace5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e6f565b600080866001600160a01b03168587604051614aea9190615126565b60006040518083038185875af1925050503d8060008114614b27576040519150601f19603f3d011682016040523d82523d6000602084013e614b2c565b606091505b5091509150614b3c828286614b47565b979650505050505050565b60608315614b56575081610fd4565b825115614b665782518084602001fd5b8160405162461bcd60e51b8152600401610e6f9190614ba4565b60005b83811015614b9b578181015183820152602001614b83565b50506000910152565b6020815260008251806020840152614bc3816040850160208701614b80565b601f01601f19169190910160400192915050565b6001600160a01b038116811461127057600080fd5b60008060408385031215614bff57600080fd5b8235614c0a81614bd7565b946020939093013593505050565b600060208284031215614c2a57600080fd5b5035919050565b600080600060608486031215614c4657600080fd5b8335614c5181614bd7565b92506020840135614c6181614bd7565b929592945050506040919091013590565b801515811461127057600080fd5b60008060408385031215614c9357600080fd5b8235614c9e81614bd7565b91506020830135614cae81614c72565b809150509250929050565b600060208284031215614ccb57600080fd5b8135610fd481614c72565b600060208284031215614ce857600080fd5b8135610fd481614bd7565b803561ffff81168114612e9e57600080fd5b60008060408385031215614d1857600080fd5b614d2183614cf3565b9150614d2f60208401614cf3565b90509250929050565b60008060408385031215614d4b57600080fd5b8235614d5681614bd7565b91506020830135614cae81614bd7565b600181811c90821680614d7a57607f821691505b602082108103614d9a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082614e0857634e487b7160e01b600052601260045260246000fd5b500490565b602080825260079082015266616c726561647960c81b604082015260600190565b600060208284031215614e4057600080fd5b5051919050565b80820180821115610e3f57610e3f614dd5565b600060208284031215614e6c57600080fd5b8151610fd481614c72565b600060208284031215614e8957600080fd5b8151610fd481614bd7565b600080600060608486031215614ea957600080fd5b8351925060208401519150604084015190509250925092565b61ffff818116838216019080821115614edd57614edd614dd5565b5092915050565b6020808252600f908201526e73656c6c20666565203c3d2032302560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2032302560901b604082015260600190565b600080600080600080600080610100898b031215614f5257600080fd5b8851614f5d81614bd7565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610e3f57610e3f614dd5565b81810381811115610e3f57610e3f614dd5565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156150a05781516001600160a01b03168752958201959082019060010161507b565b509495945050505050565b85815284602082015260a0604082015260006150ca60a0830186615067565b6001600160a01b0394909416606083015250608001529392505050565b60018060a01b038616815284602082015283604082015260a06060820152600061511460a0830185615067565b90508260808301529695505050505050565b60008251615138818460208701614b80565b919091019291505056fea2646970667358221220aed8129ac5bee9795d0fb8c1d42daa497eee6c6ba191204e72d32ea6853c144364736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000001dffeda047048bcb535dafec0e46449db53d671000000000000000000000000077f3cfe2e139c1d3b7950150923e8628e3e9733000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005d73f4b0d6e65323af1955c5f7ceb9a8fa2f3d8e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000a968163f0a57b4000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d4469676974616c2046696c65730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044449464900000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): Digital Files
Arg [1] : symbol_ (string): DIFI
Arg [2] : decimals_ (uint8): 18
Arg [3] : totalSupply_ (uint256): 10000000000000000000000000
Arg [4] : _maxWallet (uint256): 10000000000000000000000000
Arg [5] : _maxTransactionAmount (uint256): 10000000000000000000000000
Arg [6] : addrs (address[6]): 0xdAC17F958D2ee523a2206206994597C13D831ec7,0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,0x01dFfEDa047048Bcb535dafeC0E46449db53D671,0x077f3CfE2E139c1D3B7950150923E8628e3e9733,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x5d73f4B0D6e65323af1955C5f7CEB9A8Fa2F3d8E
Arg [7] : feeSettings (uint16[6]): 0,0,20,10,20,20
Arg [8] : minimumTokenBalanceForDividends_ (uint256): 50000000000000000000000
Arg [9] : _tokenForMarketingFee (uint8): 1
-----Encoded View---------------
24 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [1] : 00000000000000000000000000000000000000000000000000000000000002c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [4] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [5] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [6] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [7] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [8] : 00000000000000000000000001dffeda047048bcb535dafec0e46449db53d671
Arg [9] : 000000000000000000000000077f3cfe2e139c1d3b7950150923e8628e3e9733
Arg [10] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [11] : 0000000000000000000000005d73f4b0d6e65323af1955c5f7ceb9a8fa2f3d8e
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [15] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [18] : 000000000000000000000000000000000000000000000a968163f0a57b400000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [20] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [21] : 4469676974616c2046696c657300000000000000000000000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [23] : 4449464900000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
95412:29699:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95680:83;;;;;;;;;;;;95720:42;95680:83;;;;;-1:-1:-1;;;;;191:32:1;;;173:51;;161:2;146:18;95680:83:0;;;;;;;;30575:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32926:201::-;;;;;;;;;;-1:-1:-1;32926:201:0;;;;;:::i;:::-;;:::i;:::-;;;1512:14:1;;1505:22;1487:41;;1475:2;1460:18;32926:201:0;1347:187:1;96199:26:0;;;;;;;;;;-1:-1:-1;96199:26:0;;;;;;;;;;;;;;1713:6:1;1701:19;;;1683:38;;1671:2;1656:18;96199:26:0;1539:188:1;112281:215:0;;;;;;;;;;-1:-1:-1;112281:215:0;;;;;:::i;:::-;;:::i;:::-;;95945:30;;;;;;;;;;-1:-1:-1;95945:30:0;;;;-1:-1:-1;;;;;95945:30:0;;;31695:108;;;;;;;;;;-1:-1:-1;31783:12:0;;31695:108;;;2271:25:1;;;2259:2;2244:18;31695:108:0;2125:177:1;104076:249:0;;;;;;;;;;-1:-1:-1;104076:249:0;;;;;:::i;:::-;;:::i;33707:295::-;;;;;;;;;;-1:-1:-1;33707:295:0;;;;;:::i;:::-;;:::i;111167:323::-;;;;;;;;;;-1:-1:-1;111167:323:0;;;;;:::i;:::-;;:::i;96049:30::-;;;;;;;;;;-1:-1:-1;96049:30:0;;;;-1:-1:-1;;;;;96049:30:0;;;103722:103;;;;;;;;;;-1:-1:-1;103722:103:0;;;;;:::i;:::-;;:::i;112727:171::-;;;;;;;;;;;;;:::i;107576:92::-;;;;;;;;;;-1:-1:-1;107651:9:0;;-1:-1:-1;;;107651:9:0;;;;107576:92;;3696:4:1;3684:17;;;3666:36;;3654:2;3639:18;107576:92:0;3524:184:1;113471:160:0;;;;;;;;;;-1:-1:-1;113471:160:0;;;;;:::i;:::-;;:::i;34411:240::-;;;;;;;;;;-1:-1:-1;34411:240:0;;;;;:::i;:::-;;:::i;95770:35::-;;;;;;;;;;-1:-1:-1;95770:35:0;;;;-1:-1:-1;;;;;95770:35:0;;;96384:38;;;;;;;;;;-1:-1:-1;96384:38:0;;;;-1:-1:-1;;;96384:38:0;;-1:-1:-1;;;;;96384:38:0;;;95982:28;;;;;;;;;;-1:-1:-1;95982:28:0;;;;-1:-1:-1;;;;;95982:28:0;;;115097:133;;;;;;;;;;;;;:::i;112906:126::-;;;;;;;;;;-1:-1:-1;112906:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;112996:28:0;112972:4;112996:28;;;:19;:28;;;;;;;;;112906:126;107676:263;;;;;;;;;;-1:-1:-1;107676:263:0;;;;;:::i;:::-;;:::i;115406:172::-;;;;;;;;;;;;;:::i;106358:947::-;;;;;;;;;;-1:-1:-1;106358:947:0;;;;;:::i;:::-;;:::i;113262:201::-;;;;;;;;;;-1:-1:-1;113262:201:0;;;;;:::i;:::-;;:::i;114648:441::-;;;;;;;;;;-1:-1:-1;114648:441:0;;;;;:::i;:::-;;:::i;31866:127::-;;;;;;;;;;-1:-1:-1;31866:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;31967:18:0;31940:7;31967:18;;;;;;;;;;;;31866:127;59910:103;;;;;;;;;;;;;:::i;95812:25::-;;;;;;;;;;-1:-1:-1;95812:25:0;;;;-1:-1:-1;;;;;95812:25:0;;;96346:29;;;;;;;;;;-1:-1:-1;96346:29:0;;;;-1:-1:-1;;;96346:29:0;;;;;;95553:120;;;;;;;;;;;;95630:42;95553:120;;95907:31;;;;;;;;;;-1:-1:-1;95907:31:0;;;;-1:-1:-1;;;;;95907:31:0;;;111498:466;;;;;;;;;;-1:-1:-1;111498:466:0;;;;;:::i;:::-;;:::i;104721:1077::-;;;;;;;;;;-1:-1:-1;104721:1077:0;;;;;:::i;:::-;;:::i;124901:207::-;;;;;;;;;;-1:-1:-1;124901:207:0;;;;;:::i;:::-;;:::i;59259:87::-;;;;;;;;;;-1:-1:-1;59332:6:0;;-1:-1:-1;;;;;59332:6:0;59259:87;;105806:546;;;;;;;;;;-1:-1:-1;105806:546:0;;;;;:::i;:::-;;:::i;96309:30::-;;;;;;;;;;-1:-1:-1;96309:30:0;;;;-1:-1:-1;;;96309:30:0;;;;;;109606:622;;;;;;;;;;-1:-1:-1;109606:622:0;;;;;:::i;:::-;;:::i;30794:104::-;;;;;;;;;;;;;:::i;110240:309::-;;;;;;;;;;-1:-1:-1;110240:309:0;;;;;:::i;:::-;;:::i;96429:31::-;;;;;;;;;;;;;;;;112134:139;;;;;;;;;;;;;:::i;35154:438::-;;;;;;;;;;-1:-1:-1;35154:438:0;;;;;:::i;:::-;;:::i;113040:214::-;;;;;;;;;;-1:-1:-1;113040:214:0;;;;;:::i;:::-;;:::i;32199:193::-;;;;;;;;;;-1:-1:-1;32199:193:0;;;;;:::i;:::-;;:::i;104333:375::-;;;;;;;;;;-1:-1:-1;104333:375:0;;;;;:::i;:::-;;:::i;113860:381::-;;;;;;;;;;-1:-1:-1;113860:381:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5240:32:1;;;5222:51;;5304:2;5289:18;;5282:34;;;;5332:18;;;5325:34;;;;5390:2;5375:18;;5368:34;;;;5433:3;5418:19;;5411:35;5260:3;5462:19;;5455:35;5521:3;5506:19;;5499:35;5565:3;5550:19;;5543:35;5209:3;5194:19;113860:381:0;4883:701:1;103831:237:0;;;;;;;;;;-1:-1:-1;103831:237:0;;;;;:::i;:::-;;:::i;96760:57::-;;;;;;;;;;-1:-1:-1;96760:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;112504:215;;;;;;;;;;;;;:::i;107313:255::-;;;;;;;;;;-1:-1:-1;107313:255:0;;;;;:::i;:::-;;:::i;113639:213::-;;;;;;;;;;-1:-1:-1;113639:213:0;;;;;:::i;:::-;;:::i;96500:35::-;;;;;;;;;;;;;;;;108933:665;;;;;;;;;;-1:-1:-1;108933:665:0;;;;;:::i;:::-;;:::i;108267:658::-;;;;;;;;;;-1:-1:-1;108267:658:0;;;;;:::i;:::-;;:::i;95844:26::-;;;;;;;;;;-1:-1:-1;95844:26:0;;;;-1:-1:-1;;;95844:26:0;;;;;;32455:151;;;;;;;;;;-1:-1:-1;32455:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;32571:18:0;;;32544:7;32571:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32455:151;96165:27;;;;;;;;;;-1:-1:-1;96165:27:0;;;;;;;;124711:184;;;;;;;;;;;;;:::i;96123:33::-;;;;;;;;;;;;;;;;115238:160;;;;;;;;;;;;;:::i;96601:66::-;;;;;;;;;;-1:-1:-1;96601:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;111972:154;;;;;;;;;;-1:-1:-1;111972:154:0;;;;;:::i;:::-;;:::i;107947:312::-;;;;;;;;;;-1:-1:-1;107947:312:0;;;;;:::i;:::-;;:::i;96271:29::-;;;;;;;;;;-1:-1:-1;96271:29:0;;;;-1:-1:-1;;;96271:29:0;;;;;;114249:391;;;;;;;;;;-1:-1:-1;114249:391:0;;;;;:::i;:::-;;:::i;60168:201::-;;;;;;;;;;-1:-1:-1;60168:201:0;;;;;:::i;:::-;;:::i;96234:30::-;;;;;;;;;;-1:-1:-1;96234:30:0;;;;;;;;;;;96088:26;;;;;;;;;;-1:-1:-1;96088:26:0;;;;-1:-1:-1;;;;;96088:26:0;;;96469:24;;;;;;;;;;;;;;;;30575:100;30629:13;30662:5;30655:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30575:100;:::o;32926:201::-;33009:4;28463:10;33065:32;28463:10;33081:7;33090:6;33065:8;:32::i;:::-;33115:4;33108:11;;;32926:201;;;;;:::o;112281:215::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;;;;;;;;;112426:15:::1;::::0;112397:91:::1;::::0;-1:-1:-1;;;112397:91:0;;::::1;::::0;::::1;2271:25:1::0;;;-1:-1:-1;;;;;112426:15:0;;::::1;::::0;112397:83:::1;::::0;2244:18:1;;112397:91:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;112281:215:::0;:::o;104076:249::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;104187:5:::1;104171:13;31783:12:::0;;;31695:108;104171:13:::1;:21;;;;:::i;:::-;104159:10;:33;;104151:79;;;::::0;-1:-1:-1;;;104151:79:0;;7284:2:1;104151:79:0::1;::::0;::::1;7266:21:1::0;7323:2;7303:18;;;7296:30;7362:34;7342:18;;;7335:62;-1:-1:-1;;;7413:18:1;;;7406:31;7454:19;;104151:79:0::1;7082:397:1::0;104151:79:0::1;104274:9;::::0;104246:38:::1;::::0;;7658:25:1;;;7714:2;7699:18;;7692:34;;;;104246:38:0::1;::::0;7631:18:1;104246:38:0::1;;;;;;;104295:9;:22:::0;104076:249::o;33707:295::-;33838:4;28463:10;33896:38;33912:4;28463:10;33927:6;33896:15;:38::i;:::-;33945:27;33955:4;33961:2;33965:6;33945:9;:27::i;:::-;33990:4;33983:11;;;33707:295;;;;;;:::o;111167:323::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;111297:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:49;::::1;;:43;::::0;;::::1;:49;;::::0;111289:69:::1;;;;-1:-1:-1::0;;;111289:69:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;111369:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:50;;-1:-1:-1;;111369:50:0::1;::::0;::::1;;::::0;;::::1;::::0;;;111435:47;;1487:41:1;;;111435:47:0::1;::::0;1460:18:1;111435:47:0::1;;;;;;;;111167:323:::0;;:::o;103722:103::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;103792:14:::1;:25:::0;;;::::1;;-1:-1:-1::0;;;103792:25:0::1;-1:-1:-1::0;;;;103792:25:0;;::::1;::::0;;;::::1;::::0;;103722:103::o;112727:171::-;112846:15;;112817:73;;;-1:-1:-1;;;112817:73:0;;;;112790:7;;-1:-1:-1;;;;;112846:15:0;;112817:71;;:73;;;;;;;;;;;;;;112846:15;112817:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;112810:80;;112727:171;:::o;113471:160::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;113577:15:::1;::::0;113548:75:::1;::::0;-1:-1:-1;;;113548:75:0;;-1:-1:-1;;;;;191:32:1;;;113548:75:0::1;::::0;::::1;173:51:1::0;113577:15:0;;::::1;::::0;113548:66:::1;::::0;146:18:1;;113548:75:0::1;14:216:1::0;34411:240:0;28463:10;34499:4;34580:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;34580:27:0;;;;;;;;;;34499:4;;28463:10;34555:66;;28463:10;;34580:27;;:40;;34610:10;;34580:40;:::i;:::-;34555:8;:66::i;115097:133::-;115163:15;;115134:88;;-1:-1:-1;;;115134:88:0;;115203:10;115134:88;;;8575:51:1;115163:15:0;8642:18:1;;;8635:50;-1:-1:-1;;;;;115163:15:0;;;;115134:60;;8548:18:1;;115134:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;115097:133::o;107676:263::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;107766:23:::1;::::0;-1:-1:-1;;;;;107766:31:0;;::::1;-1:-1:-1::0;;;107766:23:0;;::::1;;:31:::0;107758:51:::1;;;;-1:-1:-1::0;;;107758:51:0::1;;;;;;;:::i;:::-;107848:23;::::0;107825:55:::1;::::0;-1:-1:-1;;;;;107825:55:0;;::::1;::::0;-1:-1:-1;;;107848:23:0;::::1;;::::0;107825:55:::1;::::0;;;::::1;107891:23;:32:::0;;-1:-1:-1;;;;;107891:32:0;;::::1;-1:-1:-1::0;;;107891:32:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;107676:263::o;115406:172::-;115528:15;;115499:71;;;-1:-1:-1;;;115499:71:0;;;;115472:7;;-1:-1:-1;;;;;115528:15:0;;115499:69;;:71;;;;;;;;;;;;;;115528:15;115499:71;;;;;;;;;;;;;;106358:947;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;106473:15:::1;::::0;-1:-1:-1;;;;;106473:15:0;;::::1;106459:29:::0;;::::1;::::0;106437:114:::1;;;::::0;-1:-1:-1;;;106437:114:0;;9148:2:1;106437:114:0::1;::::0;::::1;9130:21:1::0;9187:2;9167:18;;;9160:30;9226:34;9206:18;;;9199:62;-1:-1:-1;;;9277:18:1;;;9270:33;9320:19;;106437:114:0::1;8946:399:1::0;106437:114:0::1;106601:15;::::0;106567:50:::1;::::0;-1:-1:-1;;;;;106601:15:0;;::::1;::::0;106567:50;::::1;::::0;::::1;::::0;106601:15:::1;::::0;106567:50:::1;106681:10;-1:-1:-1::0;;;;;106662:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106744:16;::::0;106644:117:::1;::::0;-1:-1:-1;;;106644:117:0;;106737:4:::1;106644:117;::::0;::::1;9818:34:1::0;-1:-1:-1;;;;;106744:16:0;;::::1;9868:18:1::0;;;9861:43;106644:84:0;::::1;::::0;::::1;::::0;9753:18:1;;106644:117:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106628:13;:133:::0;;-1:-1:-1;;;;;106628:133:0;;::::1;-1:-1:-1::0;;;;;;106628:133:0;;::::1;;::::0;;;106772:15:::1;:28:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;106834:42:::1;::::0;;-1:-1:-1;;;106834:42:0;;;;:40:::1;::::0;:42:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;106772:28;106834:42:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106814:16;::::0;-1:-1:-1;;;;;106814:16:0;;::::1;:62:::0;::::1;;106811:171;;106911:16;::::0;106937:15:::1;::::0;106904:54:::1;::::0;-1:-1:-1;;;106904:54:0;;-1:-1:-1;;;;;106937:15:0;;::::1;106904:54;::::0;::::1;10089:51:1::0;-1:-1:-1;;10156:18:1;;;10149:34;106911:16:0;::::1;::::0;106904:32:::1;::::0;10062:18:1;;106904:54:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;106811:171;107016:15;::::0;106992:45:::1;::::0;107009:4:::1;::::0;-1:-1:-1;;;;;107016:15:0::1;-1:-1:-1::0;;106992:8:0::1;:45::i;:::-;107082:15;::::0;107123::::1;::::0;107053:86:::1;::::0;-1:-1:-1;;;107053:86:0;;-1:-1:-1;;;;;107123:15:0;;::::1;107053:86;::::0;::::1;173:51:1::0;107082:15:0;::::1;::::0;107053:69:::1;::::0;146:18:1;;107053:86:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;107048:189;;107183:15;::::0;107221::::1;::::0;107154:83:::1;::::0;-1:-1:-1;;;107154:83:0;;-1:-1:-1;;;;;107221:15:0;;::::1;107154:83;::::0;::::1;173:51:1::0;107183:15:0;::::1;::::0;107154:66:::1;::::0;146:18:1;;107154:83:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;107048:189;107277:13;::::0;107248:49:::1;::::0;-1:-1:-1;;;;;107277:13:0::1;::::0;107248:28:::1;:49::i;113262:201::-:0;113420:15;;113391:64;;-1:-1:-1;;;113391:64:0;;-1:-1:-1;;;;;191:32:1;;;113391:64:0;;;173:51:1;113359:7:0;;113420:15;;113391:55;;146:18:1;;113391:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;114648:441::-;114859:15;;114830:58;;-1:-1:-1;;;;;;114830:58:0;;;;;2271:25:1;;;114728:18:0;;;;;;-1:-1:-1;;;;;114859:15:0;;114830:53;;2244:18:1;;114830:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;114904:177;;;10736:25:1;;;10792:2;10777:18;;10770:34;;;10820:18;;;10813:34;;;10878:2;10863:18;;10856:34;;;114713:175:0;;-1:-1:-1;114713:175:0;;-1:-1:-1;114713:175:0;-1:-1:-1;115060:10:0;;115022:5;;114904:177;;10723:3:1;10708:19;114904:177:0;;;;;;;114702:387;;;114648:441;:::o;59910:103::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;59975:30:::1;60002:1;59975:18;:30::i;:::-;59910:103::o:0;111498:466::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;111610:6:::1;111598:8;:18;;:40;;;;;111632:6;111620:8;:18;;111598:40;111576:142;;;::::0;-1:-1:-1;;;111576:142:0;;11103:2:1;111576:142:0::1;::::0;::::1;11085:21:1::0;11142:2;11122:18;;;11115:30;11181:34;11161:18;;;11154:62;-1:-1:-1;;;11232:18:1;;;11225:50;11292:19;;111576:142:0::1;10901:416:1::0;111576:142:0::1;111763:16;;111751:8;:28:::0;111729:122:::1;;;::::0;-1:-1:-1;;;111729:122:0;;11524:2:1;111729:122:0::1;::::0;::::1;11506:21:1::0;11563:2;11543:18;;;11536:30;11602:34;11582:18;;;11575:62;-1:-1:-1;;;11653:18:1;;;11646:42;11705:19;;111729:122:0::1;11322:408:1::0;111729:122:0::1;111901:16;::::0;111867:51:::1;::::0;111891:8;;111867:51:::1;::::0;;;::::1;111929:16;:27:::0;111498:466::o;104721:1077::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;104836:15:::1;::::0;-1:-1:-1;;;;;104836:15:0;;::::1;104822:29:::0;;::::1;::::0;104800:124:::1;;;::::0;-1:-1:-1;;;104800:124:0;;11937:2:1;104800:124:0::1;::::0;::::1;11919:21:1::0;11976:2;11956:18;;;11949:30;12015:34;11995:18;;;11988:62;-1:-1:-1;;;12066:18:1;;;12059:43;12119:19;;104800:124:0::1;11735:409:1::0;104800:124:0::1;104937:26;104973:10;104937:47;;105087:4;-1:-1:-1::0;;;;;105019:73:0::1;105048:18;-1:-1:-1::0;;;;;105019:54:0::1;;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;105019:73:0::1;;104997:198;;;::::0;-1:-1:-1;;;104997:198:0;;12351:2:1;104997:198:0::1;::::0;::::1;12333:21:1::0;12390:2;12370:18;;;12363:30;12429:34;12409:18;;;12402:62;12500:34;12480:18;;;12473:62;-1:-1:-1;;;12551:19:1;;;12544:42;12603:19;;104997:198:0::1;12149:479:1::0;104997:198:0::1;105208:89;::::0;-1:-1:-1;;;105208:89:0;;-1:-1:-1;;;;;105208:69:0;::::1;:89;::::0;::::1;173:51:1::0;;;105208:69:0;::::1;::::0;146:18:1;;105208:89:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;105308:84:0::1;::::0;-1:-1:-1;;;105308:84:0;;105386:4:::1;105308:84;::::0;::::1;173:51:1::0;-1:-1:-1;;;;;105308:69:0;::::1;::::0;-1:-1:-1;105308:69:0::1;::::0;-1:-1:-1;146:18:1;;105308:84:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;105432:18;-1:-1:-1::0;;;;;105403:69:0::1;;105473:7;59332:6:::0;;-1:-1:-1;;;;;59332:6:0;;59259:87;105473:7:::1;105403:78;::::0;-1:-1:-1;;;;;;105403:78:0::1;::::0;;;;;;-1:-1:-1;;;;;191:32:1;;;105403:78:0::1;::::0;::::1;173:51:1::0;146:18;;105403:78:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;105562:15:0::1;::::0;105492:86:::1;::::0;-1:-1:-1;;;105492:86:0;;-1:-1:-1;;;;;105562:15:0;;::::1;105492:86;::::0;::::1;173:51:1::0;105492:69:0;;::::1;::::0;-1:-1:-1;105492:69:0::1;::::0;-1:-1:-1;146:18:1;;105492:86:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;105659:13:0::1;::::0;105589:84:::1;::::0;-1:-1:-1;;;105589:84:0;;-1:-1:-1;;;;;105659:13:0;;::::1;105589:84;::::0;::::1;173:51:1::0;105589:69:0;;::::1;::::0;-1:-1:-1;105589:69:0::1;::::0;-1:-1:-1;146:18:1;;105589:84:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;105725:15:0::1;::::0;105691:50:::1;::::0;-1:-1:-1;;;;;105725:15:0;;::::1;::::0;-1:-1:-1;105691:50:0;;::::1;::::0;-1:-1:-1;105691:50:0::1;::::0;105725:15:::1;::::0;105691:50:::1;105754:15;:36:::0;;-1:-1:-1;;;;;;105754:36:0::1;-1:-1:-1::0;;;;;105754:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;104721:1077:0:o;124901:207::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;124976:22:0;::::1;124984:4;124976:22:::0;124968:46:::1;;;::::0;-1:-1:-1;;;124968:46:0;;12835:2:1;124968:46:0::1;::::0;::::1;12817:21:1::0;12874:2;12854:18;;;12847:30;-1:-1:-1;;;12893:18:1;;;12886:41;12944:18;;124968:46:0::1;12633:335:1::0;124968:46:0::1;125025:75;125052:7;59332:6:::0;;-1:-1:-1;;;;;59332:6:0;;59259:87;125052:7:::1;125061:38;::::0;-1:-1:-1;;;125061:38:0;;125093:4:::1;125061:38;::::0;::::1;173:51:1::0;-1:-1:-1;;;;;125061:23:0;::::1;::::0;::::1;::::0;146:18:1;;125061:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;125025:26:0;::::1;::::0;:75;:26:::1;:75::i;105806:546::-:0;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;105897:16:::1;:34:::0;;-1:-1:-1;;;;;;105897:34:0::1;-1:-1:-1::0;;;;;105897:34:0;;::::1;::::0;;;::::1;::::0;;;105995:15:::1;::::0;105976:45:::1;::::0;;-1:-1:-1;;;105976:45:0;;;;105995:15;;;::::1;::::0;105976:43:::1;::::0;:45:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;105995:15;105976:45:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106076:16;::::0;105958:145:::1;::::0;-1:-1:-1;;;105958:145:0;;106056:4:::1;105958:145;::::0;::::1;9818:34:1::0;-1:-1:-1;;;;;106076:16:0;;::::1;9868:18:1::0;;;9861:43;105958:75:0;::::1;::::0;::::1;::::0;9753:18:1;;105958:145:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;105942:13;:161:::0;;-1:-1:-1;;;;;;105942:161:0::1;-1:-1:-1::0;;;;;105942:161:0;;::::1;;::::0;;106156:15:::1;::::0;106137:42:::1;::::0;;-1:-1:-1;;;106137:42:0;;;;106156:15;;;::::1;::::0;106137:40:::1;::::0;:42:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;106156:15;106137:42:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106117:16;::::0;-1:-1:-1;;;;;106117:16:0;;::::1;:62:::0;::::1;;106114:171;;106214:16;::::0;106240:15:::1;::::0;106207:54:::1;::::0;-1:-1:-1;;;106207:54:0;;-1:-1:-1;;;;;106240:15:0;;::::1;106207:54;::::0;::::1;10089:51:1::0;-1:-1:-1;;10156:18:1;;;10149:34;106214:16:0;::::1;::::0;106207:32:::1;::::0;10062:18:1;;106207:54:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;106324:13;::::0;106295:49:::1;::::0;-1:-1:-1;;;;;106324:13:0::1;::::0;106295:28:::1;:49::i;109606:622::-:0;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;109788:16:::1;::::0;109809:3:::1;::::0;109788:16:::1;-1:-1:-1::0;;;109788:16:0;::::1;::::0;::::1;::::0;109753:33:::1;::::0;109769:16;;;::::1;;109753:14:::0;:33:::1;:::i;:::-;:52;;;;:::i;:::-;:59;;;;109731:124;;;;-1:-1:-1::0;;;109731:124:0::1;;;;;;;:::i;:::-;109921:15;::::0;109941:3:::1;::::0;109921:15:::1;-1:-1:-1::0;;;109921:15:0;::::1;::::0;::::1;::::0;109888:31:::1;::::0;-1:-1:-1;;;109903:15:0;;::::1;;109888:13:::0;:31:::1;:::i;:::-;:49;;;;:::i;:::-;:56;;;;109866:120;;;;-1:-1:-1::0;;;109866:120:0::1;;;;;;;:::i;:::-;110090:13;::::0;110002:130:::1;::::0;;110090:13:::1;14099:15:1::0;;;14081:34;;14151:15;;;14146:2;14131:18;;14124:43;110090:13:0;;::::1;14183:18:1::0;;;14176:43;110119:12:0;;;::::1;::::0;;::::1;14250:2:1::0;14235:18;;14228:43;110002:130:0;::::1;::::0;;;;14043:3:1;110002:130:0;;::::1;110143:13;:30:::0;;::::1;110184:28:::0;;::::1;::::0;::::1;-1:-1:-1::0;;110184:28:0;;;110143:30;;;::::1;110184:28:::0;;;;;;;::::1;::::0;;109606:622::o;30794:104::-;30850:13;30883:7;30876:14;;;;;:::i;110240:309::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;110384:13:::1;::::0;-1:-1:-1;;;;;110384:13:0;;::::1;110376:21:::0;;::::1;::::0;110354:133:::1;;;::::0;-1:-1:-1;;;110354:133:0;;14484:2:1;110354:133:0::1;::::0;::::1;14466:21:1::0;14523:2;14503:18;;;14496:30;14562:34;14542:18;;;14535:62;14633:32;14613:18;;;14606:60;14683:19;;110354:133:0::1;14282:426:1::0;110354:133:0::1;110500:41;110529:4;110535:5;110500:28;:41::i;:::-;110240:309:::0;;:::o;112134:139::-;112237:15;;112208:57;;;-1:-1:-1;;;112208:57:0;;;;112181:7;;-1:-1:-1;;;;;112237:15:0;;112208:55;;:57;;;;;;;;;;;;;;112237:15;112208:57;;;;;;;;;;;;;;35154:438;28463:10;35247:4;35330:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;35330:27:0;;;;;;;;;;35247:4;;28463:10;35376:35;;;;35368:85;;;;-1:-1:-1;;;35368:85:0;;14915:2:1;35368:85:0;;;14897:21:1;14954:2;14934:18;;;14927:30;14993:34;14973:18;;;14966:62;-1:-1:-1;;;15044:18:1;;;15037:35;15089:19;;35368:85:0;14713:401:1;35368:85:0;35489:60;35498:5;35505:7;35533:15;35514:16;:34;35489:8;:60::i;:::-;-1:-1:-1;35580:4:0;;35154:438;-1:-1:-1;;;;35154:438:0:o;113040:214::-;113198:15;;113169:77;;-1:-1:-1;;;113169:77:0;;-1:-1:-1;;;;;191:32:1;;;113169:77:0;;;173:51:1;113137:7:0;;113198:15;;113169:68;;146:18:1;;113169:77:0;14:216:1;32199:193:0;32278:4;28463:10;32334:28;28463:10;32351:2;32355:6;32334:9;:28::i;104333:375::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;104500:5:::1;104484:13;31783:12:::0;;;31695:108;104484:13:::1;:21;;;;:::i;:::-;104461;:44;;104453:101;;;::::0;-1:-1:-1;;;104453:101:0;;15321:2:1;104453:101:0::1;::::0;::::1;15303:21:1::0;15360:2;15340:18;;;15333:30;15399:34;15379:18;;;15372:62;-1:-1:-1;;;15450:18:1;;;15443:42;15502:19;;104453:101:0::1;15119:408:1::0;104453:101:0::1;104624:20;::::0;104574:71:::1;::::0;;7658:25:1;;;7714:2;7699:18;;7692:34;;;;104574:71:0::1;::::0;7631:18:1;104574:71:0::1;;;;;;;104656:20;:44:::0;104333:375::o;113860:381::-;114197:15;;114168:65;;-1:-1:-1;;;114168:65:0;;-1:-1:-1;;;;;191:32:1;;;114168:65:0;;;173:51:1;113974:7:0;;;;;;;;;;;;;;;;114197:15;;;114168:56;;146:18:1;;114168:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;114161:72;;;;;;;;;;;;;;;;113860:381;;;;;;;;;:::o;103831:237::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;103925:1:::1;103916:6;:10;103908:45;;;::::0;-1:-1:-1;;;103908:45:0;;16420:2:1;103908:45:0::1;::::0;::::1;16402:21:1::0;16459:2;16439:18;;;16432:30;-1:-1:-1;;;16478:18:1;;;16471:52;16540:18;;103908:45:0::1;16218:346:1::0;103908:45:0::1;104002:18;::::0;103969:52:::1;::::0;;7658:25:1;;;7714:2;7699:18;;7692:34;;;;103969:52:0::1;::::0;7631:18:1;103969:52:0::1;;;;;;;104032:18;:27:::0;103831:237::o;112504:215::-;112661:15;;112632:79;;;-1:-1:-1;;;112632:79:0;;;;112600:7;;-1:-1:-1;;;;;112661:15:0;;112632:77;;:79;;;;;;;;;;;;;;112661:15;112632:79;;;;;;;;;;;;;;107313:255;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;107406:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;107398:60:::1;;;;-1:-1:-1::0;;;107398:60:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;107469:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;107469:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;107526:34;;1487:41:1;;;107526:34:0::1;::::0;1460:18:1;107526:34:0::1;1347:187:1::0;113639:213:0;113795:15;;113766:78;;-1:-1:-1;;;113766:78:0;;-1:-1:-1;;;;;191:32:1;;;113766:78:0;;;173:51:1;113737:4:0;;113795:15;;113766:69;;146:18:1;;113766:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;108933:665::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;109124:13:::1;::::0;109141:3:::1;::::0;109124:13:::1;::::0;;::::1;::::0;109089:34:::1;::::0;109107:16;;;::::1;;109089:17:::0;:34:::1;:::i;:::-;:48;;;;:::i;:::-;:55;;;;109067:120;;;;-1:-1:-1::0;;;109067:120:0::1;;;;;;;:::i;:::-;109253:12;::::0;109269:3:::1;::::0;109253:12:::1;::::0;;::::1;::::0;::::1;::::0;109220:32:::1;::::0;-1:-1:-1;;;109237:15:0;;::::1;;109220:16:::0;:32:::1;:::i;:::-;:45;;;;:::i;:::-;:52;;;;109198:116;;;;-1:-1:-1::0;;;109198:116:0::1;;;;;;;:::i;:::-;109431:16;::::0;109335:153:::1;::::0;;109431:16:::1;14099:15:1::0;;;14081:34;;14151:15;;;14146:2;14131:18;;14124:43;-1:-1:-1;;;109431:16:0;::::1;::::0;::::1;14183:18:1::0;;;14176:43;-1:-1:-1;;;109462:15:0;;::::1;::::0;;::::1;14250:2:1::0;14235:18;;14228:43;109335:153:0;::::1;::::0;;;;14043:3:1;109335:153:0;;::::1;109501:16;:36:::0;;-1:-1:-1;;109548:34:0;-1:-1:-1;;;109501:36:0::1;::::0;;::::1;;-1:-1:-1::0;;;;109548:34:0;;-1:-1:-1;;;109548:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;108933:665::o;108267:658::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;108458:13:::1;::::0;108475:3:::1;::::0;108458:13:::1;::::0;;::::1;::::0;108423:34:::1;::::0;-1:-1:-1;;;108441:16:0;;::::1;;108423:17:::0;:34:::1;:::i;:::-;:48;;;;:::i;:::-;:55;;;;108401:120;;;;-1:-1:-1::0;;;108401:120:0::1;;;;;;;:::i;:::-;108587:12;::::0;108603:3:::1;::::0;108587:12:::1;::::0;;::::1;::::0;::::1;::::0;108554:32:::1;::::0;-1:-1:-1;;;108571:15:0;;::::1;;108554:16:::0;:32:::1;:::i;:::-;:45;;;;:::i;:::-;:52;;;;108532:116;;;;-1:-1:-1::0;;;108532:116:0::1;;;;;;;:::i;:::-;108760:16;::::0;108664:153:::1;::::0;;108760:16:::1;14099:15:1::0;;;14081:34;;14151:15;;;14146:2;14131:18;;14124:43;108760:16:0;;::::1;::::0;::::1;14183:18:1::0;;;14176:43;-1:-1:-1;;;108791:15:0;;::::1;::::0;;::::1;14250:2:1::0;14235:18;;14228:43;108664:153:0;::::1;::::0;;;;14043:3:1;108664:153:0;;::::1;108828:16;:36:::0;;-1:-1:-1;;108875:34:0;108828:36;::::1;::::0;;::::1;;-1:-1:-1::0;;108875:34:0;;-1:-1:-1;;;108875:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;108267:658::o;124711:184::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;124765:12:::1;124789:7;59332:6:::0;;-1:-1:-1;;;;;59332:6:0;;59259:87;124789:7:::1;-1:-1:-1::0;;;;;124781:21:0::1;124810;124781:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124764:72;;;124855:7;124847:40;;;::::0;-1:-1:-1;;;124847:40:0;;16981:2:1;124847:40:0::1;::::0;::::1;16963:21:1::0;17020:2;17000:18;;;16993:30;-1:-1:-1;;;17039:18:1;;;17032:50;17099:18;;124847:40:0::1;16779:344:1::0;115238:160:0;115350:15;;115321:69;;;-1:-1:-1;;;115321:69:0;;;;115294:7;;-1:-1:-1;;;;;115350:15:0;;115321:67;;:69;;;;;;;;;;;;;;115350:15;115321:69;;;;;;;;;;;;;;111972:154;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;112075:15:::1;::::0;112046:72:::1;::::0;-1:-1:-1;;;112046:72:0;;::::1;::::0;::::1;2271:25:1::0;;;-1:-1:-1;;;;;112075:15:0;;::::1;::::0;112046:61:::1;::::0;2244:18:1;;112046:72:0::1;2125:177:1::0;107947:312:0;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;108052:20:::1;::::0;-1:-1:-1;;;;;108052:43:0;;::::1;:20:::0;::::1;:43:::0;108044:63:::1;;;;-1:-1:-1::0;;;108044:63:0::1;;;;;;;:::i;:::-;108174:20;::::0;108123:72:::1;::::0;-1:-1:-1;;;;;108174:20:0;;::::1;::::0;108123:72;::::1;::::0;::::1;::::0;108174:20:::1;::::0;108123:72:::1;108206:20;:44:::0;;-1:-1:-1;;;;;;108206:44:0::1;-1:-1:-1::0;;;;;108206:44:0;;;::::1;::::0;;;::::1;::::0;;107947:312::o;114249:391::-;114591:15;;114562:70;;-1:-1:-1;;;114562:70:0;;;;;2271:25:1;;;114368:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;114591:15:0;;;;114562:63;;2244:18:1;;114562:70:0;2125:177:1;60168:201:0;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60257:22:0;::::1;60249:73;;;::::0;-1:-1:-1;;;60249:73:0;;17330:2:1;60249:73:0::1;::::0;::::1;17312:21:1::0;17369:2;17349:18;;;17342:30;17408:34;17388:18;;;17381:62;-1:-1:-1;;;17459:18:1;;;17452:36;17505:19;;60249:73:0::1;17128:402:1::0;60249:73:0::1;60333:28;60352:8;60333:18;:28::i;286:524::-:0;343:16;413:4;407:11;-1:-1:-1;;;439:3:0;432:79;558:14;552:4;548:25;541:4;536:3;532:14;525:49;-1:-1:-1;;;604:4:0;599:3;595:14;588:90;719:4;714:3;711:1;704:20;692:32;-1:-1:-1;;;;;;;753:22:0;;745:57;;;;-1:-1:-1;;;745:57:0;;17737:2:1;745:57:0;;;17719:21:1;17776:2;17756:18;;;17749:30;-1:-1:-1;;;17795:18:1;;;17788:52;17857:18;;745:57:0;17535:346:1;745:57:0;286:524;;;:::o;38790:380::-;-1:-1:-1;;;;;38926:19:0;;38918:68;;;;-1:-1:-1;;;38918:68:0;;18088:2:1;38918:68:0;;;18070:21:1;18127:2;18107:18;;;18100:30;18166:34;18146:18;;;18139:62;-1:-1:-1;;;18217:18:1;;;18210:34;18261:19;;38918:68:0;17886:400:1;38918:68:0;-1:-1:-1;;;;;39005:21:0;;38997:68;;;;-1:-1:-1;;;38997:68:0;;18493:2:1;38997:68:0;;;18475:21:1;18532:2;18512:18;;;18505:30;18571:34;18551:18;;;18544:62;-1:-1:-1;;;18622:18:1;;;18615:32;18664:19;;38997:68:0;18291:398:1;38997:68:0;-1:-1:-1;;;;;39078:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;39130:32;;2271:25:1;;;39130:32:0;;2244:18:1;39130:32:0;;;;;;;38790:380;;;:::o;39457:453::-;-1:-1:-1;;;;;32571:18:0;;;39592:24;32571:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;39659:37:0;;39655:248;;39741:6;39721:16;:26;;39713:68;;;;-1:-1:-1;;;39713:68:0;;18896:2:1;39713:68:0;;;18878:21:1;18935:2;18915:18;;;18908:30;18974:31;18954:18;;;18947:59;19023:18;;39713:68:0;18694:353:1;39713:68:0;39825:51;39834:5;39841:7;39869:6;39850:16;:25;39825:8;:51::i;:::-;39581:329;39457:453;;;:::o;115586:3816::-;-1:-1:-1;;;;;115718:18:0;;115710:68;;;;-1:-1:-1;;;115710:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;115797:16:0;;115789:64;;;;-1:-1:-1;;;115789:64:0;;;;;;;:::i;:::-;115879:1;115872:6;:8;115864:48;;;;-1:-1:-1;;;115864:48:0;;20064:2:1;115864:48:0;;;20046:21:1;20103:2;20083:18;;;20076:30;20142:29;20122:18;;;20115:57;20189:18;;115864:48:0;19862:351:1;115864:48:0;115928:8;;-1:-1:-1;;;115928:8:0;;;;115927:9;:27;;;;-1:-1:-1;115940:14:0;;-1:-1:-1;;;115940:14:0;;;;115927:27;:57;;;;-1:-1:-1;;;;;;115959:25:0;;;;;;:19;:25;;;;;;;;115958:26;115927:57;:85;;;;-1:-1:-1;;;;;;115989:23:0;;;;;;:19;:23;;;;;;;;115988:24;115927:85;115923:178;;;116041:10;;116029:60;;-1:-1:-1;;;116029:60:0;;-1:-1:-1;;;;;20476:15:1;;;116029:60:0;;;20458:34:1;20528:15;;;20508:18;;;20501:43;20560:18;;;20553:34;;;116041:10:0;;;;116029:42;;20393:18:1;;116029:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;115923:178;116162:4;116113:28;31967:18;;;;;;;;;;;116220;;116196:42;;;;;;;116269:33;;-1:-1:-1;116294:8:0;;-1:-1:-1;;;116294:8:0;;;;116293:9;116269:33;:82;;;;-1:-1:-1;;;;;;116320:31:0;;;;;;:25;:31;;;;;;;;116319:32;116269:82;:114;;;;-1:-1:-1;59332:6:0;;-1:-1:-1;;;;;116368:15:0;;;59332:6;;116368:15;;116269:114;:144;;;;-1:-1:-1;59332:6:0;;-1:-1:-1;;;;;116400:13:0;;;59332:6;;116400:13;;116269:144;116251:650;;;116440:8;:15;;-1:-1:-1;;;;116440:15:0;-1:-1:-1;;;116440:15:0;;;116473:19;;:21;116470:80;;116513:37;116530:19;;116513:16;:37::i;:::-;116568:19;;:21;116565:78;;116608:35;116623:19;;116608:14;:35::i;:::-;116699:4;116660:18;31967;;;;;;;;;;;116723:12;;116720:66;;116754:32;116775:10;116754:20;:32::i;:::-;-1:-1:-1;116821:1:0;116801:19;:21;;;116837:19;:21;116873:8;:16;;-1:-1:-1;;;;116873:16:0;;;116251:650;116929:8;;-1:-1:-1;;;;;116954:25:0;;116913:12;116954:25;;;:19;:25;;;;;;116929:8;-1:-1:-1;;;116929:8:0;;;;;116928:9;;116954:25;;:52;;-1:-1:-1;;;;;;116983:23:0;;;;;;:19;:23;;;;;;;;116954:52;116950:100;;;-1:-1:-1;117033:5:0;116950:100;117060:21;117092;117124:18;117157:7;117153:895;;;-1:-1:-1;;;;;117185:31:0;;;;;;:25;:31;;;;;;;;117181:510;;;117258:12;;117273:4;;117250:21;;117258:12;;;;;117250:6;:21;:::i;:::-;:28;;;;:::i;:::-;117321:15;;117237:41;;-1:-1:-1;117339:4:0;;117313:24;;-1:-1:-1;;;117321:15:0;;;;117313:6;:24;:::i;:::-;:31;;;;:::i;:::-;117387:15;;117297:47;;-1:-1:-1;117405:4:0;;117379:24;;-1:-1:-1;;;117387:15:0;;;;117379:6;:24;:::i;:::-;:31;;;;:::i;:::-;117363:47;;117181:510;;;-1:-1:-1;;;;;117449:29:0;;;;;;:25;:29;;;;;;;;117445:246;;;117520:13;;117536:4;;117512:22;;117520:13;;117512:6;:22;:::i;:::-;:29;;;;:::i;:::-;117584:16;;117499:42;;-1:-1:-1;117603:4:0;;117576:25;;117584:16;;;;;117576:6;:25;:::i;:::-;:32;;;;:::i;:::-;117651:16;;117560:48;;-1:-1:-1;117670:4:0;;117643:25;;-1:-1:-1;;;117651:16:0;;;;117643:6;:25;:::i;:::-;:32;;;;:::i;:::-;117627:48;;117445:246;117747:13;117727:19;;:33;;;;:::i;:::-;117705:19;:55;117797:19;;:33;;117817:13;;117797:33;:::i;:::-;117775:19;:55;117845:17;117888:13;117863:24;117874:13;117863:10;:24;:::i;:::-;:38;;;;:::i;:::-;117845:56;-1:-1:-1;117923:18:0;117845:56;117923:6;:18;:::i;:::-;117916:25;-1:-1:-1;117959:11:0;;117956:80;;117989:47;118005:4;118019;118026:9;117989:15;:47::i;:::-;117166:882;117153:895;118078:33;118094:4;118100:2;118104:6;118078:15;:33::i;:::-;118170:15;;-1:-1:-1;;;;;118170:15:0;118141:56;118206:4;118213:15;118206:4;-1:-1:-1;;;;;31967:18:0;31940:7;31967:18;;;;;;;;;;;;31866:127;118213:15;118141:88;;-1:-1:-1;;;;;;118141:88:0;;;;;;;-1:-1:-1;;;;;10107:32:1;;;118141:88:0;;;10089:51:1;10156:18;;;10149:34;10062:18;;118141:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118124:126;118293:15;;-1:-1:-1;;;;;118293:15:0;118264:56;118329:2;118334:13;118329:2;-1:-1:-1;;;;;31967:18:0;31940:7;31967:18;;;;;;;;;;;;31866:127;118334:13;118264:84;;-1:-1:-1;;;;;;118264:84:0;;;;;;;-1:-1:-1;;;;;10107:32:1;;;118264:84:0;;;10089:51:1;10156:18;;;10149:34;10062:18;;118264:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118260:100;118377:8;;-1:-1:-1;;;118377:8:0;;;;118372:1023;;-1:-1:-1;;;;;118407:40:0;;;;;;:34;:40;;;;;;;;118402:214;;118507:20;;118498:6;:29;118468:132;;;;-1:-1:-1;;;118468:132:0;;21401:2:1;118468:132:0;;;21383:21:1;21440:2;21420:18;;;21413:30;21479:31;21459:18;;;21452:59;21528:18;;118468:132:0;21199:353:1;118468:132:0;-1:-1:-1;;;;;118635:38:0;;;;;;:34;:38;;;;;;;;118630:210;;118740:9;;-1:-1:-1;;;;;31967:18:0;;31940:7;31967:18;;;;;;;;;;;118724:25;118694:130;;;;-1:-1:-1;;;118694:130:0;;21759:2:1;118694:130:0;;;21741:21:1;21798:2;21778:18;;;21771:30;21837:33;21817:18;;;21810:61;21888:18;;118694:130:0;21557:355:1;118694:130:0;118868:16;;118934:15;;118905:58;;-1:-1:-1;;;;;;118905:58:0;;;;;2271:25:1;;;-1:-1:-1;;;;;118934:15:0;;;;118905:53;;2244:18:1;;118905:58:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;118905:58:0;;;;;;;;-1:-1:-1;;118905:58:0;;;;;;;;;;;;:::i;:::-;;;118901:483;;;119127:232;;;10736:25:1;;;10792:2;10777:18;;10770:34;;;10820:18;;;10813:34;;;10878:2;10863:18;;10856:34;;;119330:10:0;;119277:4;;119127:232;;10723:3:1;10708:19;119127:232:0;;;;;;;118964:411;;;118901:483;118387:1008;118372:1023;115699:3703;;;;;;115586:3816;;;:::o;110557:602::-;-1:-1:-1;;;;;110662:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;110640:146;;;;-1:-1:-1;;;110640:146:0;;22119:2:1;110640:146:0;;;22101:21:1;22158:2;22138:18;;;22131:30;22197:34;22177:18;;;22170:62;22268:26;22248:18;;;22241:54;22312:19;;110640:146:0;21917:420:1;110640:146:0;-1:-1:-1;;;;;110797:31:0;;;;;;:25;:31;;;;;;;;:39;;;;;;-1:-1:-1;;110797:39:0;;;;;;;;110847:34;:40;;;;;;;:48;;;;;;;;;;;110831:5;;110910:85;;-1:-1:-1;110949:15:0;;110920:75;;-1:-1:-1;;;110920:75:0;;-1:-1:-1;;;;;191:32:1;;;110920:75:0;;;173:51:1;110949:15:0;;;;110920:69;;146:18:1;;110920:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;110919:76;110910:85;110906:190;;;111041:15;;111012:72;;-1:-1:-1;;;111012:72:0;;-1:-1:-1;;;;;191:32:1;;;111012:72:0;;;173:51:1;111041:15:0;;;;111012:66;;146:18:1;;111012:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110906:190;111139:4;-1:-1:-1;;;;;111111:40:0;;111145:5;111111:40;;;;1512:14:1;1505:22;1487:41;;1475:2;1460:18;;1347:187;60529:191:0;60622:6;;;-1:-1:-1;;;;;60639:17:0;;;-1:-1:-1;;;;;;60639:17:0;;;;;;;60672:40;;60622:6;;;60639:17;60622:6;;60672:40;;60603:16;;60672:40;60592:128;60529:191;:::o;69670:211::-;69814:58;;;-1:-1:-1;;;;;10107:32:1;;69814:58:0;;;10089:51:1;10156:18;;;;10149:34;;;69814:58:0;;;;;;;;;;10062:18:1;;;;69814:58:0;;;;;;;;-1:-1:-1;;;;;69814:58:0;-1:-1:-1;;;69814:58:0;;;69787:86;;69807:5;;69787:19;:86::i;:::-;69670:211;;;:::o;119408:1429::-;119494:11;;119472:20;;-1:-1:-1;;;;;119494:11:0;;;119472:20;;:33;119469:1351;;119557:11;;119550:76;;-1:-1:-1;;;119550:76:0;;119606:4;119550:76;;;173:51:1;119521:26:0;;-1:-1:-1;;;;;119557:11:0;;119550:29;;146:18:1;;119550:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119521:105;;119641:25;119659:6;119641:17;:25::i;:::-;119710:11;;119703:44;;-1:-1:-1;;;119703:44:0;;119741:4;119703:44;;;173:51:1;119681:18:0;;119768;;-1:-1:-1;;;;;119710:11:0;;;;119703:29;;146:18:1;;119703:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119702:99;;;;:::i;:::-;119849:23;;;119823:11;119681:120;;-1:-1:-1;119816:69:0;;-1:-1:-1;;;;;119823:11:0;;;;-1:-1:-1;;;119849:23:0;;;119681:120;119816:32;:69::i;119469:1351::-;119927:16;;119905:20;;-1:-1:-1;;;;;119927:16:0;;;119905:20;;:38;119902:918;;120021:15;;120002:42;;;-1:-1:-1;;;120002:42:0;;;;119959:22;;-1:-1:-1;;;;;120021:15:0;;120002:40;;:42;;;;;;;;;;;;;;120021:15;120002:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119984:16;;-1:-1:-1;;;;;119984:16:0;;;:60;;;:154;;120096:16;;120089:49;;-1:-1:-1;;;120089:49:0;;120132:4;120089:49;;;173:51:1;-1:-1:-1;;;;;120096:16:0;;;;120089:34;;146:18:1;;120089:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119984:154;;;120047:21;119984:154;119959:179;;120153:30;120176:6;120153:22;:30::i;:::-;120256:15;;120237:42;;;-1:-1:-1;;;120237:42:0;;;;120198:18;;-1:-1:-1;;;;;120256:15:0;;120237:40;;:42;;;;;;;;;;;;;;120256:15;120237:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;120219:16;;-1:-1:-1;;;;;120219:16:0;;;:60;;;:183;;120345:16;;120338:49;;-1:-1:-1;;;120338:49:0;;120381:4;120338:49;;;173:51:1;120388:14:0;;-1:-1:-1;;;;;120345:16:0;;120338:34;;146:18:1;;120338:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;;;:::i;:::-;120219:183;;;120282:36;120304:14;120282:21;:36;:::i;:::-;120198:204;;120457:15;;;;;;;;;-1:-1:-1;;;;;120457:15:0;-1:-1:-1;;;;;120438:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;120420:16;;-1:-1:-1;;;;;120420:60:0;;;:16;;:60;120417:303;;120525:23;;120517:60;;120501:12;;-1:-1:-1;;;120525:23:0;;-1:-1:-1;;;;;120525:23:0;;120562:10;;120501:12;120517:60;120501:12;120517:60;120562:10;120525:23;120517:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;69670:211:0:o;120417:303::-;120668:23;;120637:16;;120630:74;;-1:-1:-1;;;;;120637:16:0;;;;-1:-1:-1;;;120668:23:0;;;;120693:10;120630:37;:74::i;119902:918::-;120776:23;;120751:57;;120769:4;;-1:-1:-1;;;120776:23:0;;-1:-1:-1;;;;;120776:23:0;120801:6;120751:9;:57::i;120843:686::-;120902:12;120917:10;120925:1;120917:6;:10;:::i;:::-;120902:25;-1:-1:-1;120938:17:0;120958:13;120902:25;120958:6;:13;:::i;:::-;120938:33;;120984:22;121046:15;;;;;;;;;-1:-1:-1;;;;;121046:15:0;-1:-1:-1;;;;;121027:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;121009:16;;-1:-1:-1;;;;;121009:16:0;;;:60;;;:150;;121117:16;;121110:49;;-1:-1:-1;;;121110:49:0;;121153:4;121110:49;;;173:51:1;-1:-1:-1;;;;;121117:16:0;;;;121110:34;;146:18:1;;121110:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;121009:150;;;121072:21;121009:150;120984:175;;121172:28;121195:4;121172:22;:28::i;:::-;121270:15;;121251:42;;;-1:-1:-1;;;121251:42:0;;;;121212:18;;-1:-1:-1;;;;;121270:15:0;;121251:40;;:42;;;;;;;;;;;;;;121270:15;121251:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;121233:16;;-1:-1:-1;;;;;121233:16:0;;;:60;;;:179;;121355:16;;121348:49;;-1:-1:-1;;;121348:49:0;;121391:4;121348:49;;;173:51:1;121398:14:0;;-1:-1:-1;;;;;121355:16:0;;121348:34;;146:18:1;;121348:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;;;:::i;:::-;121233:179;;;121296:36;121318:14;121296:21;:36;:::i;:::-;121212:200;;121425:35;121438:9;121449:10;121425:12;:35::i;:::-;121478:43;;;22544:25:1;;;22600:2;22585:18;;22578:34;;;22628:18;;;22621:34;;;121478:43:0;;22532:2:1;22517:18;121478:43:0;;;;;;;120891:638;;;;120843:686;:::o;124285:420::-;124350:25;124368:6;124350:17;:25::i;:::-;124413:11;;124406:44;;-1:-1:-1;;;124406:44:0;;124444:4;124406:44;;;173:51:1;124386:17:0;;-1:-1:-1;;;;;124413:11:0;;124406:29;;146:18:1;;124406:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;124508:15;;124468:11;;124386:64;;-1:-1:-1;124461:97:0;;-1:-1:-1;;;;;124468:11:0;;;;124508:15;124386:64;124461:32;:97::i;:::-;124598:15;;124569:80;;-1:-1:-1;;;124569:80:0;;;;;2271:25:1;;;-1:-1:-1;;;;;124598:15:0;;;;124569:69;;2244:18:1;;124569:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;124665:32:0;;;7658:25:1;;;7714:2;7699:18;;7692:34;;;124665:32:0;;-1:-1:-1;7631:18:1;;-1:-1:-1;124665:32:0;;;;;;;124339:366;124285:420;:::o;36071:671::-;-1:-1:-1;;;;;36202:18:0;;36194:68;;;;-1:-1:-1;;;36194:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36281:16:0;;36273:64;;;;-1:-1:-1;;;36273:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36423:15:0;;36401:19;36423:15;;;;;;;;;;;36457:21;;;;36449:72;;;;-1:-1:-1;;;36449:72:0;;22868:2:1;36449:72:0;;;22850:21:1;22907:2;22887:18;;;22880:30;22946:34;22926:18;;;22919:62;-1:-1:-1;;;22997:18:1;;;22990:36;23043:19;;36449:72:0;22666:402:1;36449:72:0;-1:-1:-1;;;;;36557:15:0;;;:9;:15;;;;;;;;;;;36575:20;;;36557:38;;36617:13;;;;;;;;:23;;36589:6;;36557:9;36617:23;;36589:6;;36617:23;:::i;:::-;;;;;;;;36673:2;-1:-1:-1;;;;;36658:26:0;36667:4;-1:-1:-1;;;;;36658:26:0;;36677:6;36658:26;;;;2271:25:1;;2259:2;2244:18;;2125:177;36658:26:0;;;;;;;;36697:37;69670:211;72243:716;72667:23;72693:69;72721:4;72693:69;;;;;;;;;;;;;;;;;72701:5;-1:-1:-1;;;;;72693:27:0;;;:69;;;;;:::i;:::-;72777:17;;72667:95;;-1:-1:-1;72777:21:0;72773:179;;72874:10;72863:30;;;;;;;;;;;;:::i;:::-;72855:85;;;;-1:-1:-1;;;72855:85:0;;23275:2:1;72855:85:0;;;23257:21:1;23314:2;23294:18;;;23287:30;23353:34;23333:18;;;23326:62;-1:-1:-1;;;23404:18:1;;;23397:40;23454:19;;72855:85:0;23073:406:1;122421:988:0;122509:11;;122491:16;;-1:-1:-1;;;;;122491:16:0;;;122509:11;;122491:29;122488:904;;122560:16;;;122574:1;122560:16;;;;;;;;;122536:21;;122560:16;;;;;;;;;;-1:-1:-1;122560:16:0;122536:40;;122609:4;122591;122596:1;122591:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;122591:23:0;;;:7;;;;;;;;;:23;122639:16;;122629:7;;122639:16;;;122629:4;;122639:16;;122629:7;;;;;;:::i;:::-;-1:-1:-1;;;;;122629:26:0;;;:7;;;;;;;;;:26;122680:11;;122670:7;;122680:11;;;122670:4;;122675:1;;122670:7;;;;;;:::i;:::-;-1:-1:-1;;;;;122670:21:0;;;:7;;;;;;;;;:21;122725:15;;122706:243;;-1:-1:-1;;;122706:243:0;;122725:15;;;122706:89;;:243;;122814:11;;122725:15;;122864:4;;122895;;122919:15;;122706:243;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;122521:440;115134:88;115097:133::o;122488:904::-;123004:16;;;123018:1;123004:16;;;;;;;;122980:21;;123004:16;;;;;;;;;;-1:-1:-1;123004:16:0;122980:40;;123053:4;123035;123040:1;123035:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;123035:23:0;;;:7;;;;;;;;;:23;123083:11;;123073:7;;123083:11;;;123073:4;;123083:11;;123073:7;;;;;;:::i;:::-;-1:-1:-1;;;;;123073:21:0;;;:7;;;;;;;;;:21;123197:15;;123109:259;;-1:-1:-1;;;123109:259:0;;95630:42;;123109:69;;:259;;123197:15;;;123231:11;;123197:15;;123315:4;;123338:15;;123109:259;;;:::i;121537:876::-;121633:16;;;121647:1;121633:16;;;;;;;;121609:21;;121633:16;;;;;;;;;;-1:-1:-1;121633:16:0;121609:40;;121678:4;121660;121665:1;121660:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;121660:23:0;;;:7;;;;;;;;;:23;121704:16;;121694:7;;121704:16;;;121694:4;;121704:16;;121694:7;;;;;;:::i;:::-;-1:-1:-1;;;;;121694:26:0;;;:7;;;;;;;;;;:26;;;;121767:15;;121748:42;;;-1:-1:-1;;;121748:42:0;;;;121767:15;;;;;121748:40;;:42;;;;;121694:7;;121748:42;;;;;121767:15;121748:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;121737:53:0;:4;121742:1;121737:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;121737:53:0;;121733:673;;121825:15;;121806:274;;-1:-1:-1;;;121806:274:0;;-1:-1:-1;;;;;121825:15:0;;;;121806:86;;:274;;121911:11;;121825:15;;121995:4;;122026;;122050:15;;121806:274;;;:::i;121733:673::-;122203:15;;122111:283;;-1:-1:-1;;;122111:283:0;;95630:42;;122111:69;;:283;;-1:-1:-1;;;;;122203:15:0;;122241:11;;122203:15;;122333:4;;122360:15;;122111:283;;;:::i;123417:860::-;123553:15;;;;;;;;;-1:-1:-1;;;;;123553:15:0;-1:-1:-1;;;;;123534:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;123514:16;;-1:-1:-1;;;;;123514:62:0;;;:16;;:62;123510:748;;123611:15;;123592:314;;-1:-1:-1;;;123592:314:0;;123694:4;123592:314;;;25729:34:1;25779:18;;;25772:34;;;123611:15:0;25822:18:1;;;25815:34;;;25865:18;;;25858:34;123850:6:0;25908:19:1;;;25901:44;123876:15:0;25961:19:1;;;25954:35;-1:-1:-1;;;;;123611:15:0;;;;123592:51;;123651:15;;25663:19:1;;123592:314:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;123510:748::-;123955:15;;124035:16;;123936:302;;-1:-1:-1;;;123936:302:0;;124011:4;123936:302;;;26397:34:1;-1:-1:-1;;;;;124035:16:0;;;26447:18:1;;;26440:43;26499:18;;;26492:34;;;26542:18;;;26535:34;;;123955:15:0;26585:19:1;;;26578:35;;;26629:19;;;26622:35;124182:6:0;26673:19:1;;;26666:44;124208:15:0;26726:19:1;;;26719:35;123955:15:0;;;123936:48;;26331:19:1;;123936:302:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20659:229::-;20796:12;20828:52;20850:6;20858:4;20864:1;20867:12;20828:21;:52::i;:::-;20821:59;20659:229;-1:-1:-1;;;;20659:229:0:o;21779:510::-;21949:12;22007:5;21982:21;:30;;21974:81;;;;-1:-1:-1;;;21974:81:0;;26967:2:1;21974:81:0;;;26949:21:1;27006:2;26986:18;;;26979:30;27045:34;27025:18;;;27018:62;-1:-1:-1;;;27096:18:1;;;27089:36;27142:19;;21974:81:0;26765:402:1;21974:81:0;-1:-1:-1;;;;;18209:19:0;;;22066:60;;;;-1:-1:-1;;;22066:60:0;;27374:2:1;22066:60:0;;;27356:21:1;27413:2;27393:18;;;27386:30;27452:31;27432:18;;;27425:59;27501:18;;22066:60:0;27172:353:1;22066:60:0;22140:12;22154:23;22181:6;-1:-1:-1;;;;;22181:11:0;22200:5;22207:4;22181:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22139:73;;;;22230:51;22247:7;22256:10;22268:12;22230:16;:51::i;:::-;22223:58;21779:510;-1:-1:-1;;;;;;;21779:510:0:o;24465:712::-;24615:12;24644:7;24640:530;;;-1:-1:-1;24675:10:0;24668:17;;24640:530;24789:17;;:21;24785:374;;24987:10;24981:17;25048:15;25035:10;25031:2;25027:19;25020:44;24785:374;25130:12;25123:20;;-1:-1:-1;;;25123:20:0;;;;;;;;:::i;235:250:1:-;320:1;330:113;344:6;341:1;338:13;330:113;;;420:11;;;414:18;401:11;;;394:39;366:2;359:10;330:113;;;-1:-1:-1;;477:1:1;459:16;;452:27;235:250::o;490:396::-;639:2;628:9;621:21;602:4;671:6;665:13;714:6;709:2;698:9;694:18;687:34;730:79;802:6;797:2;786:9;782:18;777:2;769:6;765:15;730:79;:::i;:::-;870:2;849:15;-1:-1:-1;;845:29:1;830:45;;;;877:2;826:54;;490:396;-1:-1:-1;;490:396:1:o;891:131::-;-1:-1:-1;;;;;966:31:1;;956:42;;946:70;;1012:1;1009;1002:12;1027:315;1095:6;1103;1156:2;1144:9;1135:7;1131:23;1127:32;1124:52;;;1172:1;1169;1162:12;1124:52;1211:9;1198:23;1230:31;1255:5;1230:31;:::i;:::-;1280:5;1332:2;1317:18;;;;1304:32;;-1:-1:-1;;;1027:315:1:o;1732:180::-;1791:6;1844:2;1832:9;1823:7;1819:23;1815:32;1812:52;;;1860:1;1857;1850:12;1812:52;-1:-1:-1;1883:23:1;;1732:180;-1:-1:-1;1732:180:1:o;2307:456::-;2384:6;2392;2400;2453:2;2441:9;2432:7;2428:23;2424:32;2421:52;;;2469:1;2466;2459:12;2421:52;2508:9;2495:23;2527:31;2552:5;2527:31;:::i;:::-;2577:5;-1:-1:-1;2634:2:1;2619:18;;2606:32;2647:33;2606:32;2647:33;:::i;:::-;2307:456;;2699:7;;-1:-1:-1;;;2753:2:1;2738:18;;;;2725:32;;2307:456::o;2768:118::-;2854:5;2847:13;2840:21;2833:5;2830:32;2820:60;;2876:1;2873;2866:12;2891:382;2956:6;2964;3017:2;3005:9;2996:7;2992:23;2988:32;2985:52;;;3033:1;3030;3023:12;2985:52;3072:9;3059:23;3091:31;3116:5;3091:31;:::i;:::-;3141:5;-1:-1:-1;3198:2:1;3183:18;;3170:32;3211:30;3170:32;3211:30;:::i;:::-;3260:7;3250:17;;;2891:382;;;;;:::o;3278:241::-;3334:6;3387:2;3375:9;3366:7;3362:23;3358:32;3355:52;;;3403:1;3400;3393:12;3355:52;3442:9;3429:23;3461:28;3483:5;3461:28;:::i;3713:247::-;3772:6;3825:2;3813:9;3804:7;3800:23;3796:32;3793:52;;;3841:1;3838;3831:12;3793:52;3880:9;3867:23;3899:31;3924:5;3899:31;:::i;4458:159::-;4525:20;;4585:6;4574:18;;4564:29;;4554:57;;4607:1;4604;4597:12;4622:256;4688:6;4696;4749:2;4737:9;4728:7;4724:23;4720:32;4717:52;;;4765:1;4762;4755:12;4717:52;4788:28;4806:9;4788:28;:::i;:::-;4778:38;;4835:37;4868:2;4857:9;4853:18;4835:37;:::i;:::-;4825:47;;4622:256;;;;;:::o;5589:388::-;5657:6;5665;5718:2;5706:9;5697:7;5693:23;5689:32;5686:52;;;5734:1;5731;5724:12;5686:52;5773:9;5760:23;5792:31;5817:5;5792:31;:::i;:::-;5842:5;-1:-1:-1;5899:2:1;5884:18;;5871:32;5912:33;5871:32;5912:33;:::i;5982:380::-;6061:1;6057:12;;;;6104;;;6125:61;;6179:4;6171:6;6167:17;6157:27;;6125:61;6232:2;6224:6;6221:14;6201:18;6198:38;6195:161;;6278:10;6273:3;6269:20;6266:1;6259:31;6313:4;6310:1;6303:15;6341:4;6338:1;6331:15;6195:161;;5982:380;;;:::o;6367:356::-;6569:2;6551:21;;;6588:18;;;6581:30;6647:34;6642:2;6627:18;;6620:62;6714:2;6699:18;;6367:356::o;6728:127::-;6789:10;6784:3;6780:20;6777:1;6770:31;6820:4;6817:1;6810:15;6844:4;6841:1;6834:15;6860:217;6900:1;6926;6916:132;;6970:10;6965:3;6961:20;6958:1;6951:31;7005:4;7002:1;6995:15;7033:4;7030:1;7023:15;6916:132;-1:-1:-1;7062:9:1;;6860:217::o;7737:330::-;7939:2;7921:21;;;7978:1;7958:18;;;7951:29;-1:-1:-1;;;8011:2:1;7996:18;;7989:37;8058:2;8043:18;;7737:330::o;8072:184::-;8142:6;8195:2;8183:9;8174:7;8170:23;8166:32;8163:52;;;8211:1;8208;8201:12;8163:52;-1:-1:-1;8234:16:1;;8072:184;-1:-1:-1;8072:184:1:o;8261:125::-;8326:9;;;8347:10;;;8344:36;;;8360:18;;:::i;8696:245::-;8763:6;8816:2;8804:9;8795:7;8791:23;8787:32;8784:52;;;8832:1;8829;8822:12;8784:52;8864:9;8858:16;8883:28;8905:5;8883:28;:::i;9350:251::-;9420:6;9473:2;9461:9;9452:7;9448:23;9444:32;9441:52;;;9489:1;9486;9479:12;9441:52;9521:9;9515:16;9540:31;9565:5;9540:31;:::i;10194:306::-;10282:6;10290;10298;10351:2;10339:9;10330:7;10326:23;10322:32;10319:52;;;10367:1;10364;10357:12;10319:52;10396:9;10390:16;10380:26;;10446:2;10435:9;10431:18;10425:25;10415:35;;10490:2;10479:9;10475:18;10469:25;10459:35;;10194:306;;;;;:::o;12973:168::-;13040:6;13066:10;;;13078;;;13062:27;;13101:11;;;13098:37;;;13115:18;;:::i;:::-;13098:37;12973:168;;;;:::o;13146:339::-;13348:2;13330:21;;;13387:2;13367:18;;;13360:30;-1:-1:-1;;;13421:2:1;13406:18;;13399:45;13476:2;13461:18;;13146:339::o;13490:338::-;13692:2;13674:21;;;13731:2;13711:18;;;13704:30;-1:-1:-1;;;13765:2:1;13750:18;;13743:44;13819:2;13804:18;;13490:338::o;15532:681::-;15663:6;15671;15679;15687;15695;15703;15711;15719;15772:3;15760:9;15751:7;15747:23;15743:33;15740:53;;;15789:1;15786;15779:12;15740:53;15821:9;15815:16;15840:31;15865:5;15840:31;:::i;:::-;15890:5;15880:15;;;15935:2;15924:9;15920:18;15914:25;15904:35;;15979:2;15968:9;15964:18;15958:25;15948:35;;16023:2;16012:9;16008:18;16002:25;15992:35;;16067:3;16056:9;16052:19;16046:26;16036:36;;16112:3;16101:9;16097:19;16091:26;16081:36;;16157:3;16146:9;16142:19;16136:26;16126:36;;16202:3;16191:9;16187:19;16181:26;16171:36;;15532:681;;;;;;;;;;;:::o;19052:401::-;19254:2;19236:21;;;19293:2;19273:18;;;19266:30;19332:34;19327:2;19312:18;;19305:62;-1:-1:-1;;;19398:2:1;19383:18;;19376:35;19443:3;19428:19;;19052:401::o;19458:399::-;19660:2;19642:21;;;19699:2;19679:18;;;19672:30;19738:34;19733:2;19718:18;;19711:62;-1:-1:-1;;;19804:2:1;19789:18;;19782:33;19847:3;19832:19;;19458:399::o;20598:168::-;20671:9;;;20702;;20719:15;;;20713:22;;20699:37;20689:71;;20740:18;;:::i;20771:128::-;20838:9;;;20859:11;;;20856:37;;;20873:18;;:::i;23616:127::-;23677:10;23672:3;23668:20;23665:1;23658:31;23708:4;23705:1;23698:15;23732:4;23729:1;23722:15;23748:461;23801:3;23839:5;23833:12;23866:6;23861:3;23854:19;23892:4;23921:2;23916:3;23912:12;23905:19;;23958:2;23951:5;23947:14;23979:1;23989:195;24003:6;24000:1;23997:13;23989:195;;;24068:13;;-1:-1:-1;;;;;24064:39:1;24052:52;;24124:12;;;;24159:15;;;;24100:1;24018:9;23989:195;;;-1:-1:-1;24200:3:1;;23748:461;-1:-1:-1;;;;;23748:461:1:o;24214:582::-;24513:6;24502:9;24495:25;24556:6;24551:2;24540:9;24536:18;24529:34;24599:3;24594:2;24583:9;24579:18;24572:31;24476:4;24620:57;24672:3;24661:9;24657:19;24649:6;24620:57;:::i;:::-;-1:-1:-1;;;;;24713:32:1;;;;24708:2;24693:18;;24686:60;-1:-1:-1;24777:3:1;24762:19;24755:35;24612:65;24214:582;-1:-1:-1;;;24214:582:1:o;24801:::-;25129:1;25125;25120:3;25116:11;25112:19;25104:6;25100:32;25089:9;25082:51;25169:6;25164:2;25153:9;25149:18;25142:34;25212:6;25207:2;25196:9;25192:18;25185:34;25255:3;25250:2;25239:9;25235:18;25228:31;25063:4;25276:57;25328:3;25317:9;25313:19;25305:6;25276:57;:::i;:::-;25268:65;;25370:6;25364:3;25353:9;25349:19;25342:35;24801:582;;;;;;;;:::o;27530:287::-;27659:3;27697:6;27691:13;27713:66;27772:6;27767:3;27760:4;27752:6;27748:17;27713:66;:::i;:::-;27795:16;;;;;27530:287;-1:-1:-1;;27530:287:1:o
Swarm Source
ipfs://aed8129ac5bee9795d0fb8c1d42daa497eee6c6ba191204e72d32ea6853c1443
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.