ERC-20
Charity
Overview
Max Total Supply
1,000,000,000 KIA
Holders
13,079 (0.00%)
Market
Price
$0.00 @ 0.000000 MATIC
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
KIATOKEN
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2024-01-12 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity 0.8.23; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) pragma solidity ^0.8.22; /** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */ interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender); } /** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */ interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator); } /** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */ interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); } // File: @openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.22; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._initialized = 1; if (isTopLevelCall) { $._initializing = true; } _; if (isTopLevelCall) { $._initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._initialized = version; $._initializing = true; _; $._initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } } // File: @openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.22; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.22; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:openzeppelin.storage.Ownable struct OwnableStorage { address _owner; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; function _getOwnableStorage() private pure returns (OwnableStorage storage $) { assembly { $.slot := OwnableStorageLocation } } /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ function __Ownable_init(address initialOwner) internal onlyInitializing { __Ownable_init_unchained(initialOwner); } function __Ownable_init_unchained(address initialOwner) internal onlyInitializing { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { OwnableStorage storage $ = _getOwnableStorage(); return $._owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { OwnableStorage storage $ = _getOwnableStorage(); address oldOwner = $._owner; $._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.22; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.22; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.22; /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts-upgradeable/token/ERC20/ERC20Upgradeable.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.22; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. */ abstract contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20, IERC20Metadata, IERC20Errors { /// @custom:storage-location erc7201:openzeppelin.storage.ERC20 struct ERC20Storage { mapping(address account => uint256) _balances; mapping(address account => mapping(address spender => uint256)) _allowances; uint256 _totalSupply; string _name; string _symbol; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00; function _getERC20Storage() private pure returns (ERC20Storage storage $) { assembly { $.slot := ERC20StorageLocation } } /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { ERC20Storage storage $ = _getERC20Storage(); $._name = name_; $._symbol = symbol_; } function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { // Additional checks or logic before a token transfer occurs // You can customize this function in your child contracts } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { ERC20Storage storage $ = _getERC20Storage(); return $._name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { ERC20Storage storage $ = _getERC20Storage(); return $._symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { ERC20Storage storage $ = _getERC20Storage(); if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows $._totalSupply += value; } else { uint256 fromBalance = $._balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. $._balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. $._totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. $._balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * ``` * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { ERC20Storage storage $ = _getERC20Storage(); if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } $._allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } } // File: @openzeppelin/contracts-upgradeable/token/ERC20/extensions/ERC20BurnableUpgradeable.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.22; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable { function __ERC20Burnable_init() internal onlyInitializing { } function __ERC20Burnable_init_unchained() internal onlyInitializing { } /** * @dev Destroys a `value` amount of tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 value) public virtual { _burn(_msgSender(), value); } /** * @dev Destroys a `value` amount of tokens from `account`, deducting from * the caller's allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `value`. */ function burnFrom(address account, uint256 value) public virtual { _spendAllowance(account, _msgSender(), value); _burn(account, value); } } // File: KIATOKEN40-5.sol pragma solidity 0.8.23; contract KIATOKEN is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, PausableUpgradeable, OwnableUpgradeable { // Event for warnings event Warning(string message); // Percentage earned on donation uint256 constant public royalty = 2; // Lock durations and release times for the lockers uint public lockDurationLocker1; uint public lockDurationLocker2; uint public lockDurationLocker3; uint public lockToken1ReleaseTime; uint public lockToken2ReleaseTime; uint public lockToken3ReleaseTime; // Variable for calculation of staking rewards uint256 internal deployTime; // Total supply of 1 billion tokens uint256 immutable public _totalSupply = 1000000000 * 10 ** decimals(); // Rate of reward tokens to be distributed uint public rewardPerThousandPerDay = 2; // Time interval for reward calculation (1 Day) uint public rewardPerDay = 1; uint256 public overallTotalDonatedTokens; mapping(address => mapping(address => uint256)) private _allowances; // List of staking addresses address[] public stakingAddresses; // List of donating addresses address[] public donatingAddresses; // Function to get staking addresses function getStakingAddresses() public view returns (address[] memory) { return stakingAddresses; } // Function to get donating addresses function getDonatingAddresses() public view returns (address[] memory) { return donatingAddresses; } // Wallets address constant public airDropwallet = 0xB0975EF03767f0eb374F71575B7F870198a0420f; address constant public StackingRewardTokens = 0xc5fA8a6E836e2a7F5712A1328B5Cc04D1cBEe2F8; address constant public managemenetWallet = 0x0A8c07a76E8febBB6928a9c811512709cf7A2B93; address constant public technicalteam = 0xbD343bf6b8eb858bD6F5AC797f217903e6c5E75E; address constant public privatesales = 0x521BCefF84c59fc75C71d6D085A416155F5D1d7b; address constant public publicsales = 0x9B1d41E5F93e726951F2BEe2224dC43a2A6d108c; address constant public liquidity = 0xf5DcC03E798e336c0df9Aad0a2329B1951e764b7; address constant public devTeamwallet = 0x99C5BcEC445C4E24f342037f2bc730406a460b2E; address constant public TokenBurningWallet = 0xe1Be0e1B6B543Dde93Da98694508C2Bfb272FbeB; address constant public locker1 = 0xaf7b3E7d217Ffd8325831988397c1E235CC9600E; address constant public locker2 = 0xadb07859C50AdD82F716b9F0833DFD815b3b8c34; address constant public locker3 = 0x02267e9C1456f80D738176C6627680D255a9146F; // Define the struct struct charity_organization { string name; string description; address ch_add; bool accept_donation; uint256 totalDonations; uint256 totalParticipants; } // Struct to represent a donor struct Donor { address donorAddress; uint256 donatedAmount; } struct DonorInfo { address donorAddress; uint256 donatedAmount; } charity_organization internal co; address[] internal organizationAddressArray; struct stakeInfor { address stakerAddress; uint stakeTime; uint amountStaked; } struct StakingReport { uint stakedAmount; uint startTime; uint endTime; uint rewardsEarned; } // Struct to represent a transfer record struct TransferRecord { address from; address to; uint256 amount; uint256 timestamp; } // Modifier to apply a burn percentage before a function call modifier burntrx(uint amount) { amount = amount / 100; _; } // Modifier to apply a burn percentage before a function call modifier applyBurnPercentage(uint amount) { amount = amount / 100; _; } // Event to log transfer history event TransferRecordEvent(address indexed from, address indexed to, uint256 amount, uint256 timestamp); // Array to store staking reports for each user mapping(address => StakingReport[]) public stakingReports; mapping(address => charity_organization) public ch_org_info; mapping(address => uint) public totalDonations; mapping(address => uint) public charity_balance; mapping(address => stakeInfor) public stakers; mapping(address => uint) public donorInfo; mapping(address => bool) public isTokenLocked; // Mapping to store transfer history mapping(address => TransferRecord[]) public transferHistory; // Mapping to store donor information for each charity mapping(address => Donor[]) public donorsForCharity; event Donation(address indexed donor, address indexed organization, uint amount, string message); event AddOrganization(string indexed, string indexed, address indexed, bool); event Donate(address indexed, uint); event Unstaked(address indexed staker, uint totalAmount); event Staked(address indexed staker, uint amount); // Function to get the list of active charities function getActiveCharities() external view returns (address[] memory) { uint256 activeCharityCount = 0; // Count the number of active charities for (uint256 i = 0; i < organizationAddressArray.length; i++) { if (ch_org_info[organizationAddressArray[i]].accept_donation) { activeCharityCount++; } } // Create an array to store active charity addresses address[] memory activeCharities = new address[](activeCharityCount); // Populate the array with active charity addresses uint256 currentIndex = 0; for (uint256 i = 0; i < organizationAddressArray.length; i++) { if (ch_org_info[organizationAddressArray[i]].accept_donation) { activeCharities[currentIndex] = organizationAddressArray[i]; currentIndex++; } } return activeCharities; } // Function to get the list of donors for a specific active charity function getDonorsForCharity(address orgAddress) external view returns (DonorInfo[] memory) { uint256 donorCount = getNumDonorsForCharity(orgAddress); DonorInfo[] memory donors = new DonorInfo[](donorCount); for (uint256 i = 0; i < donorCount; i++) { Donor memory donor = getDonorForCharity(orgAddress, i); donors[i] = DonorInfo(donor.donorAddress, donor.donatedAmount); } return donors; } // Function to get the number of donors for a specific charity function getNumDonorsForCharity(address orgAddress) public view returns (uint256) { return donorsForCharity[orgAddress].length; } // Function to get the total donations for a specific charity function getTotalDonationsForOrg(address orgAddress) public view returns (uint256) { return totalDonations[orgAddress]; } // Function to check the remaining Airdrop tokens function getRemainingAirdropTokens() external view returns (uint256) { return balanceOf(airDropwallet); } // Function to check the remaining Stacking tokens function getRemainingStackingTokens() external view returns (uint256) { return balanceOf(StackingRewardTokens); } // function to get the contract information function getContractInfo() external view returns (uint deploymentTime, uint currentTime ) { deploymentTime = deployTime; currentTime = block.timestamp; } // Function to get transfer history for a specific address function getTransferHistory(address account) public view returns (TransferRecord[] memory) { return transferHistory[account]; } // Function to get the remaining lock time for a specific locker function getRemainingLockTime(address locker) public view returns (uint) { require(locker == locker1 || locker == locker2 || locker == locker3, "Invalid locker address"); // Determine the corresponding lock duration and release time for the locker uint lockDuration; uint lockerDeployTime; if (locker == locker1) { lockDuration = lockDurationLocker1; lockerDeployTime = deployTime; } else if (locker == locker2) { lockDuration = lockDurationLocker2; lockerDeployTime = deployTime; } else if (locker == locker3) { lockDuration = lockDurationLocker3; lockerDeployTime = deployTime; } // Ensure the locker is currently locked require(isTokenLocked[locker], "Locker is not currently locked"); // Calculate the remaining lock time uint currentTime = block.timestamp; uint remainingLockTime; if (currentTime < lockerDeployTime + lockDuration) { remainingLockTime = lockDuration - (currentTime - lockerDeployTime); } return remainingLockTime; } // Event to log the burned amount event Burned(address indexed account, uint256 amount); // Mapping to track burned amounts mapping(address => uint256) private burnedBalances; uint256 private totalBurnedTokens; // Function to burn tokens from the owner's address or TokenBurningWallet function burn(uint256 amount) override public { require(_msgSender() == owner() || _msgSender() == TokenBurningWallet, "Not authorized to burn tokens"); super.burn(amount); // Log the burned amount emit Burned(_msgSender(), amount); // Update the burned balance and total burned tokens burnedBalances[_msgSender()] += amount; totalBurnedTokens += amount; } // Function to burn tokens from a specific account, restricted to owner and TokenBurningWallet function burnFrom(address account, uint256 amount) public override { require(_msgSender() == owner() || _msgSender() == TokenBurningWallet, "Not authorized to burn tokens"); // Burn the tokens directly (since _burnFrom might not be directly available) super._burn(account, amount); // Log the burned amount emit Burned(account, amount); // Update the burned balance and total burned tokens burnedBalances[account] += amount; totalBurnedTokens += amount; } // Function to get the total amount of burned tokens for a specific address function getBurnedTokens(address account) external view returns (uint256) { return burnedBalances[account]; } // Function to get the total amount of burned tokens function getTotalBurnedTokens() external view returns (uint256) { return totalBurnedTokens; } // Function to get the total number of stacked tokens across the contract function getTotalStakedTokens() external view returns (uint256) { uint256 totalStackedTokens = 0; // Iterate through all staking addresses and sum up the staked amounts for (uint256 i = 0; i < stakingAddresses.length; i++) { totalStackedTokens += stakers[stakingAddresses[i]].amountStaked; } return totalStackedTokens; } // Airdrop function function airdrop(address[] memory recipients, uint256 amount) public { require(msg.sender == airDropwallet, "Only the airdrop wallet can call this function"); require(amount > 0, "Airdrop amount must be greater than 0"); // Ensure that the contract has enough balance for the airdrop require(balanceOf(airDropwallet) >= recipients.length * amount, "Insufficient balance for airdrop"); // Perform the airdrop for (uint256 i = 0; i < recipients.length; i++) { _transfer(airDropwallet, recipients[i], amount); } } // Function to lock a specific locker function lockLocker(address locker) external onlyOwner { require(!isTokenLocked[locker], "Locker is already locked"); // Ensure that the lock duration has been set for the locker uint lockDuration; if (locker == locker1) { lockDuration = lockDurationLocker1; } else if (locker == locker2) { lockDuration = lockDurationLocker2; } else if (locker == locker3) { lockDuration = lockDurationLocker3; } else { revert("Invalid locker address"); } require(lockDuration > 0, "Lock duration not set for the locker"); isTokenLocked[locker] = true; // Set to true to lock the locker } // Function to unlock a specific locker function unlockLocker(address locker) external onlyOwner { require(isTokenLocked[locker], "Locker is not locked"); // Ensure that the lock duration has been set for the locker uint lockDuration; if (locker == locker1) { lockDuration = lockDurationLocker1; } else if (locker == locker2) { lockDuration = lockDurationLocker2; } else if (locker == locker3) { lockDuration = lockDurationLocker3; } else { revert("Invalid locker address"); } require(lockDuration > 0, "Lock duration not set for the locker"); isTokenLocked[locker] = false; // Set to false to unlock the locker } // Function to set the lock duration for locker1 function setLockDurationLocker1(uint durationInSeconds) external onlyOwner { lockDurationLocker1 = durationInSeconds; } // Function to set the lock duration for locker2 function setLockDurationLocker2(uint durationInSeconds) external onlyOwner { lockDurationLocker2 = durationInSeconds; } // Function to set the lock duration for locker3 function setLockDurationLocker3(uint durationInSeconds) external onlyOwner { lockDurationLocker3 = durationInSeconds; } // Function to get the total locked tokens function getTotalLockedTokens() external view returns (uint) { // Calculate the total locked tokens across all lockers uint totalLockedTokens = 0; if (isTokenLocked[locker1]) { totalLockedTokens += balanceOf(locker1); } if (isTokenLocked[locker2]) { totalLockedTokens += balanceOf(locker2); } if (isTokenLocked[locker3]) { totalLockedTokens += balanceOf(locker3); } return totalLockedTokens; } function getLockDuration(address locker) public view returns (uint) { if (locker == locker1) { return lockDurationLocker1; } else if (locker == locker2) { return lockDurationLocker2; } else if (locker == locker3) { return lockDurationLocker3; } else { // Return 0 for unknown locker return 0; } } // Function to update the staking report when tokens are staked function updateStakingReport(uint stakedAmount) internal { // Add your logic here to update the staking report StakingReport memory report; report.stakedAmount = stakedAmount; report.startTime = block.timestamp; report.endTime = 0; // Update this when the tokens are unstaked report.rewardsEarned = 0; // Initialize rewards earned stakingReports[msg.sender].push(report); } // Function to update the staking report when tokens are unstaked function updateUnstakingReport(uint rewardsEarned) internal { // Add your logic here to update the staking report when tokens are unstaked uint lastIndex = stakingReports[msg.sender].length - 1; stakingReports[msg.sender][lastIndex].endTime = block.timestamp; stakingReports[msg.sender][lastIndex].rewardsEarned = rewardsEarned; } function initialize(address initialOwner) initializer public { __ERC20_init("KIATOKEN", "KIA"); __ERC20Burnable_init(); __Pausable_init(); __Ownable_init(initialOwner); _mint(msg.sender, _totalSupply); _transfer(msg.sender, managemenetWallet, 100000000 * 10 ** decimals()); _transfer(msg.sender, StackingRewardTokens, 100000000 * 10 ** decimals()); _transfer(msg.sender, airDropwallet, 50000000 * 10 ** decimals()); _transfer(msg.sender, technicalteam, 100000000 * 10 ** decimals()); _transfer(msg.sender, privatesales, 50000000 * 10 ** decimals()); _transfer(msg.sender, publicsales, 50000000 * 10 ** decimals()); _transfer(msg.sender, liquidity, 50000000 * 10 ** decimals()); _transfer(msg.sender, locker1, 100000000 * 10 ** decimals()); _transfer(msg.sender, locker2, 200000000 * 10 ** decimals()); _transfer(msg.sender, locker3, 200000000 * 10 ** decimals()); deployTime = block.timestamp; // Initialize lock durations and lock release times for the lockers lockDurationLocker1 = 0; // Initially locked, set to 0 seconds lockToken1ReleaseTime = deployTime + lockDurationLocker1; lockDurationLocker2 = 0; // Initially locked, set to 0 seconds lockToken2ReleaseTime = deployTime + lockDurationLocker2; lockDurationLocker3 = 0; // Initially locked, set to 0 seconds lockToken3ReleaseTime = deployTime + lockDurationLocker3; } function checkBurn(uint amount) internal pure returns (uint) { return amount / 100; } // Function to donate function donate(address org_add, uint amount) public payable { require(org_add != address(0), "Invalid charity organization address"); require(amount > 0, "Donation amount must be greater than 0"); // Add the donor's address to the list if (!isAddressInArray(msg.sender, donatingAddresses)) { donatingAddresses.push(msg.sender); } // Check if the sender is a locker wallet require(!isLocker(msg.sender), "Lockers cannot donate"); charity_organization storage organization = ch_org_info[org_add]; require(bytes(organization.name).length > 0, "Invalid charity organization"); require(organization.accept_donation, "This charity organization does not accept donations"); uint royalty_fees = (amount * royalty) / 100; uint donationAmount = amount - royalty_fees; // Check if the sender's locker is not locked require(!isTokenLocked[msg.sender], "Cannot donate from a locked locker"); require(balanceOf(msg.sender) >= amount, "Insufficient balance to donate"); // If the recipient is a charity wallet, emit a warning if (isApprovedCharityWallet(org_add)) { emit Warning("Warning: Donation to a charity wallet. A royalty fee has been applied."); } _transfer(msg.sender, org_add, donationAmount); _transfer(msg.sender, devTeamwallet, royalty_fees); // Update donor recognition donorInfo[msg.sender] += donationAmount; // Update overall total donated tokens overallTotalDonatedTokens += donationAmount; // Modify the charity balance and total donations charity_balance[org_add] += donationAmount; totalDonations[org_add] += donationAmount; // Update donor information for the specific charity donorsForCharity[org_add].push(Donor({ donorAddress: msg.sender, donatedAmount: donationAmount })); // Emit the Donation event emit Donation(msg.sender, org_add, donationAmount, "Donation received from external source"); emit Donate(msg.sender, donationAmount); } // Function to get the overall total donated tokens function getOverallTotalDonatedTokens() public view returns (uint256) { return overallTotalDonatedTokens; } // Function to check if an address is one of the lockers function isLocker(address wallet) internal pure returns (bool) { return wallet == locker1 || wallet == locker2 || wallet == locker3; } // Function to get donor information for a specific charity by index function getDonorForCharity(address orgAddress, uint256 index) public view returns (Donor memory) { require(index < donorsForCharity[orgAddress].length, "Invalid index"); return donorsForCharity[orgAddress][index]; } function rewardDonor(address donor) internal { // Calculate rewards and perform reward logic here // You can reward donors based on donation tiers, frequency, or other criteria. // For simplicity, this example does not include specific reward logic. } function addOrganization(string memory name, string memory description, address ch_addr, bool status) public onlyOwner { // Initialize the charity organization with totalDonations and totalParticipants set to 0 ch_org_info[ch_addr] = charity_organization({ name: name, description: description, ch_add: ch_addr, accept_donation: status, totalDonations: 0, totalParticipants: 0 }); // Add the organization address to the array organizationAddressArray.push(ch_addr); // Emit an event to log the addition of the organization emit AddOrganization(name, description, ch_addr, status); } //function donate function donationStatus(address org_add, bool status) public onlyOwner { ch_org_info[org_add].accept_donation = status; } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function _beforeTokenTransfer(address from, address to, uint256 amount) internal whenNotPaused override { super._beforeTokenTransfer(from, to, amount); } function calculateRoyaltyFee(uint256 amount, bool isCharityWallet) internal pure returns (uint256) { // Calculate the royalty fee, which is 2% for donations and direct transfers to charity wallets uint royaltyFee = isCharityWallet ? (amount * 2) / 100 : 0; return royaltyFee; } // Function to get the number of stakers function getNumberOfStakers() public view returns (uint) { return stakingAddresses.length; } // Function to get the number of donors function getNumberOfDonors() public view returns (uint) { return donatingAddresses.length; } // Function to check the number of people in each position function getNumberOfParticipants() public view returns (uint numberOfStackers, uint numberOfDonors) { numberOfStackers = getNumberOfStakers(); numberOfDonors = getNumberOfDonors(); } //Approve function function approve(address spender, uint256 amount) public virtual override returns (bool) { require(!isLocker(_msgSender()), "Lockers cannot receive allowance"); require(!isLocker(spender), "Lockers cannot be given allowance"); require(spender != StackingRewardTokens, "StackingRewardTokens cannot be approved"); require(_msgSender() != StackingRewardTokens, "StackingRewardTokens cannot approve other wallets"); _approve(_msgSender(), spender, amount); return true; } //function trnasfer function transfer(address to, uint256 amount) public virtual override burntrx(amount) returns (bool) { require(to != address(0), "ERC20: transfer to the zero address"); require(amount > 0, "Transfer amount must be greater than 0"); // Check if the recipient is a charity wallet bool isCharityWallet = isApprovedCharityWallet(to); // If the recipient is a locker wallet, check the lock duration if (to == locker1 || to == locker2 || to == locker3) { require(!isTokenLocked[to], "Tokens for the locker are still locked"); } // If the sender is a locker wallet, check the lock duration if (_msgSender() == locker1 || _msgSender() == locker2 || _msgSender() == locker3) { require(!isTokenLocked[_msgSender()], "Tokens for the locker are still locked"); } // Calculate the royalty fee uint royaltyFee = calculateRoyaltyFee(amount, isCharityWallet); // Ensure the sender has enough balance after deducting the royalty fee require(balanceOf(_msgSender()) >= amount, "Insufficient balance for transfer"); // Deduct the royalty fee and transfer the remaining amount uint256 transferAmount = amount - royaltyFee; // Transfer the remaining amount bool success = super.transfer(to, transferAmount); if (success) { // Log transfer history TransferRecord memory record; record.from = msg.sender; record.to = to; record.amount = transferAmount; // Log the actual transferred amount record.timestamp = block.timestamp; transferHistory[to].push(record); transferHistory[msg.sender].push(record); emit TransferRecordEvent(msg.sender, to, transferAmount, block.timestamp); } // If the recipient is a charity wallet, transfer the royalty fee to the DevTeamwallet if (isCharityWallet) { emit Warning("Warning: Direct transfer to a charity wallet. A royalty fee has been applied."); _transfer(_msgSender(), devTeamwallet, royaltyFee); } // Update totalDonations for direct transfers to charity wallets (this might not be needed here) totalDonations[to] += transferAmount; // If the recipient is a charity wallet, update charity_balance if (isApprovedCharityWallet(to)) { charity_balance[to] += transferAmount; } return success; } //Transferfrom function // Event to log royalty fee transfers event RoyaltyFeeTransfer(address indexed sender, address indexed recipient, uint256 royaltyFee); function transferFrom(address sender, address recipient, uint256 amount) public virtual override burntrx(amount) returns (bool) { require(amount > 0, "Transfer amount must be greater than 0"); // Deduct the allowance _spendAllowance(sender, _msgSender(), amount); // Log transfer history TransferRecord memory record; record.from = sender; record.to = recipient; record.amount = amount; record.timestamp = block.timestamp; transferHistory[recipient].push(record); transferHistory[sender].push(record); emit TransferRecordEvent(sender, recipient, amount, block.timestamp); // Calculate the royalty fee uint royaltyFee = calculateRoyaltyFee(amount, isApprovedCharityWallet(recipient)); // Deduct the royalty fee uint256 transferAmount = amount - royaltyFee; // Transfer the royalty fee to the DevTeamwallet _transfer(sender, devTeamwallet, royaltyFee); // If the recipient is a charity wallet, update charity_balance if (isApprovedCharityWallet(recipient)) { charity_balance[recipient] += transferAmount; // Emit event for debugging emit RoyaltyFeeTransfer(sender, recipient, royaltyFee); } else { // Transfer tokens directly for non-charity recipients _transfer(sender, recipient, transferAmount); } // Update totalDonations for all recipients totalDonations[recipient] += transferAmount; // Check if the sender is a locker wallet if (sender == locker1 || sender == locker2 || sender == locker3) { require(isTokenLocked[sender], "Cannot operate with a locked locker"); require(block.timestamp >= deployTime + getLockDuration(sender), "Tokens for the locker are not yet unlockable"); } // Check if the recipient is a locker wallet if (recipient == locker1 || recipient == locker2 || recipient == locker3) { require(isTokenLocked[recipient], "Cannot operate with a locked locker"); } // Emit event to log information emit TransferFromEvent(sender, recipient, amount); return true; } // Event to log allowance before transfer event AllowanceBeforeTransfer(uint256 allowance); // Event to log balance before transfer event BalanceBeforeTransfer(uint256 balance); // Event to log allowance after transfer event AllowanceAfterTransfer(uint256 newAllowance); // Event to log allowance after transfer event AllowanceAfterTransfer(address indexed owner, address indexed spender, uint256 newAllowance); // Event to log information event TransferFromEvent(address indexed sender, address indexed recipient, uint256 amount); function isApprovedCharityWallet(address wallet) public view returns (bool) { // Check if the wallet is one of the approved charity wallets return ch_org_info[wallet].accept_donation; } // Staking variables and modifiers bool public stakingEnabled; modifier onlyWhenStakingEnabled() { require(stakingEnabled, "Staking is not currently enabled"); _; } function enableStaking() public onlyOwner { stakingEnabled = true; } function disableStaking() public onlyOwner { stakingEnabled = false; } function generateStakingReport() public view returns (StakingReport[] memory) { return stakingReports[msg.sender]; } // Declare events event StakingInitiated(address indexed staker, uint amount); event UnstakingInitiated(address indexed staker, uint originalAmount, uint rewards); // Staking function function stakeToken(uint amount) public onlyWhenStakingEnabled returns (string memory) { require(balanceOf(msg.sender) >= 1000 * 10 ** decimals(), "You are not eligible to stake"); require(amount >= 1000 * 10 ** decimals(), "You are staking less than 1000 tokens"); require(amount <= 100000 * 10 ** decimals(), "Exceeds maximum staking amount"); // Add the staker's address to the list if (!isAddressInArray(msg.sender, stakingAddresses)) { stakingAddresses.push(msg.sender); } // Check if the sender is a locker wallet require(!isLocker(msg.sender), "Lockers cannot stake"); // Deduct the staked amount from the staker's balance _transfer(msg.sender, address(this), amount); stakers[msg.sender] = stakeInfor(msg.sender, block.timestamp, amount); // Create a new staking report updateStakingReport(amount); // Emit staking event emit Staked(msg.sender, amount); return "Tokens are staked. You will receive 3 KIA for every 1,000 KIA staked after 1 minute."; } function isAddressInArray(address _address, address[] memory _array) internal pure returns (bool) { for (uint i = 0; i < _array.length; i++) { if (_array[i] == _address) { return true; } } return false; } //function unstack function unstakeTokens() public onlyWhenStakingEnabled returns (string memory) { require(stakers[msg.sender].amountStaked > 0, "You have not staked any tokens"); uint stakingDuration = block.timestamp - stakers[msg.sender].stakeTime; uint daysStaked = stakingDuration / 1 days; // convert seconds to days uint rewardTokens = 0; // Initialize reward tokens // Calculate reward tokens if the minimum duration is met if (daysStaked >= 1) { rewardTokens = (stakers[msg.sender].amountStaked * 2 * daysStaked) / 1000; // Update the staking report after unstaking updateUnstakingReport(rewardTokens); // Transfer the original stake amount back to the staker's wallet _transfer(address(this), msg.sender, stakers[msg.sender].amountStaked); // Remove the staker's address from the list removeAddressFromArray(msg.sender, stakingAddresses); // Clear the staker's information delete stakers[msg.sender]; // If rewards were earned, transfer them from StackingRewardTokens if (rewardTokens > 0) { _transfer(StackingRewardTokens, msg.sender, rewardTokens); } // Emit unstaking event emit Unstaked(msg.sender, stakers[msg.sender].amountStaked + rewardTokens); return "Tokens successfully unstaked, and rewards received."; } else { // If unstaking before the minimum duration, provide a message without rewards // Transfer the original stake amount back to the staker's wallet _transfer(address(this), msg.sender, stakers[msg.sender].amountStaked); // Remove the staker's address from the list removeAddressFromArray(msg.sender, stakingAddresses); // Clear the staker's information delete stakers[msg.sender]; // Emit unstaking event emit Unstaked(msg.sender, stakers[msg.sender].amountStaked); return "Tokens successfully unstaked. Note: You did not meet the minimum staking duration, so no rewards were earned."; } } // Function to remove an address from an array function removeAddressFromArray(address addr, address[] storage array) internal { for (uint i = 0; i < array.length; i++) { if (array[i] == addr) { // Move the last element to the position of the element to be removed array[i] = array[array.length - 1]; // Remove the last element array.pop(); return; } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"","type":"string"},{"indexed":true,"internalType":"string","name":"","type":"string"},{"indexed":true,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"bool","name":"","type":"bool"}],"name":"AddOrganization","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAllowance","type":"uint256"}],"name":"AllowanceAfterTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"newAllowance","type":"uint256"}],"name":"AllowanceAfterTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"allowance","type":"uint256"}],"name":"AllowanceBeforeTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"BalanceBeforeTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Donate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"donor","type":"address"},{"indexed":true,"internalType":"address","name":"organization","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"Donation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"royaltyFee","type":"uint256"}],"name":"RoyaltyFeeTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakingInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferFromEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TransferRecordEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"originalAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewards","type":"uint256"}],"name":"UnstakingInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"}],"name":"Warning","type":"event"},{"inputs":[],"name":"StackingRewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TokenBurningWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"ch_addr","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"addOrganization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airDropwallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ch_org_info","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"ch_add","type":"address"},{"internalType":"bool","name":"accept_donation","type":"bool"},{"internalType":"uint256","name":"totalDonations","type":"uint256"},{"internalType":"uint256","name":"totalParticipants","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"charity_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devTeamwallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"org_add","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"donatingAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"org_add","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"donationStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"donorInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"donorsForCharity","outputs":[{"internalType":"address","name":"donorAddress","type":"address"},{"internalType":"uint256","name":"donatedAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"generateStakingReport","outputs":[{"components":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"rewardsEarned","type":"uint256"}],"internalType":"struct KIATOKEN.StakingReport[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getActiveCharities","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractInfo","outputs":[{"internalType":"uint256","name":"deploymentTime","type":"uint256"},{"internalType":"uint256","name":"currentTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDonatingAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"orgAddress","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getDonorForCharity","outputs":[{"components":[{"internalType":"address","name":"donorAddress","type":"address"},{"internalType":"uint256","name":"donatedAmount","type":"uint256"}],"internalType":"struct KIATOKEN.Donor","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"orgAddress","type":"address"}],"name":"getDonorsForCharity","outputs":[{"components":[{"internalType":"address","name":"donorAddress","type":"address"},{"internalType":"uint256","name":"donatedAmount","type":"uint256"}],"internalType":"struct KIATOKEN.DonorInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"}],"name":"getLockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"orgAddress","type":"address"}],"name":"getNumDonorsForCharity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDonors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfParticipants","outputs":[{"internalType":"uint256","name":"numberOfStackers","type":"uint256"},{"internalType":"uint256","name":"numberOfDonors","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfStakers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOverallTotalDonatedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingAirdropTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"}],"name":"getRemainingLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingStackingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"orgAddress","type":"address"}],"name":"getTotalDonationsForOrg","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalStakedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTransferHistory","outputs":[{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct KIATOKEN.TransferRecord[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isApprovedCharityWallet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTokenLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDurationLocker1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDurationLocker2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDurationLocker3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"}],"name":"lockLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockToken1ReleaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockToken2ReleaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockToken3ReleaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"locker1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"locker2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"locker3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managemenetWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overallTotalDonatedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privatesales","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicsales","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerThousandPerDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"durationInSeconds","type":"uint256"}],"name":"setLockDurationLocker1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"durationInSeconds","type":"uint256"}],"name":"setLockDurationLocker2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"durationInSeconds","type":"uint256"}],"name":"setLockDurationLocker3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeToken","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"address","name":"stakerAddress","type":"address"},{"internalType":"uint256","name":"stakeTime","type":"uint256"},{"internalType":"uint256","name":"amountStaked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingReports","outputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"rewardsEarned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"technicalteam","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalDonations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"transferHistory","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"locker","type":"address"}],"name":"unlockLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeTokens","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052620000126012600a62000158565b6200002290633b9aca0062000170565b60805260026039556001603a553480156200003c57600080fd5b506200018a565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200009a5781600019048211156200007e576200007e62000043565b808516156200008c57918102915b93841c93908002906200005e565b509250929050565b600082620000b35750600162000152565b81620000c25750600062000152565b8160018114620000db5760028114620000e65762000106565b600191505062000152565b60ff841115620000fa57620000fa62000043565b50506001821b62000152565b5060208310610133831016604e8410600b84101617156200012b575081810a62000152565b62000137838362000059565b80600019048211156200014e576200014e62000043565b0290505b92915050565b60006200016960ff841683620000a2565b9392505050565b808202811582820484141762000152576200015262000043565b6080516157eb620001ad6000396000818161086d01526134f901526157eb6000f3fe6080604052600436106104d65760003560e01c806371713f3b11610281578063a76197771161015a578063d11aca62116100cc578063e916551311610085578063e916551314610fd9578063f2fde38b14611019578063f637168d14611039578063f66423331461106b578063f8bff7d214611081578063fc30a171146110b757600080fd5b8063d11aca6214610f10578063d1fb445414610f25578063dd62ed3e14610f70578063e0da40dd14610f90578063e1fcd8be14610fa6578063e69d849d14610fc657600080fd5b8063c204642c1161011e578063c204642c14610e53578063c4d66de814610e73578063c80c28a214610e93578063cb7c918514610ea8578063cda6b84714610ed0578063d0e1287d14610ef057600080fd5b8063a761977714610dbb578063a9059cbb14610dd0578063af8f42b814610df0578063b16b3d8114610e06578063b552531414610e3357600080fd5b80638da5cb5b116101f35780639d2c5d60116101b75780639d2c5d6014610d025780639f4a662c14610d17578063a0ed3ac514610d44578063a5a9b15d14610d59578063a5ce413b14610d79578063a729dd7c14610d8e57600080fd5b80638da5cb5b14610c375780638e62387014610c4c5780638e6c3cb614610c6c5780639168ae7214610c8257806395d89b4114610ced57600080fd5b80637e733aa5116102455780637e733aa514610b745780637fe1d39614610b9c5780638456cb5914610bb257806386516e1314610bc75780638a6b0ced14610be75780638d31a5da14610c0f57600080fd5b806371713f3b14610ace57806376ad476a14610af657806379cc679014610b0b5780637cc1f86714610b2b5780637d6897b414610b5257600080fd5b80633840636d116103b3578063553e4203116103255780636627759c116102e95780636627759c14610a1e57806366bb18f714610a345780636c02c5b914610a495780636e393e1b14610a7157806370a0823114610a99578063715018a614610ab957600080fd5b8063553e42031461096c5780635a4c38a7146109945780635c975abb146109c15780635ff03e66146109d9578063658b672914610a0957600080fd5b806343cbd9021161037757806343cbd902146108c457806344eaa2d9146108ec57806347304494146109015780634f617b961461092157806350cab7321461093757806351d185981461095757600080fd5b80633840636d1461080657806339c6bc62146108335780633eaaf86b1461085b5780633f4ba83a1461088f57806342966c68146108a457600080fd5b80631da327111161044c57806329ee566c1161041057806329ee566c146107545780632af0e25114610769578063304217f51461077e57806330f9fbc1146107b4578063313ce567146107d457806333edf08c146107f057600080fd5b80631da32711146106c857806320b7aec1146106dd57806323b872dd146106fd578063258e11e21461071d57806328696de21461073f57600080fd5b80631756e51b1161049e5780631756e51b146105c357806318160ddd146105e5578063193773641461061957806319b131e11461062f5780631a6865021461066e5780631cfff51b146106ae57600080fd5b8063021b21a8146104db57806306fdde0314610524578063095ea7b3146105465780630a06939a146105765780630b990ed4146105a3575b600080fd5b3480156104e757600080fd5b506105116104f6366004614d4e565b6001600160a01b03166000908152604e602052604090205490565b6040519081526020015b60405180910390f35b34801561053057600080fd5b506105396110df565b60405161051b9190614dc0565b34801561055257600080fd5b50610566610561366004614dd3565b6111a2565b604051901515815260200161051b565b34801561058257600080fd5b50610511610591366004614d4e565b60486020526000908152604090205481565b3480156105af57600080fd5b506105666105be366004614d4e565b61136f565b3480156105cf57600080fd5b506105e36105de366004614dfd565b611397565b005b3480156105f157600080fd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610511565b34801561062557600080fd5b5061051160335481565b34801561063b57600080fd5b5061064f61064a366004614dd3565b6113a4565b604080516001600160a01b03909316835260208301919091520161051b565b34801561067a57600080fd5b5061069673f5dcc03e798e336c0df9aad0a2329b1951e764b781565b6040516001600160a01b03909116815260200161051b565b3480156106ba57600080fd5b506050546105669060ff1681565b3480156106d457600080fd5b50603e54610511565b3480156106e957600080fd5b506105e36106f8366004614edd565b6113ea565b34801561070957600080fd5b50610566610718366004614f62565b611558565b34801561072957600080fd5b50610732611af4565b60405161051b9190614f9e565b34801561074b57600080fd5b506105e3611c88565b34801561076057600080fd5b50610511600281565b34801561077557600080fd5b50604f54610511565b34801561078a57600080fd5b50610511610799366004614d4e565b6001600160a01b03166000908152604d602052604090205490565b3480156107c057600080fd5b506105e36107cf366004614dfd565b611c9c565b3480156107e057600080fd5b506040516012815260200161051b565b3480156107fc57600080fd5b5061051160355481565b34801561081257600080fd5b50610826610821366004614d4e565b611ca9565b60405161051b9190614feb565b34801561083f57600080fd5b506106967399c5bcec445c4e24f342037f2bc730406a460b2e81565b34801561086757600080fd5b506105117f000000000000000000000000000000000000000000000000000000000000000081565b34801561089b57600080fd5b506105e3611d9e565b3480156108b057600080fd5b506105e36108bf366004614dfd565b611db0565b3480156108d057600080fd5b5061069673adb07859c50add82f716b9f0833dfd815b3b8c3481565b3480156108f857600080fd5b50610732611eb4565b34801561090d57600080fd5b5061051161091c366004614d4e565b611f16565b34801561092d57600080fd5b5061051160365481565b34801561094357600080fd5b50610511610952366004614d4e565b6120fc565b34801561096357600080fd5b50610511612192565b34801561097857600080fd5b5061069673b0975ef03767f0eb374f71575b7f870198a0420f81565b3480156109a057600080fd5b506105116109af366004614d4e565b60476020526000908152604090205481565b3480156109cd57600080fd5b5060005460ff16610566565b3480156109e557600080fd5b506105666109f4366004614d4e565b604b6020526000908152604090205460ff1681565b348015610a1557600080fd5b50603d54610511565b348015610a2a57600080fd5b5061051160325481565b348015610a4057600080fd5b50603b54610511565b348015610a5557600080fd5b5061069673521bceff84c59fc75c71d6d085a416155f5d1d7b81565b348015610a7d57600080fd5b5061069673bd343bf6b8eb858bd6f5ac797f217903e6c5e75e81565b348015610aa557600080fd5b50610511610ab4366004614d4e565b6121fa565b348015610ac557600080fd5b506105e3612222565b348015610ada57600080fd5b50610696730a8c07a76e8febbb6928a9c811512709cf7a2b9381565b348015610b0257600080fd5b50610511612234565b348015610b1757600080fd5b506105e3610b26366004614dd3565b612258565b348015610b3757600080fd5b50603854425b6040805192835260208301919091520161051b565b348015610b5e57600080fd5b50610b67612375565b60405161051b919061504b565b348015610b8057600080fd5b506106967302267e9c1456f80d738176c6627680d255a9146f81565b348015610ba857600080fd5b50610511603b5481565b348015610bbe57600080fd5b506105e3612407565b348015610bd357600080fd5b50610696610be2366004614dfd565b612417565b348015610bf357600080fd5b5061069673c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f881565b348015610c1b57600080fd5b5061069673e1be0e1b6b543dde93da98694508c2bfb272fbeb81565b348015610c4357600080fd5b50610696612441565b348015610c5857600080fd5b50610696610c67366004614dfd565b61246f565b348015610c7857600080fd5b5061051160375481565b348015610c8e57600080fd5b50610cc8610c9d366004614d4e565b6049602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b604080516001600160a01b03909416845260208401929092529082015260600161051b565b348015610cf957600080fd5b5061053961247f565b348015610d0e57600080fd5b506105116124be565b348015610d2357600080fd5b50610d37610d32366004614d4e565b6124dd565b60405161051b91906150a2565b348015610d5057600080fd5b50610511612582565b348015610d6557600080fd5b506105e3610d74366004614d4e565b6126d6565b348015610d8557600080fd5b5061053961284c565b348015610d9a57600080fd5b50610511610da9366004614d4e565b604a6020526000908152604090205481565b348015610dc757600080fd5b50610732612b0b565b348015610ddc57600080fd5b50610566610deb366004614dd3565b612b6b565b348015610dfc57600080fd5b50610511603a5481565b348015610e1257600080fd5b50610e26610e21366004614dd3565b61302d565b60405161051b9190615105565b348015610e3f57600080fd5b506105e3610e4e366004614d4e565b6130fd565b348015610e5f57600080fd5b506105e3610e6e366004615125565b61323b565b348015610e7f57600080fd5b506105e3610e8e366004614d4e565b6133dc565b348015610e9f57600080fd5b50610b3d613736565b348015610eb457600080fd5b50610696739b1d41e5f93e726951f2bee2224dc43a2a6d108c81565b348015610edc57600080fd5b50610539610eeb366004614dfd565b613753565b348015610efc57600080fd5b506105e3610f0b3660046151d8565b613aa9565b348015610f1c57600080fd5b506105e3613ae9565b348015610f3157600080fd5b50610f45610f40366004614dd3565b613b00565b604080516001600160a01b03958616815294909316602085015291830152606082015260800161051b565b348015610f7c57600080fd5b50610511610f8b36600461520b565b613b52565b348015610f9c57600080fd5b5061051160345481565b348015610fb257600080fd5b506105e3610fc1366004614dfd565b613b9c565b6105e3610fd4366004614dd3565b613ba9565b348015610fe557600080fd5b50610ff9610ff4366004614dd3565b6141c0565b60408051948552602085019390935291830152606082015260800161051b565b34801561102557600080fd5b506105e3611034366004614d4e565b614206565b34801561104557600080fd5b50611059611054366004614d4e565b614244565b60405161051b96959493929190615235565b34801561107757600080fd5b5061051160395481565b34801561108d57600080fd5b5061051161109c366004614d4e565b6001600160a01b031660009081526047602052604090205490565b3480156110c357600080fd5b5061069673af7b3e7d217ffd8325831988397c1e235cc9600e81565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060916000805160206156d58339815191529161111e90615289565b80601f016020809104026020016040519081016040528092919081815260200182805461114a90615289565b80156111975780601f1061116c57610100808354040283529160200191611197565b820191906000526020600020905b81548152906001019060200180831161117a57829003601f168201915b505050505091505090565b60006111ad33614398565b156111ff5760405162461bcd60e51b815260206004820181905260248201527f4c6f636b6572732063616e6e6f74207265636569766520616c6c6f77616e636560448201526064015b60405180910390fd5b61120883614398565b1561125f5760405162461bcd60e51b815260206004820152602160248201527f4c6f636b6572732063616e6e6f7420626520676976656e20616c6c6f77616e636044820152606560f81b60648201526084016111f6565b73c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f7196001600160a01b038416016112dc5760405162461bcd60e51b815260206004820152602760248201527f537461636b696e67526577617264546f6b656e732063616e6e6f7420626520616044820152661c1c1c9bdd995960ca1b60648201526084016111f6565b73c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f719330161135a5760405162461bcd60e51b815260206004820152603160248201527f537461636b696e67526577617264546f6b656e732063616e6e6f7420617070726044820152706f7665206f746865722077616c6c65747360781b60648201526084016111f6565b61136533848461440d565b5060015b92915050565b6001600160a01b0316600090815260466020526040902060020154600160a01b900460ff1690565b61139f61441a565b603455565b604d60205281600052604060002081815481106113c057600080fd5b6000918252602090912060029091020180546001909101546001600160a01b039091169250905082565b6113f261441a565b6040805160c08101825285815260208082018690526001600160a01b038516828401819052841515606084015260006080840181905260a08401819052908152604690915291909120815181906114499082615305565b506020820151600182019061145e9082615305565b5060408281015160028301805460608601511515600160a01b026001600160a81b03199091166001600160a01b03938416171790556080840151600384015560a090930151600490920191909155604480546001810182556000919091527f9b22d3d61959b4d3528b1d8ba932c96fbe302b36a1aad1d95cab54f9e0a135ea0180549285166001600160a01b03199390931683179055516115009085906153c5565b60405180910390208560405161151691906153c5565b6040519081900381208415158252907f04dec031e7487ce7f8de45105b251fb1b3a298cab328fd59d2f12bb92904404e9060200160405180910390a450505050565b6000816115666064826153f7565b9050600083116115885760405162461bcd60e51b81526004016111f690615419565b61159385338561444c565b61159b614cfd565b8581600001906001600160a01b031690816001600160a01b0316815250508481602001906001600160a01b031690816001600160a01b0316815250508381604001818152505042816060018181525050604c6000866001600160a01b03166001600160a01b0316815260200190815260200160002081908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301555050604c6000876001600160a01b03166001600160a01b0316815260200190815260200160002081908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301555050846001600160a01b0316866001600160a01b03167f0794b110bd69e41d8ad3b51500eb3fb307c092ecc5e82f9dc3c3b47a0cb870ed86426040516117b7929190918252602082015260400190565b60405180910390a360006117d3856117ce8861136f565b6144b2565b905060006117e1828761545f565b9050611802887399c5bcec445c4e24f342037f2bc730406a460b2e846144e0565b61180b8761136f565b15611891576001600160a01b03871660009081526048602052604081208054839290611838908490615472565b92505081905550866001600160a01b0316886001600160a01b03167f6129a9a99dc9e294d81fd18d26cad1d42a680fc5b77dbe926687375c2bd2e2838460405161188491815260200190565b60405180910390a361189c565b61189c8888836144e0565b6001600160a01b038716600090815260476020526040812080548392906118c4908490615472565b90915550506001600160a01b03881673af7b3e7d217ffd8325831988397c1e235cc9600e148061191057506001600160a01b03881673adb07859c50add82f716b9f0833dfd815b3b8c34145b8061193757506001600160a01b0388167302267e9c1456f80d738176c6627680d255a9146f145b156119ee576001600160a01b0388166000908152604b602052604090205460ff166119745760405162461bcd60e51b81526004016111f690615485565b61197d886120fc565b60385461198a9190615472565b4210156119ee5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e7320666f7220746865206c6f636b657220617265206e6f7420796560448201526b7420756e6c6f636b61626c6560a01b60648201526084016111f6565b6001600160a01b03871673af7b3e7d217ffd8325831988397c1e235cc9600e1480611a3557506001600160a01b03871673adb07859c50add82f716b9f0833dfd815b3b8c34145b80611a5c57506001600160a01b0387167302267e9c1456f80d738176c6627680d255a9146f145b15611a99576001600160a01b0387166000908152604b602052604090205460ff16611a995760405162461bcd60e51b81526004016111f690615485565b866001600160a01b0316886001600160a01b03167f4770449bc46ed470ab992a9b6bc681560fbac950dd46f1fbc02f44a056edd10f88604051611ade91815260200190565b60405180910390a3506001979650505050505050565b60606000805b604454811015611b69576046600060448381548110611b1b57611b1b6154c8565b60009182526020808320909101546001600160a01b0316835282019290925260400190206002015460ff600160a01b9091041615611b615781611b5d816154de565b9250505b600101611afa565b5060008167ffffffffffffffff811115611b8557611b85614e16565b604051908082528060200260200182016040528015611bae578160200160208202803683370190505b5090506000805b604454811015611c7f576046600060448381548110611bd657611bd66154c8565b60009182526020808320909101546001600160a01b0316835282019290925260400190206002015460ff600160a01b9091041615611c775760448181548110611c2157611c216154c8565b9060005260206000200160009054906101000a90046001600160a01b0316838381518110611c5157611c516154c8565b6001600160a01b039092166020928302919091019091015281611c73816154de565b9250505b600101611bb5565b50909392505050565b611c9061441a565b6050805460ff19169055565b611ca461441a565b603255565b60606000611ccc836001600160a01b03166000908152604d602052604090205490565b905060008167ffffffffffffffff811115611ce957611ce9614e16565b604051908082528060200260200182016040528015611d2e57816020015b6040805180820190915260008082526020820152815260200190600190039081611d075790505b50905060005b82811015611d96576000611d48868361302d565b9050604051806040016040528082600001516001600160a01b031681526020018260200151815250838381518110611d8257611d826154c8565b602090810291909101015250600101611d34565b509392505050565b611da661441a565b611dae61453f565b565b611db8612441565b6001600160a01b0316336001600160a01b03161480611dea57503373e1be0e1b6b543dde93da98694508c2bfb272fbeb145b611e365760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420617574686f72697a656420746f206275726e20746f6b656e7300000060448201526064016111f6565b611e3f81614591565b60405181815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a2336000908152604e602052604081208054839290611e93908490615472565b9250508190555080604f6000828254611eac9190615472565b909155505050565b6060603e805480602002602001604051908101604052809291908181526020018280548015611f0c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611eee575b5050505050905090565b60006001600160a01b03821673af7b3e7d217ffd8325831988397c1e235cc9600e1480611f5f57506001600160a01b03821673adb07859c50add82f716b9f0833dfd815b3b8c34145b80611f8657506001600160a01b0382167302267e9c1456f80d738176c6627680d255a9146f145b611fcb5760405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206c6f636b6572206164647265737360501b60448201526064016111f6565b60008073af7b3e7d217ffd8325831988397c1e235cc9600d196001600160a01b03851601612000575050603254603854612060565b73adb07859c50add82f716b9f0833dfd815b3b8c33196001600160a01b03851601612032575050603354603854612060565b7302267e9c1456f80d738176c6627680d255a9146e196001600160a01b038516016120605750506034546038545b6001600160a01b0384166000908152604b602052604090205460ff166120c85760405162461bcd60e51b815260206004820152601e60248201527f4c6f636b6572206973206e6f742063757272656e746c79206c6f636b6564000060448201526064016111f6565b4260006120d58484615472565b8210156120f3576120e6838361545f565b6120f0908561545f565b90505b95945050505050565b600073af7b3e7d217ffd8325831988397c1e235cc9600d196001600160a01b0383160161212b57505060325490565b73adb07859c50add82f716b9f0833dfd815b3b8c33196001600160a01b0383160161215857505060335490565b7302267e9c1456f80d738176c6627680d255a9146e196001600160a01b0383160161218557505060345490565b506000919050565b919050565b600080805b603d548110156121f45760496000603d83815481106121b8576121b86154c8565b60009182526020808320909101546001600160a01b031683528201929092526040019020600201546121ea9083615472565b9150600101612197565b50919050565b6001600160a01b031660009081526000805160206156d5833981519152602052604090205490565b61222a61441a565b611dae600061459b565b600061225373c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f86121fa565b905090565b612260612441565b6001600160a01b0316336001600160a01b0316148061229257503373e1be0e1b6b543dde93da98694508c2bfb272fbeb145b6122de5760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420617574686f72697a656420746f206275726e20746f6b656e7300000060448201526064016111f6565b6122e8828261460c565b816001600160a01b03167f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df78260405161232391815260200190565b60405180910390a26001600160a01b0382166000908152604e602052604081208054839290612353908490615472565b9250508190555080604f600082825461236c9190615472565b90915550505050565b336000908152604560209081526040808320805482518185028101850190935280835260609492939192909184015b828210156123fe5783829060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050815260200190600101906123a4565b50505050905090565b61240f61441a565b611dae614646565b603d818154811061242757600080fd5b6000918252602090912001546001600160a01b0316905081565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b603e818154811061242757600080fd5b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060916000805160206156d58339815191529161111e90615289565b600061225373b0975ef03767f0eb374f71575b7f870198a0420f6121fa565b6001600160a01b0381166000908152604c60209081526040808320805482518185028101850190935280835260609492939192909184015b82821015612577576000848152602090819020604080516080810182526004860290920180546001600160a01b039081168452600180830154909116848601526002820154928401929092526003015460608301529083529092019101612515565b505050509050919050565b73af7b3e7d217ffd8325831988397c1e235cc9600e6000908152604b6020527fa7a8a800752d160de6090f59838f1af010d56021c08f083da4f76f16a88d805154819060ff16156125f7576125ea73af7b3e7d217ffd8325831988397c1e235cc9600e6121fa565b6125f49082615472565b90505b73adb07859c50add82f716b9f0833dfd815b3b8c34600052604b6020527f5fa85c64033c1665e7bc1c71fdb5b22564dea4242ac58f59545638b71d4ba54e5460ff16156126685761265b73adb07859c50add82f716b9f0833dfd815b3b8c346121fa565b6126659082615472565b90505b7302267e9c1456f80d738176c6627680d255a9146f600052604b6020527fa08b5324b90dff07a5f74a6a83e2c0f1aa4312fe37526ab0ec2b27a7025c22b15460ff161561218d576126cc7302267e9c1456f80d738176c6627680d255a9146f6121fa565b6113699082615472565b6126de61441a565b6001600160a01b0381166000908152604b602052604090205460ff1661273d5760405162461bcd60e51b8152602060048201526014602482015273131bd8dad95c881a5cc81b9bdd081b1bd8dad95960621b60448201526064016111f6565b600073af7b3e7d217ffd8325831988397c1e235cc9600d196001600160a01b0383160161276d575060325461280a565b73adb07859c50add82f716b9f0833dfd815b3b8c33196001600160a01b0383160161279b575060335461280a565b7302267e9c1456f80d738176c6627680d255a9146e196001600160a01b038316016127c9575060345461280a565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206c6f636b6572206164647265737360501b60448201526064016111f6565b6000811161282a5760405162461bcd60e51b81526004016111f6906154f7565b506001600160a01b03166000908152604b60205260409020805460ff19169055565b60505460609060ff166128a15760405162461bcd60e51b815260206004820181905260248201527f5374616b696e67206973206e6f742063757272656e746c7920656e61626c656460448201526064016111f6565b336000908152604960205260409020600201546129005760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f74207374616b656420616e7920746f6b656e73000060448201526064016111f6565b3360009081526049602052604081206001015461291d904261545f565b9050600061292e62015180836153f7565b9050600060018210612a65573360009081526049602052604090206002908101546103e891849161295e9161553b565b612968919061553b565b61297291906153f7565b905061297d81614683565b3360008181526049602052604090206002015461299b9130916144e0565b6129a633603d61472a565b33600090815260496020526040812080546001600160a01b0319168155600181018290556002015580156129f3576129f373c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f833836144e0565b336000818152604960205260409020600201547f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f7590612a33908490615472565b60405190815260200160405180910390a26040518060600160405280603381526020016156a260339139935050505090565b33600081815260496020526040902060020154612a839130916144e0565b612a8e33603d61472a565b33600081815260496020908152604080832080546001600160a01b031916815560018101849055600201839055519182527f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75910160405180910390a26040518060a00160405280606d8152602001615749606d9139935050505090565b6060603d805480602002602001604051908101604052809291908181526020018280548015611f0c576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611eee575050505050905090565b600081612b796064826153f7565b90506001600160a01b038416612bdd5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016111f6565b60008311612bfd5760405162461bcd60e51b81526004016111f690615419565b6000612c088561136f565b90506001600160a01b03851673af7b3e7d217ffd8325831988397c1e235cc9600e1480612c5157506001600160a01b03851673adb07859c50add82f716b9f0833dfd815b3b8c34145b80612c7857506001600160a01b0385167302267e9c1456f80d738176c6627680d255a9146f145b15612cb6576001600160a01b0385166000908152604b602052604090205460ff1615612cb65760405162461bcd60e51b81526004016111f690615552565b3373af7b3e7d217ffd8325831988397c1e235cc9600e1480612ceb57503373adb07859c50add82f716b9f0833dfd815b3b8c34145b80612d095750337302267e9c1456f80d738176c6627680d255a9146f145b15612d3e57336000908152604b602052604090205460ff1615612d3e5760405162461bcd60e51b81526004016111f690615552565b6000612d4a85836144b2565b905084612d56336121fa565b1015612dae5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e742062616c616e636520666f72207472616e7366656044820152603960f91b60648201526084016111f6565b6000612dba828761545f565b90506000612dc88883614829565b90508015612ef057612dd8614cfd565b338082526001600160a01b038a81166020808501828152604080870189815242606089018181526000878152604c87528481208054600181810183559183528883208d5160049283029091018054918d166001600160a01b031992831617815589518185018054918f16918416919091179055875160028083019190915586516003928301558e8652898620805480870182559087529b9095208f519b90930290920180549a8d169a82169a909a178a559751918901805492909b169190971617909855915196850196909655519290910191909155519092917f0794b110bd69e41d8ad3b51500eb3fb307c092ecc5e82f9dc3c3b47a0cb870ed91612ee691888252602082015260400190565b60405180910390a3505b8315612fb8577f8e21091fbff1b481f4a0383146b43469a9f1bfc97275d232206e61929bf9541a604051612f91906020808252604d908201527f5761726e696e673a20446972656374207472616e7366657220746f206120636860408201527f61726974792077616c6c65742e204120726f79616c747920666565206861732060608201526c3132b2b71030b8383634b2b21760991b608082015260a00190565b60405180910390a1612fb8337399c5bcec445c4e24f342037f2bc730406a460b2e856144e0565b6001600160a01b03881660009081526047602052604081208054849290612fe0908490615472565b90915550612fef90508861136f565b15613022576001600160a01b0388166000908152604860205260408120805484929061301c908490615472565b90915550505b979650505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152604d602052604090205482106130985760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016111f6565b6001600160a01b0383166000908152604d602052604090208054839081106130c2576130c26154c8565b60009182526020918290206040805180820190915260029092020180546001600160a01b031682526001015491810191909152905092915050565b61310561441a565b6001600160a01b0381166000908152604b602052604090205460ff161561316e5760405162461bcd60e51b815260206004820152601860248201527f4c6f636b657220697320616c7265616479206c6f636b6564000000000000000060448201526064016111f6565b600073af7b3e7d217ffd8325831988397c1e235cc9600d196001600160a01b0383160161319e57506032546131f6565b73adb07859c50add82f716b9f0833dfd815b3b8c33196001600160a01b038316016131cc57506033546131f6565b7302267e9c1456f80d738176c6627680d255a9146e196001600160a01b038316016127c957506034545b600081116132165760405162461bcd60e51b81526004016111f6906154f7565b506001600160a01b03166000908152604b60205260409020805460ff19166001179055565b3373b0975ef03767f0eb374f71575b7f870198a0420f146132b55760405162461bcd60e51b815260206004820152602e60248201527f4f6e6c79207468652061697264726f702077616c6c65742063616e2063616c6c60448201526d103a3434b990333ab731ba34b7b760911b60648201526084016111f6565b600081116133135760405162461bcd60e51b815260206004820152602560248201527f41697264726f7020616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b60648201526084016111f6565b808251613320919061553b565b61333d73b0975ef03767f0eb374f71575b7f870198a0420f6121fa565b101561338b5760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e742062616c616e636520666f722061697264726f7060448201526064016111f6565b60005b82518110156133d7576133cf73b0975ef03767f0eb374f71575b7f870198a0420f8483815181106133c1576133c16154c8565b6020026020010151846144e0565b60010161338e565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156134225750825b905060008267ffffffffffffffff16600114801561343f5750303b155b90508115801561344d575080155b1561346b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561349557845460ff60401b1916600160401b1785555b6134da6040518060400160405280600881526020016725a4a0aa27a5a2a760c11b815250604051806040016040528060038152602001624b494160e81b815250614841565b6134e2614853565b6134ea61485b565b6134f38661486b565b61351d337f000000000000000000000000000000000000000000000000000000000000000061487c565b61355733730a8c07a76e8febbb6928a9c811512709cf7a2b9360125b61354490600a61567c565b613552906305f5e10061553b565b6144e0565b6135773373c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f86012613539565b6135ac3373b0975ef03767f0eb374f71575b7f870198a0420f60125b61359e90600a61567c565b613552906302faf08061553b565b6135cc3373bd343bf6b8eb858bd6f5ac797f217903e6c5e75e6012613539565b6135ec3373521bceff84c59fc75c71d6d085a416155f5d1d7b6012613593565b61360c33739b1d41e5f93e726951f2bee2224dc43a2a6d108c6012613593565b61362c3373f5dcc03e798e336c0df9aad0a2329b1951e764b76012613593565b61364c3373af7b3e7d217ffd8325831988397c1e235cc9600e6012613539565b6136813373adb07859c50add82f716b9f0833dfd815b3b8c3460125b61367390600a61567c565b61355290630bebc20061553b565b6136a1337302267e9c1456f80d738176c6627680d255a9146f6012613668565b426038819055600060328190556136b791615472565b603555600060338190556038546136ce9190615472565b603655600060348190556038546136e59190615472565b603755831561372e57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b600080613742603d5490565b915061374d603e5490565b90509091565b60505460609060ff166137a85760405162461bcd60e51b815260206004820181905260248201527f5374616b696e67206973206e6f742063757272656e746c7920656e61626c656460448201526064016111f6565b6137b46012600a61567c565b6137c0906103e861553b565b6137c9336121fa565b10156138175760405162461bcd60e51b815260206004820152601d60248201527f596f7520617265206e6f7420656c696769626c6520746f207374616b6500000060448201526064016111f6565b6138236012600a61567c565b61382f906103e861553b565b82101561388c5760405162461bcd60e51b815260206004820152602560248201527f596f7520617265207374616b696e67206c657373207468616e203130303020746044820152646f6b656e7360d81b60648201526084016111f6565b6138986012600a61567c565b6138a590620186a061553b565b8211156138f45760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178696d756d207374616b696e6720616d6f756e74000060448201526064016111f6565b61395833603d80548060200260200160405190810160405280929190818152602001828054801561394e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613930575b50505050506148b2565b61399f57603d80546001810182556000919091527fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc30180546001600160a01b031916331790555b6139a833614398565b156139ec5760405162461bcd60e51b81526020600482015260146024820152734c6f636b6572732063616e6e6f74207374616b6560601b60448201526064016111f6565b6139f73330846144e0565b60408051606081018252338082524260208084019182528385018781526000938452604990915293909120915182546001600160a01b0319166001600160a01b039091161782555160018201559051600290910155613a558261490d565b60405182815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a26040518060800160405280605481526020016156f56054913992915050565b613ab161441a565b6001600160a01b0390911660009081526046602052604090206002018054911515600160a01b0260ff60a01b19909216919091179055565b613af161441a565b6050805460ff19166001179055565b604c6020528160005260406000208181548110613b1c57600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831695509116925084565b6001600160a01b0391821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b613ba461441a565b603355565b6001600160a01b038216613c0b5760405162461bcd60e51b8152602060048201526024808201527f496e76616c69642063686172697479206f7267616e697a6174696f6e206164646044820152637265737360e01b60648201526084016111f6565b60008111613c6a5760405162461bcd60e51b815260206004820152602660248201527f446f6e6174696f6e20616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016111f6565b613ccc33603e80548060200260200160405190810160405280929190818152602001828054801561394e576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116139305750505050506148b2565b613d1357603e80546001810182556000919091527f8d800d6614d35eed73733ee453164a3b48076eb3138f466adeeb9dec7bb31f700180546001600160a01b031916331790555b613d1c33614398565b15613d615760405162461bcd60e51b81526020600482015260156024820152744c6f636b6572732063616e6e6f7420646f6e61746560581b60448201526064016111f6565b6001600160a01b038216600090815260466020526040812080549091908290613d8990615289565b905011613dd85760405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063686172697479206f7267616e697a6174696f6e0000000060448201526064016111f6565b6002810154600160a01b900460ff16613e4f5760405162461bcd60e51b815260206004820152603360248201527f546869732063686172697479206f7267616e697a6174696f6e20646f6573206e6044820152726f742061636365707420646f6e6174696f6e7360681b60648201526084016111f6565b60006064613e5e60028561553b565b613e6891906153f7565b90506000613e76828561545f565b336000908152604b602052604090205490915060ff1615613ee45760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420646f6e6174652066726f6d2061206c6f636b6564206c6f636b60448201526132b960f11b60648201526084016111f6565b83613eee336121fa565b1015613f3c5760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742062616c616e636520746f20646f6e617465000060448201526064016111f6565b613f458561136f565b15613fe7577f8e21091fbff1b481f4a0383146b43469a9f1bfc97275d232206e61929bf9541a604051613fde9060208082526046908201527f5761726e696e673a20446f6e6174696f6e20746f20612063686172697479207760408201527f616c6c65742e204120726f79616c74792066656520686173206265656e206170606082015265383634b2b21760d11b608082015260a00190565b60405180910390a15b613ff23386836144e0565b614011337399c5bcec445c4e24f342037f2bc730406a460b2e846144e0565b336000908152604a602052604081208054839290614030908490615472565b9250508190555080603b60008282546140499190615472565b90915550506001600160a01b03851660009081526048602052604081208054839290614076908490615472565b90915550506001600160a01b038516600090815260476020526040812080548392906140a3908490615472565b90915550506001600160a01b038581166000818152604d602090815260408083208151808301835233808252818501898152835460018082018655948852968690209251600290970290920180546001600160a01b031916969098169590951787555195019490945583518581529081018490526026938101939093527f446f6e6174696f6e2072656365697665642066726f6d2065787465726e616c20606084015265736f7572636560d01b608084015290917fed2b2500743c8bb2872a73feba7c885e8dba0dab543dec453faafbc44c13bbb29060a00160405180910390a360405181815233907f0553260a2e46b0577270d8992db02d30856ca880144c72d6e9503760946aef139060200160405180910390a25050505050565b604560205281600052604060002081815481106141dc57600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919450925084565b61420e61441a565b6001600160a01b03811661423857604051631e4fbdf760e01b8152600060048201526024016111f6565b6142418161459b565b50565b60466020526000908152604090208054819061425f90615289565b80601f016020809104026020016040519081016040528092919081815260200182805461428b90615289565b80156142d85780601f106142ad576101008083540402835291602001916142d8565b820191906000526020600020905b8154815290600101906020018083116142bb57829003601f168201915b5050505050908060010180546142ed90615289565b80601f016020809104026020016040519081016040528092919081815260200182805461431990615289565b80156143665780601f1061433b57610100808354040283529160200191614366565b820191906000526020600020905b81548152906001019060200180831161434957829003601f168201915b505050506002830154600384015460049094015492936001600160a01b03821693600160a01b90920460ff1692509086565b60006001600160a01b03821673af7b3e7d217ffd8325831988397c1e235cc9600e14806143e157506001600160a01b03821673adb07859c50add82f716b9f0833dfd815b3b8c34145b8061136957506001600160a01b0382167302267e9c1456f80d738176c6627680d255a9146f1492915050565b6133d78383836001614992565b33614423612441565b6001600160a01b031614611dae5760405163118cdaa760e01b81523360048201526024016111f6565b60006144588484613b52565b905060001981146144ac578181101561449d57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016111f6565b6144ac84848484036000614992565b50505050565b600080826144c15760006144d8565b60646144ce85600261553b565b6144d891906153f7565b949350505050565b6001600160a01b03831661450a57604051634b637e8f60e11b8152600060048201526024016111f6565b6001600160a01b0382166145345760405163ec442f0560e01b8152600060048201526024016111f6565b6133d7838383614a7a565b614547614bb8565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b614241338261460c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6001600160a01b03821661463657604051634b637e8f60e11b8152600060048201526024016111f6565b61464282600083614a7a565b5050565b61464e614c01565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586145743390565b3360009081526045602052604081205461469f9060019061545f565b33600090815260456020526040902080549192504291839081106146c5576146c56154c8565b9060005260206000209060040201600201819055508160456000336001600160a01b03166001600160a01b031681526020019081526020016000208281548110614711576147116154c8565b9060005260206000209060040201600301819055505050565b60005b81548110156133d757826001600160a01b0316828281548110614752576147526154c8565b6000918252602090912001546001600160a01b031603614821578154829061477c9060019061545f565b8154811061478c5761478c6154c8565b9060005260206000200160009054906101000a90046001600160a01b03168282815481106147bc576147bc6154c8565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550818054806147fa576147fa61568b565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b60010161472d565b6000336148378185856144e0565b5060019392505050565b614849614c47565b6146428282614c90565b611dae614c47565b614863614c47565b611dae614ce1565b614873614c47565b61424181614cf5565b6001600160a01b0382166148a65760405163ec442f0560e01b8152600060048201526024016111f6565b61464260008383614a7a565b6000805b825181101561490357836001600160a01b03168382815181106148db576148db6154c8565b60200260200101516001600160a01b0316036148fb576001915050611369565b6001016148b6565b5060009392505050565b6149386040518060800160405280600081526020016000815260200160008152602001600081525090565b90815242602080830191825260006040808501828152606086018381523384526045855291832080546001818101835591855294909320955160049094029095019283559251908201559151600283015551600390910155565b6000805160206156d58339815191526001600160a01b0385166149cb5760405163e602df0560e01b8152600060048201526024016111f6565b6001600160a01b0384166149f557604051634a1406b160e11b8152600060048201526024016111f6565b6001600160a01b03808616600090815260018301602090815260408083209388168352929052208390558115614a7357836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051614a6a91815260200190565b60405180910390a35b5050505050565b6000805160206156d58339815191526001600160a01b038416614ab65781816002016000828254614aab9190615472565b90915550614b289050565b6001600160a01b03841660009081526020829052604090205482811015614b095760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016111f6565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b038316614b46576002810180548390039055614b65565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614baa91815260200190565b60405180910390a350505050565b60005460ff16611dae5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016111f6565b60005460ff1615611dae5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016111f6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611dae57604051631afcd79f60e31b815260040160405180910390fd5b614c98614c47565b6000805160206156d58339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03614cd28482615305565b50600481016144ac8382615305565b614ce9614c47565b6000805460ff19169055565b61420e614c47565b604051806080016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081525090565b80356001600160a01b038116811461218d57600080fd5b600060208284031215614d6057600080fd5b614d6982614d37565b9392505050565b60005b83811015614d8b578181015183820152602001614d73565b50506000910152565b60008151808452614dac816020860160208601614d70565b601f01601f19169290920160200192915050565b602081526000614d696020830184614d94565b60008060408385031215614de657600080fd5b614def83614d37565b946020939093013593505050565b600060208284031215614e0f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e5557614e55614e16565b604052919050565b600082601f830112614e6e57600080fd5b813567ffffffffffffffff811115614e8857614e88614e16565b614e9b601f8201601f1916602001614e2c565b818152846020838601011115614eb057600080fd5b816020850160208301376000918101602001919091529392505050565b8035801515811461218d57600080fd5b60008060008060808587031215614ef357600080fd5b843567ffffffffffffffff80821115614f0b57600080fd5b614f1788838901614e5d565b95506020870135915080821115614f2d57600080fd5b50614f3a87828801614e5d565b935050614f4960408601614d37565b9150614f5760608601614ecd565b905092959194509250565b600080600060608486031215614f7757600080fd5b614f8084614d37565b9250614f8e60208501614d37565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015614fdf5783516001600160a01b031683529284019291840191600101614fba565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561503e5761502e84835180516001600160a01b03168252602090810151910152565b9284019290850190600101615008565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561503e57815180518552868101518786015285810151868601526060908101519085015260809093019290850190600101615068565b602080825282518282018190526000919060409081850190868401855b8281101561503e57815180516001600160a01b039081168652878201511687860152858101518686015260609081015190850152608090930192908501906001016150bf565b81516001600160a01b031681526020808301519082015260408101611369565b6000806040838503121561513857600080fd5b823567ffffffffffffffff8082111561515057600080fd5b818501915085601f83011261516457600080fd5b813560208282111561517857615178614e16565b8160051b9250615189818401614e2c565b82815292840181019281810190898511156151a357600080fd5b948201945b848610156151c8576151b986614d37565b825294820194908201906151a8565b9997909101359750505050505050565b600080604083850312156151eb57600080fd5b6151f483614d37565b915061520260208401614ecd565b90509250929050565b6000806040838503121561521e57600080fd5b61522783614d37565b915061520260208401614d37565b60c08152600061524860c0830189614d94565b828103602084015261525a8189614d94565b6001600160a01b0397909716604084015250509215156060840152608083019190915260a09091015292915050565b600181811c9082168061529d57607f821691505b6020821081036121f457634e487b7160e01b600052602260045260246000fd5b601f8211156133d7576000816000526020600020601f850160051c810160208610156152e65750805b601f850160051c820191505b8181101561372e578281556001016152f2565b815167ffffffffffffffff81111561531f5761531f614e16565b6153338161532d8454615289565b846152bd565b602080601f83116001811461536857600084156153505750858301515b600019600386901b1c1916600185901b17855561372e565b600085815260208120601f198616915b8281101561539757888601518255948401946001909101908401615378565b50858210156153b55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082516153d7818460208701614d70565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b60008261541457634e487b7160e01b600052601260045260246000fd5b500490565b60208082526026908201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060408201526507468616e20360d41b606082015260800190565b81810381811115611369576113696153e1565b80820180821115611369576113696153e1565b60208082526023908201527f43616e6e6f74206f70657261746520776974682061206c6f636b6564206c6f6360408201526235b2b960e91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000600182016154f0576154f06153e1565b5060010190565b60208082526024908201527f4c6f636b206475726174696f6e206e6f742073657420666f7220746865206c6f60408201526331b5b2b960e11b606082015260800190565b8082028115828204841417611369576113696153e1565b60208082526026908201527f546f6b656e7320666f7220746865206c6f636b657220617265207374696c6c206040820152651b1bd8dad95960d21b606082015260800190565b600181815b808511156155d35781600019048211156155b9576155b96153e1565b808516156155c657918102915b93841c939080029061559d565b509250929050565b6000826155ea57506001611369565b816155f757506000611369565b816001811461560d576002811461561757615633565b6001915050611369565b60ff841115615628576156286153e1565b50506001821b611369565b5060208310610133831016604e8410600b8410161715615656575081810a611369565b6156608383615598565b8060001904821115615674576156746153e1565b029392505050565b6000614d6960ff8416836155db565b634e487b7160e01b600052603160045260246000fdfe546f6b656e73207375636365737366756c6c7920756e7374616b65642c20616e6420726577617264732072656365697665642e52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00546f6b656e7320617265207374616b65642e20596f752077696c6c20726563656976652033204b494120666f7220657665727920312c303030204b4941207374616b65642061667465722031206d696e7574652e546f6b656e73207375636365737366756c6c7920756e7374616b65642e204e6f74653a20596f7520646964206e6f74206d65657420746865206d696e696d756d207374616b696e67206475726174696f6e2c20736f206e6f20726577617264732077657265206561726e65642ea2646970667358221220932f37d358232bb62c2eff4b7144fe8491f4cf9c66b861b793e88d813234588264736f6c63430008170033
Deployed Bytecode
0x6080604052600436106104d65760003560e01c806371713f3b11610281578063a76197771161015a578063d11aca62116100cc578063e916551311610085578063e916551314610fd9578063f2fde38b14611019578063f637168d14611039578063f66423331461106b578063f8bff7d214611081578063fc30a171146110b757600080fd5b8063d11aca6214610f10578063d1fb445414610f25578063dd62ed3e14610f70578063e0da40dd14610f90578063e1fcd8be14610fa6578063e69d849d14610fc657600080fd5b8063c204642c1161011e578063c204642c14610e53578063c4d66de814610e73578063c80c28a214610e93578063cb7c918514610ea8578063cda6b84714610ed0578063d0e1287d14610ef057600080fd5b8063a761977714610dbb578063a9059cbb14610dd0578063af8f42b814610df0578063b16b3d8114610e06578063b552531414610e3357600080fd5b80638da5cb5b116101f35780639d2c5d60116101b75780639d2c5d6014610d025780639f4a662c14610d17578063a0ed3ac514610d44578063a5a9b15d14610d59578063a5ce413b14610d79578063a729dd7c14610d8e57600080fd5b80638da5cb5b14610c375780638e62387014610c4c5780638e6c3cb614610c6c5780639168ae7214610c8257806395d89b4114610ced57600080fd5b80637e733aa5116102455780637e733aa514610b745780637fe1d39614610b9c5780638456cb5914610bb257806386516e1314610bc75780638a6b0ced14610be75780638d31a5da14610c0f57600080fd5b806371713f3b14610ace57806376ad476a14610af657806379cc679014610b0b5780637cc1f86714610b2b5780637d6897b414610b5257600080fd5b80633840636d116103b3578063553e4203116103255780636627759c116102e95780636627759c14610a1e57806366bb18f714610a345780636c02c5b914610a495780636e393e1b14610a7157806370a0823114610a99578063715018a614610ab957600080fd5b8063553e42031461096c5780635a4c38a7146109945780635c975abb146109c15780635ff03e66146109d9578063658b672914610a0957600080fd5b806343cbd9021161037757806343cbd902146108c457806344eaa2d9146108ec57806347304494146109015780634f617b961461092157806350cab7321461093757806351d185981461095757600080fd5b80633840636d1461080657806339c6bc62146108335780633eaaf86b1461085b5780633f4ba83a1461088f57806342966c68146108a457600080fd5b80631da327111161044c57806329ee566c1161041057806329ee566c146107545780632af0e25114610769578063304217f51461077e57806330f9fbc1146107b4578063313ce567146107d457806333edf08c146107f057600080fd5b80631da32711146106c857806320b7aec1146106dd57806323b872dd146106fd578063258e11e21461071d57806328696de21461073f57600080fd5b80631756e51b1161049e5780631756e51b146105c357806318160ddd146105e5578063193773641461061957806319b131e11461062f5780631a6865021461066e5780631cfff51b146106ae57600080fd5b8063021b21a8146104db57806306fdde0314610524578063095ea7b3146105465780630a06939a146105765780630b990ed4146105a3575b600080fd5b3480156104e757600080fd5b506105116104f6366004614d4e565b6001600160a01b03166000908152604e602052604090205490565b6040519081526020015b60405180910390f35b34801561053057600080fd5b506105396110df565b60405161051b9190614dc0565b34801561055257600080fd5b50610566610561366004614dd3565b6111a2565b604051901515815260200161051b565b34801561058257600080fd5b50610511610591366004614d4e565b60486020526000908152604090205481565b3480156105af57600080fd5b506105666105be366004614d4e565b61136f565b3480156105cf57600080fd5b506105e36105de366004614dfd565b611397565b005b3480156105f157600080fd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0254610511565b34801561062557600080fd5b5061051160335481565b34801561063b57600080fd5b5061064f61064a366004614dd3565b6113a4565b604080516001600160a01b03909316835260208301919091520161051b565b34801561067a57600080fd5b5061069673f5dcc03e798e336c0df9aad0a2329b1951e764b781565b6040516001600160a01b03909116815260200161051b565b3480156106ba57600080fd5b506050546105669060ff1681565b3480156106d457600080fd5b50603e54610511565b3480156106e957600080fd5b506105e36106f8366004614edd565b6113ea565b34801561070957600080fd5b50610566610718366004614f62565b611558565b34801561072957600080fd5b50610732611af4565b60405161051b9190614f9e565b34801561074b57600080fd5b506105e3611c88565b34801561076057600080fd5b50610511600281565b34801561077557600080fd5b50604f54610511565b34801561078a57600080fd5b50610511610799366004614d4e565b6001600160a01b03166000908152604d602052604090205490565b3480156107c057600080fd5b506105e36107cf366004614dfd565b611c9c565b3480156107e057600080fd5b506040516012815260200161051b565b3480156107fc57600080fd5b5061051160355481565b34801561081257600080fd5b50610826610821366004614d4e565b611ca9565b60405161051b9190614feb565b34801561083f57600080fd5b506106967399c5bcec445c4e24f342037f2bc730406a460b2e81565b34801561086757600080fd5b506105117f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000081565b34801561089b57600080fd5b506105e3611d9e565b3480156108b057600080fd5b506105e36108bf366004614dfd565b611db0565b3480156108d057600080fd5b5061069673adb07859c50add82f716b9f0833dfd815b3b8c3481565b3480156108f857600080fd5b50610732611eb4565b34801561090d57600080fd5b5061051161091c366004614d4e565b611f16565b34801561092d57600080fd5b5061051160365481565b34801561094357600080fd5b50610511610952366004614d4e565b6120fc565b34801561096357600080fd5b50610511612192565b34801561097857600080fd5b5061069673b0975ef03767f0eb374f71575b7f870198a0420f81565b3480156109a057600080fd5b506105116109af366004614d4e565b60476020526000908152604090205481565b3480156109cd57600080fd5b5060005460ff16610566565b3480156109e557600080fd5b506105666109f4366004614d4e565b604b6020526000908152604090205460ff1681565b348015610a1557600080fd5b50603d54610511565b348015610a2a57600080fd5b5061051160325481565b348015610a4057600080fd5b50603b54610511565b348015610a5557600080fd5b5061069673521bceff84c59fc75c71d6d085a416155f5d1d7b81565b348015610a7d57600080fd5b5061069673bd343bf6b8eb858bd6f5ac797f217903e6c5e75e81565b348015610aa557600080fd5b50610511610ab4366004614d4e565b6121fa565b348015610ac557600080fd5b506105e3612222565b348015610ada57600080fd5b50610696730a8c07a76e8febbb6928a9c811512709cf7a2b9381565b348015610b0257600080fd5b50610511612234565b348015610b1757600080fd5b506105e3610b26366004614dd3565b612258565b348015610b3757600080fd5b50603854425b6040805192835260208301919091520161051b565b348015610b5e57600080fd5b50610b67612375565b60405161051b919061504b565b348015610b8057600080fd5b506106967302267e9c1456f80d738176c6627680d255a9146f81565b348015610ba857600080fd5b50610511603b5481565b348015610bbe57600080fd5b506105e3612407565b348015610bd357600080fd5b50610696610be2366004614dfd565b612417565b348015610bf357600080fd5b5061069673c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f881565b348015610c1b57600080fd5b5061069673e1be0e1b6b543dde93da98694508c2bfb272fbeb81565b348015610c4357600080fd5b50610696612441565b348015610c5857600080fd5b50610696610c67366004614dfd565b61246f565b348015610c7857600080fd5b5061051160375481565b348015610c8e57600080fd5b50610cc8610c9d366004614d4e565b6049602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b604080516001600160a01b03909416845260208401929092529082015260600161051b565b348015610cf957600080fd5b5061053961247f565b348015610d0e57600080fd5b506105116124be565b348015610d2357600080fd5b50610d37610d32366004614d4e565b6124dd565b60405161051b91906150a2565b348015610d5057600080fd5b50610511612582565b348015610d6557600080fd5b506105e3610d74366004614d4e565b6126d6565b348015610d8557600080fd5b5061053961284c565b348015610d9a57600080fd5b50610511610da9366004614d4e565b604a6020526000908152604090205481565b348015610dc757600080fd5b50610732612b0b565b348015610ddc57600080fd5b50610566610deb366004614dd3565b612b6b565b348015610dfc57600080fd5b50610511603a5481565b348015610e1257600080fd5b50610e26610e21366004614dd3565b61302d565b60405161051b9190615105565b348015610e3f57600080fd5b506105e3610e4e366004614d4e565b6130fd565b348015610e5f57600080fd5b506105e3610e6e366004615125565b61323b565b348015610e7f57600080fd5b506105e3610e8e366004614d4e565b6133dc565b348015610e9f57600080fd5b50610b3d613736565b348015610eb457600080fd5b50610696739b1d41e5f93e726951f2bee2224dc43a2a6d108c81565b348015610edc57600080fd5b50610539610eeb366004614dfd565b613753565b348015610efc57600080fd5b506105e3610f0b3660046151d8565b613aa9565b348015610f1c57600080fd5b506105e3613ae9565b348015610f3157600080fd5b50610f45610f40366004614dd3565b613b00565b604080516001600160a01b03958616815294909316602085015291830152606082015260800161051b565b348015610f7c57600080fd5b50610511610f8b36600461520b565b613b52565b348015610f9c57600080fd5b5061051160345481565b348015610fb257600080fd5b506105e3610fc1366004614dfd565b613b9c565b6105e3610fd4366004614dd3565b613ba9565b348015610fe557600080fd5b50610ff9610ff4366004614dd3565b6141c0565b60408051948552602085019390935291830152606082015260800161051b565b34801561102557600080fd5b506105e3611034366004614d4e565b614206565b34801561104557600080fd5b50611059611054366004614d4e565b614244565b60405161051b96959493929190615235565b34801561107757600080fd5b5061051160395481565b34801561108d57600080fd5b5061051161109c366004614d4e565b6001600160a01b031660009081526047602052604090205490565b3480156110c357600080fd5b5061069673af7b3e7d217ffd8325831988397c1e235cc9600e81565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060916000805160206156d58339815191529161111e90615289565b80601f016020809104026020016040519081016040528092919081815260200182805461114a90615289565b80156111975780601f1061116c57610100808354040283529160200191611197565b820191906000526020600020905b81548152906001019060200180831161117a57829003601f168201915b505050505091505090565b60006111ad33614398565b156111ff5760405162461bcd60e51b815260206004820181905260248201527f4c6f636b6572732063616e6e6f74207265636569766520616c6c6f77616e636560448201526064015b60405180910390fd5b61120883614398565b1561125f5760405162461bcd60e51b815260206004820152602160248201527f4c6f636b6572732063616e6e6f7420626520676976656e20616c6c6f77616e636044820152606560f81b60648201526084016111f6565b73c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f7196001600160a01b038416016112dc5760405162461bcd60e51b815260206004820152602760248201527f537461636b696e67526577617264546f6b656e732063616e6e6f7420626520616044820152661c1c1c9bdd995960ca1b60648201526084016111f6565b73c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f719330161135a5760405162461bcd60e51b815260206004820152603160248201527f537461636b696e67526577617264546f6b656e732063616e6e6f7420617070726044820152706f7665206f746865722077616c6c65747360781b60648201526084016111f6565b61136533848461440d565b5060015b92915050565b6001600160a01b0316600090815260466020526040902060020154600160a01b900460ff1690565b61139f61441a565b603455565b604d60205281600052604060002081815481106113c057600080fd5b6000918252602090912060029091020180546001909101546001600160a01b039091169250905082565b6113f261441a565b6040805160c08101825285815260208082018690526001600160a01b038516828401819052841515606084015260006080840181905260a08401819052908152604690915291909120815181906114499082615305565b506020820151600182019061145e9082615305565b5060408281015160028301805460608601511515600160a01b026001600160a81b03199091166001600160a01b03938416171790556080840151600384015560a090930151600490920191909155604480546001810182556000919091527f9b22d3d61959b4d3528b1d8ba932c96fbe302b36a1aad1d95cab54f9e0a135ea0180549285166001600160a01b03199390931683179055516115009085906153c5565b60405180910390208560405161151691906153c5565b6040519081900381208415158252907f04dec031e7487ce7f8de45105b251fb1b3a298cab328fd59d2f12bb92904404e9060200160405180910390a450505050565b6000816115666064826153f7565b9050600083116115885760405162461bcd60e51b81526004016111f690615419565b61159385338561444c565b61159b614cfd565b8581600001906001600160a01b031690816001600160a01b0316815250508481602001906001600160a01b031690816001600160a01b0316815250508381604001818152505042816060018181525050604c6000866001600160a01b03166001600160a01b0316815260200190815260200160002081908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301555050604c6000876001600160a01b03166001600160a01b0316815260200190815260200160002081908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301555050846001600160a01b0316866001600160a01b03167f0794b110bd69e41d8ad3b51500eb3fb307c092ecc5e82f9dc3c3b47a0cb870ed86426040516117b7929190918252602082015260400190565b60405180910390a360006117d3856117ce8861136f565b6144b2565b905060006117e1828761545f565b9050611802887399c5bcec445c4e24f342037f2bc730406a460b2e846144e0565b61180b8761136f565b15611891576001600160a01b03871660009081526048602052604081208054839290611838908490615472565b92505081905550866001600160a01b0316886001600160a01b03167f6129a9a99dc9e294d81fd18d26cad1d42a680fc5b77dbe926687375c2bd2e2838460405161188491815260200190565b60405180910390a361189c565b61189c8888836144e0565b6001600160a01b038716600090815260476020526040812080548392906118c4908490615472565b90915550506001600160a01b03881673af7b3e7d217ffd8325831988397c1e235cc9600e148061191057506001600160a01b03881673adb07859c50add82f716b9f0833dfd815b3b8c34145b8061193757506001600160a01b0388167302267e9c1456f80d738176c6627680d255a9146f145b156119ee576001600160a01b0388166000908152604b602052604090205460ff166119745760405162461bcd60e51b81526004016111f690615485565b61197d886120fc565b60385461198a9190615472565b4210156119ee5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e7320666f7220746865206c6f636b657220617265206e6f7420796560448201526b7420756e6c6f636b61626c6560a01b60648201526084016111f6565b6001600160a01b03871673af7b3e7d217ffd8325831988397c1e235cc9600e1480611a3557506001600160a01b03871673adb07859c50add82f716b9f0833dfd815b3b8c34145b80611a5c57506001600160a01b0387167302267e9c1456f80d738176c6627680d255a9146f145b15611a99576001600160a01b0387166000908152604b602052604090205460ff16611a995760405162461bcd60e51b81526004016111f690615485565b866001600160a01b0316886001600160a01b03167f4770449bc46ed470ab992a9b6bc681560fbac950dd46f1fbc02f44a056edd10f88604051611ade91815260200190565b60405180910390a3506001979650505050505050565b60606000805b604454811015611b69576046600060448381548110611b1b57611b1b6154c8565b60009182526020808320909101546001600160a01b0316835282019290925260400190206002015460ff600160a01b9091041615611b615781611b5d816154de565b9250505b600101611afa565b5060008167ffffffffffffffff811115611b8557611b85614e16565b604051908082528060200260200182016040528015611bae578160200160208202803683370190505b5090506000805b604454811015611c7f576046600060448381548110611bd657611bd66154c8565b60009182526020808320909101546001600160a01b0316835282019290925260400190206002015460ff600160a01b9091041615611c775760448181548110611c2157611c216154c8565b9060005260206000200160009054906101000a90046001600160a01b0316838381518110611c5157611c516154c8565b6001600160a01b039092166020928302919091019091015281611c73816154de565b9250505b600101611bb5565b50909392505050565b611c9061441a565b6050805460ff19169055565b611ca461441a565b603255565b60606000611ccc836001600160a01b03166000908152604d602052604090205490565b905060008167ffffffffffffffff811115611ce957611ce9614e16565b604051908082528060200260200182016040528015611d2e57816020015b6040805180820190915260008082526020820152815260200190600190039081611d075790505b50905060005b82811015611d96576000611d48868361302d565b9050604051806040016040528082600001516001600160a01b031681526020018260200151815250838381518110611d8257611d826154c8565b602090810291909101015250600101611d34565b509392505050565b611da661441a565b611dae61453f565b565b611db8612441565b6001600160a01b0316336001600160a01b03161480611dea57503373e1be0e1b6b543dde93da98694508c2bfb272fbeb145b611e365760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420617574686f72697a656420746f206275726e20746f6b656e7300000060448201526064016111f6565b611e3f81614591565b60405181815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a2336000908152604e602052604081208054839290611e93908490615472565b9250508190555080604f6000828254611eac9190615472565b909155505050565b6060603e805480602002602001604051908101604052809291908181526020018280548015611f0c57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611eee575b5050505050905090565b60006001600160a01b03821673af7b3e7d217ffd8325831988397c1e235cc9600e1480611f5f57506001600160a01b03821673adb07859c50add82f716b9f0833dfd815b3b8c34145b80611f8657506001600160a01b0382167302267e9c1456f80d738176c6627680d255a9146f145b611fcb5760405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206c6f636b6572206164647265737360501b60448201526064016111f6565b60008073af7b3e7d217ffd8325831988397c1e235cc9600d196001600160a01b03851601612000575050603254603854612060565b73adb07859c50add82f716b9f0833dfd815b3b8c33196001600160a01b03851601612032575050603354603854612060565b7302267e9c1456f80d738176c6627680d255a9146e196001600160a01b038516016120605750506034546038545b6001600160a01b0384166000908152604b602052604090205460ff166120c85760405162461bcd60e51b815260206004820152601e60248201527f4c6f636b6572206973206e6f742063757272656e746c79206c6f636b6564000060448201526064016111f6565b4260006120d58484615472565b8210156120f3576120e6838361545f565b6120f0908561545f565b90505b95945050505050565b600073af7b3e7d217ffd8325831988397c1e235cc9600d196001600160a01b0383160161212b57505060325490565b73adb07859c50add82f716b9f0833dfd815b3b8c33196001600160a01b0383160161215857505060335490565b7302267e9c1456f80d738176c6627680d255a9146e196001600160a01b0383160161218557505060345490565b506000919050565b919050565b600080805b603d548110156121f45760496000603d83815481106121b8576121b86154c8565b60009182526020808320909101546001600160a01b031683528201929092526040019020600201546121ea9083615472565b9150600101612197565b50919050565b6001600160a01b031660009081526000805160206156d5833981519152602052604090205490565b61222a61441a565b611dae600061459b565b600061225373c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f86121fa565b905090565b612260612441565b6001600160a01b0316336001600160a01b0316148061229257503373e1be0e1b6b543dde93da98694508c2bfb272fbeb145b6122de5760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420617574686f72697a656420746f206275726e20746f6b656e7300000060448201526064016111f6565b6122e8828261460c565b816001600160a01b03167f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df78260405161232391815260200190565b60405180910390a26001600160a01b0382166000908152604e602052604081208054839290612353908490615472565b9250508190555080604f600082825461236c9190615472565b90915550505050565b336000908152604560209081526040808320805482518185028101850190935280835260609492939192909184015b828210156123fe5783829060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050815260200190600101906123a4565b50505050905090565b61240f61441a565b611dae614646565b603d818154811061242757600080fd5b6000918252602090912001546001600160a01b0316905081565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b603e818154811061242757600080fd5b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060916000805160206156d58339815191529161111e90615289565b600061225373b0975ef03767f0eb374f71575b7f870198a0420f6121fa565b6001600160a01b0381166000908152604c60209081526040808320805482518185028101850190935280835260609492939192909184015b82821015612577576000848152602090819020604080516080810182526004860290920180546001600160a01b039081168452600180830154909116848601526002820154928401929092526003015460608301529083529092019101612515565b505050509050919050565b73af7b3e7d217ffd8325831988397c1e235cc9600e6000908152604b6020527fa7a8a800752d160de6090f59838f1af010d56021c08f083da4f76f16a88d805154819060ff16156125f7576125ea73af7b3e7d217ffd8325831988397c1e235cc9600e6121fa565b6125f49082615472565b90505b73adb07859c50add82f716b9f0833dfd815b3b8c34600052604b6020527f5fa85c64033c1665e7bc1c71fdb5b22564dea4242ac58f59545638b71d4ba54e5460ff16156126685761265b73adb07859c50add82f716b9f0833dfd815b3b8c346121fa565b6126659082615472565b90505b7302267e9c1456f80d738176c6627680d255a9146f600052604b6020527fa08b5324b90dff07a5f74a6a83e2c0f1aa4312fe37526ab0ec2b27a7025c22b15460ff161561218d576126cc7302267e9c1456f80d738176c6627680d255a9146f6121fa565b6113699082615472565b6126de61441a565b6001600160a01b0381166000908152604b602052604090205460ff1661273d5760405162461bcd60e51b8152602060048201526014602482015273131bd8dad95c881a5cc81b9bdd081b1bd8dad95960621b60448201526064016111f6565b600073af7b3e7d217ffd8325831988397c1e235cc9600d196001600160a01b0383160161276d575060325461280a565b73adb07859c50add82f716b9f0833dfd815b3b8c33196001600160a01b0383160161279b575060335461280a565b7302267e9c1456f80d738176c6627680d255a9146e196001600160a01b038316016127c9575060345461280a565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206c6f636b6572206164647265737360501b60448201526064016111f6565b6000811161282a5760405162461bcd60e51b81526004016111f6906154f7565b506001600160a01b03166000908152604b60205260409020805460ff19169055565b60505460609060ff166128a15760405162461bcd60e51b815260206004820181905260248201527f5374616b696e67206973206e6f742063757272656e746c7920656e61626c656460448201526064016111f6565b336000908152604960205260409020600201546129005760405162461bcd60e51b815260206004820152601e60248201527f596f752068617665206e6f74207374616b656420616e7920746f6b656e73000060448201526064016111f6565b3360009081526049602052604081206001015461291d904261545f565b9050600061292e62015180836153f7565b9050600060018210612a65573360009081526049602052604090206002908101546103e891849161295e9161553b565b612968919061553b565b61297291906153f7565b905061297d81614683565b3360008181526049602052604090206002015461299b9130916144e0565b6129a633603d61472a565b33600090815260496020526040812080546001600160a01b0319168155600181018290556002015580156129f3576129f373c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f833836144e0565b336000818152604960205260409020600201547f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f7590612a33908490615472565b60405190815260200160405180910390a26040518060600160405280603381526020016156a260339139935050505090565b33600081815260496020526040902060020154612a839130916144e0565b612a8e33603d61472a565b33600081815260496020908152604080832080546001600160a01b031916815560018101849055600201839055519182527f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75910160405180910390a26040518060a00160405280606d8152602001615749606d9139935050505090565b6060603d805480602002602001604051908101604052809291908181526020018280548015611f0c576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311611eee575050505050905090565b600081612b796064826153f7565b90506001600160a01b038416612bdd5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016111f6565b60008311612bfd5760405162461bcd60e51b81526004016111f690615419565b6000612c088561136f565b90506001600160a01b03851673af7b3e7d217ffd8325831988397c1e235cc9600e1480612c5157506001600160a01b03851673adb07859c50add82f716b9f0833dfd815b3b8c34145b80612c7857506001600160a01b0385167302267e9c1456f80d738176c6627680d255a9146f145b15612cb6576001600160a01b0385166000908152604b602052604090205460ff1615612cb65760405162461bcd60e51b81526004016111f690615552565b3373af7b3e7d217ffd8325831988397c1e235cc9600e1480612ceb57503373adb07859c50add82f716b9f0833dfd815b3b8c34145b80612d095750337302267e9c1456f80d738176c6627680d255a9146f145b15612d3e57336000908152604b602052604090205460ff1615612d3e5760405162461bcd60e51b81526004016111f690615552565b6000612d4a85836144b2565b905084612d56336121fa565b1015612dae5760405162461bcd60e51b815260206004820152602160248201527f496e73756666696369656e742062616c616e636520666f72207472616e7366656044820152603960f91b60648201526084016111f6565b6000612dba828761545f565b90506000612dc88883614829565b90508015612ef057612dd8614cfd565b338082526001600160a01b038a81166020808501828152604080870189815242606089018181526000878152604c87528481208054600181810183559183528883208d5160049283029091018054918d166001600160a01b031992831617815589518185018054918f16918416919091179055875160028083019190915586516003928301558e8652898620805480870182559087529b9095208f519b90930290920180549a8d169a82169a909a178a559751918901805492909b169190971617909855915196850196909655519290910191909155519092917f0794b110bd69e41d8ad3b51500eb3fb307c092ecc5e82f9dc3c3b47a0cb870ed91612ee691888252602082015260400190565b60405180910390a3505b8315612fb8577f8e21091fbff1b481f4a0383146b43469a9f1bfc97275d232206e61929bf9541a604051612f91906020808252604d908201527f5761726e696e673a20446972656374207472616e7366657220746f206120636860408201527f61726974792077616c6c65742e204120726f79616c747920666565206861732060608201526c3132b2b71030b8383634b2b21760991b608082015260a00190565b60405180910390a1612fb8337399c5bcec445c4e24f342037f2bc730406a460b2e856144e0565b6001600160a01b03881660009081526047602052604081208054849290612fe0908490615472565b90915550612fef90508861136f565b15613022576001600160a01b0388166000908152604860205260408120805484929061301c908490615472565b90915550505b979650505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152604d602052604090205482106130985760405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b60448201526064016111f6565b6001600160a01b0383166000908152604d602052604090208054839081106130c2576130c26154c8565b60009182526020918290206040805180820190915260029092020180546001600160a01b031682526001015491810191909152905092915050565b61310561441a565b6001600160a01b0381166000908152604b602052604090205460ff161561316e5760405162461bcd60e51b815260206004820152601860248201527f4c6f636b657220697320616c7265616479206c6f636b6564000000000000000060448201526064016111f6565b600073af7b3e7d217ffd8325831988397c1e235cc9600d196001600160a01b0383160161319e57506032546131f6565b73adb07859c50add82f716b9f0833dfd815b3b8c33196001600160a01b038316016131cc57506033546131f6565b7302267e9c1456f80d738176c6627680d255a9146e196001600160a01b038316016127c957506034545b600081116132165760405162461bcd60e51b81526004016111f6906154f7565b506001600160a01b03166000908152604b60205260409020805460ff19166001179055565b3373b0975ef03767f0eb374f71575b7f870198a0420f146132b55760405162461bcd60e51b815260206004820152602e60248201527f4f6e6c79207468652061697264726f702077616c6c65742063616e2063616c6c60448201526d103a3434b990333ab731ba34b7b760911b60648201526084016111f6565b600081116133135760405162461bcd60e51b815260206004820152602560248201527f41697264726f7020616d6f756e74206d75737420626520677265617465722074604482015264068616e20360dc1b60648201526084016111f6565b808251613320919061553b565b61333d73b0975ef03767f0eb374f71575b7f870198a0420f6121fa565b101561338b5760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e742062616c616e636520666f722061697264726f7060448201526064016111f6565b60005b82518110156133d7576133cf73b0975ef03767f0eb374f71575b7f870198a0420f8483815181106133c1576133c16154c8565b6020026020010151846144e0565b60010161338e565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff166000811580156134225750825b905060008267ffffffffffffffff16600114801561343f5750303b155b90508115801561344d575080155b1561346b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561349557845460ff60401b1916600160401b1785555b6134da6040518060400160405280600881526020016725a4a0aa27a5a2a760c11b815250604051806040016040528060038152602001624b494160e81b815250614841565b6134e2614853565b6134ea61485b565b6134f38661486b565b61351d337f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000061487c565b61355733730a8c07a76e8febbb6928a9c811512709cf7a2b9360125b61354490600a61567c565b613552906305f5e10061553b565b6144e0565b6135773373c5fa8a6e836e2a7f5712a1328b5cc04d1cbee2f86012613539565b6135ac3373b0975ef03767f0eb374f71575b7f870198a0420f60125b61359e90600a61567c565b613552906302faf08061553b565b6135cc3373bd343bf6b8eb858bd6f5ac797f217903e6c5e75e6012613539565b6135ec3373521bceff84c59fc75c71d6d085a416155f5d1d7b6012613593565b61360c33739b1d41e5f93e726951f2bee2224dc43a2a6d108c6012613593565b61362c3373f5dcc03e798e336c0df9aad0a2329b1951e764b76012613593565b61364c3373af7b3e7d217ffd8325831988397c1e235cc9600e6012613539565b6136813373adb07859c50add82f716b9f0833dfd815b3b8c3460125b61367390600a61567c565b61355290630bebc20061553b565b6136a1337302267e9c1456f80d738176c6627680d255a9146f6012613668565b426038819055600060328190556136b791615472565b603555600060338190556038546136ce9190615472565b603655600060348190556038546136e59190615472565b603755831561372e57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b600080613742603d5490565b915061374d603e5490565b90509091565b60505460609060ff166137a85760405162461bcd60e51b815260206004820181905260248201527f5374616b696e67206973206e6f742063757272656e746c7920656e61626c656460448201526064016111f6565b6137b46012600a61567c565b6137c0906103e861553b565b6137c9336121fa565b10156138175760405162461bcd60e51b815260206004820152601d60248201527f596f7520617265206e6f7420656c696769626c6520746f207374616b6500000060448201526064016111f6565b6138236012600a61567c565b61382f906103e861553b565b82101561388c5760405162461bcd60e51b815260206004820152602560248201527f596f7520617265207374616b696e67206c657373207468616e203130303020746044820152646f6b656e7360d81b60648201526084016111f6565b6138986012600a61567c565b6138a590620186a061553b565b8211156138f45760405162461bcd60e51b815260206004820152601e60248201527f45786365656473206d6178696d756d207374616b696e6720616d6f756e74000060448201526064016111f6565b61395833603d80548060200260200160405190810160405280929190818152602001828054801561394e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613930575b50505050506148b2565b61399f57603d80546001810182556000919091527fece66cfdbd22e3f37d348a3d8e19074452862cd65fd4b9a11f0336d1ac6d1dc30180546001600160a01b031916331790555b6139a833614398565b156139ec5760405162461bcd60e51b81526020600482015260146024820152734c6f636b6572732063616e6e6f74207374616b6560601b60448201526064016111f6565b6139f73330846144e0565b60408051606081018252338082524260208084019182528385018781526000938452604990915293909120915182546001600160a01b0319166001600160a01b039091161782555160018201559051600290910155613a558261490d565b60405182815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200160405180910390a26040518060800160405280605481526020016156f56054913992915050565b613ab161441a565b6001600160a01b0390911660009081526046602052604090206002018054911515600160a01b0260ff60a01b19909216919091179055565b613af161441a565b6050805460ff19166001179055565b604c6020528160005260406000208181548110613b1c57600080fd5b600091825260209091206004909102018054600182015460028301546003909301546001600160a01b0392831695509116925084565b6001600160a01b0391821660009081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b613ba461441a565b603355565b6001600160a01b038216613c0b5760405162461bcd60e51b8152602060048201526024808201527f496e76616c69642063686172697479206f7267616e697a6174696f6e206164646044820152637265737360e01b60648201526084016111f6565b60008111613c6a5760405162461bcd60e51b815260206004820152602660248201527f446f6e6174696f6e20616d6f756e74206d75737420626520677265617465722060448201526507468616e20360d41b60648201526084016111f6565b613ccc33603e80548060200260200160405190810160405280929190818152602001828054801561394e576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116139305750505050506148b2565b613d1357603e80546001810182556000919091527f8d800d6614d35eed73733ee453164a3b48076eb3138f466adeeb9dec7bb31f700180546001600160a01b031916331790555b613d1c33614398565b15613d615760405162461bcd60e51b81526020600482015260156024820152744c6f636b6572732063616e6e6f7420646f6e61746560581b60448201526064016111f6565b6001600160a01b038216600090815260466020526040812080549091908290613d8990615289565b905011613dd85760405162461bcd60e51b815260206004820152601c60248201527f496e76616c69642063686172697479206f7267616e697a6174696f6e0000000060448201526064016111f6565b6002810154600160a01b900460ff16613e4f5760405162461bcd60e51b815260206004820152603360248201527f546869732063686172697479206f7267616e697a6174696f6e20646f6573206e6044820152726f742061636365707420646f6e6174696f6e7360681b60648201526084016111f6565b60006064613e5e60028561553b565b613e6891906153f7565b90506000613e76828561545f565b336000908152604b602052604090205490915060ff1615613ee45760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f7420646f6e6174652066726f6d2061206c6f636b6564206c6f636b60448201526132b960f11b60648201526084016111f6565b83613eee336121fa565b1015613f3c5760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742062616c616e636520746f20646f6e617465000060448201526064016111f6565b613f458561136f565b15613fe7577f8e21091fbff1b481f4a0383146b43469a9f1bfc97275d232206e61929bf9541a604051613fde9060208082526046908201527f5761726e696e673a20446f6e6174696f6e20746f20612063686172697479207760408201527f616c6c65742e204120726f79616c74792066656520686173206265656e206170606082015265383634b2b21760d11b608082015260a00190565b60405180910390a15b613ff23386836144e0565b614011337399c5bcec445c4e24f342037f2bc730406a460b2e846144e0565b336000908152604a602052604081208054839290614030908490615472565b9250508190555080603b60008282546140499190615472565b90915550506001600160a01b03851660009081526048602052604081208054839290614076908490615472565b90915550506001600160a01b038516600090815260476020526040812080548392906140a3908490615472565b90915550506001600160a01b038581166000818152604d602090815260408083208151808301835233808252818501898152835460018082018655948852968690209251600290970290920180546001600160a01b031916969098169590951787555195019490945583518581529081018490526026938101939093527f446f6e6174696f6e2072656365697665642066726f6d2065787465726e616c20606084015265736f7572636560d01b608084015290917fed2b2500743c8bb2872a73feba7c885e8dba0dab543dec453faafbc44c13bbb29060a00160405180910390a360405181815233907f0553260a2e46b0577270d8992db02d30856ca880144c72d6e9503760946aef139060200160405180910390a25050505050565b604560205281600052604060002081815481106141dc57600080fd5b60009182526020909120600490910201805460018201546002830154600390930154919450925084565b61420e61441a565b6001600160a01b03811661423857604051631e4fbdf760e01b8152600060048201526024016111f6565b6142418161459b565b50565b60466020526000908152604090208054819061425f90615289565b80601f016020809104026020016040519081016040528092919081815260200182805461428b90615289565b80156142d85780601f106142ad576101008083540402835291602001916142d8565b820191906000526020600020905b8154815290600101906020018083116142bb57829003601f168201915b5050505050908060010180546142ed90615289565b80601f016020809104026020016040519081016040528092919081815260200182805461431990615289565b80156143665780601f1061433b57610100808354040283529160200191614366565b820191906000526020600020905b81548152906001019060200180831161434957829003601f168201915b505050506002830154600384015460049094015492936001600160a01b03821693600160a01b90920460ff1692509086565b60006001600160a01b03821673af7b3e7d217ffd8325831988397c1e235cc9600e14806143e157506001600160a01b03821673adb07859c50add82f716b9f0833dfd815b3b8c34145b8061136957506001600160a01b0382167302267e9c1456f80d738176c6627680d255a9146f1492915050565b6133d78383836001614992565b33614423612441565b6001600160a01b031614611dae5760405163118cdaa760e01b81523360048201526024016111f6565b60006144588484613b52565b905060001981146144ac578181101561449d57604051637dc7a0d960e11b81526001600160a01b038416600482015260248101829052604481018390526064016111f6565b6144ac84848484036000614992565b50505050565b600080826144c15760006144d8565b60646144ce85600261553b565b6144d891906153f7565b949350505050565b6001600160a01b03831661450a57604051634b637e8f60e11b8152600060048201526024016111f6565b6001600160a01b0382166145345760405163ec442f0560e01b8152600060048201526024016111f6565b6133d7838383614a7a565b614547614bb8565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b614241338261460c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6001600160a01b03821661463657604051634b637e8f60e11b8152600060048201526024016111f6565b61464282600083614a7a565b5050565b61464e614c01565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586145743390565b3360009081526045602052604081205461469f9060019061545f565b33600090815260456020526040902080549192504291839081106146c5576146c56154c8565b9060005260206000209060040201600201819055508160456000336001600160a01b03166001600160a01b031681526020019081526020016000208281548110614711576147116154c8565b9060005260206000209060040201600301819055505050565b60005b81548110156133d757826001600160a01b0316828281548110614752576147526154c8565b6000918252602090912001546001600160a01b031603614821578154829061477c9060019061545f565b8154811061478c5761478c6154c8565b9060005260206000200160009054906101000a90046001600160a01b03168282815481106147bc576147bc6154c8565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550818054806147fa576147fa61568b565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b60010161472d565b6000336148378185856144e0565b5060019392505050565b614849614c47565b6146428282614c90565b611dae614c47565b614863614c47565b611dae614ce1565b614873614c47565b61424181614cf5565b6001600160a01b0382166148a65760405163ec442f0560e01b8152600060048201526024016111f6565b61464260008383614a7a565b6000805b825181101561490357836001600160a01b03168382815181106148db576148db6154c8565b60200260200101516001600160a01b0316036148fb576001915050611369565b6001016148b6565b5060009392505050565b6149386040518060800160405280600081526020016000815260200160008152602001600081525090565b90815242602080830191825260006040808501828152606086018381523384526045855291832080546001818101835591855294909320955160049094029095019283559251908201559151600283015551600390910155565b6000805160206156d58339815191526001600160a01b0385166149cb5760405163e602df0560e01b8152600060048201526024016111f6565b6001600160a01b0384166149f557604051634a1406b160e11b8152600060048201526024016111f6565b6001600160a01b03808616600090815260018301602090815260408083209388168352929052208390558115614a7357836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051614a6a91815260200190565b60405180910390a35b5050505050565b6000805160206156d58339815191526001600160a01b038416614ab65781816002016000828254614aab9190615472565b90915550614b289050565b6001600160a01b03841660009081526020829052604090205482811015614b095760405163391434e360e21b81526001600160a01b038616600482015260248101829052604481018490526064016111f6565b6001600160a01b03851660009081526020839052604090209083900390555b6001600160a01b038316614b46576002810180548390039055614b65565b6001600160a01b03831660009081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051614baa91815260200190565b60405180910390a350505050565b60005460ff16611dae5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016111f6565b60005460ff1615611dae5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016111f6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611dae57604051631afcd79f60e31b815260040160405180910390fd5b614c98614c47565b6000805160206156d58339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03614cd28482615305565b50600481016144ac8382615305565b614ce9614c47565b6000805460ff19169055565b61420e614c47565b604051806080016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081525090565b80356001600160a01b038116811461218d57600080fd5b600060208284031215614d6057600080fd5b614d6982614d37565b9392505050565b60005b83811015614d8b578181015183820152602001614d73565b50506000910152565b60008151808452614dac816020860160208601614d70565b601f01601f19169290920160200192915050565b602081526000614d696020830184614d94565b60008060408385031215614de657600080fd5b614def83614d37565b946020939093013593505050565b600060208284031215614e0f57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614e5557614e55614e16565b604052919050565b600082601f830112614e6e57600080fd5b813567ffffffffffffffff811115614e8857614e88614e16565b614e9b601f8201601f1916602001614e2c565b818152846020838601011115614eb057600080fd5b816020850160208301376000918101602001919091529392505050565b8035801515811461218d57600080fd5b60008060008060808587031215614ef357600080fd5b843567ffffffffffffffff80821115614f0b57600080fd5b614f1788838901614e5d565b95506020870135915080821115614f2d57600080fd5b50614f3a87828801614e5d565b935050614f4960408601614d37565b9150614f5760608601614ecd565b905092959194509250565b600080600060608486031215614f7757600080fd5b614f8084614d37565b9250614f8e60208501614d37565b9150604084013590509250925092565b6020808252825182820181905260009190848201906040850190845b81811015614fdf5783516001600160a01b031683529284019291840191600101614fba565b50909695505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561503e5761502e84835180516001600160a01b03168252602090810151910152565b9284019290850190600101615008565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561503e57815180518552868101518786015285810151868601526060908101519085015260809093019290850190600101615068565b602080825282518282018190526000919060409081850190868401855b8281101561503e57815180516001600160a01b039081168652878201511687860152858101518686015260609081015190850152608090930192908501906001016150bf565b81516001600160a01b031681526020808301519082015260408101611369565b6000806040838503121561513857600080fd5b823567ffffffffffffffff8082111561515057600080fd5b818501915085601f83011261516457600080fd5b813560208282111561517857615178614e16565b8160051b9250615189818401614e2c565b82815292840181019281810190898511156151a357600080fd5b948201945b848610156151c8576151b986614d37565b825294820194908201906151a8565b9997909101359750505050505050565b600080604083850312156151eb57600080fd5b6151f483614d37565b915061520260208401614ecd565b90509250929050565b6000806040838503121561521e57600080fd5b61522783614d37565b915061520260208401614d37565b60c08152600061524860c0830189614d94565b828103602084015261525a8189614d94565b6001600160a01b0397909716604084015250509215156060840152608083019190915260a09091015292915050565b600181811c9082168061529d57607f821691505b6020821081036121f457634e487b7160e01b600052602260045260246000fd5b601f8211156133d7576000816000526020600020601f850160051c810160208610156152e65750805b601f850160051c820191505b8181101561372e578281556001016152f2565b815167ffffffffffffffff81111561531f5761531f614e16565b6153338161532d8454615289565b846152bd565b602080601f83116001811461536857600084156153505750858301515b600019600386901b1c1916600185901b17855561372e565b600085815260208120601f198616915b8281101561539757888601518255948401946001909101908401615378565b50858210156153b55787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082516153d7818460208701614d70565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b60008261541457634e487b7160e01b600052601260045260246000fd5b500490565b60208082526026908201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060408201526507468616e20360d41b606082015260800190565b81810381811115611369576113696153e1565b80820180821115611369576113696153e1565b60208082526023908201527f43616e6e6f74206f70657261746520776974682061206c6f636b6564206c6f6360408201526235b2b960e91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000600182016154f0576154f06153e1565b5060010190565b60208082526024908201527f4c6f636b206475726174696f6e206e6f742073657420666f7220746865206c6f60408201526331b5b2b960e11b606082015260800190565b8082028115828204841417611369576113696153e1565b60208082526026908201527f546f6b656e7320666f7220746865206c6f636b657220617265207374696c6c206040820152651b1bd8dad95960d21b606082015260800190565b600181815b808511156155d35781600019048211156155b9576155b96153e1565b808516156155c657918102915b93841c939080029061559d565b509250929050565b6000826155ea57506001611369565b816155f757506000611369565b816001811461560d576002811461561757615633565b6001915050611369565b60ff841115615628576156286153e1565b50506001821b611369565b5060208310610133831016604e8410600b8410161715615656575081810a611369565b6156608383615598565b8060001904821115615674576156746153e1565b029392505050565b6000614d6960ff8416836155db565b634e487b7160e01b600052603160045260246000fdfe546f6b656e73207375636365737366756c6c7920756e7374616b65642c20616e6420726577617264732072656365697665642e52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00546f6b656e7320617265207374616b65642e20596f752077696c6c20726563656976652033204b494120666f7220657665727920312c303030204b4941207374616b65642061667465722031206d696e7574652e546f6b656e73207375636365737366756c6c7920756e7374616b65642e204e6f74653a20596f7520646964206e6f74206d65657420746865206d696e696d756d207374616b696e67206475726174696f6e2c20736f206e6f20726577617264732077657265206561726e65642ea2646970667358221220932f37d358232bb62c2eff4b7144fe8491f4cf9c66b861b793e88d813234588264736f6c63430008170033
Deployed Bytecode Sourcemap
45329:32901:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55644:115;;;;;;;;;;-1:-1:-1;55644:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;55732:23:0;55709:7;55732:23;;;:14;:23;;;;;;;55644:115;;;;529:25:1;;;517:2;502:18;55644:115:0;;;;;;;;34119:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;67566:498::-;;;;;;;;;;-1:-1:-1;67566:498:0;;;;;:::i;:::-;;:::i;:::-;;;1745:14:1;;1738:22;1720:41;;1708:2;1693:18;67566:498:0;1580:187:1;49598:47:0;;;;;;;;;;-1:-1:-1;49598:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;73394:196;;;;;;;;;;-1:-1:-1;73394:196:0;;;;;:::i;:::-;;:::i;58833:125::-;;;;;;;;;;-1:-1:-1;58833:125:0;;;;;:::i;:::-;;:::i;:::-;;35333:155;;;;;;;;;;-1:-1:-1;35466:14:0;;35333:155;;45700:31;;;;;;;;;;;;;;;;49982:51;;;;;;;;;;-1:-1:-1;49982:51:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;2149:32:1;;;2131:51;;2213:2;2198:18;;2191:34;;;;2104:18;49982:51:0;1957:274:1;47449:78:0;;;;;;;;;;;;47485:42;47449:78;;;;;-1:-1:-1;;;;;2400:32:1;;;2382:51;;2370:2;2355:18;47449:78:0;2236:203:1;73642:26:0;;;;;;;;;;-1:-1:-1;73642:26:0;;;;;;;;67185:98;;;;;;;;;;-1:-1:-1;67255:17:0;:24;67185:98;;65538:676;;;;;;;;;;-1:-1:-1;65538:676:0;;;;;:::i;:::-;;:::i;70668:2145::-;;;;;;;;;;-1:-1:-1;70668:2145:0;;;;;:::i;:::-;;:::i;50444:949::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;73899:84::-;;;;;;;;;;;;;:::i;45565:35::-;;;;;;;;;;;;45599:1;45565:35;;55817:99;;;;;;;;;;-1:-1:-1;55895:17:0;;55817:99;;51977:135;;;;;;;;;;-1:-1:-1;51977:135:0;;;;;:::i;:::-;-1:-1:-1;;;;;52073:28:0;52050:7;52073:28;;;:16;:28;;;;;:35;;51977:135;58475:125;;;;;;;;;;-1:-1:-1;58475:125:0;;;;;:::i;:::-;;:::i;35184:84::-;;;;;;;;;;-1:-1:-1;35184:84:0;;35258:2;5386:36:1;;5374:2;5359:18;35184:84:0;5244:184:1;45768:33:0;;;;;;;;;;;;;;;;51466:439;;;;;;;;;;-1:-1:-1;51466:439:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47534:82::-;;;;;;;;;;;;47574:42;47534:82;;46007:69;;;;;;;;;;;;;;;66459:65;;;;;;;;;;;;;:::i;54561:396::-;;;;;;;;;;-1:-1:-1;54561:396:0;;;;;:::i;:::-;;:::i;47800:76::-;;;;;;;;;;;;47834:42;47800:76;;46765:114;;;;;;;;;;;;;:::i;53169:1093::-;;;;;;;;;;-1:-1:-1;53169:1093:0;;;;;:::i;:::-;;:::i;45804:33::-;;;;;;;;;;;;;;;;59486:415;;;;;;;;;;-1:-1:-1;59486:415:0;;;;;:::i;:::-;;:::i;56001:359::-;;;;;;;;;;;;;:::i;46907:82::-;;;;;;;;;;;;46947:42;46907:82;;49543:46;;;;;;;;;;-1:-1:-1;49543:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;26249:86;;;;;;;;;;-1:-1:-1;26296:4:0;26320:7;;;26249:86;;49758:45;;;;;;;;;;-1:-1:-1;49758:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;67042:98;;;;;;;;;;-1:-1:-1;67113:16:0;:23;67042:98;;45666:31;;;;;;;;;;;;;;;;64639:113;;;;;;;;;;-1:-1:-1;64723:25:0;;64639:113;;47274:81;;;;;;;;;;;;47313:42;47274:81;;47185:82;;;;;;;;;;;;47225:42;47185:82;;35551:174;;;;;;;;;;-1:-1:-1;35551:174:0;;;;;:::i;:::-;;:::i;23459:103::-;;;;;;;;;;;;;:::i;47092:86::-;;;;;;;;;;;;47136:42;47092:86;;52550:127;;;;;;;;;;;;;:::i;55057:506::-;;;;;;;;;;-1:-1:-1;55057:506:0;;;;;:::i;:::-;;:::i;52736:164::-;;;;;;;;;;-1:-1:-1;52850:10:0;;52881:15;52736:164;;;;6521:25:1;;;6577:2;6562:18;;6555:34;;;;6494:18;52736:164:0;6347:248:1;73991:130:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47883:76::-;;;;;;;;;;;;47917:42;47883:76;;46279:40;;;;;;;;;;;;;;;;66390:61;;;;;;;;;;;;;:::i;46438:33::-;;;;;;;;;;-1:-1:-1;46438:33:0;;;;;:::i;:::-;;:::i;46996:89::-;;;;;;;;;;;;47043:42;46996:89;;47623:87;;;;;;;;;;;;47668:42;47623:87;;22724:147;;;;;;;;;;;;;:::i;46515:34::-;;;;;;;;;;-1:-1:-1;46515:34:0;;;;;:::i;:::-;;:::i;45840:33::-;;;;;;;;;;;;;;;;49654:45;;;;;;;;;;-1:-1:-1;49654:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49654:45:0;;;;;;;;;;;-1:-1:-1;;;;;7760:32:1;;;7742:51;;7824:2;7809:18;;7802:34;;;;7852:18;;;7845:34;7730:2;7715:18;49654:45:0;7540:345:1;34385:151:0;;;;;;;;;;;;;:::i;52367:119::-;;;;;;;;;;;;;:::i;52964:133::-;;;;;;;;;;-1:-1:-1;52964:133:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59008:474::-;;;;;;;;;;;;;:::i;57748:669::-;;;;;;;;;;-1:-1:-1;57748:669:0;;;;;:::i;:::-;;:::i;75667:2105::-;;;;;;;;;;;;;:::i;49708:41::-;;;;;;;;;;-1:-1:-1;49708:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;46602:112;;;;;;;;;;;;;:::i;68093:2407::-;;;;;;;;;;-1:-1:-1;68093:2407:0;;;;;:::i;:::-;;:::i;46242:28::-;;;;;;;;;;;;;;;;65032:227;;;;;;;;;;-1:-1:-1;65032:227:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57035:668::-;;;;;;;;;;-1:-1:-1;57035:668:0;;;;;:::i;:::-;;:::i;56395:595::-;;;;;;;;;;-1:-1:-1;56395:595:0;;;;;:::i;:::-;;:::i;60897:1479::-;;;;;;;;;;-1:-1:-1;60897:1479:0;;;;;:::i;:::-;;:::i;67347:193::-;;;;;;;;;;;;;:::i;47362:80::-;;;;;;;;;;;;47400:42;47362:80;;74321:1065;;;;;;;;;;-1:-1:-1;74321:1065:0;;;;;:::i;:::-;;:::i;66247:135::-;;;;;;;;;;-1:-1:-1;66247:135:0;;;;;:::i;:::-;;:::i;73809:82::-;;;;;;;;;;;;;:::i;49854:59::-;;;;;;;;;;-1:-1:-1;49854:59:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;10714:15:1;;;10696:34;;10766:15;;;;10761:2;10746:18;;10739:43;10798:18;;;10791:34;10856:2;10841:18;;10834:34;10645:3;10630:19;49854:59:0;10427:447:1;36175:198:0;;;;;;;;;;-1:-1:-1;36175:198:0;;;;;:::i;:::-;;:::i;45734:31::-;;;;;;;;;;;;;;;;58654:125;;;;;;;;;;-1:-1:-1;58654:125:0;;;;;:::i;:::-;;:::i;62508:2074::-;;;;;;:::i;:::-;;:::i;49409:57::-;;;;;;;;;;-1:-1:-1;49409:57:0;;;;;:::i;:::-;;:::i;:::-;;;;11375:25:1;;;11431:2;11416:18;;11409:34;;;;11459:18;;;11452:34;11517:2;11502:18;;11495:34;11362:3;11347:19;49409:57:0;11144:391:1;23717:220:0;;;;;;;;;;-1:-1:-1;23717:220:0;;;;;:::i;:::-;;:::i;49475:59::-;;;;;;;;;;-1:-1:-1;49475:59:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;46137:39::-;;;;;;;;;;;;;;;;52179:127;;;;;;;;;;-1:-1:-1;52179:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;52276:26:0;52253:7;52276:26;;;:14;:26;;;;;;;52179:127;47717:76;;;;;;;;;;;;47751:42;47717:76;;34119:147;34251:7;34244:14;;34164:13;;-1:-1:-1;;;;;;;;;;;33209:20:0;34244:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34119:147;:::o;67566:498::-;67649:4;67671:22;20162:10;67671:8;:22::i;:::-;67670:23;67662:68;;;;-1:-1:-1;;;67662:68:0;;12839:2:1;67662:68:0;;;12821:21:1;;;12858:18;;;12851:30;12917:34;12897:18;;;12890:62;12969:18;;67662:68:0;;;;;;;;;67746:17;67755:7;67746:8;:17::i;:::-;67745:18;67737:64;;;;-1:-1:-1;;;67737:64:0;;13200:2:1;67737:64:0;;;13182:21:1;13239:2;13219:18;;;13212:30;13278:34;13258:18;;;13251:62;-1:-1:-1;;;13329:18:1;;;13322:31;13370:19;;67737:64:0;12998:397:1;67737:64:0;-1:-1:-1;;;;;;;67816:31:0;;;67808:83;;;;-1:-1:-1;;;67808:83:0;;13602:2:1;67808:83:0;;;13584:21:1;13641:2;13621:18;;;13614:30;13680:34;13660:18;;;13653:62;-1:-1:-1;;;13731:18:1;;;13724:37;13778:19;;67808:83:0;13400:403:1;67808:83:0;-1:-1:-1;;20162:10:0;67906:36;67898:98;;;;-1:-1:-1;;;67898:98:0;;14010:2:1;67898:98:0;;;13992:21:1;14049:2;14029:18;;;14022:30;14088:34;14068:18;;;14061:62;-1:-1:-1;;;14139:18:1;;;14132:47;14196:19;;67898:98:0;13808:413:1;67898:98:0;68003:39;20162:10;68026:7;68035:6;68003:8;:39::i;:::-;-1:-1:-1;68056:4:0;67566:498;;;;;:::o;73394:196::-;-1:-1:-1;;;;;73551:19:0;73464:4;73551:19;;;:11;:19;;;;;:35;;;-1:-1:-1;;;73551:35:0;;;;;73394:196::o;58833:125::-;22610:13;:11;:13::i;:::-;58915:19:::1;:39:::0;58833:125::o;49982:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49982:51:0;;;;-1:-1:-1;49982:51:0;-1:-1:-1;49982:51:0;:::o;65538:676::-;22610:13;:11;:13::i;:::-;65782:204:::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;65782:204:0;::::1;::::0;;;;;;;::::1;;::::0;;;;-1:-1:-1;65782:204:0;;;;;;;;;;;;65759:20;;;:11:::1;:20:::0;;;;;;;:227;;:20;;:227:::1;::::0;:20;:227:::1;:::i;:::-;-1:-1:-1::0;65759:227:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;65759:227:0::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;;-1:-1:-1::0;;;65759:227:0::1;-1:-1:-1::0;;;;;;65759:227:0;;;-1:-1:-1;;;;;65759:227:0;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;66045:24:::1;:38:::0;;65759:227;66045:38;::::1;::::0;;65759:227:::1;66045:38:::0;;;;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;66045:38:0;;;::::1;::::0;::::1;::::0;;66159:51;::::1;::::0;66181:11;;66159:51:::1;:::i;:::-;;;;;;;;66175:4;66159:51;;;;;;:::i;:::-;;::::0;;;;::::1;::::0;;1745:14:1;;1738:22;1720:41;;66159:51:0;::::1;::::0;1708:2:1;1693:18;66159:51:0::1;;;;;;;65538:676:::0;;;;:::o;70668:2145::-;70790:4;70773:6;49003:12;49012:3;70773:6;49003:12;:::i;:::-;48994:21;;70820:1:::1;70811:6;:10;70803:61;;;;-1:-1:-1::0;;;70803:61:0::1;;;;;;;:::i;:::-;70902:45;70918:6:::0;20162:10;70940:6:::1;70902:15;:45::i;:::-;70985:28;;:::i;:::-;71034:6;71020;:11;;:20;-1:-1:-1::0;;;;;71020:20:0::1;;;-1:-1:-1::0;;;;;71020:20:0::1;;;::::0;::::1;71059:9;71047:6;:9;;:21;-1:-1:-1::0;;;;;71047:21:0::1;;;-1:-1:-1::0;;;;;71047:21:0::1;;;::::0;::::1;71091:6;71075;:13;;:22;;;::::0;::::1;71123:15;71104:6;:16;;:34;;;::::0;::::1;71147:15;:26;71163:9;-1:-1:-1::0;;;;;71147:26:0::1;-1:-1:-1::0;;;;;71147:26:0::1;;;;;;;;;;;;71179:6;71147:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;71147:39:0::1;;;;;-1:-1:-1::0;;;;;71147:39:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;71147:39:0::1;;;;;-1:-1:-1::0;;;;;71147:39:0::1;;;;;;;;;;;;;;;;;;;;;;;;71193:15;:23;71209:6;-1:-1:-1::0;;;;;71193:23:0::1;-1:-1:-1::0;;;;;71193:23:0::1;;;;;;;;;;;;71222:6;71193:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;71193:36:0::1;;;;;-1:-1:-1::0;;;;;71193:36:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;71193:36:0::1;;;;;-1:-1:-1::0;;;;;71193:36:0::1;;;;;;;;;;;;;;;;;;;;;;;;71271:9;-1:-1:-1::0;;;;;71243:63:0::1;71263:6;-1:-1:-1::0;;;;;71243:63:0::1;;71282:6;71290:15;71243:63;;;;;;6521:25:1::0;;;6577:2;6562:18;;6555:34;6509:2;6494:18;;6347:248;71243:63:0::1;;;;;;;;71349:15;71367:63;71387:6;71395:34;71419:9;71395:23;:34::i;:::-;71367:19;:63::i;:::-;71349:81:::0;-1:-1:-1;71470:22:0::1;71495:19;71349:81:::0;71495:6;:19:::1;:::i;:::-;71470:44;;71577;71587:6;47574:42;71610:10;71577:9;:44::i;:::-;71703:34;71727:9;71703:23;:34::i;:::-;71699:340;;;-1:-1:-1::0;;;;;71750:26:0;::::1;;::::0;;;:15:::1;:26;::::0;;;;:44;;71780:14;;71750:26;:44:::1;::::0;71780:14;;71750:44:::1;:::i;:::-;;;;;;;;71876:9;-1:-1:-1::0;;;;;71849:49:0::1;71868:6;-1:-1:-1::0;;;;;71849:49:0::1;;71887:10;71849:49;;;;529:25:1::0;;517:2;502:18;;383:177;71849:49:0::1;;;;;;;;71699:340;;;71987:44;71997:6;72005:9;72016:14;71987:9;:44::i;:::-;-1:-1:-1::0;;;;;72096:25:0;::::1;;::::0;;;:14:::1;:25;::::0;;;;:43;;72125:14;;72096:25;:43:::1;::::0;72125:14;;72096:43:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;72199:17:0;::::1;47751:42;72199:17;::::0;:38:::1;;-1:-1:-1::0;;;;;;72220:17:0;::::1;47834:42;72220:17;72199:38;:59;;;-1:-1:-1::0;;;;;;72241:17:0;::::1;47917:42;72241:17;72199:59;72195:276;;;-1:-1:-1::0;;;;;72279:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;::::1;;72271:69;;;;-1:-1:-1::0;;;72271:69:0::1;;;;;;;:::i;:::-;72391:23;72407:6;72391:15;:23::i;:::-;72378:10;;:36;;;;:::i;:::-;72359:15;:55;;72351:112;;;::::0;-1:-1:-1;;;72351:112:0;;18345:2:1;72351:112:0::1;::::0;::::1;18327:21:1::0;18384:2;18364:18;;;18357:30;18423:34;18403:18;;;18396:62;-1:-1:-1;;;18474:18:1;;;18467:42;18526:19;;72351:112:0::1;18143:408:1::0;72351:112:0::1;-1:-1:-1::0;;;;;72533:20:0;::::1;47751:42;72533:20;::::0;:44:::1;;-1:-1:-1::0;;;;;;72557:20:0;::::1;47834:42;72557:20;72533:44;:68;;;-1:-1:-1::0;;;;;;72581:20:0;::::1;47917:42;72581:20;72533:68;72529:165;;;-1:-1:-1::0;;;;;72622:24:0;::::1;;::::0;;;:13:::1;:24;::::0;;;;;::::1;;72614:72;;;;-1:-1:-1::0;;;72614:72:0::1;;;;;;;:::i;:::-;72771:9;-1:-1:-1::0;;;;;72745:44:0::1;72763:6;-1:-1:-1::0;;;;;72745:44:0::1;;72782:6;72745:44;;;;529:25:1::0;;517:2;502:18;;383:177;72745:44:0::1;;;;;;;;-1:-1:-1::0;72805:4:0::1;::::0;70668:2145;-1:-1:-1;;;;;;;70668:2145:0:o;50444:949::-;50497:16;50526:26;50623:9;50618:205;50642:24;:31;50638:35;;50618:205;;;50699:11;:40;50711:24;50736:1;50711:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;50711:27:0;50699:40;;;;;;;;;;;;:56;;;;-1:-1:-1;;;50699:56:0;;;;50695:117;;;50776:20;;;;:::i;:::-;;;;50695:117;50675:3;;50618:205;;;;50897:32;50946:18;50932:33;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50932:33:0;;50897:68;;51039:20;51079:9;51074:277;51098:24;:31;51094:35;;51074:277;;;51155:11;:40;51167:24;51192:1;51167:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;51167:27:0;51155:40;;;;;;;;;;;;:56;;;;-1:-1:-1;;;51155:56:0;;;;51151:189;;;51264:24;51289:1;51264:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;51264:27:0;51232:15;51248:12;51232:29;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51232:59:0;;;:29;;;;;;;;;;;:59;51310:14;;;;:::i;:::-;;;;51151:189;51131:3;;51074:277;;;-1:-1:-1;51370:15:0;;50444:949;-1:-1:-1;;;50444:949:0:o;73899:84::-;22610:13;:11;:13::i;:::-;73953:14:::1;:22:::0;;-1:-1:-1;;73953:22:0::1;::::0;;73899:84::o;58475:125::-;22610:13;:11;:13::i;:::-;58557:19:::1;:39:::0;58475:125::o;51466:439::-;51538:18;51565;51586:34;51609:10;-1:-1:-1;;;;;52073:28:0;52050:7;52073:28;;;:16;:28;;;;;:35;;51977:135;51586:34;51565:55;;51629:25;51673:10;51657:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;51657:27:0;;;;;;;;;;;;;;;;51629:55;;51698:9;51693:187;51717:10;51713:1;:14;51693:187;;;51745:18;51766:33;51785:10;51797:1;51766:18;:33::i;:::-;51745:54;;51822:50;;;;;;;;51832:5;:18;;;-1:-1:-1;;;;;51822:50:0;;;;;51852:5;:19;;;51822:50;;;51810:6;51817:1;51810:9;;;;;;;;:::i;:::-;;;;;;;;;;:62;-1:-1:-1;51729:3:0;;51693:187;;;-1:-1:-1;51895:6:0;51466:439;-1:-1:-1;;;51466:439:0:o;66459:65::-;22610:13;:11;:13::i;:::-;66506:10:::1;:8;:10::i;:::-;66459:65::o:0;54561:396::-;54638:7;:5;:7::i;:::-;-1:-1:-1;;;;;54622:23:0;20162:10;-1:-1:-1;;;;;54622:23:0;;:61;;;-1:-1:-1;20162:10:0;47668:42;54649:34;54622:61;54614:103;;;;-1:-1:-1;;;54614:103:0;;19030:2:1;54614:103:0;;;19012:21:1;19069:2;19049:18;;;19042:30;19108:31;19088:18;;;19081:59;19157:18;;54614:103:0;18828:353:1;54614:103:0;54724:18;54735:6;54724:10;:18::i;:::-;54786:28;;529:25:1;;;20162:10:0;;54786:28;;517:2:1;502:18;54786:28:0;;;;;;;20162:10;54881:28;;;;:14;:28;;;;;:38;;54913:6;;54881:28;:38;;54913:6;;54881:38;:::i;:::-;;;;;;;;54947:6;54926:17;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;;54561:396:0:o;46765:114::-;46818:16;46854:17;46847:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46847:24:0;;;;;;;;;;;;;;;;;;;;;;;46765:114;:::o;53169:1093::-;53236:4;-1:-1:-1;;;;;53257:17:0;;47751:42;53257:17;;:38;;-1:-1:-1;;;;;;53278:17:0;;47834:42;53278:17;53257:38;:59;;;-1:-1:-1;;;;;;53299:17:0;;47917:42;53299:17;53257:59;53249:94;;;;-1:-1:-1;;;53249:94:0;;19388:2:1;53249:94:0;;;19370:21:1;19427:2;19407:18;;;19400:30;-1:-1:-1;;;19446:18:1;;;19439:52;19508:18;;53249:94:0;19186:346:1;53249:94:0;53434:17;;-1:-1:-1;;;;;;;53492:17:0;;;53488:360;;-1:-1:-1;;53537:19:0;;53586:10;;53488:360;;;-1:-1:-1;;;;;;;53614:17:0;;;53610:238;;-1:-1:-1;;53659:19:0;;53708:10;;53610:238;;;-1:-1:-1;;;;;;;53736:17:0;;;53732:116;;-1:-1:-1;;53781:19:0;;53830:10;;53732:116;-1:-1:-1;;;;;53910:21:0;;;;;;:13;:21;;;;;;;;53902:64;;;;-1:-1:-1;;;53902:64:0;;19739:2:1;53902:64:0;;;19721:21:1;19778:2;19758:18;;;19751:30;19817:32;19797:18;;;19790:60;19867:18;;53902:64:0;19537:354:1;53902:64:0;54036:15;54017:16;54107:31;54126:12;54107:16;:31;:::i;:::-;54093:11;:45;54089:137;;;54187:30;54201:16;54187:11;:30;:::i;:::-;54171:47;;:12;:47;:::i;:::-;54151:67;;54089:137;54241:17;53169:1093;-1:-1:-1;;;;;53169:1093:0:o;59486:415::-;59548:4;-1:-1:-1;;;;;;;59569:17:0;;;59565:325;;-1:-1:-1;;59610:19:0;;;59486:415::o;59565:325::-;-1:-1:-1;;;;;;;59651:17:0;;;59647:243;;-1:-1:-1;;59692:19:0;;;59486:415::o;59647:243::-;-1:-1:-1;;;;;;;59733:17:0;;;59729:161;;-1:-1:-1;;59774:19:0;;;59486:415::o;59729:161::-;-1:-1:-1;59877:1:0;;59486:415;-1:-1:-1;59486:415:0:o;59729:161::-;59486:415;;;:::o;56001:359::-;56056:7;;;56187:136;56211:16;:23;56207:27;;56187:136;;;56274:7;:28;56282:16;56299:1;56282:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;56282:19:0;56274:28;;;;;;;;;;;;:41;;;56252:63;;;;:::i;:::-;;-1:-1:-1;56236:3:0;;56187:136;;;-1:-1:-1;56338:18:0;56001:359;-1:-1:-1;56001:359:0:o;35551:174::-;-1:-1:-1;;;;;35697:20:0;35616:7;35697:20;;;-1:-1:-1;;;;;;;;;;;35697:20:0;;;;;;;35551:174::o;23459:103::-;22610:13;:11;:13::i;:::-;23524:30:::1;23551:1;23524:18;:30::i;52550:127::-:0;52611:7;52638:31;47043:42;52638:9;:31::i;:::-;52631:38;;52550:127;:::o;55057:506::-;55155:7;:5;:7::i;:::-;-1:-1:-1;;;;;55139:23:0;20162:10;-1:-1:-1;;;;;55139:23:0;;:61;;;-1:-1:-1;20162:10:0;47668:42;55166:34;55139:61;55131:103;;;;-1:-1:-1;;;55131:103:0;;19030:2:1;55131:103:0;;;19012:21:1;19069:2;19049:18;;;19042:30;19108:31;19088:18;;;19081:59;19157:18;;55131:103:0;18828:353:1;55131:103:0;55330:28;55342:7;55351:6;55330:11;:28::i;:::-;55409:7;-1:-1:-1;;;;;55402:23:0;;55418:6;55402:23;;;;529:25:1;;517:2;502:18;;383:177;55402:23:0;;;;;;;;-1:-1:-1;;;;;55492:23:0;;;;;;:14;:23;;;;;:33;;55519:6;;55492:23;:33;;55519:6;;55492:33;:::i;:::-;;;;;;;;55553:6;55532:17;;:27;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;55057:506:0:o;73991:130::-;74102:10;74087:26;;;;:14;:26;;;;;;;;74080:33;;;;;;;;;;;;;;;;;74045:22;;74080:33;;74087:26;;74080:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73991:130;:::o;66390:61::-;22610:13;:11;:13::i;:::-;66435:8:::1;:6;:8::i;46438:33::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46438:33:0;;-1:-1:-1;46438:33:0;:::o;22724:147::-;21555:22;22855:8;-1:-1:-1;;;;;22855:8:0;;22724:147::o;46515:34::-;;;;;;;;;;;;34385:151;34519:9;34512:16;;34432:13;;-1:-1:-1;;;;;;;;;;;33209:20:0;34512:16;;;:::i;52367:119::-;52427:7;52454:24;46947:42;52454:9;:24::i;52964:133::-;-1:-1:-1;;;;;53069:24:0;;;;;;:15;:24;;;;;;;;53062:31;;;;;;;;;;;;;;;;;53030:23;;53062:31;;53069:24;;53062:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;53062:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52964:133;;;:::o;59008:474::-;47751:42;59063:4;59176:22;;;:13;:22;;;;59063:4;;59176:22;;59172:86;;;59232:18;47751:42;59232:9;:18::i;:::-;59211:39;;;;:::i;:::-;;;59172:86;47834:42;59270:22;;:13;:22;;;;;;59266:86;;;59326:18;47834:42;59326:9;:18::i;:::-;59305:39;;;;:::i;:::-;;;59266:86;47917:42;59364:22;;:13;:22;;;;;;59360:86;;;59420:18;47917:42;59420:9;:18::i;:::-;59399:39;;;;:::i;57748:669::-;22610:13;:11;:13::i;:::-;-1:-1:-1;;;;;57820:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;::::1;;57812:54;;;::::0;-1:-1:-1;;;57812:54:0;;20098:2:1;57812:54:0::1;::::0;::::1;20080:21:1::0;20137:2;20117:18;;;20110:30;-1:-1:-1;;;20156:18:1;;;20149:50;20216:18;;57812:54:0::1;19896:344:1::0;57812:54:0::1;57941:17;-1:-1:-1::0;;;;;;;57971:17:0;::::1;::::0;57967:297:::1;;-1:-1:-1::0;58016:19:0::1;::::0;57967:297:::1;;;-1:-1:-1::0;;;;;;;58053:17:0;::::1;::::0;58049:215:::1;;-1:-1:-1::0;58098:19:0::1;::::0;58049:215:::1;;;-1:-1:-1::0;;;;;;;58135:17:0;::::1;::::0;58131:133:::1;;-1:-1:-1::0;58180:19:0::1;::::0;58131:133:::1;;;58224:32;::::0;-1:-1:-1;;;58224:32:0;;19388:2:1;58224:32:0::1;::::0;::::1;19370:21:1::0;19427:2;19407:18;;;19400:30;-1:-1:-1;;;19446:18:1;;;19439:52;19508:18;;58224:32:0::1;19186:346:1::0;58131:133:0::1;58295:1;58280:12;:16;58272:65;;;;-1:-1:-1::0;;;58272:65:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;58346:21:0::1;58370:5;58346:21:::0;;;:13:::1;:21;::::0;;;;:29;;-1:-1:-1;;58346:29:0::1;::::0;;57748:669::o;75667:2105::-;73730:14;;75731:13;;73730:14;;73722:59;;;;-1:-1:-1;;;73722:59:0;;20852:2:1;73722:59:0;;;20834:21:1;;;20871:18;;;20864:30;20930:34;20910:18;;;20903:62;20982:18;;73722:59:0;20650:356:1;73722:59:0;75769:10:::1;75796:1;75761:19:::0;;;:7:::1;:19;::::0;;;;:32:::1;;::::0;75753:79:::1;;;::::0;-1:-1:-1;;;75753:79:0;;21213:2:1;75753:79:0::1;::::0;::::1;21195:21:1::0;21252:2;21232:18;;;21225:30;21291:32;21271:18;;;21264:60;21341:18;;75753:79:0::1;21011:354:1::0;75753:79:0::1;75890:10;75841:20;75882:19:::0;;;:7:::1;:19;::::0;;;;:29:::1;;::::0;75864:47:::1;::::0;:15:::1;:47;:::i;:::-;75841:70:::0;-1:-1:-1;75918:15:0::1;75936:24;75954:6;75841:70:::0;75936:24:::1;:::i;:::-;75918:42;;75996:17;76135:1;76121:10;:15;76117:1652;;76173:10;76165:19;::::0;;;:7:::1;:19;::::0;;;;:32:::1;::::0;;::::1;::::0;76218:4:::1;::::0;76204:10;;76165:36:::1;::::0;::::1;:::i;:::-;:49;;;;:::i;:::-;76164:58;;;;:::i;:::-;76149:73;;76289:35;76311:12;76289:21;:35::i;:::-;76437:10;76449:19;::::0;;;:7:::1;:19;::::0;;;;:32:::1;;::::0;76412:70:::1;::::0;76430:4:::1;::::0;76412:9:::1;:70::i;:::-;76549:52;76572:10;76584:16;76549:22;:52::i;:::-;76672:10;76664:19;::::0;;;:7:::1;:19;::::0;;;;76657:26;;-1:-1:-1;;;;;;76657:26:0::1;::::0;;;;::::1;::::0;;;::::1;;::::0;76776:16;;76772:106:::1;;76809:57;47043:42;76841:10;76853:12;76809:9;:57::i;:::-;76937:10;76949:19;::::0;;;:7:::1;:19;::::0;;;;:32:::1;;::::0;76928:69:::1;::::0;76949:47:::1;::::0;76984:12;;76949:47:::1;:::i;:::-;76928:69;::::0;529:25:1;;;517:2;502:18;76928:69:0::1;;;;;;;77008:60;;;;;;;;;;;;;;;;;;;;;;75667:2105:::0;:::o;76117:1652::-:1;77281:10;77293:19;::::0;;;:7:::1;:19;::::0;;;;:32:::1;;::::0;77256:70:::1;::::0;77274:4:::1;::::0;77256:9:::1;:70::i;:::-;77393:52;77416:10;77428:16;77393:22;:52::i;:::-;77516:10;77508:19;::::0;;;:7:::1;:19;::::0;;;;;;;77501:26;;-1:-1:-1;;;;;;77501:26:0::1;::::0;;-1:-1:-1;77501:26:0;::::1;::::0;;;::::1;;::::0;;;77578:54;529:25:1;;;77578:54:0::1;::::0;502:18:1;77578:54:0::1;;;;;;;77643:118;;;;;;;;;;;;;;;;;;;;;;75667:2105:::0;:::o;46602:112::-;46654:16;46690;46683:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46683:23:0;;;;;;;;;;;;;;;;;;;;;;46602:112;:::o;68093:2407::-;68188:4;68171:6;49003:12;49012:3;68171:6;49003:12;:::i;:::-;48994:21;-1:-1:-1;;;;;;68209:16:0;::::1;68201:64;;;::::0;-1:-1:-1;;;68201:64:0;;21745:2:1;68201:64:0::1;::::0;::::1;21727:21:1::0;21784:2;21764:18;;;21757:30;21823:34;21803:18;;;21796:62;-1:-1:-1;;;21874:18:1;;;21867:33;21917:19;;68201:64:0::1;21543:399:1::0;68201:64:0::1;68289:1;68280:6;:10;68272:61;;;;-1:-1:-1::0;;;68272:61:0::1;;;;;;;:::i;:::-;68393:20;68416:27;68440:2;68416:23;:27::i;:::-;68393:50:::0;-1:-1:-1;;;;;;68525:13:0;::::1;47751:42;68525:13;::::0;:30:::1;;-1:-1:-1::0;;;;;;68542:13:0;::::1;47834:42;68542:13;68525:30;:47;;;-1:-1:-1::0;;;;;;68559:13:0;::::1;47917:42;68559:13;68525:47;68521:141;;;-1:-1:-1::0;;;;;68594:17:0;::::1;;::::0;;;:13:::1;:17;::::0;;;;;::::1;;68593:18;68585:69;;;;-1:-1:-1::0;;;68585:69:0::1;;;;;;;:::i;:::-;20162:10:::0;47751:42:::1;68740:23;::::0;:50:::1;;-1:-1:-1::0;20162:10:0;47834:42:::1;68767:23;68740:50;:77;;;-1:-1:-1::0;20162:10:0;47917:42:::1;68794:23;68740:77;68736:181;;;20162:10:::0;68839:27:::1;::::0;;;:13:::1;:27;::::0;;;;;::::1;;68838:28;68830:79;;;;-1:-1:-1::0;;;68830:79:0::1;;;;;;;:::i;:::-;68959:15;68977:44;68997:6;69005:15;68977:19;:44::i;:::-;68959:62:::0;-1:-1:-1;69142:6:0;69115:23:::1;20162:10:::0;35551:174;:::i;69115:23::-:1;:33;;69107:79;;;::::0;-1:-1:-1;;;69107:79:0;;22556:2:1;69107:79:0::1;::::0;::::1;22538:21:1::0;22595:2;22575:18;;;22568:30;22634:34;22614:18;;;22607:62;-1:-1:-1;;;22685:18:1;;;22678:31;22726:19;;69107:79:0::1;22354:397:1::0;69107:79:0::1;69260:22;69285:19;69294:10:::0;69285:6;:19:::1;:::i;:::-;69260:44;;69351:12;69366:34;69381:2;69385:14;69366;:34::i;:::-;69351:49;;69413:7;69409:458;;;69466:28;;:::i;:::-;69519:10;69505:24:::0;;;-1:-1:-1;;;;;69540:14:0;;::::1;:9;::::0;;::::1;:14:::0;;;69565:13:::1;::::0;;::::1;:30:::0;;;69662:15:::1;69643:16;::::0;::::1;:34:::0;;;69505:11:::1;69690:19:::0;;;:15:::1;:19:::0;;;;;:32;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;::::1;-1:-1:-1::0;;;;;;69690:32:0;;::::1;;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;69733:27;;;;;;:40;;;;::::1;::::0;;;;;;;;;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;::::1;::::0;;;::::1;;::::0;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;69791:68;69540:14;;69519:10;69791:68:::1;::::0;::::1;::::0;69581:14;6521:25:1;;6577:2;6562:18;;6555:34;6509:2;6494:18;;6347:248;69791:68:0::1;;;;;;;;69422:445;69409:458;69971:15;69967:194;;;70004:88;;;;;22958:2:1::0;22940:21;;;22997:2;22977:18;;;22970:30;23036:34;23031:2;23016:18;;23009:62;23107:34;23102:2;23087:18;;23080:62;-1:-1:-1;;;23173:3:1;23158:19;;23151:44;23227:3;23212:19;;22756:481;70004:88:0::1;;;;;;;;70103:50;20162:10:::0;47574:42:::1;70142:10;70103:9;:50::i;:::-;-1:-1:-1::0;;;;;70271:18:0;::::1;;::::0;;;:14:::1;:18;::::0;;;;:36;;70293:14;;70271:18;:36:::1;::::0;70293:14;;70271:36:::1;:::i;:::-;::::0;;;-1:-1:-1;70389:27:0::1;::::0;-1:-1:-1;70413:2:0;70389:23:::1;:27::i;:::-;70385:89;;;-1:-1:-1::0;;;;;70429:19:0;::::1;;::::0;;;:15:::1;:19;::::0;;;;:37;;70452:14;;70429:19;:37:::1;::::0;70452:14;;70429:37:::1;:::i;:::-;::::0;;;-1:-1:-1;;70385:89:0::1;70489:7:::0;68093:2407;-1:-1:-1;;;;;;;68093:2407:0:o;65032:227::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;65153:28:0;;;;;;:16;:28;;;;;:35;65145:43;;65137:69;;;;-1:-1:-1;;;65137:69:0;;23444:2:1;65137:69:0;;;23426:21:1;23483:2;23463:18;;;23456:30;-1:-1:-1;;;23502:18:1;;;23495:43;23555:18;;65137:69:0;23242:337:1;65137:69:0;-1:-1:-1;;;;;65220:28:0;;;;;;:16;:28;;;;;:35;;65249:5;;65220:35;;;;;;:::i;:::-;;;;;;;;;;65213:42;;;;;;;;;65220:35;;;;;65213:42;;-1:-1:-1;;;;;65213:42:0;;;;;;;;;;;;;;-1:-1:-1;65032:227:0;;;;:::o;57035:668::-;22610:13;:11;:13::i;:::-;-1:-1:-1;;;;;57106:21:0;::::1;;::::0;;;:13:::1;:21;::::0;;;;;::::1;;57105:22;57097:59;;;::::0;-1:-1:-1;;;57097:59:0;;23786:2:1;57097:59:0::1;::::0;::::1;23768:21:1::0;23825:2;23805:18;;;23798:30;23864:26;23844:18;;;23837:54;23908:18;;57097:59:0::1;23584:348:1::0;57097:59:0::1;57231:17;-1:-1:-1::0;;;;;;;57261:17:0;::::1;::::0;57257:297:::1;;-1:-1:-1::0;57306:19:0::1;::::0;57257:297:::1;;;-1:-1:-1::0;;;;;;;57343:17:0;::::1;::::0;57339:215:::1;;-1:-1:-1::0;57388:19:0::1;::::0;57339:215:::1;;;-1:-1:-1::0;;;;;;;57425:17:0;::::1;::::0;57421:133:::1;;-1:-1:-1::0;57470:19:0::1;::::0;57421:133:::1;57585:1;57570:12;:16;57562:65;;;;-1:-1:-1::0;;;57562:65:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;57636:21:0::1;;::::0;;;:13:::1;:21;::::0;;;;:28;;-1:-1:-1;;57636:28:0::1;57660:4;57636:28;::::0;;57035:668::o;56395:595::-;56483:10;46947:42;56483:27;56475:86;;;;-1:-1:-1;;;56475:86:0;;24139:2:1;56475:86:0;;;24121:21:1;24178:2;24158:18;;;24151:30;24217:34;24197:18;;;24190:62;-1:-1:-1;;;24268:18:1;;;24261:44;24322:19;;56475:86:0;23937:410:1;56475:86:0;56589:1;56580:6;:10;56572:60;;;;-1:-1:-1;;;56572:60:0;;24554:2:1;56572:60:0;;;24536:21:1;24593:2;24573:18;;;24566:30;24632:34;24612:18;;;24605:62;-1:-1:-1;;;24683:18:1;;;24676:35;24728:19;;56572:60:0;24352:401:1;56572:60:0;56773:6;56753:10;:17;:26;;;;:::i;:::-;56725:24;46947:42;56725:9;:24::i;:::-;:54;;56717:99;;;;-1:-1:-1;;;56717:99:0;;24960:2:1;56717:99:0;;;24942:21:1;;;24979:18;;;24972:30;25038:34;25018:18;;;25011:62;25090:18;;56717:99:0;24758:356:1;56717:99:0;56866:9;56861:122;56885:10;:17;56881:1;:21;56861:122;;;56924:47;46947:42;56949:10;56960:1;56949:13;;;;;;;;:::i;:::-;;;;;;;56964:6;56924:9;:47::i;:::-;56904:3;;56861:122;;;;56395:595;;:::o;60897:1479::-;19144:21;14460:15;;-1:-1:-1;;;14460:15:0;;;;14459:16;;14507:14;;14313:30;14892:16;;:34;;;;;14912:14;14892:34;14872:54;;14937:17;14957:11;:16;;14972:1;14957:16;:50;;;;-1:-1:-1;14985:4:0;14977:25;:30;14957:50;14937:70;;15025:12;15024:13;:30;;;;;15042:12;15041:13;15024:30;15020:93;;;15078:23;;-1:-1:-1;;;15078:23:0;;;;;;;;;;;15020:93;15123:18;;-1:-1:-1;;15123:18:0;15140:1;15123:18;;;15152:69;;;;15187:22;;-1:-1:-1;;;;15187:22:0;-1:-1:-1;;;15187:22:0;;;15152:69;60965:31:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;60965:31:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;60965:31:0::1;;::::0;:12:::1;:31::i;:::-;61003:22;:20;:22::i;:::-;61032:17;:15;:17::i;:::-;61056:28;61071:12;61056:14;:28::i;:::-;61093:31;61099:10;61111:12;61093:5;:31::i;:::-;61131:70;61141:10;47136:42;35258:2:::0;61190:10:::1;61184:16;::::0;:2:::1;:16;:::i;:::-;61172:28;::::0;:9:::1;:28;:::i;:::-;61131:9;:70::i;:::-;61208:73;61218:10;47043:42;35258:2:::0;61270:10:::1;35184:84:::0;61208:73:::1;61288:65;61298:10;46947:42;35258:2:::0;61342:10:::1;61336:16;::::0;:2:::1;:16;:::i;:::-;61325:27;::::0;:8:::1;:27;:::i;61288:65::-;61360:66;61370:10;47225:42;35258:2:::0;61415:10:::1;35184:84:::0;61360:66:::1;61433:64;61443:10;47313:42;35258:2:::0;61486:10:::1;35184:84:::0;61433:64:::1;61504:63;61514:10;47400:42;35258:2:::0;61556:10:::1;35184:84:::0;61504:63:::1;61574:61;61584:10;47485:42;35258:2:::0;61624:10:::1;35184:84:::0;61574:61:::1;61642:60;61652:10;47751:42;35258:2:::0;61691:10:::1;35184:84:::0;61642:60:::1;61709;61719:10;47834:42;35258:2:::0;61758:10:::1;61752:16;::::0;:2:::1;:16;:::i;:::-;61740:28;::::0;:9:::1;:28;:::i;61709:60::-;61776;61786:10;47917:42;35258:2:::0;61825:10:::1;35184:84:::0;61776:60:::1;61858:15;61845:10;:28:::0;;;61981:1:::1;61959:19;:23:::0;;;62056:32:::1;::::0;::::1;:::i;:::-;62032:21;:56:::0;62123:1:::1;62101:19;:23:::0;;;62198:10:::1;::::0;:32:::1;::::0;62123:1;62198:32:::1;:::i;:::-;62174:21;:56:::0;62265:1:::1;62243:19;:23:::0;;;62340:10:::1;::::0;:32:::1;::::0;62265:1;62340:32:::1;:::i;:::-;62316:21;:56:::0;15243:104;;;;15278:23;;-1:-1:-1;;;;15278:23:0;;;15321:14;;-1:-1:-1;26649:50:1;;15321:14:0;;26637:2:1;26622:18;15321:14:0;;;;;;;15243:104;14245:1109;;;;;60897:1479;:::o;67347:193::-;67403:21;67426:19;67473:20;67113:16;:23;;67042:98;67473:20;67454:39;;67517:19;67255:17;:24;;67185:98;67517:19;67500:36;;67347:193;;:::o;74321:1065::-;73730:14;;74393:13;;73730:14;;73722:59;;;;-1:-1:-1;;;73722:59:0;;20852:2:1;73722:59:0;;;20834:21:1;;;20871:18;;;20864:30;20930:34;20910:18;;;20903:62;20982:18;;73722:59:0;20650:356:1;73722:59:0;74455:16:::1;35258:2:::0;74455::::1;:16;:::i;:::-;74448:23;::::0;:4:::1;:23;:::i;:::-;74423:21;74433:10;74423:9;:21::i;:::-;:48;;74415:90;;;::::0;-1:-1:-1;;;74415:90:0;;26912:2:1;74415:90:0::1;::::0;::::1;26894:21:1::0;26951:2;26931:18;;;26924:30;26990:31;26970:18;;;26963:59;27039:18;;74415:90:0::1;26710:353:1::0;74415:90:0::1;74537:16;35258:2:::0;74537::::1;:16;:::i;:::-;74530:23;::::0;:4:::1;:23;:::i;:::-;74520:6;:33;;74512:83;;;::::0;-1:-1:-1;;;74512:83:0;;27270:2:1;74512:83:0::1;::::0;::::1;27252:21:1::0;27309:2;27289:18;;;27282:30;27348:34;27328:18;;;27321:62;-1:-1:-1;;;27399:18:1;;;27392:35;27444:19;;74512:83:0::1;27068:401:1::0;74512:83:0::1;74629:16;35258:2:::0;74629::::1;:16;:::i;:::-;74620:25;::::0;:6:::1;:25;:::i;:::-;74610:6;:35;;74602:78;;;::::0;-1:-1:-1;;;74602:78:0;;27676:2:1;74602:78:0::1;::::0;::::1;27658:21:1::0;27715:2;27695:18;;;27688:30;27754:32;27734:18;;;27727:60;27804:18;;74602:78:0::1;27474:354:1::0;74602:78:0::1;74739:46;74756:10;74768:16;74739:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;74739:46:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;:16;:46::i;:::-;74734:105;;74798:16;:33:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;74798:33:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;74798:33:0::1;74820:10;74798:33;::::0;;74734:105:::1;74906:20;74915:10;74906:8;:20::i;:::-;74905:21;74897:54;;;::::0;-1:-1:-1;;;74897:54:0;;28035:2:1;74897:54:0::1;::::0;::::1;28017:21:1::0;28074:2;28054:18;;;28047:30;-1:-1:-1;;;28093:18:1;;;28086:50;28153:18;;74897:54:0::1;27833:344:1::0;74897:54:0::1;75019:44;75029:10;75049:4;75056:6;75019:9;:44::i;:::-;75094:47;::::0;;::::1;::::0;::::1;::::0;;75105:10:::1;75094:47:::0;;;75117:15:::1;75094:47;::::0;;::::1;::::0;;;;;;;;;-1:-1:-1;75072:19:0;;;:7:::1;:19:::0;;;;;;;:69;;;;-1:-1:-1;;;;;;75072:69:0::1;-1:-1:-1::0;;;;;75072:69:0;;::::1;;::::0;;;-1:-1:-1;75072:69:0;::::1;::::0;;;::::1;::::0;;::::1;::::0;75186:27:::1;75094:47:::0;75186:19:::1;:27::i;:::-;75254:26;::::0;529:25:1;;;75261:10:0::1;::::0;75254:26:::1;::::0;517:2:1;502:18;75254:26:0::1;;;;;;;75289:93;;;;;;;;;;;;;;;;;::::0;74321:1065;-1:-1:-1;;74321:1065:0:o;66247:135::-;22610:13;:11;:13::i;:::-;-1:-1:-1;;;;;66329:20:0;;::::1;;::::0;;;:11:::1;:20;::::0;;;;:36:::1;;:45:::0;;;::::1;;-1:-1:-1::0;;;66329:45:0::1;-1:-1:-1::0;;;;66329:45:0;;::::1;::::0;;;::::1;::::0;;66247:135::o;73809:82::-;22610:13;:11;:13::i;:::-;73862:14:::1;:21:::0;;-1:-1:-1;;73862:21:0::1;73879:4;73862:21;::::0;;73809:82::o;49854:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49854:59:0;;;;-1:-1:-1;49854:59:0;;;-1:-1:-1;49854:59:0;:::o;36175:198::-;-1:-1:-1;;;;;36336:20:0;;;36255:7;36336:20;;;:13;:20;;;;;;;;:29;;;;;;;;;;;;;36175:198::o;58654:125::-;22610:13;:11;:13::i;:::-;58736:19:::1;:39:::0;58654:125::o;62508:2074::-;-1:-1:-1;;;;;62584:21:0;;62576:70;;;;-1:-1:-1;;;62576:70:0;;28384:2:1;62576:70:0;;;28366:21:1;28423:2;28403:18;;;28396:30;28462:34;28442:18;;;28435:62;-1:-1:-1;;;28513:18:1;;;28506:34;28557:19;;62576:70:0;28182:400:1;62576:70:0;62670:1;62661:6;:10;62653:61;;;;-1:-1:-1;;;62653:61:0;;28789:2:1;62653:61:0;;;28771:21:1;28828:2;28808:18;;;28801:30;28867:34;28847:18;;;28840:62;-1:-1:-1;;;28918:18:1;;;28911:36;28964:19;;62653:61:0;28587:402:1;62653:61:0;62772:47;62789:10;62801:17;62772:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62772:47:0;;;;;;;;;;;;;;;;;;;;:16;:47::i;:::-;62767:107;;62832:17;:34;;;;;;;-1:-1:-1;62832:34:0;;;;;;;;-1:-1:-1;;;;;;62832:34:0;62855:10;62832:34;;;62767:107;62938:20;62947:10;62938:8;:20::i;:::-;62937:21;62929:55;;;;-1:-1:-1;;;62929:55:0;;29196:2:1;62929:55:0;;;29178:21:1;29235:2;29215:18;;;29208:30;-1:-1:-1;;;29254:18:1;;;29247:51;29315:18;;62929:55:0;28994:345:1;62929:55:0;-1:-1:-1;;;;;63037:20:0;;62993:41;63037:20;;;:11;:20;;;;;63072:31;;63037:20;;62993:41;63037:20;;63072:31;;;:::i;:::-;;;:35;63064:76;;;;-1:-1:-1;;;63064:76:0;;29546:2:1;63064:76:0;;;29528:21:1;29585:2;29565:18;;;29558:30;29624;29604:18;;;29597:58;29672:18;;63064:76:0;29344:352:1;63064:76:0;63155:28;;;;-1:-1:-1;;;63155:28:0;;;;63147:92;;;;-1:-1:-1;;;63147:92:0;;29903:2:1;63147:92:0;;;29885:21:1;29942:2;29922:18;;;29915:30;29981:34;29961:18;;;29954:62;-1:-1:-1;;;30032:18:1;;;30025:49;30091:19;;63147:92:0;29701:415:1;63147:92:0;63248:17;63289:3;63269:16;45599:1;63269:6;:16;:::i;:::-;63268:24;;;;:::i;:::-;63248:44;-1:-1:-1;63299:19:0;63321:21;63248:44;63321:6;:21;:::i;:::-;63425:10;63411:25;;;;:13;:25;;;;;;63299:43;;-1:-1:-1;63411:25:0;;63410:26;63402:73;;;;-1:-1:-1;;;63402:73:0;;30323:2:1;63402:73:0;;;30305:21:1;30362:2;30342:18;;;30335:30;30401:34;30381:18;;;30374:62;-1:-1:-1;;;30452:18:1;;;30445:32;30494:19;;63402:73:0;30121:398:1;63402:73:0;63515:6;63490:21;63500:10;63490:9;:21::i;:::-;:31;;63482:74;;;;-1:-1:-1;;;63482:74:0;;30726:2:1;63482:74:0;;;30708:21:1;30765:2;30745:18;;;30738:30;30804:32;30784:18;;;30777:60;30854:18;;63482:74:0;30524:354:1;63482:74:0;63630:32;63654:7;63630:23;:32::i;:::-;63626:143;;;63680:81;;;;;31085:2:1;31067:21;;;31124:2;31104:18;;;31097:30;31163:34;31158:2;31143:18;;31136:62;31234:34;31229:2;31214:18;;31207:62;-1:-1:-1;;;31300:3:1;31285:19;;31278:37;31347:3;31332:19;;30883:474;63680:81:0;;;;;;;;63626:143;63777:46;63787:10;63799:7;63808:14;63777:9;:46::i;:::-;63830:50;63840:10;47574:42;63867:12;63830:9;:50::i;:::-;63932:10;63922:21;;;;:9;:21;;;;;:39;;63947:14;;63922:21;:39;;63947:14;;63922:39;:::i;:::-;;;;;;;;64043:14;64014:25;;:43;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;64121:24:0;;;;;;:15;:24;;;;;:42;;64149:14;;64121:24;:42;;64149:14;;64121:42;:::i;:::-;;;;-1:-1:-1;;;;;;;64170:23:0;;;;;;:14;:23;;;;;:41;;64197:14;;64170:23;:41;;64197:14;;64170:41;:::i;:::-;;;;-1:-1:-1;;;;;;;64278:25:0;;;;;;;:16;:25;;;;;;;;64309:89;;;;;;;64340:10;64309:89;;;;;;;;;64278:121;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;64278:121:0;;;;;;;;;;;;;;;;;;64445:87;;31574:25:1;;;31615:18;;;31608:30;;;31674:2;31654:18;;;31647:30;;;;31713:34;31708:2;31693:18;;31686:62;-1:-1:-1;;;31779:3:1;31764:19;;31757:37;64278:25:0;;64445:87;;31826:3:1;31811:19;64445:87:0;;;;;;;64544:34;;529:25:1;;;64551:10:0;;64544:34;;517:2:1;502:18;64544:34:0;;;;;;;62569:2013;;;62508:2074;;:::o;49409:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49409:57:0;-1:-1:-1;49409:57:0;:::o;23717:220::-;22610:13;:11;:13::i;:::-;-1:-1:-1;;;;;23802:22:0;::::1;23798:93;;23848:31;::::0;-1:-1:-1;;;23848:31:0;;23876:1:::1;23848:31;::::0;::::1;2382:51:1::0;2355:18;;23848:31:0::1;2236:203:1::0;23798:93:0::1;23901:28;23920:8;23901:18;:28::i;:::-;23717:220:::0;:::o;49475:59::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;49475:59:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;49475:59:0;;;-1:-1:-1;;;49475:59:0;;;;;;-1:-1:-1;49475:59:0;;:::o;64814:140::-;64871:4;-1:-1:-1;;;;;64891:17:0;;47751:42;64891:17;;:38;;-1:-1:-1;;;;;;64912:17:0;;47834:42;64912:17;64891:38;:59;;;-1:-1:-1;;;;;;64933:17:0;;47917:42;64933:17;64884:66;64814:140;-1:-1:-1;;64814:140:0:o;41583:130::-;41668:37;41677:5;41684:7;41693:5;41700:4;41668:8;:37::i;22949:166::-;20162:10;23009:7;:5;:7::i;:::-;-1:-1:-1;;;;;23009:23:0;;23005:103;;23056:40;;-1:-1:-1;;;23056:40:0;;20162:10;23056:40;;;2382:51:1;2355:18;;23056:40:0;2236:203:1;43355:487:0;43455:24;43482:25;43492:5;43499:7;43482:9;:25::i;:::-;43455:52;;-1:-1:-1;;43522:16:0;:37;43518:317;;43599:5;43580:16;:24;43576:132;;;43632:60;;-1:-1:-1;;;43632:60:0;;-1:-1:-1;;;;;7760:32:1;;43632:60:0;;;7742:51:1;7809:18;;;7802:34;;;7852:18;;;7845:34;;;7715:18;;43632:60:0;7540:345:1;43576:132:0;43751:57;43760:5;43767:7;43795:5;43776:16;:24;43802:5;43751:8;:57::i;:::-;43444:398;43355:487;;;:::o;66703:293::-;66793:7;66910:15;66928;:40;;66967:1;66928:40;;;66961:3;66947:10;:6;66956:1;66947:10;:::i;:::-;66946:18;;;;:::i;:::-;66910:58;66703:293;-1:-1:-1;;;;66703:293:0:o;38094:308::-;-1:-1:-1;;;;;38178:18:0;;38174:88;;38220:30;;-1:-1:-1;;;38220:30:0;;38247:1;38220:30;;;2382:51:1;2355:18;;38220:30:0;2236:203:1;38174:88:0;-1:-1:-1;;;;;38276:16:0;;38272:88;;38316:32;;-1:-1:-1;;;38316:32:0;;38345:1;38316:32;;;2382:51:1;2355:18;;38316:32:0;2236:203:1;38272:88:0;38370:24;38378:4;38384:2;38388:5;38370:7;:24::i;27104:120::-;26113:16;:14;:16::i;:::-;27173:5:::1;27163:15:::0;;-1:-1:-1;;27163:15:0::1;::::0;;27194:22:::1;20162:10:::0;27203:12:::1;27194:22;::::0;-1:-1:-1;;;;;2400:32:1;;;2382:51;;2370:2;2355:18;27194:22:0::1;;;;;;;27104:120::o:0;44673:89::-;44728:26;20162:10;44748:5;44728;:26::i;24097:253::-;21555:22;24248:8;;-1:-1:-1;;;;;;24267:19:0;;-1:-1:-1;;;;;24267:19:0;;;;;;;;24302:40;;24248:8;;;;;24302:40;;24171:24;;24302:40;24160:190;;24097:253;:::o;40819:211::-;-1:-1:-1;;;;;40890:21:0;;40886:91;;40935:30;;-1:-1:-1;;;40935:30:0;;40962:1;40935:30;;;2382:51:1;2355:18;;40935:30:0;2236:203:1;40886:91:0;40987:35;40995:7;41012:1;41016:5;40987:7;:35::i;:::-;40819:211;;:::o;26845:118::-;25854:19;:17;:19::i;:::-;26905:7:::1;:14:::0;;-1:-1:-1;;26905:14:0::1;26915:4;26905:14;::::0;;26935:20:::1;26942:12;20162:10:::0;;20082:98;60518:371;60707:10;60675:14;60692:26;;;:14;:26;;;;;:33;:37;;60728:1;;60692:37;:::i;:::-;60755:10;60740:26;;;;:14;:26;;;;;:37;;60675:54;;-1:-1:-1;60788:15:0;;60675:54;;60740:37;;;;;;:::i;:::-;;;;;;;;;;;:45;;:63;;;;60868:13;60814:14;:26;60829:10;-1:-1:-1;;;;;60814:26:0;-1:-1:-1;;;;;60814:26:0;;;;;;;;;;;;60841:9;60814:37;;;;;;;;:::i;:::-;;;;;;;;;;;:51;;:67;;;;60578:311;60518:371;:::o;77826:401::-;77918:6;77913:311;77934:12;;77930:16;;77913:311;;;77980:4;-1:-1:-1;;;;;77968:16:0;:5;77974:1;77968:8;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;77968:8:0;:16;77964:253;;78101:12;;78095:5;;78101:16;;78116:1;;78101:16;:::i;:::-;78095:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;78095:23:0;78084:5;78090:1;78084:8;;;;;;;;:::i;:::-;;;;;;;;;:34;;;;;-1:-1:-1;;;;;78084:34:0;;;;;-1:-1:-1;;;;;78084:34:0;;;;;;78173:5;:11;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;78173:11:0;;;;;-1:-1:-1;;;;;;78173:11:0;;;;;;-1:-1:-1;;;77826:401:0:o;77964:253::-;77948:3;;77913:311;;35930:182;35999:4;20162:10;36055:27;20162:10;36072:2;36076:5;36055:9;:27::i;:::-;-1:-1:-1;36100:4:0;;35930:182;-1:-1:-1;;;35930:182:0:o;33445:149::-;17151:20;:18;:20::i;:::-;33548:38:::1;33571:5;33578:7;33548:22;:38::i;44398:66::-:0;17151:20;:18;:20::i;25419:99::-;17151:20;:18;:20::i;:::-;25483:27:::1;:25;:27::i;22108:129::-:0;17151:20;:18;:20::i;:::-;22191:38:::1;22216:12;22191:24;:38::i;40278:213::-:0;-1:-1:-1;;;;;40349:21:0;;40345:93;;40394:32;;-1:-1:-1;;;40394:32:0;;40423:1;40394:32;;;2382:51:1;2355:18;;40394:32:0;2236:203:1;40345:93:0;40448:35;40464:1;40468:7;40477:5;40448:7;:35::i;75390:251::-;75482:4;;75495:124;75516:6;:13;75512:1;:17;75495:124;;;75564:8;-1:-1:-1;;;;;75551:21:0;:6;75558:1;75551:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;75551:21:0;;75547:65;;75596:4;75589:11;;;;;75547:65;75531:3;;75495:124;;;-1:-1:-1;75632:5:0;;75390:251;-1:-1:-1;;;75390:251:0:o;59980:459::-;60127:27;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60127:27:0;60165:34;;;60229:15;60210:16;;;;:34;;;60165:19;60255:14;;;;:18;;;60328:20;;;:24;;;60407:10;60392:26;;:14;:26;;;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59980:459::o;42564:499::-;-1:-1:-1;;;;;;;;;;;;;;;;42731:19:0;;42727:91;;42774:32;;-1:-1:-1;;;42774:32:0;;42803:1;42774:32;;;2382:51:1;2355:18;;42774:32:0;2236:203:1;42727:91:0;-1:-1:-1;;;;;42832:21:0;;42828:92;;42877:31;;-1:-1:-1;;;42877:31:0;;42905:1;42877:31;;;2382:51:1;2355:18;;42877:31:0;2236:203:1;42828:92:0;-1:-1:-1;;;;;42930:20:0;;;;;;;:13;;;:20;;;;;;;;:29;;;;;;;;;:37;;;42978:78;;;;43029:7;-1:-1:-1;;;;;43013:31:0;43022:5;-1:-1:-1;;;;;43013:31:0;;43038:5;43013:31;;;;529:25:1;;517:2;502:18;;383:177;43013:31:0;;;;;;;;42978:78;42662:401;42564:499;;;;:::o;38726:1199::-;-1:-1:-1;;;;;;;;;;;;;;;;38870:18:0;;38866:558;;39026:5;39008:1;:14;;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;38866:558:0;;-1:-1:-1;38866:558:0;;-1:-1:-1;;;;;39086:17:0;;39064:19;39086:17;;;;;;;;;;;39122:19;;;39118:117;;;39169:50;;-1:-1:-1;;;39169:50:0;;-1:-1:-1;;;;;7760:32:1;;39169:50:0;;;7742:51:1;7809:18;;;7802:34;;;7852:18;;;7845:34;;;7715:18;;39169:50:0;7540:345:1;39118:117:0;-1:-1:-1;;;;;39358:17:0;;:11;:17;;;;;;;;;;39378:19;;;;39358:39;;38866:558;-1:-1:-1;;;;;39440:16:0;;39436:439;;39606:14;;;:23;;;;;;;39436:439;;;-1:-1:-1;;;;;39824:15:0;;:11;:15;;;;;;;;;;:24;;;;;;39436:439;39907:2;-1:-1:-1;;;;;39892:25:0;39901:4;-1:-1:-1;;;;;39892:25:0;;39911:5;39892:25;;;;529::1;;517:2;502:18;;383:177;39892:25:0;;;;;;;;38801:1124;38726:1199;;;:::o;26593:108::-;26296:4;26320:7;;;26652:41;;;;-1:-1:-1;;;26652:41:0;;32175:2:1;26652:41:0;;;32157:21:1;32214:2;32194:18;;;32187:30;-1:-1:-1;;;32233:18:1;;;32226:50;32293:18;;26652:41:0;31973:344:1;26408:108:0;26296:4;26320:7;;;26478:9;26470:38;;;;-1:-1:-1;;;26470:38:0;;32524:2:1;26470:38:0;;;32506:21:1;32563:2;32543:18;;;32536:30;-1:-1:-1;;;32582:18:1;;;32575:46;32638:18;;26470:38:0;32322:340:1;17311:145:0;19144:21;18825:40;-1:-1:-1;;;18825:40:0;;;;17374:75;;17420:17;;-1:-1:-1;;;17420:17:0;;;;;;;;;;;33602:220;17151:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;33769:7:0;:15:::1;33779:5:::0;33769:7;:15:::1;:::i;:::-;-1:-1:-1::0;33795:9:0::1;::::0;::::1;:19;33807:7:::0;33795:9;:19:::1;:::i;25526:97::-:0;17151:20;:18;:20::i;:::-;25610:5:::1;25600:15:::0;;-1:-1:-1;;25600:15:0::1;::::0;;25526:97::o;22245:240::-;17151:20;:18;:20::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:186;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;565:250::-;650:1;660:113;674:6;671:1;668:13;660:113;;;750:11;;;744:18;731:11;;;724:39;696:2;689:10;660:113;;;-1:-1:-1;;807:1:1;789:16;;782:27;565:250::o;820:271::-;862:3;900:5;894:12;927:6;922:3;915:19;943:76;1012:6;1005:4;1000:3;996:14;989:4;982:5;978:16;943:76;:::i;:::-;1073:2;1052:15;-1:-1:-1;;1048:29:1;1039:39;;;;1080:4;1035:50;;820:271;-1:-1:-1;;820:271:1:o;1096:220::-;1245:2;1234:9;1227:21;1208:4;1265:45;1306:2;1295:9;1291:18;1283:6;1265:45;:::i;1321:254::-;1389:6;1397;1450:2;1438:9;1429:7;1425:23;1421:32;1418:52;;;1466:1;1463;1456:12;1418:52;1489:29;1508:9;1489:29;:::i;:::-;1479:39;1565:2;1550:18;;;;1537:32;;-1:-1:-1;;;1321:254:1:o;1772:180::-;1831:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:52;;;1900:1;1897;1890:12;1852:52;-1:-1:-1;1923:23:1;;1772:180;-1:-1:-1;1772:180:1:o;2444:127::-;2505:10;2500:3;2496:20;2493:1;2486:31;2536:4;2533:1;2526:15;2560:4;2557:1;2550:15;2576:275;2647:2;2641:9;2712:2;2693:13;;-1:-1:-1;;2689:27:1;2677:40;;2747:18;2732:34;;2768:22;;;2729:62;2726:88;;;2794:18;;:::i;:::-;2830:2;2823:22;2576:275;;-1:-1:-1;2576:275:1:o;2856:531::-;2899:5;2952:3;2945:4;2937:6;2933:17;2929:27;2919:55;;2970:1;2967;2960:12;2919:55;3006:6;2993:20;3032:18;3028:2;3025:26;3022:52;;;3054:18;;:::i;:::-;3098:55;3141:2;3122:13;;-1:-1:-1;;3118:27:1;3147:4;3114:38;3098:55;:::i;:::-;3178:2;3169:7;3162:19;3224:3;3217:4;3212:2;3204:6;3200:15;3196:26;3193:35;3190:55;;;3241:1;3238;3231:12;3190:55;3306:2;3299:4;3291:6;3287:17;3280:4;3271:7;3267:18;3254:55;3354:1;3329:16;;;3347:4;3325:27;3318:38;;;;3333:7;2856:531;-1:-1:-1;;;2856:531:1:o;3392:160::-;3457:20;;3513:13;;3506:21;3496:32;;3486:60;;3542:1;3539;3532:12;3557:686;3660:6;3668;3676;3684;3737:3;3725:9;3716:7;3712:23;3708:33;3705:53;;;3754:1;3751;3744:12;3705:53;3794:9;3781:23;3823:18;3864:2;3856:6;3853:14;3850:34;;;3880:1;3877;3870:12;3850:34;3903:50;3945:7;3936:6;3925:9;3921:22;3903:50;:::i;:::-;3893:60;;4006:2;3995:9;3991:18;3978:32;3962:48;;4035:2;4025:8;4022:16;4019:36;;;4051:1;4048;4041:12;4019:36;;4074:52;4118:7;4107:8;4096:9;4092:24;4074:52;:::i;:::-;4064:62;;;4145:38;4179:2;4168:9;4164:18;4145:38;:::i;:::-;4135:48;;4202:35;4233:2;4222:9;4218:18;4202:35;:::i;:::-;4192:45;;3557:686;;;;;;;:::o;4248:328::-;4325:6;4333;4341;4394:2;4382:9;4373:7;4369:23;4365:32;4362:52;;;4410:1;4407;4400:12;4362:52;4433:29;4452:9;4433:29;:::i;:::-;4423:39;;4481:38;4515:2;4504:9;4500:18;4481:38;:::i;:::-;4471:48;;4566:2;4555:9;4551:18;4538:32;4528:42;;4248:328;;;;;:::o;4581:658::-;4752:2;4804:21;;;4874:13;;4777:18;;;4896:22;;;4723:4;;4752:2;4975:15;;;;4949:2;4934:18;;;4723:4;5018:195;5032:6;5029:1;5026:13;5018:195;;;5097:13;;-1:-1:-1;;;;;5093:39:1;5081:52;;5188:15;;;;5153:12;;;;5129:1;5047:9;5018:195;;;-1:-1:-1;5230:3:1;;4581:658;-1:-1:-1;;;;;;4581:658:1:o;5614:728::-;5839:2;5891:21;;;5961:13;;5864:18;;;5983:22;;;5810:4;;5839:2;6024;;6042:18;;;;6083:15;;;5810:4;6126:190;6140:6;6137:1;6134:13;6126:190;;;6189:47;6232:3;6223:6;6217:13;5512:12;;-1:-1:-1;;;;;5508:38:1;5496:51;;5596:4;5585:16;;;5579:23;5563:14;;5556:47;5433:176;6189:47;6256:12;;;;6291:15;;;;6162:1;6155:9;6126:190;;;-1:-1:-1;6333:3:1;;5614:728;-1:-1:-1;;;;;;;5614:728:1:o;6600:935::-;6833:2;6885:21;;;6955:13;;6858:18;;;6977:22;;;6804:4;;6833:2;7018;;7036:18;;;;7077:15;;;6804:4;7120:389;7134:6;7131:1;7128:13;7120:389;;;7193:13;;7231:9;;7219:22;;7281:11;;;7275:18;7261:12;;;7254:40;7334:11;;;7328:18;7314:12;;;7307:40;7370:4;7414:11;;;7408:18;7394:12;;;7387:40;7456:4;7447:14;;;;7484:15;;;;7156:1;7149:9;7120:389;;7890:997;8125:2;8177:21;;;8247:13;;8150:18;;;8269:22;;;8096:4;;8125:2;8310;;8328:18;;;;8369:15;;;8096:4;8412:449;8426:6;8423:1;8420:13;8412:449;;;8485:13;;8569:9;;-1:-1:-1;;;;;8565:18:1;;;8553:31;;8628:11;;;8622:18;8618:27;8604:12;;;8597:49;8686:11;;;8680:18;8666:12;;;8659:40;8722:4;8766:11;;;8760:18;8746:12;;;8739:40;8808:4;8799:14;;;;8836:15;;;;8538:1;8441:9;8412:449;;8892:244;5512:12;;-1:-1:-1;;;;;5508:38:1;5496:51;;5596:4;5585:16;;;5579:23;5563:14;;;5556:47;9072:2;9057:18;;9084:46;5433:176;9141:1022;9234:6;9242;9295:2;9283:9;9274:7;9270:23;9266:32;9263:52;;;9311:1;9308;9301:12;9263:52;9351:9;9338:23;9380:18;9421:2;9413:6;9410:14;9407:34;;;9437:1;9434;9427:12;9407:34;9475:6;9464:9;9460:22;9450:32;;9520:7;9513:4;9509:2;9505:13;9501:27;9491:55;;9542:1;9539;9532:12;9491:55;9578:2;9565:16;9600:4;9623:2;9619;9616:10;9613:36;;;9629:18;;:::i;:::-;9675:2;9672:1;9668:10;9658:20;;9698:28;9722:2;9718;9714:11;9698:28;:::i;:::-;9760:15;;;9830:11;;;9826:20;;;9791:12;;;;9858:19;;;9855:39;;;9890:1;9887;9880:12;9855:39;9914:11;;;;9934:148;9950:6;9945:3;9942:15;9934:148;;;10016:23;10035:3;10016:23;:::i;:::-;10004:36;;9967:12;;;;10060;;;;9934:148;;;10101:5;10138:18;;;;10125:32;;-1:-1:-1;;;;;;;9141:1022:1:o;10168:254::-;10233:6;10241;10294:2;10282:9;10273:7;10269:23;10265:32;10262:52;;;10310:1;10307;10300:12;10262:52;10333:29;10352:9;10333:29;:::i;:::-;10323:39;;10381:35;10412:2;10401:9;10397:18;10381:35;:::i;:::-;10371:45;;10168:254;;;;;:::o;10879:260::-;10947:6;10955;11008:2;10996:9;10987:7;10983:23;10979:32;10976:52;;;11024:1;11021;11014:12;10976:52;11047:29;11066:9;11047:29;:::i;:::-;11037:39;;11095:38;11129:2;11118:9;11114:18;11095:38;:::i;11540:707::-;11843:3;11832:9;11825:22;11806:4;11870:46;11911:3;11900:9;11896:19;11888:6;11870:46;:::i;:::-;11964:9;11956:6;11952:22;11947:2;11936:9;11932:18;11925:50;11992:33;12018:6;12010;11992:33;:::i;:::-;-1:-1:-1;;;;;12061:32:1;;;;12056:2;12041:18;;12034:60;-1:-1:-1;;12137:14:1;;12130:22;12125:2;12110:18;;12103:50;12184:3;12169:19;;12162:35;;;;12081:3;12213:19;;;12206:35;12061:32;11984:41;-1:-1:-1;;11540:707:1:o;12252:380::-;12331:1;12327:12;;;;12374;;;12395:61;;12449:4;12441:6;12437:17;12427:27;;12395:61;12502:2;12494:6;12491:14;12471:18;12468:38;12465:161;;12548:10;12543:3;12539:20;12536:1;12529:31;12583:4;12580:1;12573:15;12611:4;12608:1;12601:15;14352:543;14454:2;14449:3;14446:11;14443:446;;;14490:1;14514:5;14511:1;14504:16;14558:4;14555:1;14545:18;14628:2;14616:10;14612:19;14609:1;14605:27;14599:4;14595:38;14664:4;14652:10;14649:20;14646:47;;;-1:-1:-1;14687:4:1;14646:47;14742:2;14737:3;14733:12;14730:1;14726:20;14720:4;14716:31;14706:41;;14797:82;14815:2;14808:5;14805:13;14797:82;;;14860:17;;;14841:1;14830:13;14797:82;;15071:1345;15197:3;15191:10;15224:18;15216:6;15213:30;15210:56;;;15246:18;;:::i;:::-;15275:97;15365:6;15325:38;15357:4;15351:11;15325:38;:::i;:::-;15319:4;15275:97;:::i;:::-;15427:4;;15484:2;15473:14;;15501:1;15496:663;;;;16203:1;16220:6;16217:89;;;-1:-1:-1;16272:19:1;;;16266:26;16217:89;-1:-1:-1;;15028:1:1;15024:11;;;15020:24;15016:29;15006:40;15052:1;15048:11;;;15003:57;16319:81;;15466:944;;15496:663;14299:1;14292:14;;;14336:4;14323:18;;-1:-1:-1;;15532:20:1;;;15650:236;15664:7;15661:1;15658:14;15650:236;;;15753:19;;;15747:26;15732:42;;15845:27;;;;15813:1;15801:14;;;;15680:19;;15650:236;;;15654:3;15914:6;15905:7;15902:19;15899:201;;;15975:19;;;15969:26;-1:-1:-1;;16058:1:1;16054:14;;;16070:3;16050:24;16046:37;16042:42;16027:58;16012:74;;15899:201;-1:-1:-1;;;;;16146:1:1;16130:14;;;16126:22;16113:36;;-1:-1:-1;15071:1345:1:o;16421:289::-;16552:3;16590:6;16584:13;16606:66;16665:6;16660:3;16653:4;16645:6;16641:17;16606:66;:::i;:::-;16688:16;;;;;16421:289;-1:-1:-1;;16421:289:1:o;16715:127::-;16776:10;16771:3;16767:20;16764:1;16757:31;16807:4;16804:1;16797:15;16831:4;16828:1;16821:15;16847:217;16887:1;16913;16903:132;;16957:10;16952:3;16948:20;16945:1;16938:31;16992:4;16989:1;16982:15;17020:4;17017:1;17010:15;16903:132;-1:-1:-1;17049:9:1;;16847:217::o;17069:402::-;17271:2;17253:21;;;17310:2;17290:18;;;17283:30;17349:34;17344:2;17329:18;;17322:62;-1:-1:-1;;;17415:2:1;17400:18;;17393:36;17461:3;17446:19;;17069:402::o;17476:128::-;17543:9;;;17564:11;;;17561:37;;;17578:18;;:::i;17609:125::-;17674:9;;;17695:10;;;17692:36;;;17708:18;;:::i;17739:399::-;17941:2;17923:21;;;17980:2;17960:18;;;17953:30;18019:34;18014:2;17999:18;;17992:62;-1:-1:-1;;;18085:2:1;18070:18;;18063:33;18128:3;18113:19;;17739:399::o;18556:127::-;18617:10;18612:3;18608:20;18605:1;18598:31;18648:4;18645:1;18638:15;18672:4;18669:1;18662:15;18688:135;18727:3;18748:17;;;18745:43;;18768:18;;:::i;:::-;-1:-1:-1;18815:1:1;18804:13;;18688:135::o;20245:400::-;20447:2;20429:21;;;20486:2;20466:18;;;20459:30;20525:34;20520:2;20505:18;;20498:62;-1:-1:-1;;;20591:2:1;20576:18;;20569:34;20635:3;20620:19;;20245:400::o;21370:168::-;21443:9;;;21474;;21491:15;;;21485:22;;21471:37;21461:71;;21512:18;;:::i;21947:402::-;22149:2;22131:21;;;22188:2;22168:18;;;22161:30;22227:34;22222:2;22207:18;;22200:62;-1:-1:-1;;;22293:2:1;22278:18;;22271:36;22339:3;22324:19;;21947:402::o;25119:416::-;25208:1;25245:5;25208:1;25259:270;25280:7;25270:8;25267:21;25259:270;;;25339:4;25335:1;25331:6;25327:17;25321:4;25318:27;25315:53;;;25348:18;;:::i;:::-;25398:7;25388:8;25384:22;25381:55;;;25418:16;;;;25381:55;25497:22;;;;25457:15;;;;25259:270;;;25263:3;25119:416;;;;;:::o;25540:806::-;25589:5;25619:8;25609:80;;-1:-1:-1;25660:1:1;25674:5;;25609:80;25708:4;25698:76;;-1:-1:-1;25745:1:1;25759:5;;25698:76;25790:4;25808:1;25803:59;;;;25876:1;25871:130;;;;25783:218;;25803:59;25833:1;25824:10;;25847:5;;;25871:130;25908:3;25898:8;25895:17;25892:43;;;25915:18;;:::i;:::-;-1:-1:-1;;25971:1:1;25957:16;;25986:5;;25783:218;;26085:2;26075:8;26072:16;26066:3;26060:4;26057:13;26053:36;26047:2;26037:8;26034:16;26029:2;26023:4;26020:12;26016:35;26013:77;26010:159;;;-1:-1:-1;26122:19:1;;;26154:5;;26010:159;26201:34;26226:8;26220:4;26201:34;:::i;:::-;26271:6;26267:1;26263:6;26259:19;26250:7;26247:32;26244:58;;;26282:18;;:::i;:::-;26320:20;;25540:806;-1:-1:-1;;;25540:806:1:o;26351:140::-;26409:5;26438:47;26479:4;26469:8;26465:19;26459:4;26438:47;:::i;31841:127::-;31902:10;31897:3;31893:20;31890:1;31883:31;31933:4;31930:1;31923:15;31957:4;31954:1;31947:15
Swarm Source
ipfs://932f37d358232bb62c2eff4b7144fe8491f4cf9c66b861b793e88d8132345882
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.