More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,546 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Harvest Lp Minin... | 21321219 | 25 days ago | IN | 0 ETH | 0.00136867 | ||||
Harvest Lp Minin... | 21321178 | 25 days ago | IN | 0 ETH | 0.0015346 | ||||
Harvest Lp Minin... | 21313532 | 26 days ago | IN | 0 ETH | 0.00111951 | ||||
Harvest Lp Minin... | 21246424 | 35 days ago | IN | 0 ETH | 0.00133023 | ||||
Harvest Lp Minin... | 21246422 | 35 days ago | IN | 0 ETH | 0.001509 | ||||
Harvest Lp Minin... | 21088825 | 57 days ago | IN | 0 ETH | 0.00054506 | ||||
Harvest Lp Minin... | 21076941 | 59 days ago | IN | 0 ETH | 0.00082205 | ||||
Harvest Lp Minin... | 21076875 | 59 days ago | IN | 0 ETH | 0.00094717 | ||||
Harvest Lp Minin... | 20997952 | 70 days ago | IN | 0 ETH | 0.00068311 | ||||
Harvest Lp Minin... | 20997949 | 70 days ago | IN | 0 ETH | 0.00080707 | ||||
Harvest Lp Minin... | 20879201 | 87 days ago | IN | 0 ETH | 0.00255386 | ||||
Harvest Lp Minin... | 20879198 | 87 days ago | IN | 0 ETH | 0.0030558 | ||||
Harvest Lp Minin... | 20849341 | 91 days ago | IN | 0 ETH | 0.00140999 | ||||
Harvest Lp Minin... | 20848326 | 91 days ago | IN | 0 ETH | 0.00062077 | ||||
Harvest Lp Minin... | 20848321 | 91 days ago | IN | 0 ETH | 0.00065798 | ||||
Deposit LP | 20814777 | 96 days ago | IN | 0 ETH | 0.00266336 | ||||
Harvest Lp Minin... | 20814754 | 96 days ago | IN | 0 ETH | 0.00194492 | ||||
Harvest Lp Minin... | 20814747 | 96 days ago | IN | 0 ETH | 0.00234328 | ||||
Harvest Lp Minin... | 20726261 | 108 days ago | IN | 0 ETH | 0.00016444 | ||||
Harvest Lp Minin... | 20726257 | 108 days ago | IN | 0 ETH | 0.00021448 | ||||
Deposit LP | 20712233 | 110 days ago | IN | 0 ETH | 0.00053185 | ||||
Harvest Lp Minin... | 20712200 | 110 days ago | IN | 0 ETH | 0.00033772 | ||||
Harvest Lp Minin... | 20712196 | 110 days ago | IN | 0 ETH | 0.00039604 | ||||
Harvest Lp Minin... | 20612064 | 124 days ago | IN | 0 ETH | 0.0004299 | ||||
Harvest Lp Minin... | 20598702 | 126 days ago | IN | 0 ETH | 0.00007942 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
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:
AngryMining
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-07-17 */ // File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } } else if (signature.length == 64) { // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { let vs := mload(add(signature, 0x40)) r := mload(add(signature, 0x20)) s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } } else { revert("ECDSA: invalid signature length"); } return recover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value"); require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value"); // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol 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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ 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' // solhint-disable-next-line max-line-length 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 // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/AngryMining.sol pragma solidity ^0.8.4; contract AngryMining is ReentrancyGuard{ using SafeERC20 for IERC20; using ECDSA for bytes32; struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. uint256 reward; } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. ANGRYs to distribute per block. uint256 lastRewardBlock; // Last block number that ANGRYs distribution occurs. uint256 accAngryPerShare; // Accumulated ANGRYs per share, times 1e12. See below. uint256 stakeAmount; } struct PoolItem { uint256 pid; uint256 allocPoint; address lpToken; } struct BonusPeriod{ uint256 beginBlock; uint256 endBlock; } struct LpMiningInfo{ uint256 pid; address lpToken; uint256 amount; uint256 reward; } bool public bInited; address public owner; IERC20 public angryToken; // ANGRY tokens created per block. uint256 public angryPerBlock; // Bonus muliplier for early angry makers. uint256 public constant BONUS_MULTIPLIER = 2; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; BonusPeriod[] public bonusPeriods; mapping(address => bool) public executorList; address[5] public adminList; mapping(string => bool) public usedUUIDs; event ExecutorAdd(address _newAddr); event ExecutorDel(address _oldAddr); event BonusPeriodAdd(uint256 _beginBlock, uint256 _endBlock); event LpDeposit(address indexed user, uint256 indexed pid, uint256 amount); event LpWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event PoolAdd(uint256 _allocPoint, address indexed _lpToken, uint256 _pid); event PoolChange(uint256 indexed pid, uint256 _allocPoint); event LpMiningRewardHarvest(address _user, uint256 _pid, uint256 _amount); event AdminChange(address _oldAddr, address _newAddr); event RewardsPerBlockChange(uint256 _oldValue, uint256 _newValue); modifier onlyOwner { require(msg.sender == owner); _; } modifier onlyExecutor { require(executorList[msg.sender]); _; } modifier validPool(uint256 _pid) { require( _pid < poolInfo.length, "pool not exists!" ); _; } modifier checkSig(string memory _uuid, bytes[] memory _sigs) { require( !usedUUIDs[_uuid], "UUID exists!" ); bool[5] memory flags = [false,false,false,false,false]; bytes32 hash = keccak256(abi.encodePacked(_uuid)); for(uint256 i = 0;i < _sigs.length; i++){ address signer = hash.recover(_sigs[i]); if(signer == adminList[0]){ flags[0] = true; }else if(signer == adminList[1]){ flags[1] = true; }else if(signer == adminList[2]){ flags[2] = true; }else if(signer == adminList[3]){ flags[3] = true; }else if(signer == adminList[4]){ flags[4] = true; } } uint256 cnt = 0; for(uint256 i = 0; i < 5; i++){ if(flags[i]) cnt += 1; } usedUUIDs[_uuid] = true; require( cnt >= 3, "Not enough sigs!" ); _; } constructor(address _angryTokenAddr, uint256 _angryPerBlock, address _admin1, address _admin2, address _admin3, address _admin4, address _admin5) { initialize(_angryTokenAddr, _angryPerBlock, _admin1, _admin2, _admin3, _admin4, _admin5); } function initialize(address _angryTokenAddr, uint256 _angryPerBlock, address _admin1, address _admin2, address _admin3, address _admin4, address _admin5) public { require(!bInited, "already Inited!"); bInited = true; owner = msg.sender; executorList[msg.sender] = true; angryToken = IERC20(_angryTokenAddr); angryPerBlock = _angryPerBlock; adminList[0] = _admin1; adminList[1] = _admin2; adminList[2] = _admin3; adminList[3] = _admin4; adminList[4] = _admin5; emit ExecutorAdd(msg.sender); } function addExecutor(address _newExecutor) onlyOwner public { executorList[_newExecutor] = true; emit ExecutorAdd(_newExecutor); } function delExecutor(address _oldExecutor) onlyOwner public { executorList[_oldExecutor] = false; emit ExecutorDel(_oldExecutor); } function checkPoolDuplicate(IERC20 _lpToken) internal view { uint256 length = poolInfo.length; for(uint256 pid = 0; pid < length; ++pid){ require( poolInfo[pid].lpToken != _lpToken, "duplicate pool!" ); } } function addBonusPeriod(uint256 _beginBlock, uint256 _endBlock) public onlyExecutor { require( _beginBlock < _endBlock ); uint256 length = bonusPeriods.length; for(uint256 i = 0;i < length; i++){ require(_endBlock < bonusPeriods[i].beginBlock || _beginBlock > bonusPeriods[i].endBlock, "BO"); } massUpdatePools(); BonusPeriod memory bp; bp.beginBlock = _beginBlock; bp.endBlock = _endBlock; bonusPeriods.push(bp); emit BonusPeriodAdd(_beginBlock, _endBlock); } function addPool( uint256 _allocPoint, address _lpToken, string memory _uuid, bytes[] memory _sigs ) public checkSig(_uuid, _sigs) { checkPoolDuplicate(IERC20(_lpToken)); massUpdatePools(); totalAllocPoint = totalAllocPoint + _allocPoint; poolInfo.push( PoolInfo({ lpToken: IERC20(_lpToken), allocPoint: _allocPoint, lastRewardBlock: block.number, accAngryPerShare: 0, stakeAmount: 0 }) ); emit PoolAdd(_allocPoint,_lpToken, poolInfo.length-1); } function changePool( uint256 _pid, uint256 _allocPoint, string memory _uuid, bytes[] memory _sigs ) public validPool(_pid) checkSig(_uuid, _sigs) { require( _allocPoint > 0, "invalid allocPoint!" ); massUpdatePools(); totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint; poolInfo[_pid].allocPoint = _allocPoint; emit PoolChange(_pid, _allocPoint); } function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { uint256 bonusBeginBlock = 0; uint256 bonusEndBlock = 0; uint256 length = bonusPeriods.length; uint256 reward = 0; uint256 totalBlocks = _to - _from; uint256 bonusBlocks = 0; for(uint256 i = 0;i < length; i++){ bonusBeginBlock = bonusPeriods[i].beginBlock; bonusEndBlock = bonusPeriods[i].endBlock; if (_to >= bonusBeginBlock && _from <= bonusEndBlock){ uint256 a = _from > bonusBeginBlock ? _from : bonusBeginBlock; uint256 b = _to > bonusEndBlock ? bonusEndBlock : _to; if(b > a){ bonusBlocks += (b - a); reward += (b - a) * BONUS_MULTIPLIER; } } } if(totalBlocks > bonusBlocks){ reward += (totalBlocks - bonusBlocks); } return reward; } function getLpMiningReward(uint256 _pid, address _user) public validPool(_pid) view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accAngryPerShare = pool.accAngryPerShare; uint256 lpSupply = pool.stakeAmount; if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 angryReward = multiplier * angryPerBlock * pool.allocPoint / totalAllocPoint; accAngryPerShare = accAngryPerShare + angryReward * (1e12) / lpSupply; } return user.amount * accAngryPerShare / (1e12) - user.rewardDebt + user.reward; } function getPoolList() public view returns(PoolItem[] memory _pools){ uint256 length = poolInfo.length; _pools = new PoolItem[](length); for (uint256 pid = 0; pid < length; ++pid) { _pools[pid].pid = pid; _pools[pid].lpToken = address(poolInfo[pid].lpToken); _pools[pid].allocPoint = poolInfo[pid].allocPoint; } } function getPoolListArr() public view returns(uint256[] memory _pids,address[] memory _tokenAddrs, uint256[] memory _allocPoints){ uint256 length = poolInfo.length; _pids = new uint256[](length); _tokenAddrs = new address[](length); _allocPoints = new uint256[](length); for (uint256 pid = 0; pid < length; ++pid) { _pids[pid] = pid; _tokenAddrs[pid] = address(poolInfo[pid].lpToken); _allocPoints[pid] = poolInfo[pid].allocPoint; } } function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } function getAccountLpMinings(address _addr) public view returns(LpMiningInfo[] memory _infos){ uint256 length = poolInfo.length; _infos = new LpMiningInfo[](length); for (uint256 pid = 0; pid < length; ++pid) { UserInfo storage user = userInfo[pid][_addr]; _infos[pid].pid = pid; _infos[pid].lpToken = address(poolInfo[pid].lpToken); _infos[pid].amount = user.amount; _infos[pid].reward = getLpMiningReward(pid,_addr); } } function updatePool(uint256 _pid) public validPool(_pid) { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.stakeAmount; if (lpSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 angryReward = multiplier * angryPerBlock * pool.allocPoint / totalAllocPoint; pool.accAngryPerShare = pool.accAngryPerShare + angryReward * (1e12) / lpSupply; pool.lastRewardBlock = block.number; } function depositLP(uint256 _pid, uint256 _amount) public nonReentrant validPool(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pending = user.amount * pool.accAngryPerShare / (1e12) - user.rewardDebt; //safeAngryTransfer(msg.sender, pending); user.reward += pending; } pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); pool.stakeAmount += _amount; user.amount = user.amount + _amount; user.rewardDebt = user.amount * pool.accAngryPerShare / (1e12); emit LpDeposit(msg.sender, _pid, _amount); } function withdrawLP(uint256 _pid, uint256 _amount) public nonReentrant validPool(_pid) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "AE"); updatePool(_pid); uint256 pending = user.amount * pool.accAngryPerShare / (1e12) - user.rewardDebt; //safeAngryTransfer(msg.sender, pending); user.reward += pending; user.amount = user.amount - _amount; user.rewardDebt = user.amount * pool.accAngryPerShare / (1e12); pool.lpToken.safeTransfer(address(msg.sender), _amount); pool.stakeAmount -= _amount; if(user.amount == 0){ safeAngryTransfer(msg.sender, user.reward); user.reward = 0; } emit LpWithdraw(msg.sender, _pid, _amount); } function harvestLpMiningReward(uint256 _pid) public nonReentrant validPool(_pid){ PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); uint256 pending = user.amount * pool.accAngryPerShare / (1e12) - user.rewardDebt; user.reward += pending; user.rewardDebt = user.amount * pool.accAngryPerShare / (1e12); safeAngryTransfer(msg.sender, user.reward); emit LpMiningRewardHarvest(msg.sender, _pid, user.reward); user.reward = 0; } function safeAngryTransfer(address _to, uint256 _amount) internal { angryToken.safeTransfer(_to, _amount); } function getAdminList() public view returns (address[] memory _admins){ _admins = new address[](adminList.length); for(uint256 i = 0; i < adminList.length; i++){ _admins[i] = adminList[i]; } } function changeAdmin(uint256 _index, address _newAddress, string memory _uuid, bytes[] memory _sigs) public checkSig(_uuid, _sigs) { require(_index < adminList.length, "index out of range!"); emit AdminChange(adminList[_index], _newAddress); adminList[_index] = _newAddress; } function changeRewardsPerBlock(uint256 _angryPerBlock, string memory _uuid, bytes[] memory _sigs) public checkSig(_uuid, _sigs){ emit RewardsPerBlockChange(angryPerBlock,_angryPerBlock); angryPerBlock = _angryPerBlock; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_angryTokenAddr","type":"address"},{"internalType":"uint256","name":"_angryPerBlock","type":"uint256"},{"internalType":"address","name":"_admin1","type":"address"},{"internalType":"address","name":"_admin2","type":"address"},{"internalType":"address","name":"_admin3","type":"address"},{"internalType":"address","name":"_admin4","type":"address"},{"internalType":"address","name":"_admin5","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldAddr","type":"address"},{"indexed":false,"internalType":"address","name":"_newAddr","type":"address"}],"name":"AdminChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_beginBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_endBlock","type":"uint256"}],"name":"BonusPeriodAdd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newAddr","type":"address"}],"name":"ExecutorAdd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_oldAddr","type":"address"}],"name":"ExecutorDel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LpDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"LpMiningRewardHarvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LpWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"indexed":true,"internalType":"address","name":"_lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"PoolAdd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"PoolChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_oldValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newValue","type":"uint256"}],"name":"RewardsPerBlockChange","type":"event"},{"inputs":[],"name":"BONUS_MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_beginBlock","type":"uint256"},{"internalType":"uint256","name":"_endBlock","type":"uint256"}],"name":"addBonusPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newExecutor","type":"address"}],"name":"addExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"string","name":"_uuid","type":"string"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"}],"name":"addPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"angryPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"angryToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bInited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bonusPeriods","outputs":[{"internalType":"uint256","name":"beginBlock","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"address","name":"_newAddress","type":"address"},{"internalType":"string","name":"_uuid","type":"string"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"string","name":"_uuid","type":"string"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"}],"name":"changePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_angryPerBlock","type":"uint256"},{"internalType":"string","name":"_uuid","type":"string"},{"internalType":"bytes[]","name":"_sigs","type":"bytes[]"}],"name":"changeRewardsPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oldExecutor","type":"address"}],"name":"delExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"executorList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getAccountLpMinings","outputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"lpToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"internalType":"struct AngryMining.LpMiningInfo[]","name":"_infos","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdminList","outputs":[{"internalType":"address[]","name":"_admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getLpMiningReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolList","outputs":[{"components":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"address","name":"lpToken","type":"address"}],"internalType":"struct AngryMining.PoolItem[]","name":"_pools","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPoolListArr","outputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"},{"internalType":"address[]","name":"_tokenAddrs","type":"address[]"},{"internalType":"uint256[]","name":"_allocPoints","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"harvestLpMiningReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_angryTokenAddr","type":"address"},{"internalType":"uint256","name":"_angryPerBlock","type":"uint256"},{"internalType":"address","name":"_admin1","type":"address"},{"internalType":"address","name":"_admin2","type":"address"},{"internalType":"address","name":"_admin3","type":"address"},{"internalType":"address","name":"_admin4","type":"address"},{"internalType":"address","name":"_admin5","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accAngryPerShare","type":"uint256"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"usedUUIDs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawLP","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200355d3803806200355d83398101604081905262000034916200019b565b60016000556200004a8787878787878762000057565b5050505050505062000226565b60015460ff1615620000a15760405162461bcd60e51b815260206004820152600f60248201526e616c726561647920496e697465642160881b604482015260640160405180910390fd5b600180543361010081026001600160a81b03199092169190911782178255600081815260086020908152604091829020805460ff1916909417909355600280546001600160a01b038c81166001600160a01b03199283161790925560038b9055600980548b8416908316179055600a80548a8416908316179055600b8054898416908316179055600c8054888416908316179055600d805492871692909116919091179055519081527f217603b67e96243085c45dc7bec1c2813c04f15868319981d0eb223f8538da44910160405180910390a150505050505050565b80516001600160a01b03811681146200019657600080fd5b919050565b600080600080600080600060e0888a031215620001b6578283fd5b620001c1886200017e565b965060208801519550620001d8604089016200017e565b9450620001e8606089016200017e565b9350620001f8608089016200017e565b92506200020860a089016200017e565b91506200021860c089016200017e565b905092959891949750929550565b61332780620002366000396000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80636dbdb9141161010f57806399ed0a4d116100a2578063d41dcbea11610071578063d41dcbea146104ad578063d9f774fc146104c2578063e9fdfb89146104d7578063fefeb942146104ff57600080fd5b806399ed0a4d14610454578063bfe50f7214610467578063cfb508a01461047a578063d14942a61461048d57600080fd5b80638da5cb5b116100de5780638da5cb5b146103c15780638dbb1e3a146103d957806391918d64146103ec57806393f1a40b146103ff57600080fd5b80636dbdb914146103615780637a799d71146103745780637b0703d41461038b5780638aa28550146103b957600080fd5b80634bd93b021161018757806360f1af5d1161015657806360f1af5d14610330578063630b5ba114610343578063676fdb9f1461034b5780636d0d7d7d1461035857600080fd5b80634bd93b02146102c457806350a57a91146102d757806351eb05a61461030a5780635af463d71461031d57600080fd5b806316e2868a116101c357806316e2868a1461027457806317caf6f1146102875780631f5a0bbe1461029e57806341c8b268146102b157600080fd5b8063082f91ac146101ea57806311117fc8146101ff5780631526fe271461022f575b600080fd5b6101fd6101f8366004612f25565b610512565b005b61021261020d366004612ddc565b6108a5565b6040516001600160a01b0390911681526020015b60405180910390f35b61024261023d366004612ddc565b6108c5565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610226565b600254610212906001600160a01b031681565b61029060065481565b604051908152602001610226565b6101fd6102ac366004612ce9565b610910565b6101fd6102bf366004612d03565b610987565b6101fd6102d2366004612e9a565b610aa9565b6102fa6102e5366004612ce9565b60086020526000908152604090205460ff1681565b6040519015158152602001610226565b6101fd610318366004612ddc565b610d28565b6101fd61032b366004612e1f565b610e24565b6101fd61033e366004612f04565b611150565b6101fd6112f8565b6001546102fa9060ff1681565b61029060035481565b6101fd61036f366004612e1f565b61131f565b61037c6116e7565b604051610226939291906130c2565b6102fa610399366004612da1565b8051602081830181018051600e8252928201919093012091525460ff1681565b610290600281565b6001546102129061010090046001600160a01b031681565b6102906103e7366004612f04565b611917565b6101fd6103fa366004612f04565b611a63565b61043961040d366004612df4565b600560209081526000928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610226565b610290610462366004612df4565b611c4e565b6101fd610475366004612f04565b611d9d565b6101fd610488366004612ddc565b611f3d565b6104a061049b366004612ce9565b6120bb565b6040516102269190613000565b6104b56122ad565b604051610226919061306d565b6104ca61246e565b6040516102269190612fed565b6104ea6104e5366004612ddc565b61251c565b60408051928352602083019190915201610226565b6101fd61050d366004612ce9565b61254a565b6004548490811061053e5760405162461bcd60e51b8152600401610535906131b5565b60405180910390fd5b8282600e826040516105509190612fd1565b9081526040519081900360200190205460ff16156105805760405162461bcd60e51b81526004016105359061312e565b6040805160a0810182526000808252602080830182905282840182905260608301829052608083018290529251919290916105bd91869101612fd1565b60405160208183030381529060405280519060200120905060005b83518110156106dd57600061061d85838151811061060657634e487b7160e01b600052603260045260246000fd5b6020026020010151846125b790919063ffffffff16565b90506009600001546001600160a01b038281169116141561064d5760018460005b911515602090920201526106ca565b600a546001600160a01b038281169116141561066c576001848161063e565b600b546001600160a01b038281169116141561068c57600184600261063e565b600c546001600160a01b03828116911614156106ac57600184600361063e565b600d546001600160a01b03828116911614156106ca57600160808501525b50806106d5816132aa565b9150506105d8565b506000805b60058110156107355783816005811061070b57634e487b7160e01b600052603260045260246000fd5b60200201511561072357610720600183613210565b91505b8061072d816132aa565b9150506106e2565b506001600e866040516107489190612fd1565b908152604051908190036020019020805491151560ff1990921691909117905560038110156107895760405162461bcd60e51b815260040161053590613154565b600089116107cf5760405162461bcd60e51b8152602060048201526013602482015272696e76616c696420616c6c6f63506f696e742160681b6044820152606401610535565b6107d76112f8565b8860048b815481106107f957634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600101546006546108189190613267565b6108229190613210565b6006819055508860048b8154811061084a57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010181905550897f4be6cb3727f6892528cbf78ba443d3ee9ee228c332edb586ede4bb41bf022db28a60405161089191815260200190565b60405180910390a250505050505050505050565b600981600581106108b557600080fd5b01546001600160a01b0316905081565b600481815481106108d557600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b60015461010090046001600160a01b0316331461092c57600080fd5b6001600160a01b038116600081815260086020908152604091829020805460ff1916600117905590519182527f217603b67e96243085c45dc7bec1c2813c04f15868319981d0eb223f8538da4491015b60405180910390a150565b60015460ff16156109cc5760405162461bcd60e51b815260206004820152600f60248201526e616c726561647920496e697465642160881b6044820152606401610535565b600180543361010081026001600160a81b03199092169190911782178255600081815260086020908152604091829020805460ff1916909417909355600280546001600160a01b038c81166001600160a01b03199283161790925560038b9055600980548b8416908316179055600a80548a8416908316179055600b8054898416908316179055600c8054888416908316179055600d805492871692909116919091179055519081527f217603b67e96243085c45dc7bec1c2813c04f15868319981d0eb223f8538da44910160405180910390a150505050505050565b8181600e82604051610abb9190612fd1565b9081526040519081900360200190205460ff1615610aeb5760405162461bcd60e51b81526004016105359061312e565b6040805160a081018252600080825260208083018290528284018290526060830182905260808301829052925191929091610b2891869101612fd1565b60405160208183030381529060405280519060200120905060005b8351811015610c31576000610b7185838151811061060657634e487b7160e01b600052603260045260246000fd5b90506009600001546001600160a01b0382811691161415610ba15760018460005b91151560209092020152610c1e565b600a546001600160a01b0382811691161415610bc05760018481610b92565b600b546001600160a01b0382811691161415610be0576001846002610b92565b600c546001600160a01b0382811691161415610c00576001846003610b92565b600d546001600160a01b0382811691161415610c1e57600160808501525b5080610c29816132aa565b915050610b43565b506000805b6005811015610c8957838160058110610c5f57634e487b7160e01b600052603260045260246000fd5b602002015115610c7757610c74600183613210565b91505b80610c81816132aa565b915050610c36565b506001600e86604051610c9c9190612fd1565b908152604051908190036020019020805491151560ff199092169190911790556003811015610cdd5760405162461bcd60e51b815260040161053590613154565b60035460408051918252602082018a90527fc86fdc1cbe95930609311505166ab1b99d3615e0c856d3d7e0fd9945a813332d910160405180910390a150505060039490945550505050565b60045481908110610d4b5760405162461bcd60e51b8152600401610535906131b5565b600060048381548110610d6e57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201905080600201544311610d8e57505050565b600481015480610da45750436002909101555050565b6000610db4836002015443611917565b90506000600654846001015460035484610dce9190613248565b610dd89190613248565b610de29190613228565b905082610df48264e8d4a51000613248565b610dfe9190613228565b8460030154610e0d9190613210565b6003850155505043600290920191909155505b5050565b8181600e82604051610e369190612fd1565b9081526040519081900360200190205460ff1615610e665760405162461bcd60e51b81526004016105359061312e565b6040805160a081018252600080825260208083018290528284018290526060830182905260808301829052925191929091610ea391869101612fd1565b60405160208183030381529060405280519060200120905060005b8351811015610fac576000610eec85838151811061060657634e487b7160e01b600052603260045260246000fd5b90506009600001546001600160a01b0382811691161415610f1c5760018460005b91151560209092020152610f99565b600a546001600160a01b0382811691161415610f3b5760018481610f0d565b600b546001600160a01b0382811691161415610f5b576001846002610f0d565b600c546001600160a01b0382811691161415610f7b576001846003610f0d565b600d546001600160a01b0382811691161415610f9957600160808501525b5080610fa4816132aa565b915050610ebe565b506000805b600581101561100457838160058110610fda57634e487b7160e01b600052603260045260246000fd5b602002015115610ff257610fef600183613210565b91505b80610ffc816132aa565b915050610fb1565b506001600e866040516110179190612fd1565b908152604051908190036020019020805491151560ff1990921691909117905560038110156110585760405162461bcd60e51b815260040161053590613154565b6005891061109e5760405162461bcd60e51b8152602060048201526013602482015272696e646578206f7574206f662072616e67652160681b6044820152606401610535565b7f38b1065e0d088f6eda3cb9f0efc7bbb9b145907ab0deb0dbfb700d2bb21599e960098a600581106110e057634e487b7160e01b600052603260045260246000fd5b0154604080516001600160a01b039283168152918b1660208301520160405180910390a18760098a6005811061112657634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b0392909216919091179055505050505050505050565b3360009081526008602052604090205460ff1661116c57600080fd5b80821061117857600080fd5b60075460005b8181101561123a57600781815481106111a757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600001548310806111f75750600781815481106111e257634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015484115b6112285760405162461bcd60e51b8152602060048201526002602482015261424f60f01b6044820152606401610535565b80611232816132aa565b91505061117e565b506112436112f8565b60408051808201825284815260208082018581526007805460018101825560009190915283517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68860029092029182015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689909101558251868152908101859052825191927fa79bf3b43e9c67b09d30da2b6d16a720dcc6238736e932d965463ee4688053bb92918290030190a150505050565b60045460005b81811015610e205761130f81610d28565b611318816132aa565b90506112fe565b8181600e826040516113319190612fd1565b9081526040519081900360200190205460ff16156113615760405162461bcd60e51b81526004016105359061312e565b6040805160a08101825260008082526020808301829052828401829052606083018290526080830182905292519192909161139e91869101612fd1565b60405160208183030381529060405280519060200120905060005b83518110156114a75760006113e785838151811061060657634e487b7160e01b600052603260045260246000fd5b90506009600001546001600160a01b03828116911614156114175760018460005b91151560209092020152611494565b600a546001600160a01b03828116911614156114365760018481611408565b600b546001600160a01b0382811691161415611456576001846002611408565b600c546001600160a01b0382811691161415611476576001846003611408565b600d546001600160a01b038281169116141561149457600160808501525b508061149f816132aa565b9150506113b9565b506000805b60058110156114ff578381600581106114d557634e487b7160e01b600052603260045260246000fd5b6020020151156114ed576114ea600183613210565b91505b806114f7816132aa565b9150506114ac565b506001600e866040516115129190612fd1565b908152604051908190036020019020805491151560ff1990921691909117905560038110156115535760405162461bcd60e51b815260040161053590613154565b61155c8861266d565b6115646112f8565b886006546115729190613210565b6006556040805160a0810182526001600160a01b038a8116808352602083018d8152439484019485526000606085018181526080860182815260048054600180820183559482905297517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600590990298890180546001600160a01b031916919098161790965592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c87015595517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d86015594517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e850155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f909301929092555490917f23f5ca24fade32837225bb2f519e5f44ca00590279eb07d81108357bfecefe06918c916116c491613267565b6040805192835260208301919091520160405180910390a2505050505050505050565b600454606090819081908067ffffffffffffffff81111561171857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611741578160200160208202803683370190505b5093508067ffffffffffffffff81111561176b57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611794578160200160208202803683370190505b5092508067ffffffffffffffff8111156117be57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156117e7578160200160208202803683370190505b50915060005b81811015611910578085828151811061181657634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506004818154811061184357634e487b7160e01b600052603260045260246000fd5b600091825260209091206005909102015484516001600160a01b039091169085908390811061188257634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050600481815481106118c357634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600101548382815181106118f557634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611909816132aa565b90506117ed565b5050909192565b60075460009081908190818061192d8888613267565b90506000805b84811015611a36576007818154811061195c57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000015496506007818154811061199157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015495508689101580156119b55750858a11155b15611a24576000878b116119c957876119cb565b8a5b90506000878b116119dc578a6119de565b875b905081811115611a21576119f28282613267565b6119fc9085613210565b93506002611a0a8383613267565b611a149190613248565b611a1e9087613210565b95505b50505b80611a2e816132aa565b915050611933565b5080821115611a5657611a498183613267565b611a539084613210565b92505b5090979650505050505050565b60026000541415611a865760405162461bcd60e51b81526004016105359061317e565b600260005560045482908110611aae5760405162461bcd60e51b8152600401610535906131b5565b600060048481548110611ad157634e487b7160e01b600052603260045260246000fd5b6000918252602080832087845260058083526040808620338752909352919093208054929091029092019250841115611b315760405162461bcd60e51b8152602060048201526002602482015261414560f01b6044820152606401610535565b611b3a85610d28565b6000816001015464e8d4a5100084600301548460000154611b5b9190613248565b611b659190613228565b611b6f9190613267565b905080826002016000828254611b859190613210565b90915550508154611b97908690613267565b808355600384015464e8d4a5100091611bb09190613248565b611bba9190613228565b60018301558254611bd5906001600160a01b03163387612715565b84836004016000828254611be99190613267565b90915550508154611c0a57611c02338360020154612778565b600060028301555b604051858152869033907fbaebb61e35277a4d0c5c4a29129d451dad8a89ae2917ddcf34a990f505b3aa1c9060200160405180910390a35050600160005550505050565b60045460009083908110611c745760405162461bcd60e51b8152600401610535906131b5565b600060048581548110611c9757634e487b7160e01b600052603260045260246000fd5b60009182526020808320888452600580835260408086206001600160a01b038b168752909352919093209102909101600381015460048201546002830154929450909143118015611ce757508015155b15611d55576000611cfc856002015443611917565b90506000600654866001015460035484611d169190613248565b611d209190613248565b611d2a9190613228565b905082611d3c8264e8d4a51000613248565b611d469190613228565b611d509085613210565b935050505b60028301546001840154845464e8d4a5100090611d73908690613248565b611d7d9190613228565b611d879190613267565b611d919190613210565b98975050505050505050565b60026000541415611dc05760405162461bcd60e51b81526004016105359061317e565b600260005560045482908110611de85760405162461bcd60e51b8152600401610535906131b5565b600060048481548110611e0b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320878452600580835260408086203387529093529190932091029091019150611e3c85610d28565b805415611e95576000816001015464e8d4a5100084600301548460000154611e649190613248565b611e6e9190613228565b611e789190613267565b905080826002016000828254611e8e9190613210565b9091555050505b8154611eac906001600160a01b031633308761278f565b83826004016000828254611ec09190613210565b90915550508054611ed2908590613210565b808255600383015464e8d4a5100091611eeb9190613248565b611ef59190613228565b6001820155604051848152859033907fee1c1fc8c3cee482d2fd6bc7dac7f2282a10417bcd4a828918e2c563525cc3f09060200160405180910390a350506001600055505050565b60026000541415611f605760405162461bcd60e51b81526004016105359061317e565b600260005560045481908110611f885760405162461bcd60e51b8152600401610535906131b5565b600060048381548110611fab57634e487b7160e01b600052603260045260246000fd5b60009182526020808320868452600580835260408086203387529093529190932091029091019150611fdc84610d28565b6000816001015464e8d4a5100084600301548460000154611ffd9190613248565b6120079190613228565b6120119190613267565b9050808260020160008282546120279190613210565b90915550506003830154825464e8d4a510009161204391613248565b61204d9190613228565b60018301556002820154612062903390612778565b6002820154604080513381526020810188905280820192909252517f09a9fc77c8280a3fcb8470a9dabef1f3a18e452423f15fa7b99ed0b60dad63479181900360600190a1506000600290910181905560019055505050565b6004546060908067ffffffffffffffff8111156120e857634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561214d57816020015b61213a60405180608001604052806000815260200160006001600160a01b0316815260200160008152602001600081525090565b8152602001906001900390816121065790505b50915060005b818110156122a65760008181526005602090815260408083206001600160a01b03881684529091529020835182908590829081106121a157634e487b7160e01b600052603260045260246000fd5b60209081029190910101515260048054839081106121cf57634e487b7160e01b600052603260045260246000fd5b600091825260209091206005909102015484516001600160a01b039091169085908490811061220e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b039092169101528054845185908490811061224c57634e487b7160e01b600052603260045260246000fd5b602002602001015160400181815250506122668286611c4e565b84838151811061228657634e487b7160e01b600052603260045260246000fd5b6020908102919091010151606001525061229f816132aa565b9050612153565b5050919050565b6004546060908067ffffffffffffffff8111156122da57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561233857816020015b6123256040518060600160405280600081526020016000815260200160006001600160a01b031681525090565b8152602001906001900390816122f85790505b50915060005b81811015612469578083828151811061236757634e487b7160e01b600052603260045260246000fd5b602090810291909101015152600480548290811061239557634e487b7160e01b600052603260045260246000fd5b600091825260209091206005909102015483516001600160a01b03909116908490839081106123d457634e487b7160e01b600052603260045260246000fd5b6020026020010151604001906001600160a01b031690816001600160a01b0316815250506004818154811061241957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016001015483828151811061244b57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101510152612462816132aa565b905061233e565b505090565b60408051600580825260c082019092526060916020820160a08036833701905050905060005b600581101561251857600981600581106124be57634e487b7160e01b600052603260045260246000fd5b015482516001600160a01b03909116908390839081106124ee57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280612510816132aa565b915050612494565b5090565b6007818154811061252c57600080fd5b60009182526020909120600290910201805460019091015490915082565b60015461010090046001600160a01b0316331461256657600080fd5b6001600160a01b038116600081815260086020908152604091829020805460ff1916905590519182527f6140b1995a6d93cb229eb0b3da35af8cc220cdec34ac47d95ecb6a5d38d809fb910161097c565b6000806000808451604114156125e15750505060208201516040830151606084015160001a612657565b84516040141561260f5750505060408201516020830151906001600160ff1b0381169060ff1c601b01612657565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610535565b612663868285856127cd565b9695505050505050565b60045460005b8181101561271057826001600160a01b0316600482815481106126a657634e487b7160e01b600052603260045260246000fd5b60009182526020909120600590910201546001600160a01b031614156127005760405162461bcd60e51b815260206004820152600f60248201526e6475706c696361746520706f6f6c2160881b6044820152606401610535565b612709816132aa565b9050612673565b505050565b6040516001600160a01b03831660248201526044810182905261271090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612976565b600254610e20906001600160a01b03168383612715565b6040516001600160a01b03808516602483015283166044820152606481018290526127c79085906323b872dd60e01b90608401612741565b50505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561284a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610535565b8360ff16601b148061285f57508360ff16601c145b6128b65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610535565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa15801561290a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661296d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610535565b95945050505050565b60006129cb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a489092919063ffffffff16565b80519091501561271057808060200190518101906129e99190612d81565b6127105760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610535565b6060612a578484600085612a61565b90505b9392505050565b606082471015612ac25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610535565b843b612b105760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610535565b600080866001600160a01b03168587604051612b2c9190612fd1565b60006040518083038185875af1925050503d8060008114612b69576040519150601f19603f3d011682016040523d82523d6000602084013e612b6e565b606091505b5091509150612b7e828286612b89565b979650505050505050565b60608315612b98575081612a5a565b825115612ba85782518084602001fd5b8160405162461bcd60e51b815260040161053591906130fb565b80356001600160a01b0381168114612bd957600080fd5b919050565b600082601f830112612bee578081fd5b8135602067ffffffffffffffff80831115612c0b57612c0b6132db565b8260051b612c1a8382016131df565b8481528381019087850183890186018a1015612c34578788fd5b8793505b86841015612c7157803585811115612c4e578889fd5b612c5c8b88838d0101612c7e565b84525060019390930192918501918501612c38565b5098975050505050505050565b600082601f830112612c8e578081fd5b813567ffffffffffffffff811115612ca857612ca86132db565b612cbb601f8201601f19166020016131df565b818152846020838601011115612ccf578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612cfa578081fd5b612a5a82612bc2565b600080600080600080600060e0888a031215612d1d578283fd5b612d2688612bc2565b965060208801359550612d3b60408901612bc2565b9450612d4960608901612bc2565b9350612d5760808901612bc2565b9250612d6560a08901612bc2565b9150612d7360c08901612bc2565b905092959891949750929550565b600060208284031215612d92578081fd5b81518015158114612a5a578182fd5b600060208284031215612db2578081fd5b813567ffffffffffffffff811115612dc8578182fd5b612dd484828501612c7e565b949350505050565b600060208284031215612ded578081fd5b5035919050565b60008060408385031215612e06578182fd5b82359150612e1660208401612bc2565b90509250929050565b60008060008060808587031215612e34578384fd5b84359350612e4460208601612bc2565b9250604085013567ffffffffffffffff80821115612e60578384fd5b612e6c88838901612c7e565b93506060870135915080821115612e81578283fd5b50612e8e87828801612bde565b91505092959194509250565b600080600060608486031215612eae578283fd5b83359250602084013567ffffffffffffffff80821115612ecc578384fd5b612ed887838801612c7e565b93506040860135915080821115612eed578283fd5b50612efa86828701612bde565b9150509250925092565b60008060408385031215612f16578182fd5b50508035926020909101359150565b60008060008060808587031215612f3a578384fd5b8435935060208501359250604085013567ffffffffffffffff80821115612e60578384fd5b6000815180845260208085019450808401835b83811015612f975781516001600160a01b031687529582019590820190600101612f72565b509495945050505050565b6000815180845260208085019450808401835b83811015612f9757815187529582019590820190600101612fb5565b60008251612fe381846020870161327e565b9190910192915050565b602081526000612a5a6020830184612f5f565b602080825282518282018190526000919060409081850190868401855b8281101561306057815180518552868101516001600160a01b0316878601528581015186860152606090810151908501526080909301929085019060010161301d565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156130605781518051855286810151878601528501516001600160a01b0316858501526060909301929085019060010161308a565b6060815260006130d56060830186612fa2565b82810360208401526130e78186612f5f565b905082810360408401526126638185612fa2565b602081526000825180602084015261311a81604085016020870161327e565b601f01601f19169190910160400192915050565b6020808252600c908201526b55554944206578697374732160a01b604082015260600190565b60208082526010908201526f4e6f7420656e6f75676820736967732160801b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526010908201526f706f6f6c206e6f74206578697374732160801b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613208576132086132db565b604052919050565b60008219821115613223576132236132c5565b500190565b60008261324357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613262576132626132c5565b500290565b600082821015613279576132796132c5565b500390565b60005b83811015613299578181015183820152602001613281565b838111156127c75750506000910152565b60006000198214156132be576132be6132c5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122084e3535fcadc0413ed9c1026aeb49699f1d32c1f635f9172cbae692f2d682d5964736f6c634300080400330000000000000000000000002c9aceb63181cd08a093d052ec041e191f229692000000000000000000000000000000000000000000000a968163f0a57b4000000000000000000000000000002ff474d5f3307960f40d94b9dae1873a25520a8800000000000000000000000076827db8475a94e070237b2e501ff9481cd1d0590000000000000000000000003109434cd5d1d3ed8ed046baeab97e93def40c1e000000000000000000000000357bd1b270c3d06ee760d9fc6db0a61973db214f000000000000000000000000177c489075f18cf85c9d38f425b2a58393e76444
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e55760003560e01c80636dbdb9141161010f57806399ed0a4d116100a2578063d41dcbea11610071578063d41dcbea146104ad578063d9f774fc146104c2578063e9fdfb89146104d7578063fefeb942146104ff57600080fd5b806399ed0a4d14610454578063bfe50f7214610467578063cfb508a01461047a578063d14942a61461048d57600080fd5b80638da5cb5b116100de5780638da5cb5b146103c15780638dbb1e3a146103d957806391918d64146103ec57806393f1a40b146103ff57600080fd5b80636dbdb914146103615780637a799d71146103745780637b0703d41461038b5780638aa28550146103b957600080fd5b80634bd93b021161018757806360f1af5d1161015657806360f1af5d14610330578063630b5ba114610343578063676fdb9f1461034b5780636d0d7d7d1461035857600080fd5b80634bd93b02146102c457806350a57a91146102d757806351eb05a61461030a5780635af463d71461031d57600080fd5b806316e2868a116101c357806316e2868a1461027457806317caf6f1146102875780631f5a0bbe1461029e57806341c8b268146102b157600080fd5b8063082f91ac146101ea57806311117fc8146101ff5780631526fe271461022f575b600080fd5b6101fd6101f8366004612f25565b610512565b005b61021261020d366004612ddc565b6108a5565b6040516001600160a01b0390911681526020015b60405180910390f35b61024261023d366004612ddc565b6108c5565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610226565b600254610212906001600160a01b031681565b61029060065481565b604051908152602001610226565b6101fd6102ac366004612ce9565b610910565b6101fd6102bf366004612d03565b610987565b6101fd6102d2366004612e9a565b610aa9565b6102fa6102e5366004612ce9565b60086020526000908152604090205460ff1681565b6040519015158152602001610226565b6101fd610318366004612ddc565b610d28565b6101fd61032b366004612e1f565b610e24565b6101fd61033e366004612f04565b611150565b6101fd6112f8565b6001546102fa9060ff1681565b61029060035481565b6101fd61036f366004612e1f565b61131f565b61037c6116e7565b604051610226939291906130c2565b6102fa610399366004612da1565b8051602081830181018051600e8252928201919093012091525460ff1681565b610290600281565b6001546102129061010090046001600160a01b031681565b6102906103e7366004612f04565b611917565b6101fd6103fa366004612f04565b611a63565b61043961040d366004612df4565b600560209081526000928352604080842090915290825290208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610226565b610290610462366004612df4565b611c4e565b6101fd610475366004612f04565b611d9d565b6101fd610488366004612ddc565b611f3d565b6104a061049b366004612ce9565b6120bb565b6040516102269190613000565b6104b56122ad565b604051610226919061306d565b6104ca61246e565b6040516102269190612fed565b6104ea6104e5366004612ddc565b61251c565b60408051928352602083019190915201610226565b6101fd61050d366004612ce9565b61254a565b6004548490811061053e5760405162461bcd60e51b8152600401610535906131b5565b60405180910390fd5b8282600e826040516105509190612fd1565b9081526040519081900360200190205460ff16156105805760405162461bcd60e51b81526004016105359061312e565b6040805160a0810182526000808252602080830182905282840182905260608301829052608083018290529251919290916105bd91869101612fd1565b60405160208183030381529060405280519060200120905060005b83518110156106dd57600061061d85838151811061060657634e487b7160e01b600052603260045260246000fd5b6020026020010151846125b790919063ffffffff16565b90506009600001546001600160a01b038281169116141561064d5760018460005b911515602090920201526106ca565b600a546001600160a01b038281169116141561066c576001848161063e565b600b546001600160a01b038281169116141561068c57600184600261063e565b600c546001600160a01b03828116911614156106ac57600184600361063e565b600d546001600160a01b03828116911614156106ca57600160808501525b50806106d5816132aa565b9150506105d8565b506000805b60058110156107355783816005811061070b57634e487b7160e01b600052603260045260246000fd5b60200201511561072357610720600183613210565b91505b8061072d816132aa565b9150506106e2565b506001600e866040516107489190612fd1565b908152604051908190036020019020805491151560ff1990921691909117905560038110156107895760405162461bcd60e51b815260040161053590613154565b600089116107cf5760405162461bcd60e51b8152602060048201526013602482015272696e76616c696420616c6c6f63506f696e742160681b6044820152606401610535565b6107d76112f8565b8860048b815481106107f957634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600101546006546108189190613267565b6108229190613210565b6006819055508860048b8154811061084a57634e487b7160e01b600052603260045260246000fd5b906000526020600020906005020160010181905550897f4be6cb3727f6892528cbf78ba443d3ee9ee228c332edb586ede4bb41bf022db28a60405161089191815260200190565b60405180910390a250505050505050505050565b600981600581106108b557600080fd5b01546001600160a01b0316905081565b600481815481106108d557600080fd5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b60015461010090046001600160a01b0316331461092c57600080fd5b6001600160a01b038116600081815260086020908152604091829020805460ff1916600117905590519182527f217603b67e96243085c45dc7bec1c2813c04f15868319981d0eb223f8538da4491015b60405180910390a150565b60015460ff16156109cc5760405162461bcd60e51b815260206004820152600f60248201526e616c726561647920496e697465642160881b6044820152606401610535565b600180543361010081026001600160a81b03199092169190911782178255600081815260086020908152604091829020805460ff1916909417909355600280546001600160a01b038c81166001600160a01b03199283161790925560038b9055600980548b8416908316179055600a80548a8416908316179055600b8054898416908316179055600c8054888416908316179055600d805492871692909116919091179055519081527f217603b67e96243085c45dc7bec1c2813c04f15868319981d0eb223f8538da44910160405180910390a150505050505050565b8181600e82604051610abb9190612fd1565b9081526040519081900360200190205460ff1615610aeb5760405162461bcd60e51b81526004016105359061312e565b6040805160a081018252600080825260208083018290528284018290526060830182905260808301829052925191929091610b2891869101612fd1565b60405160208183030381529060405280519060200120905060005b8351811015610c31576000610b7185838151811061060657634e487b7160e01b600052603260045260246000fd5b90506009600001546001600160a01b0382811691161415610ba15760018460005b91151560209092020152610c1e565b600a546001600160a01b0382811691161415610bc05760018481610b92565b600b546001600160a01b0382811691161415610be0576001846002610b92565b600c546001600160a01b0382811691161415610c00576001846003610b92565b600d546001600160a01b0382811691161415610c1e57600160808501525b5080610c29816132aa565b915050610b43565b506000805b6005811015610c8957838160058110610c5f57634e487b7160e01b600052603260045260246000fd5b602002015115610c7757610c74600183613210565b91505b80610c81816132aa565b915050610c36565b506001600e86604051610c9c9190612fd1565b908152604051908190036020019020805491151560ff199092169190911790556003811015610cdd5760405162461bcd60e51b815260040161053590613154565b60035460408051918252602082018a90527fc86fdc1cbe95930609311505166ab1b99d3615e0c856d3d7e0fd9945a813332d910160405180910390a150505060039490945550505050565b60045481908110610d4b5760405162461bcd60e51b8152600401610535906131b5565b600060048381548110610d6e57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201905080600201544311610d8e57505050565b600481015480610da45750436002909101555050565b6000610db4836002015443611917565b90506000600654846001015460035484610dce9190613248565b610dd89190613248565b610de29190613228565b905082610df48264e8d4a51000613248565b610dfe9190613228565b8460030154610e0d9190613210565b6003850155505043600290920191909155505b5050565b8181600e82604051610e369190612fd1565b9081526040519081900360200190205460ff1615610e665760405162461bcd60e51b81526004016105359061312e565b6040805160a081018252600080825260208083018290528284018290526060830182905260808301829052925191929091610ea391869101612fd1565b60405160208183030381529060405280519060200120905060005b8351811015610fac576000610eec85838151811061060657634e487b7160e01b600052603260045260246000fd5b90506009600001546001600160a01b0382811691161415610f1c5760018460005b91151560209092020152610f99565b600a546001600160a01b0382811691161415610f3b5760018481610f0d565b600b546001600160a01b0382811691161415610f5b576001846002610f0d565b600c546001600160a01b0382811691161415610f7b576001846003610f0d565b600d546001600160a01b0382811691161415610f9957600160808501525b5080610fa4816132aa565b915050610ebe565b506000805b600581101561100457838160058110610fda57634e487b7160e01b600052603260045260246000fd5b602002015115610ff257610fef600183613210565b91505b80610ffc816132aa565b915050610fb1565b506001600e866040516110179190612fd1565b908152604051908190036020019020805491151560ff1990921691909117905560038110156110585760405162461bcd60e51b815260040161053590613154565b6005891061109e5760405162461bcd60e51b8152602060048201526013602482015272696e646578206f7574206f662072616e67652160681b6044820152606401610535565b7f38b1065e0d088f6eda3cb9f0efc7bbb9b145907ab0deb0dbfb700d2bb21599e960098a600581106110e057634e487b7160e01b600052603260045260246000fd5b0154604080516001600160a01b039283168152918b1660208301520160405180910390a18760098a6005811061112657634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b0392909216919091179055505050505050505050565b3360009081526008602052604090205460ff1661116c57600080fd5b80821061117857600080fd5b60075460005b8181101561123a57600781815481106111a757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060020201600001548310806111f75750600781815481106111e257634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015484115b6112285760405162461bcd60e51b8152602060048201526002602482015261424f60f01b6044820152606401610535565b80611232816132aa565b91505061117e565b506112436112f8565b60408051808201825284815260208082018581526007805460018101825560009190915283517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68860029092029182015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689909101558251868152908101859052825191927fa79bf3b43e9c67b09d30da2b6d16a720dcc6238736e932d965463ee4688053bb92918290030190a150505050565b60045460005b81811015610e205761130f81610d28565b611318816132aa565b90506112fe565b8181600e826040516113319190612fd1565b9081526040519081900360200190205460ff16156113615760405162461bcd60e51b81526004016105359061312e565b6040805160a08101825260008082526020808301829052828401829052606083018290526080830182905292519192909161139e91869101612fd1565b60405160208183030381529060405280519060200120905060005b83518110156114a75760006113e785838151811061060657634e487b7160e01b600052603260045260246000fd5b90506009600001546001600160a01b03828116911614156114175760018460005b91151560209092020152611494565b600a546001600160a01b03828116911614156114365760018481611408565b600b546001600160a01b0382811691161415611456576001846002611408565b600c546001600160a01b0382811691161415611476576001846003611408565b600d546001600160a01b038281169116141561149457600160808501525b508061149f816132aa565b9150506113b9565b506000805b60058110156114ff578381600581106114d557634e487b7160e01b600052603260045260246000fd5b6020020151156114ed576114ea600183613210565b91505b806114f7816132aa565b9150506114ac565b506001600e866040516115129190612fd1565b908152604051908190036020019020805491151560ff1990921691909117905560038110156115535760405162461bcd60e51b815260040161053590613154565b61155c8861266d565b6115646112f8565b886006546115729190613210565b6006556040805160a0810182526001600160a01b038a8116808352602083018d8152439484019485526000606085018181526080860182815260048054600180820183559482905297517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b600590990298890180546001600160a01b031916919098161790965592517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c87015595517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d86015594517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e850155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f909301929092555490917f23f5ca24fade32837225bb2f519e5f44ca00590279eb07d81108357bfecefe06918c916116c491613267565b6040805192835260208301919091520160405180910390a2505050505050505050565b600454606090819081908067ffffffffffffffff81111561171857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611741578160200160208202803683370190505b5093508067ffffffffffffffff81111561176b57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611794578160200160208202803683370190505b5092508067ffffffffffffffff8111156117be57634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156117e7578160200160208202803683370190505b50915060005b81811015611910578085828151811061181657634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506004818154811061184357634e487b7160e01b600052603260045260246000fd5b600091825260209091206005909102015484516001600160a01b039091169085908390811061188257634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050600481815481106118c357634e487b7160e01b600052603260045260246000fd5b9060005260206000209060050201600101548382815181106118f557634e487b7160e01b600052603260045260246000fd5b6020908102919091010152611909816132aa565b90506117ed565b5050909192565b60075460009081908190818061192d8888613267565b90506000805b84811015611a36576007818154811061195c57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000015496506007818154811061199157634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016001015495508689101580156119b55750858a11155b15611a24576000878b116119c957876119cb565b8a5b90506000878b116119dc578a6119de565b875b905081811115611a21576119f28282613267565b6119fc9085613210565b93506002611a0a8383613267565b611a149190613248565b611a1e9087613210565b95505b50505b80611a2e816132aa565b915050611933565b5080821115611a5657611a498183613267565b611a539084613210565b92505b5090979650505050505050565b60026000541415611a865760405162461bcd60e51b81526004016105359061317e565b600260005560045482908110611aae5760405162461bcd60e51b8152600401610535906131b5565b600060048481548110611ad157634e487b7160e01b600052603260045260246000fd5b6000918252602080832087845260058083526040808620338752909352919093208054929091029092019250841115611b315760405162461bcd60e51b8152602060048201526002602482015261414560f01b6044820152606401610535565b611b3a85610d28565b6000816001015464e8d4a5100084600301548460000154611b5b9190613248565b611b659190613228565b611b6f9190613267565b905080826002016000828254611b859190613210565b90915550508154611b97908690613267565b808355600384015464e8d4a5100091611bb09190613248565b611bba9190613228565b60018301558254611bd5906001600160a01b03163387612715565b84836004016000828254611be99190613267565b90915550508154611c0a57611c02338360020154612778565b600060028301555b604051858152869033907fbaebb61e35277a4d0c5c4a29129d451dad8a89ae2917ddcf34a990f505b3aa1c9060200160405180910390a35050600160005550505050565b60045460009083908110611c745760405162461bcd60e51b8152600401610535906131b5565b600060048581548110611c9757634e487b7160e01b600052603260045260246000fd5b60009182526020808320888452600580835260408086206001600160a01b038b168752909352919093209102909101600381015460048201546002830154929450909143118015611ce757508015155b15611d55576000611cfc856002015443611917565b90506000600654866001015460035484611d169190613248565b611d209190613248565b611d2a9190613228565b905082611d3c8264e8d4a51000613248565b611d469190613228565b611d509085613210565b935050505b60028301546001840154845464e8d4a5100090611d73908690613248565b611d7d9190613228565b611d879190613267565b611d919190613210565b98975050505050505050565b60026000541415611dc05760405162461bcd60e51b81526004016105359061317e565b600260005560045482908110611de85760405162461bcd60e51b8152600401610535906131b5565b600060048481548110611e0b57634e487b7160e01b600052603260045260246000fd5b60009182526020808320878452600580835260408086203387529093529190932091029091019150611e3c85610d28565b805415611e95576000816001015464e8d4a5100084600301548460000154611e649190613248565b611e6e9190613228565b611e789190613267565b905080826002016000828254611e8e9190613210565b9091555050505b8154611eac906001600160a01b031633308761278f565b83826004016000828254611ec09190613210565b90915550508054611ed2908590613210565b808255600383015464e8d4a5100091611eeb9190613248565b611ef59190613228565b6001820155604051848152859033907fee1c1fc8c3cee482d2fd6bc7dac7f2282a10417bcd4a828918e2c563525cc3f09060200160405180910390a350506001600055505050565b60026000541415611f605760405162461bcd60e51b81526004016105359061317e565b600260005560045481908110611f885760405162461bcd60e51b8152600401610535906131b5565b600060048381548110611fab57634e487b7160e01b600052603260045260246000fd5b60009182526020808320868452600580835260408086203387529093529190932091029091019150611fdc84610d28565b6000816001015464e8d4a5100084600301548460000154611ffd9190613248565b6120079190613228565b6120119190613267565b9050808260020160008282546120279190613210565b90915550506003830154825464e8d4a510009161204391613248565b61204d9190613228565b60018301556002820154612062903390612778565b6002820154604080513381526020810188905280820192909252517f09a9fc77c8280a3fcb8470a9dabef1f3a18e452423f15fa7b99ed0b60dad63479181900360600190a1506000600290910181905560019055505050565b6004546060908067ffffffffffffffff8111156120e857634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561214d57816020015b61213a60405180608001604052806000815260200160006001600160a01b0316815260200160008152602001600081525090565b8152602001906001900390816121065790505b50915060005b818110156122a65760008181526005602090815260408083206001600160a01b03881684529091529020835182908590829081106121a157634e487b7160e01b600052603260045260246000fd5b60209081029190910101515260048054839081106121cf57634e487b7160e01b600052603260045260246000fd5b600091825260209091206005909102015484516001600160a01b039091169085908490811061220e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b039092169101528054845185908490811061224c57634e487b7160e01b600052603260045260246000fd5b602002602001015160400181815250506122668286611c4e565b84838151811061228657634e487b7160e01b600052603260045260246000fd5b6020908102919091010151606001525061229f816132aa565b9050612153565b5050919050565b6004546060908067ffffffffffffffff8111156122da57634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561233857816020015b6123256040518060600160405280600081526020016000815260200160006001600160a01b031681525090565b8152602001906001900390816122f85790505b50915060005b81811015612469578083828151811061236757634e487b7160e01b600052603260045260246000fd5b602090810291909101015152600480548290811061239557634e487b7160e01b600052603260045260246000fd5b600091825260209091206005909102015483516001600160a01b03909116908490839081106123d457634e487b7160e01b600052603260045260246000fd5b6020026020010151604001906001600160a01b031690816001600160a01b0316815250506004818154811061241957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600502016001015483828151811061244b57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101510152612462816132aa565b905061233e565b505090565b60408051600580825260c082019092526060916020820160a08036833701905050905060005b600581101561251857600981600581106124be57634e487b7160e01b600052603260045260246000fd5b015482516001600160a01b03909116908390839081106124ee57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280612510816132aa565b915050612494565b5090565b6007818154811061252c57600080fd5b60009182526020909120600290910201805460019091015490915082565b60015461010090046001600160a01b0316331461256657600080fd5b6001600160a01b038116600081815260086020908152604091829020805460ff1916905590519182527f6140b1995a6d93cb229eb0b3da35af8cc220cdec34ac47d95ecb6a5d38d809fb910161097c565b6000806000808451604114156125e15750505060208201516040830151606084015160001a612657565b84516040141561260f5750505060408201516020830151906001600160ff1b0381169060ff1c601b01612657565b60405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610535565b612663868285856127cd565b9695505050505050565b60045460005b8181101561271057826001600160a01b0316600482815481106126a657634e487b7160e01b600052603260045260246000fd5b60009182526020909120600590910201546001600160a01b031614156127005760405162461bcd60e51b815260206004820152600f60248201526e6475706c696361746520706f6f6c2160881b6044820152606401610535565b612709816132aa565b9050612673565b505050565b6040516001600160a01b03831660248201526044810182905261271090849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612976565b600254610e20906001600160a01b03168383612715565b6040516001600160a01b03808516602483015283166044820152606481018290526127c79085906323b872dd60e01b90608401612741565b50505050565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561284a5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610535565b8360ff16601b148061285f57508360ff16601c145b6128b65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610535565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa15801561290a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661296d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610535565b95945050505050565b60006129cb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612a489092919063ffffffff16565b80519091501561271057808060200190518101906129e99190612d81565b6127105760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610535565b6060612a578484600085612a61565b90505b9392505050565b606082471015612ac25760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610535565b843b612b105760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610535565b600080866001600160a01b03168587604051612b2c9190612fd1565b60006040518083038185875af1925050503d8060008114612b69576040519150601f19603f3d011682016040523d82523d6000602084013e612b6e565b606091505b5091509150612b7e828286612b89565b979650505050505050565b60608315612b98575081612a5a565b825115612ba85782518084602001fd5b8160405162461bcd60e51b815260040161053591906130fb565b80356001600160a01b0381168114612bd957600080fd5b919050565b600082601f830112612bee578081fd5b8135602067ffffffffffffffff80831115612c0b57612c0b6132db565b8260051b612c1a8382016131df565b8481528381019087850183890186018a1015612c34578788fd5b8793505b86841015612c7157803585811115612c4e578889fd5b612c5c8b88838d0101612c7e565b84525060019390930192918501918501612c38565b5098975050505050505050565b600082601f830112612c8e578081fd5b813567ffffffffffffffff811115612ca857612ca86132db565b612cbb601f8201601f19166020016131df565b818152846020838601011115612ccf578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612cfa578081fd5b612a5a82612bc2565b600080600080600080600060e0888a031215612d1d578283fd5b612d2688612bc2565b965060208801359550612d3b60408901612bc2565b9450612d4960608901612bc2565b9350612d5760808901612bc2565b9250612d6560a08901612bc2565b9150612d7360c08901612bc2565b905092959891949750929550565b600060208284031215612d92578081fd5b81518015158114612a5a578182fd5b600060208284031215612db2578081fd5b813567ffffffffffffffff811115612dc8578182fd5b612dd484828501612c7e565b949350505050565b600060208284031215612ded578081fd5b5035919050565b60008060408385031215612e06578182fd5b82359150612e1660208401612bc2565b90509250929050565b60008060008060808587031215612e34578384fd5b84359350612e4460208601612bc2565b9250604085013567ffffffffffffffff80821115612e60578384fd5b612e6c88838901612c7e565b93506060870135915080821115612e81578283fd5b50612e8e87828801612bde565b91505092959194509250565b600080600060608486031215612eae578283fd5b83359250602084013567ffffffffffffffff80821115612ecc578384fd5b612ed887838801612c7e565b93506040860135915080821115612eed578283fd5b50612efa86828701612bde565b9150509250925092565b60008060408385031215612f16578182fd5b50508035926020909101359150565b60008060008060808587031215612f3a578384fd5b8435935060208501359250604085013567ffffffffffffffff80821115612e60578384fd5b6000815180845260208085019450808401835b83811015612f975781516001600160a01b031687529582019590820190600101612f72565b509495945050505050565b6000815180845260208085019450808401835b83811015612f9757815187529582019590820190600101612fb5565b60008251612fe381846020870161327e565b9190910192915050565b602081526000612a5a6020830184612f5f565b602080825282518282018190526000919060409081850190868401855b8281101561306057815180518552868101516001600160a01b0316878601528581015186860152606090810151908501526080909301929085019060010161301d565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b828110156130605781518051855286810151878601528501516001600160a01b0316858501526060909301929085019060010161308a565b6060815260006130d56060830186612fa2565b82810360208401526130e78186612f5f565b905082810360408401526126638185612fa2565b602081526000825180602084015261311a81604085016020870161327e565b601f01601f19169190910160400192915050565b6020808252600c908201526b55554944206578697374732160a01b604082015260600190565b60208082526010908201526f4e6f7420656e6f75676820736967732160801b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526010908201526f706f6f6c206e6f74206578697374732160801b604082015260600190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613208576132086132db565b604052919050565b60008219821115613223576132236132c5565b500190565b60008261324357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613262576132626132c5565b500290565b600082821015613279576132796132c5565b500390565b60005b83811015613299578181015183820152602001613281565b838111156127c75750506000910152565b60006000198214156132be576132be6132c5565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fdfea264697066735822122084e3535fcadc0413ed9c1026aeb49699f1d32c1f635f9172cbae692f2d682d5964736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002c9aceb63181cd08a093d052ec041e191f229692000000000000000000000000000000000000000000000a968163f0a57b4000000000000000000000000000002ff474d5f3307960f40d94b9dae1873a25520a8800000000000000000000000076827db8475a94e070237b2e501ff9481cd1d0590000000000000000000000003109434cd5d1d3ed8ed046baeab97e93def40c1e000000000000000000000000357bd1b270c3d06ee760d9fc6db0a61973db214f000000000000000000000000177c489075f18cf85c9d38f425b2a58393e76444
-----Decoded View---------------
Arg [0] : _angryTokenAddr (address): 0x2c9acEb63181cd08a093d052ec041e191f229692
Arg [1] : _angryPerBlock (uint256): 50000000000000000000000
Arg [2] : _admin1 (address): 0x2ff474D5F3307960f40D94b9daE1873A25520A88
Arg [3] : _admin2 (address): 0x76827dB8475a94E070237b2E501FF9481Cd1d059
Arg [4] : _admin3 (address): 0x3109434CD5d1d3Ed8ed046BaEAB97e93def40C1e
Arg [5] : _admin4 (address): 0x357bd1b270C3D06eE760d9fc6dB0a61973Db214f
Arg [6] : _admin5 (address): 0x177C489075F18CF85c9D38f425b2a58393E76444
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000002c9aceb63181cd08a093d052ec041e191f229692
Arg [1] : 000000000000000000000000000000000000000000000a968163f0a57b400000
Arg [2] : 0000000000000000000000002ff474d5f3307960f40d94b9dae1873a25520a88
Arg [3] : 00000000000000000000000076827db8475a94e070237b2e501ff9481cd1d059
Arg [4] : 0000000000000000000000003109434cd5d1d3ed8ed046baeab97e93def40c1e
Arg [5] : 000000000000000000000000357bd1b270c3d06ee760d9fc6db0a61973db214f
Arg [6] : 000000000000000000000000177c489075f18cf85c9d38f425b2a58393e76444
Deployed Bytecode Sourcemap
22764:14541:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29297:465;;;;;;:::i;:::-;;:::i;:::-;;24490:27;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7693:32:1;;;7675:51;;7663:2;7648:18;24490:27:0;;;;;;;;24121:26;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;12945:32:1;;;12927:51;;13009:2;12994:18;;12987:34;;;;13037:18;;;13030:34;;;;13095:2;13080:18;;13073:34;13138:3;13123:19;;13116:35;12914:3;12899:19;24121:26:0;12881:276:1;23889:24:0;;;;;-1:-1:-1;;;;;23889:24:0;;;24362:30;;;;;;;;;19826:25:1;;;19814:2;19799:18;24362:30:0;19781:76:1;27453:153:0;;;;;;:::i;:::-;;:::i;26837:604::-;;;;;;:::i;:::-;;:::i;37059:243::-;;;;;;:::i;:::-;;:::i;24439:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12002:14:1;;11995:22;11977:41;;11965:2;11950:18;24439:44:0;11932:92:1;33349:682:0;;;;;;:::i;:::-;;:::i;36739:308::-;;;;;;:::i;:::-;;:::i;28047:568::-;;;;;;:::i;:::-;;:::i;32617:180::-;;;:::i;23836:19::-;;;;;;;;;23960:28;;;;;;28627:658;;;;;;:::i;:::-;;:::i;32073:532::-;;;:::i;:::-;;;;;;;;;:::i;24524:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24043:44;;24086:1;24043:44;;23862:20;;;;;;;;-1:-1:-1;;;;;23862:20:0;;;29774:1038;;;;;;:::i;:::-;;:::i;34877:873::-;;;;;;:::i;:::-;;:::i;24203:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20317:25:1;;;20373:2;20358:18;;20351:34;;;;20401:18;;;20394:34;20305:2;20290:18;24203:64:0;20272:162:1;30824:832:0;;;;;;:::i;:::-;;:::i;34043:822::-;;;;;;:::i;:::-;;:::i;35762:582::-;;;;;;:::i;:::-;;:::i;32809:528::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31668:393::-;;;:::i;:::-;;;;;;;:::i;36490:237::-;;;:::i;:::-;;;;;;;:::i;24399:33::-;;;;;;:::i;:::-;;:::i;:::-;;;;20036:25:1;;;20092:2;20077:18;;20070:34;;;;20009:18;24399:33:0;19991:119:1;27618:154:0;;;;;;:::i;:::-;;:::i;29297:465::-;25503:8;:15;29456:4;;25496:22;;25487:53;;;;-1:-1:-1;;;25487:53:0;;;;;;;:::i;:::-;;;;;;;;;29471:5:::1;29478;25654:9;25664:5;25654:16;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;25653:17;25644:44;;;;-1:-1:-1::0;;;25644:44:0::1;;;;;;;:::i;:::-;25699:54;::::0;;::::1;::::0;::::1;::::0;;:20:::1;:54:::0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;25789:23;;25699:54;;:20;;25789:23:::1;::::0;25806:5;;25789:23:::1;;:::i;:::-;;;;;;;;;;;;;25779:34;;;;;;25764:49;;25828:9;25824:520;25846:5;:12;25842:1;:16;25824:520;;;25879:14;25896:22;25909:5;25915:1;25909:8;;;;;;-1:-1:-1::0;;;25909:8:0::1;;;;;;;;;;;;;;;25896:4;:12;;:22;;;;:::i;:::-;25879:39:::0;-1:-1:-1;25946:9:0::1;25956:1;25946:12;::::0;-1:-1:-1;;;;;25936:22:0;;::::1;25946:12:::0;::::1;25936:22;25933:400;;;25989:4;25978:5:::0;25984:1:::1;25978:8;:15:::0;::::1;;:8;::::0;;::::1;;:15:::0;25933:400:::1;;;26027:12:::0;;-1:-1:-1;;;;;26017:22:0;;::::1;26027:12:::0;::::1;26017:22;26014:319;;;26070:4;26059:5:::0;26070:4;26059:8:::1;::::0;26014:319:::1;26108:12:::0;;-1:-1:-1;;;;;26098:22:0;;::::1;26108:12:::0;::::1;26098:22;26095:238;;;26151:4;26140:5:::0;26146:1:::1;26140:8;::::0;26095:238:::1;26189:12:::0;;-1:-1:-1;;;;;26179:22:0;;::::1;26189:12:::0;::::1;26179:22;26176:157;;;26232:4;26221:5:::0;26227:1:::1;26221:8;::::0;26176:157:::1;26270:12:::0;;-1:-1:-1;;;;;26260:22:0;;::::1;26270:12:::0;::::1;26260:22;26257:76;;;26313:4;26302:8:::0;;::::1;:15:::0;26257:76:::1;-1:-1:-1::0;25860:3:0;::::1;::::0;::::1;:::i;:::-;;;;25824:520;;;;26354:11;26385:9:::0;26381:76:::1;26404:1;26400;:5;26381:76;;;26427:5;26433:1;26427:8;;;;;-1:-1:-1::0;;;26427:8:0::1;;;;;;;;;;;;;26424:21;;;26437:8;26444:1;26437:8:::0;::::1;:::i;:::-;;;26424:21;26407:3:::0;::::1;::::0;::::1;:::i;:::-;;;;26381:76;;;;26486:4;26467:9;26477:5;26467:16;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:23;;;::::1;;-1:-1:-1::0;;26467:23:0;;::::1;::::0;;;::::1;::::0;;26517:1:::1;26510:8:::0;::::1;;26501:39;;;;-1:-1:-1::0;;;26501:39:0::1;;;;;;;:::i;:::-;29519:1:::2;29505:11;:15;29496:49;;;::::0;-1:-1:-1;;;29496:49:0;;17382:2:1;29496:49:0::2;::::0;::::2;17364:21:1::0;17421:2;17401:18;;;17394:30;-1:-1:-1;;;17440:18:1;;;17433:49;17499:18;;29496:49:0::2;17354:169:1::0;29496:49:0::2;29556:17;:15;:17::i;:::-;29648:11;29620:8;29629:4;29620:14;;;;;;-1:-1:-1::0;;;29620:14:0::2;;;;;;;;;;;;;;;;;;;:25;;;29602:15;;:43;;;;:::i;:::-;:57;;;;:::i;:::-;29584:15;:75;;;;29698:11;29670:8;29679:4;29670:14;;;;;;-1:-1:-1::0;;;29670:14:0::2;;;;;;;;;;;;;;;;;;;:25;;:39;;;;29736:4;29725:29;29742:11;29725:29;;;;19826:25:1::0;;19814:2;19799:18;;19781:76;29725:29:0::2;;;;;;;;25551:1:::1;;;;;29297:465:::0;;;;;:::o;24490:27::-;;;;;;;;;;;;;;-1:-1:-1;;;;;24490:27:0;;-1:-1:-1;24490:27:0;:::o;24121:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24121:26:0;;;;-1:-1:-1;24121:26:0;;;;;:::o;27453:153::-;25307:5;;;;;-1:-1:-1;;;;;25307:5:0;25293:10;:19;25285:28;;;;;;-1:-1:-1;;;;;27524:26:0;::::1;;::::0;;;:12:::1;:26;::::0;;;;;;;;:33;;-1:-1:-1;;27524:33:0::1;27553:4;27524:33;::::0;;27573:25;;7675:51:1;;;27573:25:0::1;::::0;7648:18:1;27573:25:0::1;;;;;;;;27453:153:::0;:::o;26837:604::-;27018:7;;;;27017:8;27009:36;;;;-1:-1:-1;;;27009:36:0;;14791:2:1;27009:36:0;;;14773:21:1;14830:2;14810:18;;;14803:30;-1:-1:-1;;;14849:18:1;;;14842:45;14904:18;;27009:36:0;14763:165:1;27009:36:0;27066:4;27056:14;;27089:10;27056:14;27081:18;;-1:-1:-1;;;;;;27081:18:0;;;;;;;;;;;-1:-1:-1;27110:24:0;;;:12;:24;;;;;;;;;:31;;-1:-1:-1;;27110:31:0;;;;;;;27152:10;:36;;-1:-1:-1;;;;;27152:36:0;;;-1:-1:-1;;;;;;27152:36:0;;;;;;;27199:13;:30;;;27240:9;:22;;;;;;;;;;;27273:12;:22;;;;;;;;;;;27306:12;:22;;;;;;;;;;;27339:12;:22;;;;;;;;;;;27372:12;:22;;;;;;;;;;;;;;;27410:23;7675:51:1;;;27410:23:0;;7648:18:1;27410:23:0;;;;;;;26837:604;;;;;;;:::o;37059:243::-;37173:5;37180;25654:9;25664:5;25654:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;25653:17;25644:44;;;;-1:-1:-1;;;25644:44:0;;;;;;;:::i;:::-;25699:54;;;;;;;;:20;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;25789:23;;25699:54;;:20;;25789:23;;25806:5;;25789:23;;:::i;:::-;;;;;;;;;;;;;25779:34;;;;;;25764:49;;25828:9;25824:520;25846:5;:12;25842:1;:16;25824:520;;;25879:14;25896:22;25909:5;25915:1;25909:8;;;;;;-1:-1:-1;;;25909:8:0;;;;;;;;25896:22;25879:39;-1:-1:-1;25946:9:0;25956:1;25946:12;;-1:-1:-1;;;;;25936:22:0;;;25946:12;;25936:22;25933:400;;;25989:4;25978:5;25984:1;25978:8;:15;;;:8;;;;;:15;25933:400;;;26027:12;;-1:-1:-1;;;;;26017:22:0;;;26027:12;;26017:22;26014:319;;;26070:4;26059:5;26070:4;26059:8;;26014:319;26108:12;;-1:-1:-1;;;;;26098:22:0;;;26108:12;;26098:22;26095:238;;;26151:4;26140:5;26146:1;26140:8;;26095:238;26189:12;;-1:-1:-1;;;;;26179:22:0;;;26189:12;;26179:22;26176:157;;;26232:4;26221:5;26227:1;26221:8;;26176:157;26270:12;;-1:-1:-1;;;;;26260:22:0;;;26270:12;;26260:22;26257:76;;;26313:4;26302:8;;;:15;26257:76;-1:-1:-1;25860:3:0;;;;:::i;:::-;;;;25824:520;;;;26354:11;26385:9;26381:76;26404:1;26400;:5;26381:76;;;26427:5;26433:1;26427:8;;;;;-1:-1:-1;;;26427:8:0;;;;;;;;;;;;;26424:21;;;26437:8;26444:1;26437:8;;:::i;:::-;;;26424:21;26407:3;;;;:::i;:::-;;;;26381:76;;;;26486:4;26467:9;26477:5;26467:16;;;;;;:::i;:::-;;;;;;;;;;;;;;:23;;;;;-1:-1:-1;;26467:23:0;;;;;;;;;26517:1;26510:8;;;26501:39;;;;-1:-1:-1;;;26501:39:0;;;;;;;:::i;:::-;37224:13:::1;::::0;37202:51:::1;::::0;;20036:25:1;;;20092:2;20077:18;;20070:34;;;37202:51:0::1;::::0;20009:18:1;37202:51:0::1;;;;;;;-1:-1:-1::0;;;37264:13:0::1;:30:::0;;;;-1:-1:-1;;;;37059:243:0:o;33349:682::-;25503:8;:15;33400:4;;25496:22;;25487:53;;;;-1:-1:-1;;;25487:53:0;;;;;;;:::i;:::-;33417:21:::1;33441:8;33450:4;33441:14;;;;;;-1:-1:-1::0;;;33441:14:0::1;;;;;;;;;;;;;;;;;;;33417:38;;33486:4;:20;;;33470:12;:36;33466:75;;33523:7;33349:682:::0;;:::o;33466:75::-:1;33570:16;::::0;::::1;::::0;33601:13;33597:102:::1;;-1:-1:-1::0;33654:12:0::1;33631:20;::::0;;::::1;:35:::0;33349:682;;:::o;33597:102::-:1;33709:18;33730:49;33744:4;:20;;;33766:12;33730:13;:49::i;:::-;33709:70;;33790:19;33872:15;;33854:4;:15;;;33838:13;;33825:10;:26;;;;:::i;:::-;:44;;;;:::i;:::-;:62;;;;:::i;:::-;33790:97:::0;-1:-1:-1;33969:8:0;33946:20:::1;33790:97:::0;33961:4:::1;33946:20;:::i;:::-;:31;;;;:::i;:::-;33922:4;:21;;;:55;;;;:::i;:::-;33898:21;::::0;::::1;:79:::0;-1:-1:-1;;34011:12:0::1;33988:20;::::0;;::::1;:35:::0;;;;-1:-1:-1;25551:1:0::1;33349:682:::0;;:::o;36739:308::-;36856:5;36863;25654:9;25664:5;25654:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;25653:17;25644:44;;;;-1:-1:-1;;;25644:44:0;;;;;;;:::i;:::-;25699:54;;;;;;;;:20;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;25789:23;;25699:54;;:20;;25789:23;;25806:5;;25789:23;;:::i;:::-;;;;;;;;;;;;;25779:34;;;;;;25764:49;;25828:9;25824:520;25846:5;:12;25842:1;:16;25824:520;;;25879:14;25896:22;25909:5;25915:1;25909:8;;;;;;-1:-1:-1;;;25909:8:0;;;;;;;;25896:22;25879:39;-1:-1:-1;25946:9:0;25956:1;25946:12;;-1:-1:-1;;;;;25936:22:0;;;25946:12;;25936:22;25933:400;;;25989:4;25978:5;25984:1;25978:8;:15;;;:8;;;;;:15;25933:400;;;26027:12;;-1:-1:-1;;;;;26017:22:0;;;26027:12;;26017:22;26014:319;;;26070:4;26059:5;26070:4;26059:8;;26014:319;26108:12;;-1:-1:-1;;;;;26098:22:0;;;26108:12;;26098:22;26095:238;;;26151:4;26140:5;26146:1;26140:8;;26095:238;26189:12;;-1:-1:-1;;;;;26179:22:0;;;26189:12;;26179:22;26176:157;;;26232:4;26221:5;26227:1;26221:8;;26176:157;26270:12;;-1:-1:-1;;;;;26260:22:0;;;26270:12;;26260:22;26257:76;;;26313:4;26302:8;;;:15;26257:76;-1:-1:-1;25860:3:0;;;;:::i;:::-;;;;25824:520;;;;26354:11;26385:9;26381:76;26404:1;26400;:5;26381:76;;;26427:5;26433:1;26427:8;;;;;-1:-1:-1;;;26427:8:0;;;;;;;;;;;;;26424:21;;;26437:8;26444:1;26437:8;;:::i;:::-;;;26424:21;26407:3;;;;:::i;:::-;;;;26381:76;;;;26486:4;26467:9;26477:5;26467:16;;;;;;:::i;:::-;;;;;;;;;;;;;;:23;;;;;-1:-1:-1;;26467:23:0;;;;;;;;;26517:1;26510:8;;;26501:39;;;;-1:-1:-1;;;26501:39:0;;;;;;;:::i;:::-;36898:16:::1;36889:6;:25;36881:57;;;::::0;-1:-1:-1;;;36881:57:0;;17730:2:1;36881:57:0::1;::::0;::::1;17712:21:1::0;17769:2;17749:18;;;17742:30;-1:-1:-1;;;17788:18:1;;;17781:49;17847:18;;36881:57:0::1;17702:169:1::0;36881:57:0::1;36954:43;36966:9;36976:6;36966:17;;;;;-1:-1:-1::0;;;36966:17:0::1;;;;;;;;;;::::0;36954:43:::1;::::0;;-1:-1:-1;;;;;36966:17:0;;::::1;7949:34:1::0;;8019:15;;;8014:2;7999:18;;7992:43;7884:18;36954:43:0::1;;;;;;;37028:11;37008:9;37018:6;37008:17;;;;;-1:-1:-1::0;;;37008:17:0::1;;;;;;;;;;:31:::0;;-1:-1:-1;;;;;;37008:31:0::1;-1:-1:-1::0;;;;;37008:31:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;;;;;;;36739:308:0:o;28047:568::-;25399:10;25386:24;;;;:12;:24;;;;;;;;25378:33;;;;;;28165:9:::1;28151:11;:23;28142:34;;;::::0;::::1;;28204:12;:19:::0;28187:14:::1;28234:156;28256:6;28252:1;:10;28234:156;;;28303:12;28316:1;28303:15;;;;;;-1:-1:-1::0;;;28303:15:0::1;;;;;;;;;;;;;;;;;;;:26;;;28291:9;:38;:80;;;;28347:12;28360:1;28347:15;;;;;;-1:-1:-1::0;;;28347:15:0::1;;;;;;;;;;;;;;;;;;;:24;;;28333:11;:38;28291:80;28283:95;;;::::0;-1:-1:-1;;;28283:95:0;;18847:2:1;28283:95:0::1;::::0;::::1;18829:21:1::0;18886:1;18866:18;;;18859:29;-1:-1:-1;;;18904:18:1;;;18897:32;18946:18;;28283:95:0::1;18819:151:1::0;28283:95:0::1;28264:3:::0;::::1;::::0;::::1;:::i;:::-;;;;28234:156;;;;28400:17;:15;:17::i;:::-;-1:-1:-1::0;;;;;;;;28460:27:0;;;-1:-1:-1;;;;28498:23:0;;;28532:12:::1;:21:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;28532:21:0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;28569:38;;20036:25:1;;;20077:18;;;20070:34;;;28569:38:0;;-1:-1:-1;;28569:38:0::1;::::0;;;;;;;::::1;25422:1;;28047:568:::0;;:::o;32617:180::-;32679:8;:15;32662:14;32705:85;32733:6;32727:3;:12;32705:85;;;32763:15;32774:3;32763:10;:15::i;:::-;32741:5;;;:::i;:::-;;;32705:85;;28627:658;28786:5;28793;25654:9;25664:5;25654:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;25653:17;25644:44;;;;-1:-1:-1;;;25644:44:0;;;;;;;:::i;:::-;25699:54;;;;;;;;:20;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;25789:23;;25699:54;;:20;;25789:23;;25806:5;;25789:23;;:::i;:::-;;;;;;;;;;;;;25779:34;;;;;;25764:49;;25828:9;25824:520;25846:5;:12;25842:1;:16;25824:520;;;25879:14;25896:22;25909:5;25915:1;25909:8;;;;;;-1:-1:-1;;;25909:8:0;;;;;;;;25896:22;25879:39;-1:-1:-1;25946:9:0;25956:1;25946:12;;-1:-1:-1;;;;;25936:22:0;;;25946:12;;25936:22;25933:400;;;25989:4;25978:5;25984:1;25978:8;:15;;;:8;;;;;:15;25933:400;;;26027:12;;-1:-1:-1;;;;;26017:22:0;;;26027:12;;26017:22;26014:319;;;26070:4;26059:5;26070:4;26059:8;;26014:319;26108:12;;-1:-1:-1;;;;;26098:22:0;;;26108:12;;26098:22;26095:238;;;26151:4;26140:5;26146:1;26140:8;;26095:238;26189:12;;-1:-1:-1;;;;;26179:22:0;;;26189:12;;26179:22;26176:157;;;26232:4;26221:5;26227:1;26221:8;;26176:157;26270:12;;-1:-1:-1;;;;;26260:22:0;;;26270:12;;26260:22;26257:76;;;26313:4;26302:8;;;:15;26257:76;-1:-1:-1;25860:3:0;;;;:::i;:::-;;;;25824:520;;;;26354:11;26385:9;26381:76;26404:1;26400;:5;26381:76;;;26427:5;26433:1;26427:8;;;;;-1:-1:-1;;;26427:8:0;;;;;;;;;;;;;26424:21;;;26437:8;26444:1;26437:8;;:::i;:::-;;;26424:21;26407:3;;;;:::i;:::-;;;;26381:76;;;;26486:4;26467:9;26477:5;26467:16;;;;;;:::i;:::-;;;;;;;;;;;;;;:23;;;;;-1:-1:-1;;26467:23:0;;;;;;;;;26517:1;26510:8;;;26501:39;;;;-1:-1:-1;;;26501:39:0;;;;;;;:::i;:::-;28811:36:::1;28837:8;28811:18;:36::i;:::-;28858:17;:15;:17::i;:::-;28922:11;28904:15;;:29;;;;:::i;:::-;28886:15;:47:::0;28972:230:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;28972:230:0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;29103:12:::1;28972:230:::0;;;;;;-1:-1:-1;28972:230:0;;;;;;;;;;;;28944:8:::1;:269:::0;;::::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;28944:269:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29259:15;28972:230;;29229:48:::1;::::0;28972:230;;29259:17:::1;::::0;::::1;:::i;:::-;29229:48;::::0;;20036:25:1;;;20092:2;20077:18;;20070:34;;;;20009:18;29229:48:0::1;;;;;;;28627:658:::0;;;;;;;;;:::o;32073:532::-;32230:8;:15;32119:22;;;;;;32230:15;32264:21;;;;;;-1:-1:-1;;;32264:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32264:21:0;;32256:29;;32324:6;32310:21;;;;;;-1:-1:-1;;;32310:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32310:21:0;;32296:35;;32371:6;32357:21;;;;;;-1:-1:-1;;;32357:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32357:21:0;;32342:36;;32394:11;32389:209;32417:6;32411:3;:12;32389:209;;;32460:3;32447:5;32453:3;32447:10;;;;;;-1:-1:-1;;;32447:10:0;;;;;;;;;;;;;;:16;;;;;32505:8;32514:3;32505:13;;;;;;-1:-1:-1;;;32505:13:0;;;;;;;;;;;;;;;;;;;;;;:21;32478:16;;-1:-1:-1;;;;;32505:21:0;;;;32478:11;;32490:3;;32478:16;;;;-1:-1:-1;;;32478:16:0;;;;;;;;;;;;;;:49;-1:-1:-1;;;;;32478:49:0;;;-1:-1:-1;;;;;32478:49:0;;;;;32562:8;32571:3;32562:13;;;;;;-1:-1:-1;;;32562:13:0;;;;;;;;;;;;;;;;;;;:24;;;32542:12;32555:3;32542:17;;;;;;-1:-1:-1;;;32542:17:0;;;;;;;;;;;;;;;;;;:44;32425:5;;;:::i;:::-;;;32389:209;;;;32073:532;;;;:::o;29774:1038::-;29989:12;:19;29873:7;;;;;;;;30070:11;30076:5;30070:3;:11;:::i;:::-;30048:33;;30092:19;30136:9;30132:546;30154:6;30150:1;:10;30132:546;;;30199:12;30212:1;30199:15;;;;;;-1:-1:-1;;;30199:15:0;;;;;;;;;;;;;;;;;;;:26;;;30181:44;;30256:12;30269:1;30256:15;;;;;;-1:-1:-1;;;30256:15:0;;;;;;;;;;;;;;;;;;;:24;;;30240:40;;30306:15;30299:3;:22;;:48;;;;;30334:13;30325:5;:22;;30299:48;30295:372;;;30367:9;30387:15;30379:5;:23;:49;;30413:15;30379:49;;;30405:5;30379:49;30367:61;;30447:9;30465:13;30459:3;:19;:41;;30497:3;30459:41;;;30481:13;30459:41;30447:53;;30526:1;30522;:5;30519:133;;;30567:5;30571:1;30567;:5;:::i;:::-;30551:22;;;;:::i;:::-;;-1:-1:-1;24086:1:0;30607:5;30611:1;30607;:5;:::i;:::-;30606:26;;;;:::i;:::-;30596:36;;;;:::i;:::-;;;30519:133;30295:372;;;30162:3;;;;:::i;:::-;;;;30132:546;;;;30705:11;30691;:25;30688:93;;;30743:25;30757:11;30743;:25;:::i;:::-;30732:37;;;;:::i;:::-;;;30688:93;-1:-1:-1;30798:6:0;;29774:1038;-1:-1:-1;;;;;;;29774:1038:0:o;34877:873::-;7086:1;7683:7;;:19;;7675:63;;;;-1:-1:-1;;;7675:63:0;;;;;;;:::i;:::-;7086:1;7816:7;:18;25503:8:::1;:15:::0;34958:4;;25496:22;::::1;25487:53;;;;-1:-1:-1::0;;;25487:53:0::1;;;;;;;:::i;:::-;34975:21:::2;34999:8;35008:4;34999:14;;;;;;-1:-1:-1::0;;;34999:14:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;35048;;;34999::::2;35048::::0;;;;;;;35063:10:::2;35048:26:::0;;;;;;;;;35093:11;;34999:14;;;::::2;::::0;;::::2;::::0;-1:-1:-1;;;35093:22:0::2;35085:37;;;::::0;-1:-1:-1;;;35085:37:0;;17052:2:1;35085:37:0::2;::::0;::::2;17034:21:1::0;17091:1;17071:18;;;17064:29;-1:-1:-1;;;17109:18:1;;;17102:32;17151:18;;35085:37:0::2;17024:151:1::0;35085:37:0::2;35133:16;35144:4;35133:10;:16::i;:::-;35160:15;35238:4;:15;;;35230:4;35205;:21;;;35191:4;:11;;;:35;;;;:::i;:::-;:44;;;;:::i;:::-;:62;;;;:::i;:::-;35160:93;;35330:7;35315:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;35362:11:0;;:21:::2;::::0;35376:7;;35362:21:::2;:::i;:::-;35348:35:::0;;;35426:21:::2;::::0;::::2;::::0;35451:4:::2;::::0;35412:35:::2;::::0;35426:21;35412:35:::2;:::i;:::-;:44;;;;:::i;:::-;35394:15;::::0;::::2;:62:::0;35467:12;;:55:::2;::::0;-1:-1:-1;;;;;35467:12:0::2;35501:10;35514:7:::0;35467:25:::2;:55::i;:::-;35553:7;35533:4;:16;;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;35574:11:0;;35571:119:::2;;35606:42;35624:10;35636:4;:11;;;35606:17;:42::i;:::-;35677:1;35663:11;::::0;::::2;:15:::0;35571:119:::2;35705:37;::::0;19826:25:1;;;35728:4:0;;35716:10:::2;::::0;35705:37:::2;::::0;19814:2:1;19799:18;35705:37:0::2;;;;;;;-1:-1:-1::0;;7042:1:0;7995:7;:22;-1:-1:-1;;;;34877:873:0:o;30824:832::-;25503:8;:15;30953:7;;30915:4;;25496:22;;25487:53;;;;-1:-1:-1;;;25487:53:0;;;;;;;:::i;:::-;30978:21:::1;31002:8;31011:4;31002:14;;;;;;-1:-1:-1::0;;;31002:14:0::1;;;;;;;;;;::::0;;;::::1;::::0;;;31051;;;31002::::1;31051::::0;;;;;;;-1:-1:-1;;;;;31051:21:0;::::1;::::0;;;;;;;;;31002:14;::::1;::::0;;::::1;31110:21;::::0;::::1;::::0;31161:16:::1;::::0;::::1;::::0;31207:20:::1;::::0;::::1;::::0;31002:14;;-1:-1:-1;31110:21:0;;31192:12:::1;:35;:52:::0;::::1;;;-1:-1:-1::0;31231:13:0;;::::1;31192:52;31188:372;;;31261:18;31299:49;31313:4;:20;;;31335:12;31299:13;:49::i;:::-;31261:87;;31363:19;31449:15;;31431:4;:15;;;31415:13;;31402:10;:26;;;;:::i;:::-;:44;;;;:::i;:::-;:62;;;;:::i;:::-;31363:101:::0;-1:-1:-1;31540:8:0;31517:20:::1;31363:101:::0;31532:4:::1;31517:20;:::i;:::-;:31;;;;:::i;:::-;31498:50;::::0;:16;:50:::1;:::i;:::-;31479:69;;31188:372;;;31637:11;::::0;::::1;::::0;31619:15:::1;::::0;::::1;::::0;31577:11;;31611:4:::1;::::0;31577:30:::1;::::0;31591:16;;31577:30:::1;:::i;:::-;:39;;;;:::i;:::-;:57;;;;:::i;:::-;:71;;;;:::i;:::-;31570:78:::0;30824:832;-1:-1:-1;;;;;;;;30824:832:0:o;34043:822::-;7086:1;7683:7;;:19;;7675:63;;;;-1:-1:-1;;;7675:63:0;;;;;;;:::i;:::-;7086:1;7816:7;:18;25503:8:::1;:15:::0;34123:4;;25496:22;::::1;25487:53;;;;-1:-1:-1::0;;;25487:53:0::1;;;;;;;:::i;:::-;34140:21:::2;34164:8;34173:4;34164:14;;;;;;-1:-1:-1::0;;;34164:14:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;34213;;;34164::::2;34213::::0;;;;;;;34228:10:::2;34213:26:::0;;;;;;;;;34164:14;::::2;::::0;;::::2;::::0;-1:-1:-1;34250:16:0::2;34222:4:::0;34250:10:::2;:16::i;:::-;34281:11:::0;;:15;34277:237:::2;;34313:15;34395:4;:15;;;34387:4;34362;:21;;;34348:4;:11;;;:35;;;;:::i;:::-;:44;;;;:::i;:::-;:62;;;;:::i;:::-;34313:97;;34495:7;34480:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;34277:237:0::2;34524:12:::0;;:124:::2;::::0;-1:-1:-1;;;;;34524:12:0::2;34576:10;34610:4;34630:7:::0;34524:29:::2;:124::i;:::-;34679:7;34659:4;:16;;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;34711:11:0;;:21:::2;::::0;34725:7;;34711:21:::2;:::i;:::-;34697:35:::0;;;34775:21:::2;::::0;::::2;::::0;34800:4:::2;::::0;34761:35:::2;::::0;34775:21;34761:35:::2;:::i;:::-;:44;;;;:::i;:::-;34743:15;::::0;::::2;:62:::0;34821:36:::2;::::0;19826:25:1;;;34843:4:0;;34831:10:::2;::::0;34821:36:::2;::::0;19814:2:1;19799:18;34821:36:0::2;;;;;;;-1:-1:-1::0;;7042:1:0;7995:7;:22;-1:-1:-1;;;34043:822:0:o;35762:582::-;7086:1;7683:7;;:19;;7675:63;;;;-1:-1:-1;;;7675:63:0;;;;;;;:::i;:::-;7086:1;7816:7;:18;25503:8:::1;:15:::0;35837:4;;25496:22;::::1;25487:53;;;;-1:-1:-1::0;;;25487:53:0::1;;;;;;;:::i;:::-;35853:21:::2;35877:8;35886:4;35877:14;;;;;;-1:-1:-1::0;;;35877:14:0::2;;;;;;;;;;::::0;;;::::2;::::0;;;35926;;;35877::::2;35926::::0;;;;;;;35941:10:::2;35926:26:::0;;;;;;;;;35877:14;::::2;::::0;;::::2;::::0;-1:-1:-1;35963:16:0::2;35935:4:::0;35963:10:::2;:16::i;:::-;35990:15;36068:4;:15;;;36060:4;36035;:21;;;36021:4;:11;;;:35;;;;:::i;:::-;:44;;;;:::i;:::-;:62;;;;:::i;:::-;35990:93;;36109:7;36094:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;36159:21:0::2;::::0;::::2;::::0;36145:11;;36184:4:::2;::::0;36145:35:::2;::::0;::::2;:::i;:::-;:44;;;;:::i;:::-;36127:15;::::0;::::2;:62:::0;36230:11:::2;::::0;::::2;::::0;36200:42:::2;::::0;36218:10:::2;::::0;36200:17:::2;:42::i;:::-;36298:11;::::0;::::2;::::0;36258:52:::2;::::0;;36280:10:::2;8907:51:1::0;;8989:2;8974:18;;8967:34;;;9017:18;;;9010:34;;;;36258:52:0;::::2;::::0;;;;8895:2:1;36258:52:0;;::::2;-1:-1:-1::0;36335:1:0::2;36321:11;::::0;;::::2;:15:::0;;;7042:1;7995:22;;-1:-1:-1;;;35762:582:0:o;32809:528::-;32930:8;:15;32873:28;;32930:15;32965:26;;;;;;-1:-1:-1;;;32965:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32965:26:0;;;;;;;;;;;;;;;;;32956:35;;33007:11;33002:328;33030:6;33024:3;:12;33002:328;;;33060:21;33084:13;;;:8;:13;;;;;;;;-1:-1:-1;;;;;33084:20:0;;;;;;;;;33119:11;;33093:3;;33119:6;;33093:3;;33119:11;;;;-1:-1:-1;;;33119:11:0;;;;;;;;;;;;;;;;;;;:21;33185:8;:13;;33194:3;;33185:13;;;;-1:-1:-1;;;33185:13:0;;;;;;;;;;;;;;;;;;;;;;:21;33155:11;;-1:-1:-1;;;;;33185:21:0;;;;33155:6;;33162:3;;33155:11;;;;-1:-1:-1;;;33155:11:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33155:52:0;;;:19;;:52;33243:11;;33222;;:6;;33229:3;;33222:11;;;;-1:-1:-1;;;33222:11:0;;;;;;;;;;;;;;;:18;;:32;;;;;33290:28;33308:3;33312:5;33290:17;:28::i;:::-;33269:6;33276:3;33269:11;;;;;;-1:-1:-1;;;33269:11:0;;;;;;;;;;;;;;;;;;;:18;;:49;-1:-1:-1;33038:5:0;;;:::i;:::-;;;33002:328;;;;32809:528;;;;:::o;31668:393::-;31764:8;:15;31711:24;;31764:15;31799:22;;;;;;-1:-1:-1;;;31799:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31799:22:0;;;;;;;;;;;;;;;;;31790:31;;31837:11;31832:222;31860:6;31854:3;:12;31832:222;;;31908:3;31890:6;31897:3;31890:11;;;;;;-1:-1:-1;;;31890:11:0;;;;;;;;;;;;;;;;;;;:21;31956:8;:13;;31965:3;;31956:13;;;;-1:-1:-1;;;31956:13:0;;;;;;;;;;;;;;;;;;;;;;:21;31926:11;;-1:-1:-1;;;;;31956:21:0;;;;31926:6;;31933:3;;31926:11;;;;-1:-1:-1;;;31926:11:0;;;;;;;;;;;;;;;:19;;:52;-1:-1:-1;;;;;31926:52:0;;;-1:-1:-1;;;;;31926:52:0;;;;;32018:8;32027:3;32018:13;;;;;;-1:-1:-1;;;32018:13:0;;;;;;;;;;;;;;;;;;;:24;;;31993:6;32000:3;31993:11;;;;;;-1:-1:-1;;;31993:11:0;;;;;;;;;;;;;;;;;;;;:22;:49;31868:5;;;:::i;:::-;;;31832:222;;;;31668:393;;:::o;36490:237::-;36581:31;;;36595:16;36581:31;;;;;;;;;36535:24;;36581:31;;;;;;;;;;-1:-1:-1;36581:31:0;36571:41;;36627:9;36623:97;36646:16;36642:1;:20;36623:97;;;36696:9;36706:1;36696:12;;;;;-1:-1:-1;;;36696:12:0;;;;;;;;;;;36683:10;;-1:-1:-1;;;;;36696:12:0;;;;36683:7;;36691:1;;36683:10;;;;-1:-1:-1;;;36683:10:0;;;;;;;;;-1:-1:-1;;;;;36683:25:0;;;:10;;;;;;;;;;;:25;36664:3;;;;:::i;:::-;;;;36623:97;;;;36490:237;:::o;24399:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24399:33:0;:::o;27618:154::-;25307:5;;;;;-1:-1:-1;;;;;25307:5:0;25293:10;:19;25285:28;;;;;;-1:-1:-1;;;;;27689:26:0;::::1;27718:5;27689:26:::0;;;:12:::1;:26;::::0;;;;;;;;:34;;-1:-1:-1;;27689:34:0::1;::::0;;27739:25;;7675:51:1;;;27739:25:0::1;::::0;7648:18:1;27739:25:0::1;7630:102:1::0;1154:1492:0;1232:7;1309:9;1329;1349:7;1569:9;:16;1589:2;1569:22;1565:1032;;;-1:-1:-1;;;1856:4:0;1841:20;;1835:27;1906:4;1891:20;;1885:27;1964:4;1949:20;;1943:27;1940:1;1935:36;1811:175;;;2007:9;:16;2027:2;2007:22;2003:594;;;-1:-1:-1;;;2299:4:0;2284:20;;2278:27;2349:4;2334:20;;2328:27;;-1:-1:-1;;;;;2378:75:0;;;2484:3;2480:12;2494:2;2476:21;2249:263;;;2544:41;;-1:-1:-1;;;2544:41:0;;15135:2:1;2544:41:0;;;15117:21:1;15174:2;15154:18;;;15147:30;15213:33;15193:18;;;15186:61;15264:18;;2544:41:0;15107:181:1;2003:594:0;2616:22;2624:4;2630:1;2633;2636;2616:7;:22::i;:::-;2609:29;1154:1492;-1:-1:-1;;;;;;1154:1492:0:o;27784:251::-;27871:8;:15;27854:14;27897:131;27924:6;27918:3;:12;27897:131;;;27987:8;-1:-1:-1;;;;;27962:33:0;:8;27971:3;27962:13;;;;;;-1:-1:-1;;;27962:13:0;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;27962:21:0;:33;;27953:63;;;;-1:-1:-1;;;27953:63:0;;16708:2:1;27953:63:0;;;16690:21:1;16747:2;16727:18;;;16720:30;-1:-1:-1;;;16766:18:1;;;16759:45;16821:18;;27953:63:0;16680:165:1;27953:63:0;27932:5;;;:::i;:::-;;;27897:131;;;;27784:251;;:::o;19489:177::-;19599:58;;-1:-1:-1;;;;;8618:32:1;;19599:58:0;;;8600:51:1;8667:18;;;8660:34;;;19572:86:0;;19592:5;;-1:-1:-1;;;19622:23:0;8573:18:1;;19599:58:0;;;;-1:-1:-1;;19599:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;19599:58:0;-1:-1:-1;;;;;;19599:58:0;;;;;;;;;;19572:19;:86::i;36356:122::-;36433:10;;:37;;-1:-1:-1;;;;;36433:10:0;36457:3;36462:7;36433:23;:37::i;19674:205::-;19802:68;;-1:-1:-1;;;;;8304:15:1;;;19802:68:0;;;8286:34:1;8356:15;;8336:18;;;8329:43;8388:18;;;8381:34;;;19775:96:0;;19795:5;;-1:-1:-1;;;19825:27:0;8221:18:1;;19802:68:0;8203:218:1;19775:96:0;19674:205;;;;:::o;2785:1432::-;2870:7;3795:66;3781:80;;;3773:127;;;;-1:-1:-1;;;3773:127:0;;15495:2:1;3773:127:0;;;15477:21:1;15534:2;15514:18;;;15507:30;15573:34;15553:18;;;15546:62;-1:-1:-1;;;15624:18:1;;;15617:32;15666:19;;3773:127:0;15467:224:1;3773:127:0;3919:1;:7;;3924:2;3919:7;:18;;;;3930:1;:7;;3935:2;3930:7;3919:18;3911:65;;;;-1:-1:-1;;;3911:65:0;;16305:2:1;3911:65:0;;;16287:21:1;16344:2;16324:18;;;16317:30;16383:34;16363:18;;;16356:62;-1:-1:-1;;;16434:18:1;;;16427:32;16476:19;;3911:65:0;16277:224:1;3911:65:0;4091:24;;;4074:14;4091:24;;;;;;;;;12256:25:1;;;12329:4;12317:17;;12297:18;;;12290:45;;;;12351:18;;;12344:34;;;12394:18;;;12387:34;;;4091:24:0;;12228:19:1;;4091:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4091:24:0;;-1:-1:-1;;4091:24:0;;;-1:-1:-1;;;;;;;4134:20:0;;4126:57;;;;-1:-1:-1;;;4126:57:0;;13752:2:1;4126:57:0;;;13734:21:1;13791:2;13771:18;;;13764:30;13830:26;13810:18;;;13803:54;13874:18;;4126:57:0;13724:174:1;4126:57:0;4203:6;2785:1432;-1:-1:-1;;;;;2785:1432:0:o;21923:761::-;22347:23;22373:69;22401:4;22373:69;;;;;;;;;;;;;;;;;22381:5;-1:-1:-1;;;;;22373:27:0;;;:69;;;;;:::i;:::-;22457:17;;22347:95;;-1:-1:-1;22457:21:0;22453:224;;22599:10;22588:30;;;;;;;;;;;;:::i;:::-;22580:85;;;;-1:-1:-1;;;22580:85:0;;18436:2:1;22580:85:0;;;18418:21:1;18475:2;18455:18;;;18448:30;18514:34;18494:18;;;18487:62;-1:-1:-1;;;18565:18:1;;;18558:40;18615:19;;22580:85:0;18408:232:1;11716:195:0;11819:12;11851:52;11873:6;11881:4;11887:1;11890:12;11851:21;:52::i;:::-;11844:59;;11716:195;;;;;;:::o;12768:530::-;12895:12;12953:5;12928:21;:30;;12920:81;;;;-1:-1:-1;;;12920:81:0;;15898:2:1;12920:81:0;;;15880:21:1;15937:2;15917:18;;;15910:30;15976:34;15956:18;;;15949:62;-1:-1:-1;;;16027:18:1;;;16020:36;16073:19;;12920:81:0;15870:228:1;12920:81:0;9165:20;;13012:60;;;;-1:-1:-1;;;13012:60:0;;18078:2:1;13012:60:0;;;18060:21:1;18117:2;18097:18;;;18090:30;18156:31;18136:18;;;18129:59;18205:18;;13012:60:0;18050:179:1;13012:60:0;13146:12;13160:23;13187:6;-1:-1:-1;;;;;13187:11:0;13207:5;13215:4;13187:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13145:75;;;;13238:52;13256:7;13265:10;13277:12;13238:17;:52::i;:::-;13231:59;12768:530;-1:-1:-1;;;;;;;12768:530:0:o;15308:742::-;15423:12;15452:7;15448:595;;;-1:-1:-1;15483:10:0;15476:17;;15448:595;15597:17;;:21;15593:439;;15860:10;15854:17;15921:15;15908:10;15904:2;15900:19;15893:44;15808:148;16003:12;15996:20;;-1:-1:-1;;;15996:20:0;;;;;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:910::-;244:5;297:3;290:4;282:6;278:17;274:27;264:2;;319:5;312;305:20;264:2;359:6;346:20;385:4;408:18;445:2;441;438:10;435:2;;;451:18;;:::i;:::-;497:2;494:1;490:10;520:28;544:2;540;536:11;520:28;:::i;:::-;582:15;;;613:12;;;;645:15;;;679;;;675:24;;672:33;-1:-1:-1;669:2:1;;;722:5;715;708:20;669:2;748:5;739:14;;762:311;776:2;773:1;770:9;762:311;;;853:3;840:17;889:2;876:11;873:19;870:2;;;909:5;902;895:20;870:2;942:56;994:3;989:2;975:11;967:6;963:24;959:33;942:56;:::i;:::-;930:69;;-1:-1:-1;794:1:1;787:9;;;;;1019:12;;;;1051;;762:311;;;-1:-1:-1;1091:5:1;254:848;-1:-1:-1;;;;;;;;254:848:1:o;1107:550::-;1149:5;1202:3;1195:4;1187:6;1183:17;1179:27;1169:2;;1224:5;1217;1210:20;1169:2;1264:6;1251:20;1290:18;1286:2;1283:26;1280:2;;;1312:18;;:::i;:::-;1356:55;1399:2;1380:13;;-1:-1:-1;;1376:27:1;1405:4;1372:38;1356:55;:::i;:::-;1436:2;1427:7;1420:19;1482:3;1475:4;1470:2;1462:6;1458:15;1454:26;1451:35;1448:2;;;1503:5;1496;1489:20;1448:2;1572;1565:4;1557:6;1553:17;1546:4;1537:7;1533:18;1520:55;1595:16;;;1613:4;1591:27;1584:42;;;;1599:7;1159:498;-1:-1:-1;;1159:498:1:o;1662:196::-;1721:6;1774:2;1762:9;1753:7;1749:23;1745:32;1742:2;;;1795:6;1787;1780:22;1742:2;1823:29;1842:9;1823:29;:::i;1863:638::-;1976:6;1984;1992;2000;2008;2016;2024;2077:3;2065:9;2056:7;2052:23;2048:33;2045:2;;;2099:6;2091;2084:22;2045:2;2127:29;2146:9;2127:29;:::i;:::-;2117:39;;2203:2;2192:9;2188:18;2175:32;2165:42;;2226:38;2260:2;2249:9;2245:18;2226:38;:::i;:::-;2216:48;;2283:38;2317:2;2306:9;2302:18;2283:38;:::i;:::-;2273:48;;2340:39;2374:3;2363:9;2359:19;2340:39;:::i;:::-;2330:49;;2398:39;2432:3;2421:9;2417:19;2398:39;:::i;:::-;2388:49;;2456:39;2490:3;2479:9;2475:19;2456:39;:::i;:::-;2446:49;;2035:466;;;;;;;;;;:::o;2506:297::-;2573:6;2626:2;2614:9;2605:7;2601:23;2597:32;2594:2;;;2647:6;2639;2632:22;2594:2;2684:9;2678:16;2737:5;2730:13;2723:21;2716:5;2713:32;2703:2;;2764:6;2756;2749:22;2808:341;2877:6;2930:2;2918:9;2909:7;2905:23;2901:32;2898:2;;;2951:6;2943;2936:22;2898:2;2996:9;2983:23;3029:18;3021:6;3018:30;3015:2;;;3066:6;3058;3051:22;3015:2;3094:49;3135:7;3126:6;3115:9;3111:22;3094:49;:::i;:::-;3084:59;2888:261;-1:-1:-1;;;;2888:261:1:o;3154:190::-;3213:6;3266:2;3254:9;3245:7;3241:23;3237:32;3234:2;;;3287:6;3279;3272:22;3234:2;-1:-1:-1;3315:23:1;;3224:120;-1:-1:-1;3224:120:1:o;3349:264::-;3417:6;3425;3478:2;3466:9;3457:7;3453:23;3449:32;3446:2;;;3499:6;3491;3484:22;3446:2;3540:9;3527:23;3517:33;;3569:38;3603:2;3592:9;3588:18;3569:38;:::i;:::-;3559:48;;3436:177;;;;;:::o;3618:748::-;3748:6;3756;3764;3772;3825:3;3813:9;3804:7;3800:23;3796:33;3793:2;;;3847:6;3839;3832:22;3793:2;3888:9;3875:23;3865:33;;3917:38;3951:2;3940:9;3936:18;3917:38;:::i;:::-;3907:48;;4006:2;3995:9;3991:18;3978:32;4029:18;4070:2;4062:6;4059:14;4056:2;;;4091:6;4083;4076:22;4056:2;4119:49;4160:7;4151:6;4140:9;4136:22;4119:49;:::i;:::-;4109:59;;4221:2;4210:9;4206:18;4193:32;4177:48;;4250:2;4240:8;4237:16;4234:2;;;4271:6;4263;4256:22;4234:2;;4299:61;4352:7;4341:8;4330:9;4326:24;4299:61;:::i;:::-;4289:71;;;3783:583;;;;;;;:::o;4371:673::-;4492:6;4500;4508;4561:2;4549:9;4540:7;4536:23;4532:32;4529:2;;;4582:6;4574;4567:22;4529:2;4623:9;4610:23;4600:33;;4684:2;4673:9;4669:18;4656:32;4707:18;4748:2;4740:6;4737:14;4734:2;;;4769:6;4761;4754:22;4734:2;4797:49;4838:7;4829:6;4818:9;4814:22;4797:49;:::i;:::-;4787:59;;4899:2;4888:9;4884:18;4871:32;4855:48;;4928:2;4918:8;4915:16;4912:2;;;4949:6;4941;4934:22;4912:2;;4977:61;5030:7;5019:8;5008:9;5004:24;4977:61;:::i;:::-;4967:71;;;4519:525;;;;;:::o;5049:258::-;5117:6;5125;5178:2;5166:9;5157:7;5153:23;5149:32;5146:2;;;5199:6;5191;5184:22;5146:2;-1:-1:-1;;5227:23:1;;;5297:2;5282:18;;;5269:32;;-1:-1:-1;5136:171:1:o;5312:742::-;5442:6;5450;5458;5466;5519:3;5507:9;5498:7;5494:23;5490:33;5487:2;;;5541:6;5533;5526:22;5487:2;5582:9;5569:23;5559:33;;5639:2;5628:9;5624:18;5611:32;5601:42;;5694:2;5683:9;5679:18;5666:32;5717:18;5758:2;5750:6;5747:14;5744:2;;;5779:6;5771;5764:22;6059:463;6112:3;6150:5;6144:12;6177:6;6172:3;6165:19;6203:4;6232:2;6227:3;6223:12;6216:19;;6269:2;6262:5;6258:14;6290:3;6302:195;6316:6;6313:1;6310:13;6302:195;;;6381:13;;-1:-1:-1;;;;;6377:39:1;6365:52;;6437:12;;;;6472:15;;;;6413:1;6331:9;6302:195;;;-1:-1:-1;6513:3:1;;6120:402;-1:-1:-1;;;;;6120:402:1:o;6527:437::-;6580:3;6618:5;6612:12;6645:6;6640:3;6633:19;6671:4;6700:2;6695:3;6691:12;6684:19;;6737:2;6730:5;6726:14;6758:3;6770:169;6784:6;6781:1;6778:13;6770:169;;;6845:13;;6833:26;;6879:12;;;;6914:15;;;;6806:1;6799:9;6770:169;;6969:274;7098:3;7136:6;7130:13;7152:53;7198:6;7193:3;7186:4;7178:6;7174:17;7152:53;:::i;:::-;7221:16;;;;;7106:137;-1:-1:-1;;7106:137:1:o;9055:261::-;9234:2;9223:9;9216:21;9197:4;9254:56;9306:2;9295:9;9291:18;9283:6;9254:56;:::i;9321:960::-;9550:2;9602:21;;;9672:13;;9575:18;;;9694:22;;;9521:4;;9550:2;9735;;9753:18;;;;9794:15;;;9521:4;9840:415;9854:6;9851:1;9848:13;9840:415;;;9913:13;;9951:9;;9939:22;;10005:11;;;9999:18;-1:-1:-1;;;;;9995:44:1;9981:12;;;9974:66;10080:11;;;10074:18;10060:12;;;10053:40;10116:4;10160:11;;;10154:18;10140:12;;;10133:40;10202:4;10193:14;;;;10230:15;;;;10036:1;9869:9;9840:415;;;-1:-1:-1;10272:3:1;;9530:751;-1:-1:-1;;;;;;;9530:751:1:o;10286:872::-;10507:2;10559:21;;;10629:13;;10532:18;;;10651:22;;;10478:4;;10507:2;10692;;10710:18;;;;10751:15;;;10478:4;10797:335;10811:6;10808:1;10805:13;10797:335;;;10870:13;;10908:9;;10896:22;;10958:11;;;10952:18;10938:12;;;10931:40;11015:11;;11009:18;-1:-1:-1;;;;;11005:44:1;10991:12;;;10984:66;11079:4;11070:14;;;;11107:15;;;;11046:1;10826:9;10797:335;;11163:669;11498:2;11487:9;11480:21;11461:4;11524:56;11576:2;11565:9;11561:18;11553:6;11524:56;:::i;:::-;11628:9;11620:6;11616:22;11611:2;11600:9;11596:18;11589:50;11662:44;11699:6;11691;11662:44;:::i;:::-;11648:58;;11754:9;11746:6;11742:22;11737:2;11726:9;11722:18;11715:50;11782:44;11819:6;11811;11782:44;:::i;13162:383::-;13311:2;13300:9;13293:21;13274:4;13343:6;13337:13;13386:6;13381:2;13370:9;13366:18;13359:34;13402:66;13461:6;13456:2;13445:9;13441:18;13436:2;13428:6;13424:15;13402:66;:::i;:::-;13529:2;13508:15;-1:-1:-1;;13504:29:1;13489:45;;;;13536:2;13485:54;;13283:262;-1:-1:-1;;13283:262:1:o;13903:336::-;14105:2;14087:21;;;14144:2;14124:18;;;14117:30;-1:-1:-1;;;14178:2:1;14163:18;;14156:42;14230:2;14215:18;;14077:162::o;14244:340::-;14446:2;14428:21;;;14485:2;14465:18;;;14458:30;-1:-1:-1;;;14519:2:1;14504:18;;14497:46;14575:2;14560:18;;14418:166::o;18975:355::-;19177:2;19159:21;;;19216:2;19196:18;;;19189:30;19255:33;19250:2;19235:18;;19228:61;19321:2;19306:18;;19149:181::o;19335:340::-;19537:2;19519:21;;;19576:2;19556:18;;;19549:30;-1:-1:-1;;;19610:2:1;19595:18;;19588:46;19666:2;19651:18;;19509:166::o;20439:275::-;20510:2;20504:9;20575:2;20556:13;;-1:-1:-1;;20552:27:1;20540:40;;20610:18;20595:34;;20631:22;;;20592:62;20589:2;;;20657:18;;:::i;:::-;20693:2;20686:22;20484:230;;-1:-1:-1;20484:230:1:o;20719:128::-;20759:3;20790:1;20786:6;20783:1;20780:13;20777:2;;;20796:18;;:::i;:::-;-1:-1:-1;20832:9:1;;20767:80::o;20852:217::-;20892:1;20918;20908:2;;-1:-1:-1;;;20943:31:1;;20997:4;20994:1;20987:15;21025:4;20950:1;21015:15;20908:2;-1:-1:-1;21054:9:1;;20898:171::o;21074:168::-;21114:7;21180:1;21176;21172:6;21168:14;21165:1;21162:21;21157:1;21150:9;21143:17;21139:45;21136:2;;;21187:18;;:::i;:::-;-1:-1:-1;21227:9:1;;21126:116::o;21247:125::-;21287:4;21315:1;21312;21309:8;21306:2;;;21320:18;;:::i;:::-;-1:-1:-1;21357:9:1;;21296:76::o;21377:258::-;21449:1;21459:113;21473:6;21470:1;21467:13;21459:113;;;21549:11;;;21543:18;21530:11;;;21523:39;21495:2;21488:10;21459:113;;;21590:6;21587:1;21584:13;21581:2;;;-1:-1:-1;;21625:1:1;21607:16;;21600:27;21430:205::o;21640:135::-;21679:3;-1:-1:-1;;21700:17:1;;21697:2;;;21720:18;;:::i;:::-;-1:-1:-1;21767:1:1;21756:13;;21687:88::o;21780:127::-;21841:10;21836:3;21832:20;21829:1;21822:31;21872:4;21869:1;21862:15;21896:4;21893:1;21886:15;21912:127;21973:10;21968:3;21964:20;21961:1;21954:31;22004:4;22001:1;21994:15;22028:4;22025:1;22018:15
Swarm Source
ipfs://84e3535fcadc0413ed9c1026aeb49699f1d32c1f635f9172cbae692f2d682d59
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.