Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
xKNC
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-08 */ // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts-ethereum-package/contracts/Initializable.sol pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @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 GSN 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. */ contract ContextUpgradeSafe is Initializable { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20MinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Initializable, ContextUpgradeSafe, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name, string memory symbol) internal initializer { __Context_init_unchained(); __ERC20_init_unchained(name, symbol); } function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * 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 returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } uint256[44] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/Pausable.sol pragma solidity ^0.6.0; /** * @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. */ contract PausableUpgradeSafe is Initializable, ContextUpgradeSafe { /** * @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 initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } // File: @openzeppelin/contracts-ethereum-package/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.6.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuardUpgradeSafe is Initializable { bool private _notEntered; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { // Storing an initial 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 percetange 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. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } uint256[49] private __gap; } // File: contracts/interface/IKyberNetworkProxy.sol pragma solidity 0.6.2; interface IKyberNetworkProxy { function getExpectedRate(ERC20 src, ERC20 dest, uint srcQty) external view returns (uint expectedRate, uint slippageRate); function swapEtherToToken(ERC20 token, uint minConversionRate) external payable returns(uint); function swapTokenToEther(ERC20 token, uint tokenQty, uint minRate) external payable returns(uint); function swapTokenToToken(ERC20 src, uint srcAmount, ERC20 dest, uint minRate) external returns(uint); } // File: contracts/interface/IKyberStaking.sol pragma solidity 0.6.2; interface IKyberStaking { function deposit(uint256 amount) external; function withdraw(uint256 amount) external; function getLatestStakeBalance(address staker) external view returns(uint); } // File: contracts/interface/IKyberDAO.sol pragma solidity 0.6.2; interface IKyberDAO { function vote(uint256 campaignID, uint256 option) external; } // File: contracts/interface/IKyberFeeHandler.sol pragma solidity 0.6.2; interface IKyberFeeHandler { function claimStakerReward( address staker, uint256 epoch ) external returns(uint256 amountWei); } // File: contracts/xKNC.sol pragma solidity 0.6.2; /* * xKNC KyberDAO Pool Token * Communal Staking Pool with Stated Governance Position */ contract xKNC is Initializable, ERC20, OwnableUpgradeSafe, PausableUpgradeSafe, ReentrancyGuardUpgradeSafe { using SafeMath for uint256; using SafeERC20 for ERC20; address private constant ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; ERC20 private knc; IKyberDAO private kyberDao; IKyberStaking private kyberStaking; IKyberNetworkProxy private kyberProxy; IKyberFeeHandler[] private kyberFeeHandlers; address[] private kyberFeeTokens; uint256 private constant PERCENT = 100; uint256 private constant MAX_UINT = 2**256 - 1; uint256 private constant INITIAL_SUPPLY_MULTIPLIER = 10; uint256 private withdrawableEthFees; uint256 private withdrawableKncFees; string public mandate; address private manager; address private manager2; struct FeeDivisors { uint256 mintFee; uint256 burnFee; uint256 claimFee; } FeeDivisors public feeDivisors; event FeeDivisorsSet(uint256 mintFee, uint256 burnFee, uint256 claimFee); enum FeeTypes {MINT, BURN, CLAIM} function initialize( string memory _symbol, string memory _mandate, IKyberStaking _kyberStaking, IKyberNetworkProxy _kyberProxy, ERC20 _knc, IKyberDAO _kyberDao, uint256 mintFee, uint256 burnFee, uint256 claimFee ) public initializer { __Context_init_unchained(); __Ownable_init_unchained(); __ReentrancyGuard_init_unchained(); __ERC20_init_unchained("xKNC", _symbol); mandate = _mandate; kyberStaking = _kyberStaking; kyberProxy = _kyberProxy; knc = _knc; kyberDao = _kyberDao; _setFeeDivisors(mintFee, burnFee, claimFee); } /* * @notice Called by users buying with ETH * @dev Swaps ETH for KNC, deposits to Staking contract * @dev: Mints pro rata xKNC tokens * @param: kyberProxy.getExpectedRate(eth => knc) */ function mint(uint256 minRate) external payable whenNotPaused { require(msg.value > 0, "Must send eth with tx"); // ethBalBefore checked in case of eth still waiting for exch to KNC uint256 ethBalBefore = getFundEthBalanceWei().sub(msg.value); uint256 fee = _administerEthFee(FeeTypes.MINT, ethBalBefore); uint256 ethValueForKnc = msg.value.sub(fee); uint256 kncBalanceBefore = getFundKncBalanceTwei(); _swapEtherToKnc(ethValueForKnc, minRate); _deposit(getAvailableKncBalanceTwei()); uint256 mintAmount = _calculateMintAmount(kncBalanceBefore); return super._mint(msg.sender, mintAmount); } /* * @notice Called by users buying with KNC * @notice Users must submit ERC20 approval before calling * @dev Deposits to Staking contract * @dev: Mints pro rata xKNC tokens * @param: Number of KNC to contribue */ function mintWithToken(uint256 kncAmountTwei) external whenNotPaused { require(kncAmountTwei > 0, "Must contribute KNC"); knc.safeTransferFrom(msg.sender, address(this), kncAmountTwei); uint256 kncBalanceBefore = getFundKncBalanceTwei(); _administerKncFee(kncAmountTwei, FeeTypes.MINT); _deposit(getAvailableKncBalanceTwei()); uint256 mintAmount = _calculateMintAmount(kncBalanceBefore); return super._mint(msg.sender, mintAmount); } /* * @notice Called by users burning their xKNC * @dev Calculates pro rata KNC and redeems from Staking contract * @dev: Exchanges for ETH if necessary and pays out to caller * @param tokensToRedeem * @param redeemForKnc bool: if true, redeem for KNC; otherwise ETH * @param kyberProxy.getExpectedRate(knc => eth) */ function burn( uint256 tokensToRedeemTwei, bool redeemForKnc, uint256 minRate ) external nonReentrant { require( balanceOf(msg.sender) >= tokensToRedeemTwei, "Insufficient balance" ); uint256 proRataKnc = getFundKncBalanceTwei().mul(tokensToRedeemTwei).div(totalSupply()); _withdraw(proRataKnc); super._burn(msg.sender, tokensToRedeemTwei); if (redeemForKnc) { uint256 fee = _administerKncFee(proRataKnc, FeeTypes.BURN); knc.safeTransfer(msg.sender, proRataKnc.sub(fee)); } else { // safeguard to not overcompensate _burn sender in case eth still awaiting for exch to KNC uint256 ethBalBefore = getFundEthBalanceWei(); kyberProxy.swapTokenToEther( knc, getAvailableKncBalanceTwei(), minRate ); _administerEthFee(FeeTypes.BURN, ethBalBefore); uint256 valToSend = getFundEthBalanceWei().sub(ethBalBefore); (bool success, ) = msg.sender.call.value(valToSend)(""); require(success, "Burn transfer failed"); } } /* * @notice Calculates proportional issuance according to KNC contribution * @notice Fund starts at ratio of INITIAL_SUPPLY_MULTIPLIER/1 == xKNC supply/KNC balance * and approaches 1/1 as rewards accrue in KNC * @param kncBalanceBefore used to determine ratio of incremental to current KNC */ function _calculateMintAmount(uint256 kncBalanceBefore) private view returns (uint256 mintAmount) { uint256 kncBalanceAfter = getFundKncBalanceTwei(); if (totalSupply() == 0) return kncBalanceAfter.mul(INITIAL_SUPPLY_MULTIPLIER); mintAmount = (kncBalanceAfter.sub(kncBalanceBefore)) .mul(totalSupply()) .div(kncBalanceBefore); } /* * @notice KyberDAO deposit */ function _deposit(uint256 amount) private { kyberStaking.deposit(amount); } /* * @notice KyberDAO withdraw */ function _withdraw(uint256 amount) private { kyberStaking.withdraw(amount); } /* * @notice Vote on KyberDAO campaigns * @dev Admin calls with relevant params for each campaign in an epoch * @param DAO campaign ID * @param Choice of voting option */ function vote(uint256 campaignID, uint256 option) external onlyOwnerOrManager { kyberDao.vote(campaignID, option); } /* * @notice Claim reward from previous epoch * @notice All fee handlers should be called at once * @dev Admin calls with relevant params * @dev ETH/other asset rewards swapped into KNC * @param epoch - KyberDAO epoch * @param feeHandlerIndices - indices of feeHandler contract to claim from * @param maxAmountsToSell - sellAmount above which slippage would be too high * and rewards would redirected into KNC in multiple trades * @param minRates - kyberProxy.getExpectedRate(eth/token => knc) */ function claimReward( uint256 epoch, uint256[] calldata feeHandlerIndices, uint256[] calldata maxAmountsToSell, uint256[] calldata minRates ) external onlyOwnerOrManager { require( feeHandlerIndices.length == maxAmountsToSell.length, "Arrays must be equal length" ); require( maxAmountsToSell.length == minRates.length, "Arrays must be equal length" ); uint256 ethBalBefore = getFundEthBalanceWei(); for (uint256 i = 0; i < feeHandlerIndices.length; i++) { kyberFeeHandlers[i].claimStakerReward(address(this), epoch); if (kyberFeeTokens[i] == ETH_ADDRESS) { _administerEthFee(FeeTypes.CLAIM, ethBalBefore); } _unwindRewards( feeHandlerIndices[i], maxAmountsToSell[i], minRates[i] ); } _deposit(getAvailableKncBalanceTwei()); } /* * @notice Called when rewards size is too big for the one trade executed by `claimReward` * @param feeHandlerIndices - index of feeHandler previously claimed from * @param maxAmountsToSell - sellAmount above which slippage would be too high * and rewards would redirected into KNC in multiple trades * @param minRates - kyberProxy.getExpectedRate(eth/token => knc) */ function unwindRewards( uint256[] calldata feeHandlerIndices, uint256[] calldata maxAmountsToSell, uint256[] calldata minRates ) external onlyOwnerOrManager { for (uint256 i = 0; i < feeHandlerIndices.length; i++) { _unwindRewards( feeHandlerIndices[i], maxAmountsToSell[i], minRates[i] ); } _deposit(getAvailableKncBalanceTwei()); } /* * @notice Exchanges reward tokens (ETH, etc) for KNC */ function _unwindRewards( uint256 feeHandlerIndex, uint256 maxAmountToSell, uint256 minRate ) private { address rewardTokenAddress = kyberFeeTokens[feeHandlerIndex]; uint256 amountToSell; if (rewardTokenAddress == ETH_ADDRESS) { uint256 ethBal = getFundEthBalanceWei(); if (maxAmountToSell < ethBal) { amountToSell = maxAmountToSell; } else { amountToSell = ethBal; } _swapEtherToKnc(amountToSell, minRate); } else { uint256 tokenBal = IERC20(rewardTokenAddress).balanceOf(address(this)); if (maxAmountToSell < tokenBal) { amountToSell = maxAmountToSell; } else { amountToSell = tokenBal; } uint256 kncBalanceBefore = getAvailableKncBalanceTwei(); _swapTokenToKnc(rewardTokenAddress, amountToSell, minRate); uint256 kncBalanceAfter = getAvailableKncBalanceTwei(); _administerKncFee( kncBalanceAfter.sub(kncBalanceBefore), FeeTypes.CLAIM ); } } function _swapEtherToKnc(uint256 amount, uint256 minRate) private { kyberProxy.swapEtherToToken.value(amount)(knc, minRate); } function _swapTokenToKnc( address fromAddress, uint256 amount, uint256 minRate ) private { kyberProxy.swapTokenToToken(ERC20(fromAddress), amount, knc, minRate); } /* * @notice Returns ETH balance belonging to the fund */ function getFundEthBalanceWei() public view returns (uint256) { return address(this).balance.sub(withdrawableEthFees); } /* * @notice Returns KNC balance staked to DAO */ function getFundKncBalanceTwei() public view returns (uint256) { return kyberStaking.getLatestStakeBalance(address(this)); } /* * @notice Returns KNC balance available to stake */ function getAvailableKncBalanceTwei() public view returns (uint256) { return knc.balanceOf(address(this)).sub(withdrawableKncFees); } function _administerEthFee(FeeTypes _type, uint256 ethBalBefore) private returns (uint256 fee) { uint256 feeRate = getFeeRate(_type); if (feeRate == 0) return 0; fee = (getFundEthBalanceWei().sub(ethBalBefore)).div(feeRate); withdrawableEthFees = withdrawableEthFees.add(fee); } function _administerKncFee(uint256 _kncAmount, FeeTypes _type) private returns (uint256 fee) { uint256 feeRate = getFeeRate(_type); if (feeRate == 0) return 0; fee = _kncAmount.div(feeRate); withdrawableKncFees = withdrawableKncFees.add(fee); } function getFeeRate(FeeTypes _type) public view returns (uint256) { if (_type == FeeTypes.MINT) return feeDivisors.mintFee; if (_type == FeeTypes.BURN) return feeDivisors.burnFee; if (_type == FeeTypes.CLAIM) return feeDivisors.claimFee; } /* * @notice Called on initial deployment and on the addition of new fee handlers * @param Address of KyberFeeHandler contract * @param Address of underlying rewards token */ function addKyberFeeHandler( address _kyberfeeHandlerAddress, address _tokenAddress ) external onlyOwnerOrManager { kyberFeeHandlers.push(IKyberFeeHandler(_kyberfeeHandlerAddress)); kyberFeeTokens.push(_tokenAddress); if (_tokenAddress != ETH_ADDRESS) { _approveKyberProxyContract(_tokenAddress, false); } } /* UTILS */ /* * @notice Called by admin on deployment * @dev Approves Kyber Staking contract to deposit KNC * @param Pass _reset as true if resetting allowance to zero */ function approveStakingContract(bool _reset) external onlyOwnerOrManager { uint256 amount = _reset ? 0 : MAX_UINT; knc.approve(address(kyberStaking), amount); } /* * @notice Called by admin on deployment for KNC * @dev Approves Kyber Proxy contract to trade KNC * @param Token to approve on proxy contract * @param Pass _reset as true if resetting allowance to zero */ function approveKyberProxyContract(address _token, bool _reset) external onlyOwnerOrManager { _approveKyberProxyContract(_token, _reset); } function _approveKyberProxyContract(address _token, bool _reset) private { uint256 amount = _reset ? 0 : MAX_UINT; IERC20(_token).approve(address(kyberProxy), amount); } /* * @notice Called by admin on deployment * @dev (1 / feeDivisor) = % fee on mint, burn, ETH claims * @dev ex: A feeDivisor of 334 suggests a fee of 0.3% * @param feeDivisors[mint, burn, claim]: */ function setFeeDivisors( uint256 _mintFee, uint256 _burnFee, uint256 _claimFee ) external onlyOwner { _setFeeDivisors(_mintFee, _burnFee, _claimFee); } function _setFeeDivisors( uint256 _mintFee, uint256 _burnFee, uint256 _claimFee ) private { require( _mintFee >= 100 || _mintFee == 0, "Mint fee must be zero or equal to or less than 1%" ); require(_burnFee >= 100, "Burn fee must be equal to or less than 1%"); require(_claimFee >= 10, "Claim fee must be less than 10%"); feeDivisors.mintFee = _mintFee; feeDivisors.burnFee = _burnFee; feeDivisors.claimFee = _claimFee; emit FeeDivisorsSet(_mintFee, _burnFee, _claimFee); } function withdrawFees() external onlyOwner { uint256 ethFees = withdrawableEthFees; uint256 kncFees = withdrawableKncFees; withdrawableEthFees = 0; withdrawableKncFees = 0; (bool success, ) = msg.sender.call.value(ethFees)(""); require(success, "Burn transfer failed"); knc.safeTransfer(owner(), kncFees); } function setManager(address _manager) external onlyOwner { manager = _manager; } function setManager2(address _manager2) external onlyOwner { manager2 = _manager2; } function pause() external onlyOwnerOrManager { _pause(); } function unpause() external onlyOwnerOrManager { _unpause(); } modifier onlyOwnerOrManager { require( msg.sender == owner() || msg.sender == manager || msg.sender == manager2, "Non-admin caller" ); _; } /* * @notice Fallback to accommodate claimRewards function */ receive() external payable { require(msg.sender != tx.origin, "Errant ETH deposit"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":"mintFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claimFee","type":"uint256"}],"name":"FeeDivisorsSet","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":"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"_kyberfeeHandlerAddress","type":"address"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"addKyberFeeHandler","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":"_token","type":"address"},{"internalType":"bool","name":"_reset","type":"bool"}],"name":"approveKyberProxyContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_reset","type":"bool"}],"name":"approveStakingContract","outputs":[],"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":"tokensToRedeemTwei","type":"uint256"},{"internalType":"bool","name":"redeemForKnc","type":"bool"},{"internalType":"uint256","name":"minRate","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256[]","name":"feeHandlerIndices","type":"uint256[]"},{"internalType":"uint256[]","name":"maxAmountsToSell","type":"uint256[]"},{"internalType":"uint256[]","name":"minRates","type":"uint256[]"}],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeDivisors","outputs":[{"internalType":"uint256","name":"mintFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"claimFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableKncBalanceTwei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum xKNC.FeeTypes","name":"_type","type":"uint8"}],"name":"getFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundEthBalanceWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFundKncBalanceTwei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_mandate","type":"string"},{"internalType":"contract IKyberStaking","name":"_kyberStaking","type":"address"},{"internalType":"contract IKyberNetworkProxy","name":"_kyberProxy","type":"address"},{"internalType":"contract ERC20","name":"_knc","type":"address"},{"internalType":"contract IKyberDAO","name":"_kyberDao","type":"address"},{"internalType":"uint256","name":"mintFee","type":"uint256"},{"internalType":"uint256","name":"burnFee","type":"uint256"},{"internalType":"uint256","name":"claimFee","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mandate","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"minRate","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"kncAmountTwei","type":"uint256"}],"name":"mintWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"},{"internalType":"uint256","name":"_claimFee","type":"uint256"}],"name":"setFeeDivisors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_manager2","type":"address"}],"name":"setManager2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feeHandlerIndices","type":"uint256[]"},{"internalType":"uint256[]","name":"maxAmountsToSell","type":"uint256[]"},{"internalType":"uint256[]","name":"minRates","type":"uint256[]"}],"name":"unwindRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"campaignID","type":"uint256"},{"internalType":"uint256","name":"option","type":"uint256"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50613a57806100206000396000f3fe60806040526004361061021e5760003560e01c80637c70fb5711610123578063a9059cbb116100ab578063d0ebdbe71161006f578063d0ebdbe714610b15578063dd62ed3e14610b48578063df22db8814610b83578063e7654b3c14610bbb578063f2fde38b14610bf15761026f565b8063a9059cbb14610952578063ad4258bd1461098b578063b384abef146109a0578063b3eaff8b146109d0578063c4ede67d146109fa5761026f565b806395602675116100f257806395602675146107b057806395d89b41146107c5578063a0712d68146107da578063a457c2d7146107f7578063a620daef146108305761026f565b80637c70fb571461070a5780638456cb59146107375780638bea72fb1461074c5780638da5cb5b1461077f5761026f565b806345d7bf32116101a65780635793e155116101755780635793e1551461063f5780635c975abb1461067a578063629c577e1461068f57806370a08231146106c2578063715018a6146106f55761026f565b806345d7bf3214610458578063476343ee146105c357806351be62fa146105d8578063544e3a5b146106135761026f565b806323b872dd116101ed57806323b872dd14610387578063313ce567146103ca57806339509351146103f557806339b1b96d1461042e5780633f4ba83a146104435761026f565b806306fdde0314610274578063095ea7b3146102fe57806318160ddd1461034b57806320cbf72c146103725761026f565b3661026f573332141561026d576040805162461bcd60e51b8152602060048201526012602482015271115c9c985b9d081155120819195c1bdcda5d60721b604482015290519081900360640190fd5b005b600080fd5b34801561028057600080fd5b50610289610c24565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c35781810151838201526020016102ab565b50505050905090810190601f1680156102f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030a57600080fd5b506103376004803603604081101561032157600080fd5b506001600160a01b038135169060200135610cbb565b604080519115158252519081900360200190f35b34801561035757600080fd5b50610360610cd9565b60408051918252519081900360200190f35b34801561037e57600080fd5b50610360610cdf565b34801561039357600080fd5b50610337600480360360608110156103aa57600080fd5b506001600160a01b03813581169160208101359091169060400135610d75565b3480156103d657600080fd5b506103df610e02565b6040805160ff9092168252519081900360200190f35b34801561040157600080fd5b506103376004803603604081101561041857600080fd5b506001600160a01b038135169060200135610e0b565b34801561043a57600080fd5b50610289610e5f565b34801561044f57600080fd5b5061026d610eee565b34801561046457600080fd5b5061026d600480360361012081101561047c57600080fd5b810190602081018135600160201b81111561049657600080fd5b8201836020820111156104a857600080fd5b803590602001918460018302840111600160201b831117156104c957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561051b57600080fd5b82018360208201111561052d57600080fd5b803590602001918460018302840111600160201b8311171561054e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b0383358116945060208401358116936040810135821693506060810135909116915060808101359060a08101359060c00135610f84565b3480156105cf57600080fd5b5061026d6110db565b3480156105e457600080fd5b5061026d600480360360408110156105fb57600080fd5b506001600160a01b0381351690602001351515611206565b34801561061f57600080fd5b5061026d6004803603602081101561063657600080fd5b503515156112a0565b34801561064b57600080fd5b5061026d6004803603604081101561066257600080fd5b506001600160a01b03813581169160200135166113cb565b34801561068657600080fd5b50610337611507565b34801561069b57600080fd5b506106a4611510565b60408051938452602084019290925282820152519081900360600190f35b3480156106ce57600080fd5b50610360600480360360208110156106e557600080fd5b50356001600160a01b031661151f565b34801561070157600080fd5b5061026d61153e565b34801561071657600080fd5b506103606004803603602081101561072d57600080fd5b503560ff166115e0565b34801561074357600080fd5b5061026d61163b565b34801561075857600080fd5b5061026d6004803603602081101561076f57600080fd5b50356001600160a01b03166116cf565b34801561078b57600080fd5b5061079461174a565b604080516001600160a01b039092168252519081900360200190f35b3480156107bc57600080fd5b50610360611759565b3480156107d157600080fd5b50610289611771565b61026d600480360360208110156107f057600080fd5b50356117d2565b34801561080357600080fd5b506103376004803603604081101561081a57600080fd5b506001600160a01b0381351690602001356118ef565b34801561083c57600080fd5b5061026d6004803603608081101561085357600080fd5b81359190810190604081016020820135600160201b81111561087457600080fd5b82018360208201111561088657600080fd5b803590602001918460208302840111600160201b831117156108a757600080fd5b919390929091602081019035600160201b8111156108c457600080fd5b8201836020820111156108d657600080fd5b803590602001918460208302840111600160201b831117156108f757600080fd5b919390929091602081019035600160201b81111561091457600080fd5b82018360208201111561092657600080fd5b803590602001918460208302840111600160201b8311171561094757600080fd5b50909250905061195d565b34801561095e57600080fd5b506103376004803603604081101561097557600080fd5b506001600160a01b038135169060200135611bed565b34801561099757600080fd5b50610360611c01565b3480156109ac57600080fd5b5061026d600480360360408110156109c357600080fd5b5080359060200135611c7e565b3480156109dc57600080fd5b5061026d600480360360208110156109f357600080fd5b5035611d73565b348015610a0657600080fd5b5061026d60048036036060811015610a1d57600080fd5b810190602081018135600160201b811115610a3757600080fd5b820183602082011115610a4957600080fd5b803590602001918460208302840111600160201b83111715610a6a57600080fd5b919390929091602081019035600160201b811115610a8757600080fd5b820183602082011115610a9957600080fd5b803590602001918460208302840111600160201b83111715610aba57600080fd5b919390929091602081019035600160201b811115610ad757600080fd5b820183602082011115610ae957600080fd5b803590602001918460208302840111600160201b83111715610b0a57600080fd5b509092509050611e62565b348015610b2157600080fd5b5061026d60048036036020811015610b3857600080fd5b50356001600160a01b0316611f42565b348015610b5457600080fd5b5061036060048036036040811015610b6b57600080fd5b506001600160a01b0381358116916020013516611fbd565b348015610b8f57600080fd5b5061026d60048036036060811015610ba657600080fd5b50803590602081013515159060400135611fe8565b348015610bc757600080fd5b5061026d60048036036060811015610bde57600080fd5b50803590602081013590604001356122a8565b348015610bfd57600080fd5b5061026d60048036036020811015610c1457600080fd5b50356001600160a01b031661230b565b60688054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb05780601f10610c8557610100808354040283529160200191610cb0565b820191906000526020600020905b815481529060010190602001808311610c9357829003601f168201915b505050505090505b90565b6000610ccf610cc8612404565b8484612408565b5060015b92915050565b60675490565b6101345461012d54604080516370a0823160e01b81523060048201529051600093610d709390926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015610d3857600080fd5b505afa158015610d4c573d6000803e3d6000fd5b505050506040513d6020811015610d6257600080fd5b50519063ffffffff6124f416565b905090565b6000610d8284848461253d565b610df884610d8e612404565b610df385604051806060016040528060288152602001613899602891396001600160a01b038a16600090815260666020526040812090610dcc612404565b6001600160a01b03168152602081019190915260400160002054919063ffffffff6126a616565b612408565b5060019392505050565b606a5460ff1690565b6000610ccf610e18612404565b84610df38560666000610e29612404565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61273d16565b610135805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610ee65780601f10610ebb57610100808354040283529160200191610ee6565b820191906000526020600020905b815481529060010190602001808311610ec957829003601f168201915b505050505081565b610ef661174a565b6001600160a01b0316336001600160a01b03161480610f205750610136546001600160a01b031633145b80610f365750610137546001600160a01b031633145b610f7a576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b610f82612797565b565b600054610100900460ff1680610f9d5750610f9d612835565b80610fab575060005460ff16155b610fe65760405162461bcd60e51b815260040180806020018281038252602e8152602001806138e1602e913960400191505060405180910390fd5b600054610100900460ff16158015611011576000805460ff1961ff0019909116610100171660011790555b61101961283b565b6110216128dc565b6110296129d5565b61104f60405180604001604052806004815260200163784b4e4360e01b8152508b612a83565b8851611063906101359060208c019061372c565b5061012f80546001600160a01b03808b166001600160a01b03199283161790925561013080548a841690831617905561012d805489841690831617905561012e8054928816929091169190911790556110bd848484612b5b565b80156110cf576000805461ff00191690555b50505050505050505050565b6110e3612404565b6097546001600160a01b03908116911614611133576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b610133805461013480546000938490559083905560405191929091339084908381818185875af1925050503d806000811461118a576040519150601f19603f3d011682016040523d82523d6000602084013e61118f565b606091505b50509050806111dc576040805162461bcd60e51b8152602060048201526014602482015273109d5c9b881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b6112016111e761174a565b61012d546001600160a01b0316908463ffffffff612c9116565b505050565b61120e61174a565b6001600160a01b0316336001600160a01b031614806112385750610136546001600160a01b031633145b8061124e5750610137546001600160a01b031633145b611292576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61129c8282612ce3565b5050565b6112a861174a565b6001600160a01b0316336001600160a01b031614806112d25750610136546001600160a01b031633145b806112e85750610137546001600160a01b031633145b61132c576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60008161133b5760001961133e565b60005b61012d5461012f546040805163095ea7b360e01b81526001600160a01b03928316600482015260248101859052905193945091169163095ea7b3916044808201926020929091908290030181600087803b15801561139b57600080fd5b505af11580156113af573d6000803e3d6000fd5b505050506040513d60208110156113c557600080fd5b50505050565b6113d361174a565b6001600160a01b0316336001600160a01b031614806113fd5750610136546001600160a01b031633145b806114135750610137546001600160a01b031633145b611457576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b610131805460018181019092557fbd987ad6ccdb7c7567f7335ea839f95dc944431abcf935b6924f70215963db730180546001600160a01b038086166001600160a01b031992831617909255610132805493840181556000527fc53bdfd4aa1ab65dfdaf681ca6bda958ae4a123d4ed68c4277796592280e7835909201805491841691909216811790915573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461129c5761129c816000612ce3565b60c95460ff1690565b610138546101395461013a5483565b6001600160a01b0381166000908152606560205260409020545b919050565b611546612404565b6097546001600160a01b03908116911614611596576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b6000808260028111156115ef57fe5b14156115ff575061013854611539565b600182600281111561160d57fe5b141561161d575061013954611539565b600282600281111561162b57fe5b1415611539575061013a54611539565b61164361174a565b6001600160a01b0316336001600160a01b0316148061166d5750610136546001600160a01b031633145b806116835750610137546001600160a01b031633145b6116c7576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b610f82612d80565b6116d7612404565b6097546001600160a01b03908116911614611727576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b61013780546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031690565b6000610d7061013354476124f490919063ffffffff16565b60698054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb05780601f10610c8557610100808354040283529160200191610cb0565b60c95460ff161561181d576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000341161186a576040805162461bcd60e51b815260206004820152601560248201527409aeae6e840e6cadcc840cae8d040eed2e8d040e8f605b1b604482015290519081900360640190fd5b600061188434611878611759565b9063ffffffff6124f416565b90506000611893600083612e01565b905060006118a7348363ffffffff6124f416565b905060006118b3611c01565b90506118bf8286612e50565b6118cf6118ca610cdf565b612ed8565b60006118da82612f3a565b90506118e63382612f8b565b50505050505b50565b6000610ccf6118fc612404565b84610df3856040518060600160405280602581526020016139fd6025913960666000611926612404565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff6126a616565b61196561174a565b6001600160a01b0316336001600160a01b0316148061198f5750610136546001600160a01b031633145b806119a55750610137546001600160a01b031633145b6119e9576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b848314611a3d576040805162461bcd60e51b815260206004820152601b60248201527f417272617973206d75737420626520657175616c206c656e6774680000000000604482015290519081900360640190fd5b828114611a91576040805162461bcd60e51b815260206004820152601b60248201527f417272617973206d75737420626520657175616c206c656e6774680000000000604482015290519081900360640190fd5b6000611a9b611759565b905060005b86811015611bd7576101318181548110611ab657fe5b6000918252602080832090910154604080516353fa2eb760e01b8152306004820152602481018e905290516001600160a01b03909216936353fa2eb79360448084019491939192918390030190829087803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b505050506040513d6020811015611b3e57600080fd5b5050610132805473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee919083908110611b6657fe5b6000918252602090912001546001600160a01b03161415611b8e57611b8c600283612e01565b505b611bcf888883818110611b9d57fe5b90506020020135878784818110611bb057fe5b90506020020135868685818110611bc357fe5b90506020020135613089565b600101611aa0565b50611be36118ca610cdf565b5050505050505050565b6000610ccf611bfa612404565b848461253d565b61012f546040805163072b77f160e01b815230600482015290516000926001600160a01b03169163072b77f1916024808301926020929190829003018186803b158015611c4d57600080fd5b505afa158015611c61573d6000803e3d6000fd5b505050506040513d6020811015611c7757600080fd5b5051905090565b611c8661174a565b6001600160a01b0316336001600160a01b03161480611cb05750610136546001600160a01b031633145b80611cc65750610137546001600160a01b031633145b611d0a576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61012e546040805163b384abef60e01b8152600481018590526024810184905290516001600160a01b039092169163b384abef9160448082019260009290919082900301818387803b158015611d5f57600080fd5b505af11580156118e6573d6000803e3d6000fd5b60c95460ff1615611dbe576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60008111611e09576040805162461bcd60e51b81526020600482015260136024820152724d75737420636f6e74726962757465204b4e4360681b604482015290519081900360640190fd5b61012d54611e28906001600160a01b031633308463ffffffff6131cf16565b6000611e32611c01565b9050611e3f826000613229565b50611e4b6118ca610cdf565b6000611e5682612f3a565b90506112013382612f8b565b611e6a61174a565b6001600160a01b0316336001600160a01b03161480611e945750610136546001600160a01b031633145b80611eaa5750610137546001600160a01b031633145b611eee576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60005b85811015611f3657611f2e878783818110611f0857fe5b90506020020135868684818110611f1b57fe5b90506020020135858585818110611bc357fe5b600101611ef1565b506118e66118ca610cdf565b611f4a612404565b6097546001600160a01b03908116911614611f9a576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b61013680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b60fb5460ff1661203f576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60fb805460ff19169055826120533361151f565b101561209d576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b60006120ce6120aa610cd9565b6120c2866120b6611c01565b9063ffffffff61327816565b9063ffffffff6132d116565b90506120d981613313565b6120e33385613361565b821561212c5760006120f6826001613229565b90506121263361210c848463ffffffff6124f416565b61012d546001600160a01b0316919063ffffffff612c9116565b50612295565b6000612136611759565b6101305461012d549192506001600160a01b0390811691633bba21dc911661215c610cdf565b866040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b031681526020018381526020018281526020019350505050602060405180830381600087803b1580156121b357600080fd5b505af11580156121c7573d6000803e3d6000fd5b505050506040513d60208110156121dd57600080fd5b506121eb9050600182612e01565b5060006121fa82611878611759565b604051909150600090339083908381818185875af1925050503d806000811461223f576040519150601f19603f3d011682016040523d82523d6000602084013e612244565b606091505b5050905080612291576040805162461bcd60e51b8152602060048201526014602482015273109d5c9b881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b5050505b505060fb805460ff191660011790555050565b6122b0612404565b6097546001600160a01b03908116911614612300576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b611201838383612b5b565b612313612404565b6097546001600160a01b03908116911614612363576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b6001600160a01b0381166123a85760405162461bcd60e51b815260040180806020018281038252602681526020018061380a6026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b03831661244d5760405162461bcd60e51b815260040180806020018281038252602481526020018061397e6024913960400191505060405180910390fd5b6001600160a01b0382166124925760405162461bcd60e51b81526004018080602001828103825260228152602001806138306022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600061253683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506126a6565b9392505050565b6001600160a01b0383166125825760405162461bcd60e51b81526004018080602001828103825260258152602001806139306025913960400191505060405180910390fd5b6001600160a01b0382166125c75760405162461bcd60e51b81526004018080602001828103825260238152602001806137c56023913960400191505060405180910390fd5b6125d2838383611201565b61261581604051806060016040528060268152602001613852602691396001600160a01b038616600090815260656020526040902054919063ffffffff6126a616565b6001600160a01b03808516600090815260656020526040808220939093559084168152205461264a908263ffffffff61273d16565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156127355760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126fa5781810151838201526020016126e2565b50505050905090810190601f1680156127275780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612536576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60c95460ff166127e5576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612818612404565b604080516001600160a01b039092168252519081900360200190a1565b303b1590565b600054610100900460ff16806128545750612854612835565b80612862575060005460ff16155b61289d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806138e1602e913960400191505060405180910390fd5b600054610100900460ff161580156128c8576000805460ff1961ff0019909116610100171660011790555b80156118ec576000805461ff001916905550565b600054610100900460ff16806128f557506128f5612835565b80612903575060005460ff16155b61293e5760405162461bcd60e51b815260040180806020018281038252602e8152602001806138e1602e913960400191505060405180910390fd5b600054610100900460ff16158015612969576000805460ff1961ff0019909116610100171660011790555b6000612973612404565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156118ec576000805461ff001916905550565b600054610100900460ff16806129ee57506129ee612835565b806129fc575060005460ff16155b612a375760405162461bcd60e51b815260040180806020018281038252602e8152602001806138e1602e913960400191505060405180910390fd5b600054610100900460ff16158015612a62576000805460ff1961ff0019909116610100171660011790555b60fb805460ff1916600117905580156118ec576000805461ff001916905550565b600054610100900460ff1680612a9c5750612a9c612835565b80612aaa575060005460ff16155b612ae55760405162461bcd60e51b815260040180806020018281038252602e8152602001806138e1602e913960400191505060405180910390fd5b600054610100900460ff16158015612b10576000805460ff1961ff0019909116610100171660011790555b8251612b2390606890602086019061372c565b508151612b3790606990602085019061372c565b50606a805460ff191660121790558015611201576000805461ff0019169055505050565b606483101580612b69575082155b612ba45760405162461bcd60e51b81526004018080602001828103825260318152602001806139cc6031913960400191505060405180910390fd5b6064821015612be45760405162461bcd60e51b81526004018080602001828103825260298152602001806139556029913960400191505060405180910390fd5b600a811015612c3a576040805162461bcd60e51b815260206004820152601f60248201527f436c61696d20666565206d757374206265206c657373207468616e2031302500604482015290519081900360640190fd5b61013883905561013982905561013a819055604080518481526020810184905280820183905290517f985786ed84548f26eae234688f08682cdd04f5b552190a894b31307afd72c46a9181900360600190a1505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611201908490613469565b600081612cf257600019612cf5565b60005b610130546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519293509085169163095ea7b3916044808201926020929091908290030181600087803b158015612d4f57600080fd5b505af1158015612d63573d6000803e3d6000fd5b505050506040513d6020811015612d7957600080fd5b5050505050565b60c95460ff1615612dcb576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612818612404565b600080612e0d846115e0565b905080612e1e576000915050610cd3565b612e2e816120c285611878611759565b61013354909250612e45908363ffffffff61273d16565b610133555092915050565b6101305461012d5460408051633d15022b60e11b81526001600160a01b0392831660048201526024810185905290519190921691637a2a045691859160448082019260209290919082900301818588803b158015612ead57600080fd5b505af1158015612ec1573d6000803e3d6000fd5b50505050506040513d60208110156113c557600080fd5b61012f546040805163b6b55f2560e01b81526004810184905290516001600160a01b039092169163b6b55f259160248082019260009290919082900301818387803b158015612f2657600080fd5b505af1158015612d79573d6000803e3d6000fd5b600080612f45611c01565b9050612f4f610cd9565b612f6c57612f6481600a63ffffffff61327816565b915050611539565b612536836120c2612f7b610cd9565b6120b6858863ffffffff6124f416565b6001600160a01b038216612fe6576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b612ff260008383611201565b606754613005908263ffffffff61273d16565b6067556001600160a01b038216600090815260656020526040902054613031908263ffffffff61273d16565b6001600160a01b03831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000610132848154811061309957fe5b60009182526020822001546001600160a01b0316915073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8214156130fb5760006130d5611759565b9050808510156130e7578491506130eb565b8091505b6130f58285612e50565b50612d79565b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561314557600080fd5b505afa158015613159573d6000803e3d6000fd5b505050506040513d602081101561316f57600080fd5b505190508085101561318357849150613187565b8091505b6000613191610cdf565b905061319e848487613621565b60006131a8610cdf565b90506131c46131bd828463ffffffff6124f416565b6002613229565b505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526113c5908590613469565b600080613235836115e0565b905080613246576000915050610cd3565b613256848263ffffffff6132d116565b6101345490925061326d908363ffffffff61273d16565b610134555092915050565b60008261328757506000610cd3565b8282028284828161329457fe5b04146125365760405162461bcd60e51b81526004018080602001828103825260218152602001806138786021913960400191505060405180910390fd5b600061253683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061368b565b61012f5460408051632e1a7d4d60e01b81526004810184905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015612f2657600080fd5b6001600160a01b0382166133a65760405162461bcd60e51b815260040180806020018281038252602181526020018061390f6021913960400191505060405180910390fd5b6133b282600083611201565b6133f5816040518060600160405280602281526020016137e8602291396001600160a01b038516600090815260656020526040902054919063ffffffff6126a616565b6001600160a01b038316600090815260656020526040902055606754613421908263ffffffff6124f416565b6067556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b61347b826001600160a01b03166136f0565b6134cc576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061350a5780518252601f1990920191602091820191016134eb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461356c576040519150601f19603f3d011682016040523d82523d6000602084013e613571565b606091505b5091509150816135c8576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156113c5578080602001905160208110156135e457600080fd5b50516113c55760405162461bcd60e51b815260040180806020018281038252602a8152602001806139a2602a913960400191505060405180910390fd5b6101305461012d5460408051637409e2eb60e01b81526001600160a01b0387811660048301526024820187905292831660448201526064810185905290519190921691637409e2eb9160848083019260209291908290030181600087803b158015612d4f57600080fd5b600081836136da5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156126fa5781810151838201526020016126e2565b5060008385816136e657fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061372457508115155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061376d57805160ff191683800117855561379a565b8280016001018555821561379a579182015b8281111561379a57825182559160200191906001019061377f565b506137a69291506137aa565b5090565b610cb891905b808211156137a657600081556001016137b056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734275726e20666565206d75737420626520657175616c20746f206f72206c657373207468616e20312545524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644d696e7420666565206d757374206265207a65726f206f7220657175616c20746f206f72206c657373207468616e20312545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ad2bed63fb66d7c4d9b5bcae10a37d8b6766ed9eb320403a47650e78ec83c21364736f6c63430006020033
Deployed Bytecode
0x60806040526004361061021e5760003560e01c80637c70fb5711610123578063a9059cbb116100ab578063d0ebdbe71161006f578063d0ebdbe714610b15578063dd62ed3e14610b48578063df22db8814610b83578063e7654b3c14610bbb578063f2fde38b14610bf15761026f565b8063a9059cbb14610952578063ad4258bd1461098b578063b384abef146109a0578063b3eaff8b146109d0578063c4ede67d146109fa5761026f565b806395602675116100f257806395602675146107b057806395d89b41146107c5578063a0712d68146107da578063a457c2d7146107f7578063a620daef146108305761026f565b80637c70fb571461070a5780638456cb59146107375780638bea72fb1461074c5780638da5cb5b1461077f5761026f565b806345d7bf32116101a65780635793e155116101755780635793e1551461063f5780635c975abb1461067a578063629c577e1461068f57806370a08231146106c2578063715018a6146106f55761026f565b806345d7bf3214610458578063476343ee146105c357806351be62fa146105d8578063544e3a5b146106135761026f565b806323b872dd116101ed57806323b872dd14610387578063313ce567146103ca57806339509351146103f557806339b1b96d1461042e5780633f4ba83a146104435761026f565b806306fdde0314610274578063095ea7b3146102fe57806318160ddd1461034b57806320cbf72c146103725761026f565b3661026f573332141561026d576040805162461bcd60e51b8152602060048201526012602482015271115c9c985b9d081155120819195c1bdcda5d60721b604482015290519081900360640190fd5b005b600080fd5b34801561028057600080fd5b50610289610c24565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102c35781810151838201526020016102ab565b50505050905090810190601f1680156102f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030a57600080fd5b506103376004803603604081101561032157600080fd5b506001600160a01b038135169060200135610cbb565b604080519115158252519081900360200190f35b34801561035757600080fd5b50610360610cd9565b60408051918252519081900360200190f35b34801561037e57600080fd5b50610360610cdf565b34801561039357600080fd5b50610337600480360360608110156103aa57600080fd5b506001600160a01b03813581169160208101359091169060400135610d75565b3480156103d657600080fd5b506103df610e02565b6040805160ff9092168252519081900360200190f35b34801561040157600080fd5b506103376004803603604081101561041857600080fd5b506001600160a01b038135169060200135610e0b565b34801561043a57600080fd5b50610289610e5f565b34801561044f57600080fd5b5061026d610eee565b34801561046457600080fd5b5061026d600480360361012081101561047c57600080fd5b810190602081018135600160201b81111561049657600080fd5b8201836020820111156104a857600080fd5b803590602001918460018302840111600160201b831117156104c957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561051b57600080fd5b82018360208201111561052d57600080fd5b803590602001918460018302840111600160201b8311171561054e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b0383358116945060208401358116936040810135821693506060810135909116915060808101359060a08101359060c00135610f84565b3480156105cf57600080fd5b5061026d6110db565b3480156105e457600080fd5b5061026d600480360360408110156105fb57600080fd5b506001600160a01b0381351690602001351515611206565b34801561061f57600080fd5b5061026d6004803603602081101561063657600080fd5b503515156112a0565b34801561064b57600080fd5b5061026d6004803603604081101561066257600080fd5b506001600160a01b03813581169160200135166113cb565b34801561068657600080fd5b50610337611507565b34801561069b57600080fd5b506106a4611510565b60408051938452602084019290925282820152519081900360600190f35b3480156106ce57600080fd5b50610360600480360360208110156106e557600080fd5b50356001600160a01b031661151f565b34801561070157600080fd5b5061026d61153e565b34801561071657600080fd5b506103606004803603602081101561072d57600080fd5b503560ff166115e0565b34801561074357600080fd5b5061026d61163b565b34801561075857600080fd5b5061026d6004803603602081101561076f57600080fd5b50356001600160a01b03166116cf565b34801561078b57600080fd5b5061079461174a565b604080516001600160a01b039092168252519081900360200190f35b3480156107bc57600080fd5b50610360611759565b3480156107d157600080fd5b50610289611771565b61026d600480360360208110156107f057600080fd5b50356117d2565b34801561080357600080fd5b506103376004803603604081101561081a57600080fd5b506001600160a01b0381351690602001356118ef565b34801561083c57600080fd5b5061026d6004803603608081101561085357600080fd5b81359190810190604081016020820135600160201b81111561087457600080fd5b82018360208201111561088657600080fd5b803590602001918460208302840111600160201b831117156108a757600080fd5b919390929091602081019035600160201b8111156108c457600080fd5b8201836020820111156108d657600080fd5b803590602001918460208302840111600160201b831117156108f757600080fd5b919390929091602081019035600160201b81111561091457600080fd5b82018360208201111561092657600080fd5b803590602001918460208302840111600160201b8311171561094757600080fd5b50909250905061195d565b34801561095e57600080fd5b506103376004803603604081101561097557600080fd5b506001600160a01b038135169060200135611bed565b34801561099757600080fd5b50610360611c01565b3480156109ac57600080fd5b5061026d600480360360408110156109c357600080fd5b5080359060200135611c7e565b3480156109dc57600080fd5b5061026d600480360360208110156109f357600080fd5b5035611d73565b348015610a0657600080fd5b5061026d60048036036060811015610a1d57600080fd5b810190602081018135600160201b811115610a3757600080fd5b820183602082011115610a4957600080fd5b803590602001918460208302840111600160201b83111715610a6a57600080fd5b919390929091602081019035600160201b811115610a8757600080fd5b820183602082011115610a9957600080fd5b803590602001918460208302840111600160201b83111715610aba57600080fd5b919390929091602081019035600160201b811115610ad757600080fd5b820183602082011115610ae957600080fd5b803590602001918460208302840111600160201b83111715610b0a57600080fd5b509092509050611e62565b348015610b2157600080fd5b5061026d60048036036020811015610b3857600080fd5b50356001600160a01b0316611f42565b348015610b5457600080fd5b5061036060048036036040811015610b6b57600080fd5b506001600160a01b0381358116916020013516611fbd565b348015610b8f57600080fd5b5061026d60048036036060811015610ba657600080fd5b50803590602081013515159060400135611fe8565b348015610bc757600080fd5b5061026d60048036036060811015610bde57600080fd5b50803590602081013590604001356122a8565b348015610bfd57600080fd5b5061026d60048036036020811015610c1457600080fd5b50356001600160a01b031661230b565b60688054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb05780601f10610c8557610100808354040283529160200191610cb0565b820191906000526020600020905b815481529060010190602001808311610c9357829003601f168201915b505050505090505b90565b6000610ccf610cc8612404565b8484612408565b5060015b92915050565b60675490565b6101345461012d54604080516370a0823160e01b81523060048201529051600093610d709390926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015610d3857600080fd5b505afa158015610d4c573d6000803e3d6000fd5b505050506040513d6020811015610d6257600080fd5b50519063ffffffff6124f416565b905090565b6000610d8284848461253d565b610df884610d8e612404565b610df385604051806060016040528060288152602001613899602891396001600160a01b038a16600090815260666020526040812090610dcc612404565b6001600160a01b03168152602081019190915260400160002054919063ffffffff6126a616565b612408565b5060019392505050565b606a5460ff1690565b6000610ccf610e18612404565b84610df38560666000610e29612404565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61273d16565b610135805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610ee65780601f10610ebb57610100808354040283529160200191610ee6565b820191906000526020600020905b815481529060010190602001808311610ec957829003601f168201915b505050505081565b610ef661174a565b6001600160a01b0316336001600160a01b03161480610f205750610136546001600160a01b031633145b80610f365750610137546001600160a01b031633145b610f7a576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b610f82612797565b565b600054610100900460ff1680610f9d5750610f9d612835565b80610fab575060005460ff16155b610fe65760405162461bcd60e51b815260040180806020018281038252602e8152602001806138e1602e913960400191505060405180910390fd5b600054610100900460ff16158015611011576000805460ff1961ff0019909116610100171660011790555b61101961283b565b6110216128dc565b6110296129d5565b61104f60405180604001604052806004815260200163784b4e4360e01b8152508b612a83565b8851611063906101359060208c019061372c565b5061012f80546001600160a01b03808b166001600160a01b03199283161790925561013080548a841690831617905561012d805489841690831617905561012e8054928816929091169190911790556110bd848484612b5b565b80156110cf576000805461ff00191690555b50505050505050505050565b6110e3612404565b6097546001600160a01b03908116911614611133576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b610133805461013480546000938490559083905560405191929091339084908381818185875af1925050503d806000811461118a576040519150601f19603f3d011682016040523d82523d6000602084013e61118f565b606091505b50509050806111dc576040805162461bcd60e51b8152602060048201526014602482015273109d5c9b881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b6112016111e761174a565b61012d546001600160a01b0316908463ffffffff612c9116565b505050565b61120e61174a565b6001600160a01b0316336001600160a01b031614806112385750610136546001600160a01b031633145b8061124e5750610137546001600160a01b031633145b611292576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61129c8282612ce3565b5050565b6112a861174a565b6001600160a01b0316336001600160a01b031614806112d25750610136546001600160a01b031633145b806112e85750610137546001600160a01b031633145b61132c576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60008161133b5760001961133e565b60005b61012d5461012f546040805163095ea7b360e01b81526001600160a01b03928316600482015260248101859052905193945091169163095ea7b3916044808201926020929091908290030181600087803b15801561139b57600080fd5b505af11580156113af573d6000803e3d6000fd5b505050506040513d60208110156113c557600080fd5b50505050565b6113d361174a565b6001600160a01b0316336001600160a01b031614806113fd5750610136546001600160a01b031633145b806114135750610137546001600160a01b031633145b611457576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b610131805460018181019092557fbd987ad6ccdb7c7567f7335ea839f95dc944431abcf935b6924f70215963db730180546001600160a01b038086166001600160a01b031992831617909255610132805493840181556000527fc53bdfd4aa1ab65dfdaf681ca6bda958ae4a123d4ed68c4277796592280e7835909201805491841691909216811790915573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461129c5761129c816000612ce3565b60c95460ff1690565b610138546101395461013a5483565b6001600160a01b0381166000908152606560205260409020545b919050565b611546612404565b6097546001600160a01b03908116911614611596576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b6097546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3609780546001600160a01b0319169055565b6000808260028111156115ef57fe5b14156115ff575061013854611539565b600182600281111561160d57fe5b141561161d575061013954611539565b600282600281111561162b57fe5b1415611539575061013a54611539565b61164361174a565b6001600160a01b0316336001600160a01b0316148061166d5750610136546001600160a01b031633145b806116835750610137546001600160a01b031633145b6116c7576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b610f82612d80565b6116d7612404565b6097546001600160a01b03908116911614611727576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b61013780546001600160a01b0319166001600160a01b0392909216919091179055565b6097546001600160a01b031690565b6000610d7061013354476124f490919063ffffffff16565b60698054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610cb05780601f10610c8557610100808354040283529160200191610cb0565b60c95460ff161561181d576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6000341161186a576040805162461bcd60e51b815260206004820152601560248201527409aeae6e840e6cadcc840cae8d040eed2e8d040e8f605b1b604482015290519081900360640190fd5b600061188434611878611759565b9063ffffffff6124f416565b90506000611893600083612e01565b905060006118a7348363ffffffff6124f416565b905060006118b3611c01565b90506118bf8286612e50565b6118cf6118ca610cdf565b612ed8565b60006118da82612f3a565b90506118e63382612f8b565b50505050505b50565b6000610ccf6118fc612404565b84610df3856040518060600160405280602581526020016139fd6025913960666000611926612404565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff6126a616565b61196561174a565b6001600160a01b0316336001600160a01b0316148061198f5750610136546001600160a01b031633145b806119a55750610137546001600160a01b031633145b6119e9576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b848314611a3d576040805162461bcd60e51b815260206004820152601b60248201527f417272617973206d75737420626520657175616c206c656e6774680000000000604482015290519081900360640190fd5b828114611a91576040805162461bcd60e51b815260206004820152601b60248201527f417272617973206d75737420626520657175616c206c656e6774680000000000604482015290519081900360640190fd5b6000611a9b611759565b905060005b86811015611bd7576101318181548110611ab657fe5b6000918252602080832090910154604080516353fa2eb760e01b8152306004820152602481018e905290516001600160a01b03909216936353fa2eb79360448084019491939192918390030190829087803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b505050506040513d6020811015611b3e57600080fd5b5050610132805473eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee919083908110611b6657fe5b6000918252602090912001546001600160a01b03161415611b8e57611b8c600283612e01565b505b611bcf888883818110611b9d57fe5b90506020020135878784818110611bb057fe5b90506020020135868685818110611bc357fe5b90506020020135613089565b600101611aa0565b50611be36118ca610cdf565b5050505050505050565b6000610ccf611bfa612404565b848461253d565b61012f546040805163072b77f160e01b815230600482015290516000926001600160a01b03169163072b77f1916024808301926020929190829003018186803b158015611c4d57600080fd5b505afa158015611c61573d6000803e3d6000fd5b505050506040513d6020811015611c7757600080fd5b5051905090565b611c8661174a565b6001600160a01b0316336001600160a01b03161480611cb05750610136546001600160a01b031633145b80611cc65750610137546001600160a01b031633145b611d0a576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b61012e546040805163b384abef60e01b8152600481018590526024810184905290516001600160a01b039092169163b384abef9160448082019260009290919082900301818387803b158015611d5f57600080fd5b505af11580156118e6573d6000803e3d6000fd5b60c95460ff1615611dbe576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60008111611e09576040805162461bcd60e51b81526020600482015260136024820152724d75737420636f6e74726962757465204b4e4360681b604482015290519081900360640190fd5b61012d54611e28906001600160a01b031633308463ffffffff6131cf16565b6000611e32611c01565b9050611e3f826000613229565b50611e4b6118ca610cdf565b6000611e5682612f3a565b90506112013382612f8b565b611e6a61174a565b6001600160a01b0316336001600160a01b03161480611e945750610136546001600160a01b031633145b80611eaa5750610137546001600160a01b031633145b611eee576040805162461bcd60e51b815260206004820152601060248201526f2737b716b0b236b4b71031b0b63632b960811b604482015290519081900360640190fd5b60005b85811015611f3657611f2e878783818110611f0857fe5b90506020020135868684818110611f1b57fe5b90506020020135858585818110611bc357fe5b600101611ef1565b506118e66118ca610cdf565b611f4a612404565b6097546001600160a01b03908116911614611f9a576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b61013680546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205490565b60fb5460ff1661203f576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60fb805460ff19169055826120533361151f565b101561209d576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b60006120ce6120aa610cd9565b6120c2866120b6611c01565b9063ffffffff61327816565b9063ffffffff6132d116565b90506120d981613313565b6120e33385613361565b821561212c5760006120f6826001613229565b90506121263361210c848463ffffffff6124f416565b61012d546001600160a01b0316919063ffffffff612c9116565b50612295565b6000612136611759565b6101305461012d549192506001600160a01b0390811691633bba21dc911661215c610cdf565b866040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b031681526020018381526020018281526020019350505050602060405180830381600087803b1580156121b357600080fd5b505af11580156121c7573d6000803e3d6000fd5b505050506040513d60208110156121dd57600080fd5b506121eb9050600182612e01565b5060006121fa82611878611759565b604051909150600090339083908381818185875af1925050503d806000811461223f576040519150601f19603f3d011682016040523d82523d6000602084013e612244565b606091505b5050905080612291576040805162461bcd60e51b8152602060048201526014602482015273109d5c9b881d1c985b9cd9995c8819985a5b195960621b604482015290519081900360640190fd5b5050505b505060fb805460ff191660011790555050565b6122b0612404565b6097546001600160a01b03908116911614612300576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b611201838383612b5b565b612313612404565b6097546001600160a01b03908116911614612363576040805162461bcd60e51b815260206004820181905260248201526000805160206138c1833981519152604482015290519081900360640190fd5b6001600160a01b0381166123a85760405162461bcd60e51b815260040180806020018281038252602681526020018061380a6026913960400191505060405180910390fd5b6097546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3609780546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b6001600160a01b03831661244d5760405162461bcd60e51b815260040180806020018281038252602481526020018061397e6024913960400191505060405180910390fd5b6001600160a01b0382166124925760405162461bcd60e51b81526004018080602001828103825260228152602001806138306022913960400191505060405180910390fd5b6001600160a01b03808416600081815260666020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600061253683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506126a6565b9392505050565b6001600160a01b0383166125825760405162461bcd60e51b81526004018080602001828103825260258152602001806139306025913960400191505060405180910390fd5b6001600160a01b0382166125c75760405162461bcd60e51b81526004018080602001828103825260238152602001806137c56023913960400191505060405180910390fd5b6125d2838383611201565b61261581604051806060016040528060268152602001613852602691396001600160a01b038616600090815260656020526040902054919063ffffffff6126a616565b6001600160a01b03808516600090815260656020526040808220939093559084168152205461264a908263ffffffff61273d16565b6001600160a01b0380841660008181526065602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156127355760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156126fa5781810151838201526020016126e2565b50505050905090810190601f1680156127275780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015612536576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60c95460ff166127e5576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b60c9805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612818612404565b604080516001600160a01b039092168252519081900360200190a1565b303b1590565b600054610100900460ff16806128545750612854612835565b80612862575060005460ff16155b61289d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806138e1602e913960400191505060405180910390fd5b600054610100900460ff161580156128c8576000805460ff1961ff0019909116610100171660011790555b80156118ec576000805461ff001916905550565b600054610100900460ff16806128f557506128f5612835565b80612903575060005460ff16155b61293e5760405162461bcd60e51b815260040180806020018281038252602e8152602001806138e1602e913960400191505060405180910390fd5b600054610100900460ff16158015612969576000805460ff1961ff0019909116610100171660011790555b6000612973612404565b609780546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35080156118ec576000805461ff001916905550565b600054610100900460ff16806129ee57506129ee612835565b806129fc575060005460ff16155b612a375760405162461bcd60e51b815260040180806020018281038252602e8152602001806138e1602e913960400191505060405180910390fd5b600054610100900460ff16158015612a62576000805460ff1961ff0019909116610100171660011790555b60fb805460ff1916600117905580156118ec576000805461ff001916905550565b600054610100900460ff1680612a9c5750612a9c612835565b80612aaa575060005460ff16155b612ae55760405162461bcd60e51b815260040180806020018281038252602e8152602001806138e1602e913960400191505060405180910390fd5b600054610100900460ff16158015612b10576000805460ff1961ff0019909116610100171660011790555b8251612b2390606890602086019061372c565b508151612b3790606990602085019061372c565b50606a805460ff191660121790558015611201576000805461ff0019169055505050565b606483101580612b69575082155b612ba45760405162461bcd60e51b81526004018080602001828103825260318152602001806139cc6031913960400191505060405180910390fd5b6064821015612be45760405162461bcd60e51b81526004018080602001828103825260298152602001806139556029913960400191505060405180910390fd5b600a811015612c3a576040805162461bcd60e51b815260206004820152601f60248201527f436c61696d20666565206d757374206265206c657373207468616e2031302500604482015290519081900360640190fd5b61013883905561013982905561013a819055604080518481526020810184905280820183905290517f985786ed84548f26eae234688f08682cdd04f5b552190a894b31307afd72c46a9181900360600190a1505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611201908490613469565b600081612cf257600019612cf5565b60005b610130546040805163095ea7b360e01b81526001600160a01b0392831660048201526024810184905290519293509085169163095ea7b3916044808201926020929091908290030181600087803b158015612d4f57600080fd5b505af1158015612d63573d6000803e3d6000fd5b505050506040513d6020811015612d7957600080fd5b5050505050565b60c95460ff1615612dcb576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b60c9805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612818612404565b600080612e0d846115e0565b905080612e1e576000915050610cd3565b612e2e816120c285611878611759565b61013354909250612e45908363ffffffff61273d16565b610133555092915050565b6101305461012d5460408051633d15022b60e11b81526001600160a01b0392831660048201526024810185905290519190921691637a2a045691859160448082019260209290919082900301818588803b158015612ead57600080fd5b505af1158015612ec1573d6000803e3d6000fd5b50505050506040513d60208110156113c557600080fd5b61012f546040805163b6b55f2560e01b81526004810184905290516001600160a01b039092169163b6b55f259160248082019260009290919082900301818387803b158015612f2657600080fd5b505af1158015612d79573d6000803e3d6000fd5b600080612f45611c01565b9050612f4f610cd9565b612f6c57612f6481600a63ffffffff61327816565b915050611539565b612536836120c2612f7b610cd9565b6120b6858863ffffffff6124f416565b6001600160a01b038216612fe6576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b612ff260008383611201565b606754613005908263ffffffff61273d16565b6067556001600160a01b038216600090815260656020526040902054613031908263ffffffff61273d16565b6001600160a01b03831660008181526065602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6000610132848154811061309957fe5b60009182526020822001546001600160a01b0316915073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee8214156130fb5760006130d5611759565b9050808510156130e7578491506130eb565b8091505b6130f58285612e50565b50612d79565b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561314557600080fd5b505afa158015613159573d6000803e3d6000fd5b505050506040513d602081101561316f57600080fd5b505190508085101561318357849150613187565b8091505b6000613191610cdf565b905061319e848487613621565b60006131a8610cdf565b90506131c46131bd828463ffffffff6124f416565b6002613229565b505050505050505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526113c5908590613469565b600080613235836115e0565b905080613246576000915050610cd3565b613256848263ffffffff6132d116565b6101345490925061326d908363ffffffff61273d16565b610134555092915050565b60008261328757506000610cd3565b8282028284828161329457fe5b04146125365760405162461bcd60e51b81526004018080602001828103825260218152602001806138786021913960400191505060405180910390fd5b600061253683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061368b565b61012f5460408051632e1a7d4d60e01b81526004810184905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b158015612f2657600080fd5b6001600160a01b0382166133a65760405162461bcd60e51b815260040180806020018281038252602181526020018061390f6021913960400191505060405180910390fd5b6133b282600083611201565b6133f5816040518060600160405280602281526020016137e8602291396001600160a01b038516600090815260656020526040902054919063ffffffff6126a616565b6001600160a01b038316600090815260656020526040902055606754613421908263ffffffff6124f416565b6067556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b61347b826001600160a01b03166136f0565b6134cc576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061350a5780518252601f1990920191602091820191016134eb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461356c576040519150601f19603f3d011682016040523d82523d6000602084013e613571565b606091505b5091509150816135c8576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156113c5578080602001905160208110156135e457600080fd5b50516113c55760405162461bcd60e51b815260040180806020018281038252602a8152602001806139a2602a913960400191505060405180910390fd5b6101305461012d5460408051637409e2eb60e01b81526001600160a01b0387811660048301526024820187905292831660448201526064810185905290519190921691637409e2eb9160848083019260209291908290030181600087803b158015612d4f57600080fd5b600081836136da5760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156126fa5781810151838201526020016126e2565b5060008385816136e657fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061372457508115155b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061376d57805160ff191683800117855561379a565b8280016001018555821561379a579182015b8281111561379a57825182559160200191906001019061377f565b506137a69291506137aa565b5090565b610cb891905b808211156137a657600081556001016137b056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734275726e20666565206d75737420626520657175616c20746f206f72206c657373207468616e20312545524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644d696e7420666565206d757374206265207a65726f206f7220657175616c20746f206f72206c657373207468616e20312545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ad2bed63fb66d7c4d9b5bcae10a37d8b6766ed9eb320403a47650e78ec83c21364736f6c63430006020033
Deployed Bytecode Sourcemap
38395:16276:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54614:10;54628:9;54614:23;;54606:54;;;;;-1:-1:-1;;;54606:54:0;;;;;;;;;;;;-1:-1:-1;;;54606:54:0;;;;;;;;;;;;;;;38395:16276;;;;;20848:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20848:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;20848:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22954:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22954:169:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22954:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21923:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21923:100:0;;;:::i;:::-;;;;;;;;;;;;;;;;49704:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49704:147:0;;;:::i;23597:321::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23597:321:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23597:321:0;;;;;;;;;;;;;;;;;:::i;21775:83::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21775:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24327:218;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24327:218:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24327:218:0;;;;;;;;:::i;39184:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39184:21:0;;;:::i;54166:76::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54166:76:0;;;:::i;39552:710::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39552:710:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;39552:710:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;39552:710:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39552:710:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39552:710:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39552:710:0;;;;;;;;-1:-1:-1;39552:710:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;39552:710:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39552:710:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;39552:710:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;39552:710:0;;-1:-1:-1;;;;;;;39552:710:0;;;;;-1:-1:-1;39552:710:0;;;;;;;;;;;;;;-1:-1:-1;39552:710:0;;;;;;;;-1:-1:-1;39552:710:0;;;;;;;;;;;;;;:::i;53489:381::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53489:381:0;;;:::i;52048:176::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52048:176:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;52048:176:0;;;;;;;;;;:::i;51614:183::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51614:183:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51614:183:0;;;;:::i;51012:386::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51012:386:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;51012:386:0;;;;;;;;;;:::i;33582:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33582:78:0;;;:::i;39391:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39391:30:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;22086:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22086:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22086:119:0;-1:-1:-1;;;;;22086:119:0;;:::i;31677:148::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31677:148:0;;;:::i;50529:271::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50529:271:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50529:271:0;;;;:::i;54086:72::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54086:72:0;;;:::i;53980:98::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53980:98:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53980:98:0;-1:-1:-1;;;;;53980:98:0;;:::i;31035:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31035:79:0;;;:::i;:::-;;;;-1:-1:-1;;;;;31035:79:0;;;;;;;;;;;;;;49277:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49277:134:0;;;:::i;21050:87::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21050:87:0;;;:::i;40492:694::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40492:694:0;;:::i;25048:269::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25048:269:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25048:269:0;;;;;;;;:::i;45577:1037::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45577:1037:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;45577:1037:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;45577:1037:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45577:1037:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;45577:1037:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;45577:1037:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45577:1037:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;45577:1037:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;45577:1037:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45577:1037:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;45577:1037:0;;-1:-1:-1;45577:1037:0;-1:-1:-1;45577:1037:0;:::i;22418:175::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22418:175:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22418:175:0;;;;;;;;:::i;49486:138::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49486:138:0;;;:::i;44854:153::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44854:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44854:153:0;;;;;;;:::i;41449:509::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41449:509:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41449:509:0;;:::i;47034:476::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47034:476:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;47034:476:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;47034:476:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47034:476:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;47034:476:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;47034:476:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47034:476:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;47034:476:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;47034:476:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47034:476:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;47034:476:0;;-1:-1:-1;47034:476:0;-1:-1:-1;47034:476:0;:::i;53878:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53878:94:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53878:94:0;-1:-1:-1;;;;;53878:94:0;;:::i;22656:151::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22656:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22656:151:0;;;;;;;;;;:::i;42330:1243::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42330:1243:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42330:1243:0;;;;;;;;;;;;;;:::i;52666:197::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52666:197:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52666:197:0;;;;;;;;;;;;:::i;31980:244::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31980:244:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31980:244:0;-1:-1:-1;;;;;31980:244:0;;:::i;20848:83::-;20918:5;20911:12;;;;;;;;-1:-1:-1;;20911:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20885:13;;20911:12;;20918:5;;20911:12;;20918:5;20911:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20848:83;;:::o;22954:169::-;23037:4;23054:39;23063:12;:10;:12::i;:::-;23077:7;23086:6;23054:8;:39::i;:::-;-1:-1:-1;23111:4:0;22954:169;;;;;:::o;21923:100::-;22003:12;;21923:100;:::o;49704:147::-;49823:19;;49790:3;;:28;;;-1:-1:-1;;;49790:28:0;;49812:4;49790:28;;;;;;49763:7;;49790:53;;49823:19;;-1:-1:-1;;;;;49790:3:0;;;;:13;;:28;;;;;;;;;;;;;;;:3;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;49790:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49790:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49790:28:0;;:53;:32;:53;:::i;:::-;49783:60;;49704:147;:::o;23597:321::-;23703:4;23720:36;23730:6;23738:9;23749:6;23720:9;:36::i;:::-;23767:121;23776:6;23784:12;:10;:12::i;:::-;23798:89;23836:6;23798:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23798:19:0;;;;;;:11;:19;;;;;;23818:12;:10;:12::i;:::-;-1:-1:-1;;;;;23798:33:0;;;;;;;;;;;;-1:-1:-1;23798:33:0;;;:89;;:37;:89;:::i;:::-;23767:8;:121::i;:::-;-1:-1:-1;23906:4:0;23597:321;;;;;:::o;21775:83::-;21841:9;;;;21775:83;:::o;24327:218::-;24415:4;24432:83;24441:12;:10;:12::i;:::-;24455:7;24464:50;24503:10;24464:11;:25;24476:12;:10;:12::i;:::-;-1:-1:-1;;;;;24464:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;24464:25:0;;;:34;;;;;;;;;;;:50;:38;:50;:::i;39184:21::-;;;;;;;;;;;;;;;-1:-1:-1;;39184:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54166:76::-;54325:7;:5;:7::i;:::-;-1:-1:-1;;;;;54311:21:0;:10;-1:-1:-1;;;;;54311:21:0;;:63;;;-1:-1:-1;54367:7:0;;-1:-1:-1;;;;;54367:7:0;54353:10;:21;54311:63;:106;;;-1:-1:-1;54409:8:0;;-1:-1:-1;;;;;54409:8:0;54395:10;:22;54311:106;54289:172;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;;;;54224:10:::1;:8;:10::i;:::-;54166:76::o:0;39552:710::-;15966:12;;;;;;;;:31;;;15982:15;:13;:15::i;:::-;15966:47;;;-1:-1:-1;16002:11:0;;;;16001:12;15966:47;15958:106;;;;-1:-1:-1;;;15958:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16073:19;16096:12;;;;;;16095:13;16115:83;;;;16144:12;:19;;-1:-1:-1;;;;16144:19:0;;;;;16172:18;16159:4;16172:18;;;16115:83;39883:26:::1;:24;:26::i;:::-;39920;:24;:26::i;:::-;39957:34;:32;:34::i;:::-;40002:39;;;;;;;;;;;;;;-1:-1:-1::0;;;40002:39:0::1;;::::0;40033:7:::1;40002:22;:39::i;:::-;40054:18:::0;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;40083:12:0::1;:28:::0;;-1:-1:-1;;;;;40083:28:0;;::::1;-1:-1:-1::0;;;;;;40083:28:0;;::::1;;::::0;;;40122:10:::1;:24:::0;;;;::::1;::::0;;::::1;;::::0;;40157:3:::1;:10:::0;;;;::::1;::::0;;::::1;;::::0;;40178:8:::1;:20:::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;40211:43:::1;40227:7:::0;40236;40245:8;40211:15:::1;:43::i;:::-;16220:14:::0;16216:57;;;16260:5;16245:20;;-1:-1:-1;;16245:20:0;;;16216:57;39552:710;;;;;;;;;;:::o;53489:381::-;31257:12;:10;:12::i;:::-;31247:6;;-1:-1:-1;;;;;31247:6:0;;;:22;;;31239:67;;;;;-1:-1:-1;;;31239:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31239:67:0;;;;;;;;;;;;;;;53561:19:::1;::::0;;53609::::1;::::0;;53543:15:::1;53641:23:::0;;;;53675;;;;53730:34:::1;::::0;53561:19;;53609;;53730:10:::1;::::0;53561:19;;53543:15;53730:34;53543:15;53730:34;53561:19;53730:10;:34:::1;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;53711:53:0;;;53783:7;53775:40;;;::::0;;-1:-1:-1;;;53775:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;53775:40:0;;;;;;;;;;;;;::::1;;53828:34;53845:7;:5;:7::i;:::-;53828:3;::::0;-1:-1:-1;;;;;53828:3:0::1;::::0;53854:7;53828:34:::1;:16;:34;:::i;:::-;31317:1;;;53489:381::o:0;52048:176::-;54325:7;:5;:7::i;:::-;-1:-1:-1;;;;;54311:21:0;:10;-1:-1:-1;;;;;54311:21:0;;:63;;;-1:-1:-1;54367:7:0;;-1:-1:-1;;;;;54367:7:0;54353:10;:21;54311:63;:106;;;-1:-1:-1;54409:8:0;;-1:-1:-1;;;;;54409:8:0;54395:10;:22;54311:106;54289:172;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;;;;52174:42:::1;52201:6;52209;52174:26;:42::i;:::-;52048:176:::0;;:::o;51614:183::-;54325:7;:5;:7::i;:::-;-1:-1:-1;;;;;54311:21:0;:10;-1:-1:-1;;;;;54311:21:0;;:63;;;-1:-1:-1;54367:7:0;;-1:-1:-1;;;;;54367:7:0;54353:10;:21;54311:63;:106;;;-1:-1:-1;54409:8:0;;-1:-1:-1;;;;;54409:8:0;54395:10;:22;54311:106;54289:172;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;;;;51698:14:::1;51715:6;:21;;-1:-1:-1::0;;51715:21:0::1;;;51724:1;51715:21;51747:3;::::0;51767:12:::1;::::0;51747:42:::1;::::0;;-1:-1:-1;;;51747:42:0;;-1:-1:-1;;;;;51767:12:0;;::::1;51747:42;::::0;::::1;::::0;;;;;;;;;51698:38;;-1:-1:-1;51747:3:0;::::1;::::0;:11:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;;:3:::1;::::0;:42;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;51747:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;51747:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;;;;51614:183:0:o;51012:386::-;54325:7;:5;:7::i;:::-;-1:-1:-1;;;;;54311:21:0;:10;-1:-1:-1;;;;;54311:21:0;;:63;;;-1:-1:-1;54367:7:0;;-1:-1:-1;;;;;54367:7:0;54353:10;:21;54311:63;:106;;;-1:-1:-1;54409:8:0;;-1:-1:-1;;;;;54409:8:0;54395:10;:22;54311:106;54289:172;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;;;;51160:16:::1;27:10:-1::0;;39:1:::1;23:18:::0;;::::1;45:23:::0;;;51160:64:0;::::1;::::0;;-1:-1:-1;;;;;51160:64:0;;::::1;-1:-1:-1::0;;;;;;51160:64:0;;::::1;;::::0;;;51235:14:::1;27:10:-1::0;;23:18;;::::1;45:23:::0;;-1:-1;51235:34:0;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;38650:42:::1;51286:28;51282:109;;51331:48;51358:13;51373:5;51331:26;:48::i;33582:78::-:0;33645:7;;;;33582:78;:::o;39391:30::-;;;;;;;;:::o;22086:119::-;-1:-1:-1;;;;;22179:18:0;;22152:7;22179:18;;;:9;:18;;;;;;22086:119;;;;:::o;31677:148::-;31257:12;:10;:12::i;:::-;31247:6;;-1:-1:-1;;;;;31247:6:0;;;:22;;;31239:67;;;;;-1:-1:-1;;;31239:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31239:67:0;;;;;;;;;;;;;;;31768:6:::1;::::0;31747:40:::1;::::0;31784:1:::1;::::0;-1:-1:-1;;;;;31768:6:0::1;::::0;31747:40:::1;::::0;31784:1;;31747:40:::1;31798:6;:19:::0;;-1:-1:-1;;;;;;31798:19:0::1;::::0;;31677:148::o;50529:271::-;50586:7;;50610:5;:22;;;;;;;;;50606:54;;;-1:-1:-1;50641:11:0;:19;50634:26;;50606:54;50684:13;50675:5;:22;;;;;;;;;50671:54;;;-1:-1:-1;50706:19:0;;50699:26;;50671:54;50749:14;50740:5;:23;;;;;;;;;50736:56;;;-1:-1:-1;50772:20:0;;50765:27;;54086:72;54325:7;:5;:7::i;:::-;-1:-1:-1;;;;;54311:21:0;:10;-1:-1:-1;;;;;54311:21:0;;:63;;;-1:-1:-1;54367:7:0;;-1:-1:-1;;;;;54367:7:0;54353:10;:21;54311:63;:106;;;-1:-1:-1;54409:8:0;;-1:-1:-1;;;;;54409:8:0;54395:10;:22;54311:106;54289:172;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;;;;54142:8:::1;:6;:8::i;53980:98::-:0;31257:12;:10;:12::i;:::-;31247:6;;-1:-1:-1;;;;;31247:6:0;;;:22;;;31239:67;;;;;-1:-1:-1;;;31239:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31239:67:0;;;;;;;;;;;;;;;54050:8:::1;:20:::0;;-1:-1:-1;;;;;;54050:20:0::1;-1:-1:-1::0;;;;;54050:20:0;;;::::1;::::0;;;::::1;::::0;;53980:98::o;31035:79::-;31100:6;;-1:-1:-1;;;;;31100:6:0;31035:79;:::o;49277:134::-;49330:7;49357:46;49383:19;;49357:21;:25;;:46;;;;:::i;21050:87::-;21122:7;21115:14;;;;;;;;-1:-1:-1;;21115:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21089:13;;21115:14;;21122:7;;21115:14;;21122:7;21115:14;;;;;;;;;;;;;;;;;;;;;;;;40492:694;33819:7;;;;33818:8;33810:37;;;;;-1:-1:-1;;;33810:37:0;;;;;;;;;;;;-1:-1:-1;;;33810:37:0;;;;;;;;;;;;;;;40585:1:::1;40573:9;:13;40565:47;;;::::0;;-1:-1:-1;;;40565:47:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40565:47:0;;;;;;;;;;;;;::::1;;40701:20;40724:37;40751:9;40724:22;:20;:22::i;:::-;:26:::0;:37:::1;:26;:37;:::i;:::-;40701:60;;40772:11;40786:46;40804:13;40819:12;40786:17;:46::i;:::-;40772:60:::0;-1:-1:-1;40845:22:0::1;40870:18;:9;40772:60:::0;40870:18:::1;:13;:18;:::i;:::-;40845:43;;40899:24;40926:23;:21;:23::i;:::-;40899:50;;40962:40;40978:14;40994:7;40962:15;:40::i;:::-;41013:38;41022:28;:26;:28::i;:::-;41013:8;:38::i;:::-;41064:18;41085:38;41106:16;41085:20;:38::i;:::-;41064:59;;41143:35;41155:10;41167;41143:11;:35::i;:::-;41136:42;;;;;33858:1;40492:694:::0;:::o;25048:269::-;25141:4;25158:129;25167:12;:10;:12::i;:::-;25181:7;25190:96;25229:15;25190:96;;;;;;;;;;;;;;;;;:11;:25;25202:12;:10;:12::i;:::-;-1:-1:-1;;;;;25190:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;25190:25:0;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;45577:1037::-;54325:7;:5;:7::i;:::-;-1:-1:-1;;;;;54311:21:0;:10;-1:-1:-1;;;;;54311:21:0;;:63;;;-1:-1:-1;54367:7:0;;-1:-1:-1;;;;;54367:7:0;54353:10;:21;54311:63;:106;;;-1:-1:-1;54409:8:0;;-1:-1:-1;;;;;54409:8:0;54395:10;:22;54311:106;54289:172;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;;;;45821:51;;::::1;45799:128;;;::::0;;-1:-1:-1;;;45799:128:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;45960:42:::0;;::::1;45938:119;;;::::0;;-1:-1:-1;;;45938:119:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;46070:20;46093:22;:20;:22::i;:::-;46070:45:::0;-1:-1:-1;46131:9:0::1;46126:430;46146:28:::0;;::::1;46126:430;;;46196:16;46213:1;46196:19;;;;;;;;;::::0;;;::::1;::::0;;;;;::::1;::::0;:59:::1;::::0;;-1:-1:-1;;;46196:59:0;;46242:4:::1;46196:59;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;46196:19:0;;::::1;::::0;:37:::1;::::0;:59;;;;;:19;;:59;;;;;;;;;;:19;:59;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;46196:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46196:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;;46276:14:0::1;:17:::0;;38650:42:::1;::::0;46276:14;46291:1;;46276:17;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;46276:17:0::1;:32;46272:120;;;46329:47;46347:14;46363:12;46329:17;:47::i;:::-;;46272:120;46408:136;46441:17;;46459:1;46441:20;;;;;;;;;;;;;46480:16;;46497:1;46480:19;;;;;;;;;;;;;46518:8;;46527:1;46518:11;;;;;;;;;;;;;46408:14;:136::i;:::-;46176:3;;46126:430;;;;46568:38;46577:28;:26;:28::i;46568:38::-;54472:1;45577:1037:::0;;;;;;;:::o;22418:175::-;22504:4;22521:42;22531:12;:10;:12::i;:::-;22545:9;22556:6;22521:9;:42::i;49486:138::-;49567:12;;:49;;;-1:-1:-1;;;49567:49:0;;49610:4;49567:49;;;;;;49540:7;;-1:-1:-1;;;;;49567:12:0;;:34;;:49;;;;;;;;;;;;;;:12;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;49567:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49567:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49567:49:0;;-1:-1:-1;49486:138:0;:::o;44854:153::-;54325:7;:5;:7::i;:::-;-1:-1:-1;;;;;54311:21:0;:10;-1:-1:-1;;;;;54311:21:0;;:63;;;-1:-1:-1;54367:7:0;;-1:-1:-1;;;;;54367:7:0;54353:10;:21;54311:63;:106;;;-1:-1:-1;54409:8:0;;-1:-1:-1;;;;;54409:8:0;54395:10;:22;54311:106;54289:172;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;;;;44966:8:::1;::::0;:33:::1;::::0;;-1:-1:-1;;;44966:33:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;44966:8:0;;::::1;::::0;:13:::1;::::0;:33;;;;;:8:::1;::::0;:33;;;;;;;;:8;;:33;::::1;;5:2:-1::0;::::1;;;30:1;27::::0;20:12:::1;5:2;44966:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;41449:509:0::0;33819:7;;;;33818:8;33810:37;;;;;-1:-1:-1;;;33810:37:0;;;;;;;;;;;;-1:-1:-1;;;33810:37:0;;;;;;;;;;;;;;;41553:1:::1;41537:13;:17;41529:49;;;::::0;;-1:-1:-1;;;41529:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41529:49:0;;;;;;;;;;;;;::::1;;41589:3;::::0;:62:::1;::::0;-1:-1:-1;;;;;41589:3:0::1;41610:10;41630:4;41637:13:::0;41589:62:::1;:20;:62;:::i;:::-;41664:24;41691:23;:21;:23::i;:::-;41664:50;;41725:47;41743:13;41758;41725:17;:47::i;:::-;;41785:38;41794:28;:26;:28::i;41785:38::-;41836:18;41857:38;41878:16;41857:20;:38::i;:::-;41836:59;;41915:35;41927:10;41939;41915:11;:35::i;47034:476::-:0;54325:7;:5;:7::i;:::-;-1:-1:-1;;;;;54311:21:0;:10;-1:-1:-1;;;;;54311:21:0;;:63;;;-1:-1:-1;54367:7:0;;-1:-1:-1;;;;;54367:7:0;54353:10;:21;54311:63;:106;;;-1:-1:-1;54409:8:0;;-1:-1:-1;;;;;54409:8:0;54395:10;:22;54311:106;54289:172;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;-1:-1:-1;;;54289:172:0;;;;;;;;;;;;;;;47239:9:::1;47234:218;47254:28:::0;;::::1;47234:218;;;47304:136;47337:17;;47355:1;47337:20;;;;;;;;;;;;;47376:16;;47393:1;47376:19;;;;;;;;;;;;;47414:8;;47423:1;47414:11;;;;;;47304:136;47284:3;;47234:218;;;;47464:38;47473:28;:26;:28::i;53878:94::-:0;31257:12;:10;:12::i;:::-;31247:6;;-1:-1:-1;;;;;31247:6:0;;;:22;;;31239:67;;;;;-1:-1:-1;;;31239:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31239:67:0;;;;;;;;;;;;;;;53946:7:::1;:18:::0;;-1:-1:-1;;;;;;53946:18:0::1;-1:-1:-1::0;;;;;53946:18:0;;;::::1;::::0;;;::::1;::::0;;53878:94::o;22656:151::-;-1:-1:-1;;;;;22772:18:0;;;22745:7;22772:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;22656:151::o;42330:1243::-;36599:11;;;;36591:55;;;;;-1:-1:-1;;;36591:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36724:11;:19;;-1:-1:-1;;36724:19:0;;;42522:18;42497:21:::1;42507:10;42497:9;:21::i;:::-;:43;;42475:113;;;::::0;;-1:-1:-1;;;42475:113:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;42475:113:0;;;;;;;;;;;;;::::1;;42601:18;42635:66;42687:13;:11;:13::i;:::-;42635:47;42663:18;42635:23;:21;:23::i;:::-;:27:::0;:47:::1;:27;:47;:::i;:::-;:51:::0;:66:::1;:51;:66;:::i;:::-;42601:100;;42712:21;42722:10;42712:9;:21::i;:::-;42744:43;42756:10;42768:18;42744:11;:43::i;:::-;42804:12;42800:766;;;42833:11;42847:44;42865:10;42877:13;42847:17;:44::i;:::-;42833:58:::0;-1:-1:-1;42906:49:0::1;42923:10;42935:19;:10:::0;42833:58;42935:19:::1;:14;:19;:::i;:::-;42906:3;::::0;-1:-1:-1;;;;;42906:3:0::1;::::0;:49;::::1;:16;:49;:::i;:::-;42800:766;;;;43092:20;43115:22;:20;:22::i;:::-;43152:10;::::0;43198:3:::1;::::0;43092:45;;-1:-1:-1;;;;;;43152:10:0;;::::1;::::0;:27:::1;::::0;43198:3:::1;43220:28;:26;:28::i;:::-;43267:7;43152:137;;;;;;;;;;;;;-1:-1:-1::0;;;;;43152:137:0::1;-1:-1:-1::0;;;;;43152:137:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27::::0;20:12:::1;5:2;43152:137:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43152:137:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26::::0;19:12:::1;2:2;-1:-1:::0;43306:46:0::1;::::0;-1:-1:-1;43324:13:0::1;43339:12:::0;43306:17:::1;:46::i;:::-;;43369:17;43389:40;43416:12;43389:22;:20;:22::i;:40::-;43463:36;::::0;43369:60;;-1:-1:-1;43445:12:0::1;::::0;43463:10:::1;::::0;43369:60;;43445:12;43463:36;43445:12;43463:36;43369:60;43463:10;:36:::1;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;43444:55:0;;;43522:7;43514:40;;;::::0;;-1:-1:-1;;;43514:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;43514:40:0;;;;;;;;;;;;;::::1;;42800:766;;;;-1:-1:-1::0;;36904:11:0;:18;;-1:-1:-1;;36904:18:0;36918:4;36904:18;;;-1:-1:-1;;42330:1243:0:o;52666:197::-;31257:12;:10;:12::i;:::-;31247:6;;-1:-1:-1;;;;;31247:6:0;;;:22;;;31239:67;;;;;-1:-1:-1;;;31239:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31239:67:0;;;;;;;;;;;;;;;52809:46:::1;52825:8;52835;52845:9;52809:15;:46::i;31980:244::-:0;31257:12;:10;:12::i;:::-;31247:6;;-1:-1:-1;;;;;31247:6:0;;;:22;;;31239:67;;;;;-1:-1:-1;;;31239:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;31239:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32069:22:0;::::1;32061:73;;;;-1:-1:-1::0;;;32061:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32171:6;::::0;32150:38:::1;::::0;-1:-1:-1;;;;;32150:38:0;;::::1;::::0;32171:6:::1;::::0;32150:38:::1;::::0;32171:6:::1;::::0;32150:38:::1;32199:6;:17:::0;;-1:-1:-1;;;;;;32199:17:0::1;-1:-1:-1::0;;;;;32199:17:0;;;::::1;::::0;;;::::1;::::0;;31980:244::o;17997:106::-;18085:10;17997:106;:::o;28195:346::-;-1:-1:-1;;;;;28297:19:0;;28289:68;;;;-1:-1:-1;;;28289:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28376:21:0;;28368:68;;;;-1:-1:-1;;;28368:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28449:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;28501:32;;;;;;;;;;;;;;;;;28195:346;;;:::o;4222:136::-;4280:7;4307:43;4311:1;4314;4307:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4300:50;4222:136;-1:-1:-1;;;4222:136:0:o;25807:539::-;-1:-1:-1;;;;;25913:20:0;;25905:70;;;;-1:-1:-1;;;25905:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25994:23:0;;25986:71;;;;-1:-1:-1;;;25986:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26070:47;26091:6;26099:9;26110:6;26070:20;:47::i;:::-;26150:71;26172:6;26150:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26150:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;26130:17:0;;;;;;;:9;:17;;;;;;:91;;;;26255:20;;;;;;;:32;;26280:6;26255:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;26232:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;26303:35;;;;;;;26232:20;;26303:35;;;;;;;;;;;;;25807:539;;;:::o;4653:192::-;4739:7;4775:12;4767:6;;;;4759:29;;;;-1:-1:-1;;;4759:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4759:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4811:5:0;;;4653:192::o;3766:181::-;3824:7;3856:5;;;3880:6;;;;3872:46;;;;;-1:-1:-1;;;3872:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;34315:120;34018:7;;;;34010:40;;;;;-1:-1:-1;;;34010:40:0;;;;;;;;;;;;-1:-1:-1;;;34010:40:0;;;;;;;;;;;;;;;34374:7:::1;:15:::0;;-1:-1:-1;;34374:15:0::1;::::0;;34405:22:::1;34414:12;:10;:12::i;:::-;34405:22;::::0;;-1:-1:-1;;;;;34405:22:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;34315:120::o:0;16367:508::-;16784:4;16830:17;16862:7;16367:508;:::o;17918:69::-;15966:12;;;;;;;;:31;;;15982:15;:13;:15::i;:::-;15966:47;;;-1:-1:-1;16002:11:0;;;;16001:12;15966:47;15958:106;;;;-1:-1:-1;;;15958:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16073:19;16096:12;;;;;;16095:13;16115:83;;;;16144:12;:19;;-1:-1:-1;;;;16144:19:0;;;;;16172:18;16159:4;16172:18;;;16115:83;16220:14;16216:57;;;16260:5;16245:20;;-1:-1:-1;;16245:20:0;;;17918:69;:::o;30750:202::-;15966:12;;;;;;;;:31;;;15982:15;:13;:15::i;:::-;15966:47;;;-1:-1:-1;16002:11:0;;;;16001:12;15966:47;15958:106;;;;-1:-1:-1;;;15958:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16073:19;16096:12;;;;;;16095:13;16115:83;;;;16144:12;:19;;-1:-1:-1;;;;16144:19:0;;;;;16172:18;16159:4;16172:18;;;16115:83;30822:17:::1;30842:12;:10;:12::i;:::-;30865:6;:18:::0;;-1:-1:-1;;;;;;30865:18:0::1;-1:-1:-1::0;;;;;30865:18:0;::::1;::::0;;::::1;::::0;;;30899:43:::1;::::0;30865:18;;-1:-1:-1;30865:18:0;-1:-1:-1;;30899:43:0::1;::::0;-1:-1:-1;;30899:43:0::1;16206:1;16220:14:::0;16216:57;;;16260:5;16245:20;;-1:-1:-1;;16245:20:0;;;30750:202;:::o;35572:526::-;15966:12;;;;;;;;:31;;;15982:15;:13;:15::i;:::-;15966:47;;;-1:-1:-1;16002:11:0;;;;16001:12;15966:47;15958:106;;;;-1:-1:-1;;;15958:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16073:19;16096:12;;;;;;16095:13;16115:83;;;;16144:12;:19;;-1:-1:-1;;;;16144:19:0;;;;;16172:18;16159:4;16172:18;;;16115:83;36070:11:::1;:18:::0;;-1:-1:-1;;36070:18:0::1;36084:4;36070:18;::::0;;16216:57;;;;16260:5;16245:20;;-1:-1:-1;;16245:20:0;;;35572:526;:::o;20592:184::-;15966:12;;;;;;;;:31;;;15982:15;:13;:15::i;:::-;15966:47;;;-1:-1:-1;16002:11:0;;;;16001:12;15966:47;15958:106;;;;-1:-1:-1;;;15958:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16073:19;16096:12;;;;;;16095:13;16115:83;;;;16144:12;:19;;-1:-1:-1;;;;16144:19:0;;;;;16172:18;16159:4;16172:18;;;16115:83;20702:12;;::::1;::::0;:5:::1;::::0;:12:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;20725:16:0;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;20752:9:0::1;:14:::0;;-1:-1:-1;;20752:14:0::1;20764:2;20752:14;::::0;;16216:57;;;;16260:5;16245:20;;-1:-1:-1;;16245:20:0;;;20592:184;;;:::o;52871:610::-;53038:3;53026:8;:15;;:32;;;-1:-1:-1;53045:13:0;;53026:32;53004:131;;;;-1:-1:-1;;;53004:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53166:3;53154:8;:15;;53146:69;;;;-1:-1:-1;;;53146:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53247:2;53234:9;:15;;53226:59;;;;;-1:-1:-1;;;53226:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53296:11;:30;;;53337:19;:30;;;53378:20;:32;;;53428:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52871:610;;;:::o;11664:177::-;11774:58;;;-1:-1:-1;;;;;11774:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11774:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11747:86:0;;11767:5;;11747:19;:86::i;52232:192::-;52316:14;52333:6;:21;;-1:-1:-1;;52333:21:0;;;52342:1;52333:21;52396:10;;52365:51;;;-1:-1:-1;;;52365:51:0;;-1:-1:-1;;;;;52396:10:0;;;52365:51;;;;;;;;;;;;52316:38;;-1:-1:-1;52365:22:0;;;;;;:51;;;;;;;;;;;;;;;52396:10;52365:22;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;52365:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52365:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;52232:192:0:o;34133:118::-;33819:7;;;;33818:8;33810:37;;;;;-1:-1:-1;;;33810:37:0;;;;;;;;;;;;-1:-1:-1;;;33810:37:0;;;;;;;;;;;;;;;34193:7:::1;:14:::0;;-1:-1:-1;;34193:14:0::1;34203:4;34193:14;::::0;;34223:20:::1;34230:12;:10;:12::i;49859:344::-:0;49959:11;49988:15;50006:17;50017:5;50006:10;:17::i;:::-;49988:35;-1:-1:-1;50038:12:0;50034:26;;50059:1;50052:8;;;;;50034:26;50079:55;50126:7;50080:40;50107:12;50080:22;:20;:22::i;50079:55::-;50167:19;;50073:61;;-1:-1:-1;50167:28:0;;50073:61;50167:28;:23;:28;:::i;:::-;50145:19;:50;-1:-1:-1;49859:344:0;;;;:::o;48837:140::-;48914:10;;48956:3;;48914:55;;;-1:-1:-1;;;48914:55:0;;-1:-1:-1;;;;;48956:3:0;;;48914:55;;;;;;;;;;;;:10;;;;;:27;;48948:6;;48914:55;;;;;;;;;;;;;;;48948:6;48914:10;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;48914:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48914:55:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;44401:89:0;44454:12;;:28;;;-1:-1:-1;;;44454:28:0;;;;;;;;;;-1:-1:-1;;;;;44454:12:0;;;;:20;;:28;;;;;:12;;:28;;;;;;;;:12;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;44454:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;43910:433:0;44015:18;44051:23;44077;:21;:23::i;:::-;44051:49;;44115:13;:11;:13::i;:::-;44111:90;;44155:46;:15;39087:2;44155:46;:19;:46;:::i;:::-;44148:53;;;;;44111:90;44227:108;44318:16;44227:72;44285:13;:11;:13::i;:::-;44228:37;:15;44248:16;44228:37;:19;:37;:::i;26627:378::-;-1:-1:-1;;;;;26711:21:0;;26703:65;;;;;-1:-1:-1;;;26703:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26781:49;26810:1;26814:7;26823:6;26781:20;:49::i;:::-;26858:12;;:24;;26875:6;26858:24;:16;:24;:::i;:::-;26843:12;:39;-1:-1:-1;;;;;26914:18:0;;;;;;:9;:18;;;;;;:30;;26937:6;26914:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;26893:18:0;;;;;;:9;:18;;;;;;;;:51;;;;26960:37;;;;;;;26893:18;;;;26960:37;;;;;;;;;;26627:378;;:::o;47594:1235::-;47738:26;47767:14;47782:15;47767:31;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47767:31:0;;-1:-1:-1;38650:42:0;47846:33;;47842:980;;;47896:14;47913:22;:20;:22::i;:::-;47896:39;;47972:6;47954:15;:24;47950:157;;;48014:15;47999:30;;47950:157;;;48085:6;48070:21;;47950:157;48123:38;48139:12;48153:7;48123:15;:38::i;:::-;47842:980;;;;48230:51;;;-1:-1:-1;;;48230:51:0;;48275:4;48230:51;;;;;;48194:16;;-1:-1:-1;;;;;48230:36:0;;;;;:51;;;;;;;;;;;;;;;:36;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;48230:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48230:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48230:51:0;;-1:-1:-1;48300:26:0;;;48296:161;;;48362:15;48347:30;;48296:161;;;48433:8;48418:23;;48296:161;48473:24;48500:28;:26;:28::i;:::-;48473:55;;48545:58;48561:18;48581:12;48595:7;48545:15;:58::i;:::-;48620:23;48646:28;:26;:28::i;:::-;48620:54;-1:-1:-1;48689:121:0;48725:37;48620:54;48745:16;48725:37;:19;:37;:::i;:::-;48781:14;48689:17;:121::i;:::-;;47842:980;;;47594:1235;;;;;:::o;11849:205::-;11977:68;;;-1:-1:-1;;;;;11977:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11977:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;11950:96:0;;11970:5;;11950:19;:96::i;50211:310::-;50309:11;50338:15;50356:17;50367:5;50356:10;:17::i;:::-;50338:35;-1:-1:-1;50388:12:0;50384:26;;50409:1;50402:8;;;;;50384:26;50429:23;:10;50444:7;50429:23;:14;:23;:::i;:::-;50485:19;;50423:29;;-1:-1:-1;50485:28:0;;50423:29;50485:28;:23;:28;:::i;:::-;50463:19;:50;-1:-1:-1;50211:310:0;;;;:::o;5096:471::-;5154:7;5399:6;5395:47;;-1:-1:-1;5429:1:0;5422:8;;5395:47;5466:5;;;5470:1;5466;:5;:1;5490:5;;;;;:10;5482:56;;;;-1:-1:-1;;;5482:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6035:132;6093:7;6120:39;6124:1;6127;6120:39;;;;;;;;;;;;;;;;;:3;:39::i;44549:91::-;44603:12;;:29;;;-1:-1:-1;;;44603:29:0;;;;;;;;;;-1:-1:-1;;;;;44603:12:0;;;;:21;;:29;;;;;:12;;:29;;;;;;;;:12;;:29;;;5:2:-1;;;;30:1;27;20:12;27337:418:0;-1:-1:-1;;;;;27421:21:0;;27413:67;;;;-1:-1:-1;;;27413:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27493:49;27514:7;27531:1;27535:6;27493:20;:49::i;:::-;27576:68;27599:6;27576:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27576:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;27555:18:0;;;;;;:9;:18;;;;;:89;27670:12;;:24;;27687:6;27670:24;:16;:24;:::i;:::-;27655:12;:39;27710:37;;;;;;;;27736:1;;-1:-1:-1;;;;;27710:37:0;;;;;;;;;;;;27337:418;;:::o;13708:1115::-;14313:27;14321:5;-1:-1:-1;;;;;14313:25:0;;:27::i;:::-;14305:71;;;;;-1:-1:-1;;;14305:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14450:12;14464:23;14499:5;-1:-1:-1;;;;;14491:19:0;14511:4;14491:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;14491:25:0;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;14449:67:0;;;;14535:7;14527:52;;;;;-1:-1:-1;;;14527:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14596:17;;:21;14592:224;;14738:10;14727:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14727:30:0;14719:85;;;;-1:-1:-1;;;14719:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48985:209;49117:10;;49173:3;;49117:69;;;-1:-1:-1;;;49117:69:0;;-1:-1:-1;;;;;49117:69:0;;;;;;;;;;;;;49173:3;;;49117:69;;;;;;;;;;;;:10;;;;;:27;;:69;;;;;;;;;;;;;;:10;;:69;;;5:2:-1;;;;30:1;27;20:12;6655:345:0;6741:7;6843:12;6836:5;6828:28;;;;-1:-1:-1;;;6828:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;6828:28:0;;6867:9;6883:1;6879;:5;;;;;;;6655:345;-1:-1:-1;;;;;6655:345:0:o;9026:619::-;9086:4;9554:20;;9397:66;9594:23;;;;;;:42;;-1:-1:-1;9621:15:0;;;9594:42;9586:51;9026:619;-1:-1:-1;;;;9026:619:0:o;38395:16276::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38395:16276:0;;;-1:-1:-1;38395:16276:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://ad2bed63fb66d7c4d9b5bcae10a37d8b6766ed9eb320403a47650e78ec83c213
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.