ERC-721
Overview
Max Total Supply
4,118.783053734172423922 veNFT
Holders
3
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x1d530D62...ba5240e97 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Locker
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-12-17 */ /** *Submitted for verification at Etherscan.io on 2022-12-06 */ // Sources flattened with hardhat v2.9.0 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Base64.sol) pragma solidity ^0.8.0; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.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 meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.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. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/interface/ICheckPermission.sol pragma solidity =0.8.10; interface ICheckPermission { function operator() external view returns (address); function owner() external view returns (address); function check(address _target) external view returns (bool); } // File contracts/tools/Operatable.sol pragma solidity =0.8.10; // seperate owner and operator, operator is for daily devops, only owner can update operator contract Operatable is Ownable { event SetOperator(address indexed oldOperator, address indexed newOperator); address public operator; mapping(address => bool) public contractWhiteList; constructor() { operator = msg.sender; emit SetOperator(address(0), operator); } modifier onlyOperator() { require(msg.sender == operator, "not operator"); _; } function setOperator(address newOperator) public onlyOwner { require(newOperator != address(0), "bad new operator"); address oldOperator = operator; operator = newOperator; emit SetOperator(oldOperator, newOperator); } // File: @openzeppelin/contracts/utils/Address.sol function isContract(address account) public view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. // 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 != 0x0 && codehash != accountHash); } function addContract(address _target) public onlyOperator { contractWhiteList[_target] = true; } function removeContract(address _target) public onlyOperator { contractWhiteList[_target] = false; } //Do not ban access to the user, need to be in the whitelist contract address to be able to access function check(address _target) public view returns (bool) { if (isContract(_target)) { return contractWhiteList[_target]; } return true; } } // File contracts/tools/CheckPermission.sol pragma solidity =0.8.10; // seperate owner and operator, operator is for daily devops, only owner can update operator contract CheckPermission is ICheckPermission { Operatable public operatable; event SetOperatorContract(address indexed oldOperator, address indexed newOperator); constructor(address _oper) { operatable = Operatable(_oper); emit SetOperatorContract(address(0), _oper); } modifier onlyOwner() { require(operatable.owner() == msg.sender, "Ownable: caller is not the owner"); _; } modifier onlyOperator() { require(operatable.operator() == msg.sender, "not operator"); _; } modifier onlyAEOWhiteList() { require(check(msg.sender), "aeo or whitelist"); _; } function operator() public view override returns (address) { return operatable.operator(); } function owner() public view override returns (address) { return operatable.owner(); } function setOperContract(address _oper) public onlyOwner { require(_oper != address(0), "bad new operator"); address oldOperator = address(operatable); operatable = Operatable(_oper); emit SetOperatorContract(oldOperator, _oper); } function check(address _target) public view override returns (bool) { return operatable.check(_target); } } // File contracts/dao/Locker.sol pragma solidity 0.8.10; //@title Voting Escrow //@author Curve Finance //@license MIT //@notice Votes have a weight depending on time, so that users are //committed to the future of (whatever they are voting for) //@dev Vote weight decays linearly over time. Lock time cannot be //more than `MAXTIME` (4 years). // //# Voting escrow to have time-weighted votes //# Votes have a weight depending on time, so that users are committed //# to the future of (whatever they are voting for). //# The weight in this implementation is linear, and lock cannot be more than maxtime: //# w ^ //# 1 + / //# | / //# | / //# | / //# |/ //# 0 +--------+------> time //# maxtime (4 years?) contract Locker is IERC721, IERC721Metadata, ReentrancyGuard, CheckPermission { event Withdraw(address indexed provider, uint256 tokenId, uint256 value, uint256 ts); event Supply(uint256 prevSupply, uint256 supply); event BoostAdded(address _address); event BoostRemoved(address _address); struct Point { int128 bias; int128 slope; // # -dweight / dt uint256 ts; uint256 blk; // block } struct LockedBalance { int128 amount; uint256 end; } enum DepositType { DEPOSIT_FOR_TYPE, CREATE_LOCK_TYPE, INCREASE_LOCK_AMOUNT, INCREASE_UNLOCK_TIME, MERGE_TYPE } event Deposit( address indexed provider, uint256 tokenId, uint256 value, uint256 indexed locktime, DepositType depositType, uint256 ts ); uint256 public constant MAXTIME = 4 * 365 * 86400; int128 public constant I_MAXTIME = 4 * 365 * 86400; uint256 public constant MULTIPLIER = 1 ether; uint256 public immutable duration; address public immutable token; uint256 public supply; mapping(uint256 => LockedBalance) public locked; mapping(uint256 => uint256) public ownershipChange; uint256 public epoch; mapping(uint256 => Point) public pointHistory; // epoch -> unsigned point mapping(uint256 => Point[1000000000]) public userPointHistory; // user -> Point[user_epoch] mapping(uint256 => uint256) public userPointEpoch; mapping(uint256 => int128) public slopeChanges; // time -> signed slope change mapping(uint256 => bool) public voted; mapping(address => bool) public boosts; /* solhint-disable */ string public constant name = "veNFT"; string public constant symbol = "veNFT"; string public constant version = "1.0.0"; uint8 public constant decimals = 18; bytes4 internal constant ERC165_INTERFACE_ID = 0x01ffc9a7; bytes4 internal constant ERC721_INTERFACE_ID = 0x80ac58cd; bytes4 internal constant ERC721_METADATA_INTERFACE_ID = 0x5b5e139f; /* solhint-enable */ uint256 public tokenId; mapping(uint256 => address) internal _idToOwner; mapping(uint256 => address) internal _idToApprovals; mapping(address => uint256) internal _ownerToNFTokenCount; mapping(address => mapping(uint256 => uint256)) internal _ownerToNFTokenIdList; mapping(uint256 => uint256) internal _tokenToOwnerIndex; mapping(address => mapping(address => bool)) internal _ownerToOperators; mapping(bytes4 => bool) internal _supportedInterfaces; constructor( address _operatorMsg, address tokenAddr, uint256 _duration ) CheckPermission(_operatorMsg) { token = tokenAddr; pointHistory[0].blk = block.number; pointHistory[0].ts = block.timestamp; duration = _duration; _supportedInterfaces[ERC165_INTERFACE_ID] = true; _supportedInterfaces[ERC721_INTERFACE_ID] = true; _supportedInterfaces[ERC721_METADATA_INTERFACE_ID] = true; // mint-ish emit Transfer(address(0), address(this), tokenId); // burn-ish emit Transfer(address(this), address(0), tokenId); } modifier onlyBoost() { require(boosts[msg.sender], "only voter"); _; } function supportsInterface(bytes4 _interfaceID) external view returns (bool) { return _supportedInterfaces[_interfaceID]; } function getLastUserSlope(uint256 _tokenId) external view returns (int128) { uint256 uepoch = userPointEpoch[_tokenId]; return userPointHistory[_tokenId][uepoch].slope; } function userPointHistoryTs(uint256 _tokenId, uint256 _idx) external view returns (uint256) { return userPointHistory[_tokenId][_idx].ts; } function lockedEnd(uint256 _tokenId) external view returns (uint256) { return locked[_tokenId].end; } function _balance(address _owner) internal view returns (uint256) { return _ownerToNFTokenCount[_owner]; } function balanceOf(address _owner) public view returns (uint256) { return _balance(_owner); } function ownerOf(uint256 _tokenId) public view returns (address) { return _idToOwner[_tokenId]; } function getApproved(uint256 _tokenId) external view returns (address) { return _idToApprovals[_tokenId]; } function isApprovedForAll(address _owner, address _operator) external view returns (bool) { return (_ownerToOperators[_owner])[_operator]; } function tokenOfOwnerByIndex(address _owner, uint256 _tokenIndex) external view returns (uint256) { return _ownerToNFTokenIdList[_owner][_tokenIndex]; } function _isApprovedOrOwner(address _spender, uint256 _tokenId) internal view returns (bool) { address owner = _idToOwner[_tokenId]; bool spenderIsOwner = owner == _spender; bool spenderIsApproved = _spender == _idToApprovals[_tokenId]; bool spenderIsApprovedForAll = (_ownerToOperators[owner])[_spender]; return spenderIsOwner || spenderIsApproved || spenderIsApprovedForAll; } function isApprovedOrOwner(address _spender, uint256 _tokenId) external view returns (bool) { return _isApprovedOrOwner(_spender, _tokenId); } function _addTokenToOwnerList(address _to, uint256 _tokenId) internal { uint256 currentCount = _balance(_to); _ownerToNFTokenIdList[_to][currentCount] = _tokenId; _tokenToOwnerIndex[_tokenId] = currentCount; } function _removeTokenFromOwnerList(address _from, uint256 _tokenId) internal { // Delete uint256 currentCount = _balance(_from) - 1; uint256 currentIndex = _tokenToOwnerIndex[_tokenId]; if (currentCount == currentIndex) { // update ownerToNFTokenIdList _ownerToNFTokenIdList[_from][currentCount] = 0; // update tokenToOwnerIndex _tokenToOwnerIndex[_tokenId] = 0; } else { uint256 lastTokenId = _ownerToNFTokenIdList[_from][currentCount]; // Add // update ownerToNFTokenIdList _ownerToNFTokenIdList[_from][currentIndex] = lastTokenId; // update tokenToOwnerIndex _tokenToOwnerIndex[lastTokenId] = currentIndex; // Delete // update ownerToNFTokenIdList _ownerToNFTokenIdList[_from][currentCount] = 0; // update tokenToOwnerIndex _tokenToOwnerIndex[_tokenId] = 0; } } function _addTokenTo(address _to, uint256 _tokenId) internal { // Throws if `_tokenId` is owned by someone assert(_idToOwner[_tokenId] == address(0)); // Change the owner _idToOwner[_tokenId] = _to; // Update owner token index tracking _addTokenToOwnerList(_to, _tokenId); // Change count tracking _ownerToNFTokenCount[_to] += 1; } function _removeTokenFrom(address _from, uint256 _tokenId) internal { // Throws if `_from` is not the current owner assert(_idToOwner[_tokenId] == _from); // Change the owner _idToOwner[_tokenId] = address(0); // Update owner token index tracking _removeTokenFromOwnerList(_from, _tokenId); // Change count tracking _ownerToNFTokenCount[_from] -= 1; } function _clearApproval(address _owner, uint256 _tokenId) internal { // Throws if `_owner` is not the current owner assert(_idToOwner[_tokenId] == _owner); if (_idToApprovals[_tokenId] != address(0)) { // Reset approvals _idToApprovals[_tokenId] = address(0); } } function _transferFrom( address _from, address _to, uint256 _tokenId, address _sender ) internal { require(!voted[_tokenId], "attached"); // Check requirements require(_isApprovedOrOwner(_sender, _tokenId), "no owner"); // Clear approval. Throws if `_from` is not the current owner _clearApproval(_from, _tokenId); // Remove NFT. Throws if `_tokenId` is not a valid NFT _removeTokenFrom(_from, _tokenId); // Add NFT _addTokenTo(_to, _tokenId); // Set the block of ownership transfer (for Flash NFT protection) ownershipChange[_tokenId] = block.number; // Log the transfer emit Transfer(_from, _to, _tokenId); } function transferFrom( address _from, address _to, uint256 _tokenId ) external { _transferFrom(_from, _to, _tokenId, msg.sender); } function _isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes memory _data ) public { _transferFrom(_from, _to, _tokenId, msg.sender); if (_isContract(_to)) { // Throws if transfer destination is a contract which does not implement 'onERC721Received' try IERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) returns (bytes4) {} catch ( bytes memory reason ) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } } function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external { safeTransferFrom(_from, _to, _tokenId, ""); } function approve(address _approved, uint256 _tokenId) public { address owner = _idToOwner[_tokenId]; // Throws if `_tokenId` is not a valid NFT require(owner != address(0)); // Throws if `_approved` is the current owner require(_approved != owner); // Check requirements bool senderIsOwner = (_idToOwner[_tokenId] == msg.sender); bool senderIsApprovedForAll = (_ownerToOperators[owner])[msg.sender]; require(senderIsOwner || senderIsApprovedForAll); // Set the approval _idToApprovals[_tokenId] = _approved; emit Approval(owner, _approved, _tokenId); } function setApprovalForAll(address _operator, bool _approved) external { // Throws if `_operator` is the `msg.sender` assert(_operator != msg.sender); _ownerToOperators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } function _mint(address _to, uint256 _tokenId) internal returns (bool) { // Throws if `_to` is zero address assert(_to != address(0)); // Add NFT. Throws if `_tokenId` is owned by someone _addTokenTo(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); return true; } function _checkpoint( uint256 _tokenId, LockedBalance memory oldLocked, LockedBalance memory newLocked ) internal { Point memory uOld; Point memory uNew; int128 oldDslope = 0; int128 newDslope = 0; uint256 _epoch = epoch; if (_tokenId != 0) { // Calculate slopes and biases // Kept at zero when they have to if (oldLocked.end > block.timestamp && oldLocked.amount > 0) { uOld.slope = oldLocked.amount / I_MAXTIME; uOld.bias = uOld.slope * int128(int256(oldLocked.end - block.timestamp)); } if (newLocked.end > block.timestamp && newLocked.amount > 0) { uNew.slope = newLocked.amount / I_MAXTIME; uNew.bias = uNew.slope * int128(int256(newLocked.end - block.timestamp)); } // Read values of scheduled changes in the slope // old_locked.end can be in the past and in the future // new_locked.end can ONLY by in the FUTURE unless everything expired: than zeros oldDslope = slopeChanges[oldLocked.end]; if (newLocked.end != 0) { if (newLocked.end == oldLocked.end) { newDslope = oldDslope; } else { newDslope = slopeChanges[newLocked.end]; } } } Point memory lastPoint = Point({bias: 0, slope: 0, ts: block.timestamp, blk: block.number}); if (_epoch > 0) { lastPoint = pointHistory[_epoch]; } uint256 lastCheckpoint = lastPoint.ts; // initial_last_point is used for extrapolation to calculate block number // (approximately, for *At methods) and save them // as we cannot figure that out exactly from inside the contract Point memory initialLastPoint = lastPoint; uint256 blockSlope = 0; // dblock/dt if (block.timestamp > lastPoint.ts) { blockSlope = (MULTIPLIER * (block.number - lastPoint.blk)) / (block.timestamp - lastPoint.ts); } // If last point is already recorded in this block, slope=0 // But that's ok b/c we know the block in such case // Go over weeks to fill history and calculate what the current point is { uint256 ti = (lastCheckpoint / duration) * duration; for (uint256 i = 0; i < 255; ++i) { // Hopefully it won't happen that this won't get used in 5 years! // If it does, users will be able to withdraw but vote weight will be broken ti += duration; int128 dSlope = 0; if (ti > block.timestamp) { ti = block.timestamp; } else { dSlope = slopeChanges[ti]; } lastPoint.bias -= lastPoint.slope * int128(int256(ti - lastCheckpoint)); lastPoint.slope += dSlope; if (lastPoint.bias < 0) { // This can happen lastPoint.bias = 0; } if (lastPoint.slope < 0) { // This cannot happen - just in case lastPoint.slope = 0; } lastCheckpoint = ti; lastPoint.ts = ti; lastPoint.blk = initialLastPoint.blk + (blockSlope * (ti - initialLastPoint.ts)) / MULTIPLIER; _epoch += 1; if (ti == block.timestamp) { lastPoint.blk = block.number; break; } else { pointHistory[_epoch] = lastPoint; } } } epoch = _epoch; // Now pointHistory is filled until t=now if (_tokenId != 0) { // If last point was in this block, the slope change has been applied already // But in such case we have 0 slope(s) lastPoint.slope += (uNew.slope - uOld.slope); lastPoint.bias += (uNew.bias - uOld.bias); if (lastPoint.slope < 0) { lastPoint.slope = 0; } if (lastPoint.bias < 0) { lastPoint.bias = 0; } } // Record the changed point into history pointHistory[_epoch] = lastPoint; if (_tokenId != 0) { // Schedule the slope changes (slope is going down) // We subtract new_user_slope from [new_locked.end] // and add old_user_slope to [old_locked.end] if (oldLocked.end > block.timestamp) { // old_dslope was <something> - u_old.slope, so we cancel that oldDslope += uOld.slope; if (newLocked.end == oldLocked.end) { oldDslope -= uNew.slope; // It was a new deposit, not extension } slopeChanges[oldLocked.end] = oldDslope; } if (newLocked.end > block.timestamp) { if (newLocked.end > oldLocked.end) { newDslope -= uNew.slope; // old slope disappeared at this point slopeChanges[newLocked.end] = newDslope; } // else: we recorded it already in old_dslope } // Now handle user history uint256 userEpoch = userPointEpoch[_tokenId] + 1; userPointEpoch[_tokenId] = userEpoch; uNew.ts = block.timestamp; uNew.blk = block.number; userPointHistory[_tokenId][userEpoch] = uNew; } } function _depositFor( uint256 _tokenId, uint256 _value, uint256 unlockTime, LockedBalance memory lockedBalance, DepositType depositType ) internal { LockedBalance memory _locked = lockedBalance; uint256 supplyBefore = supply; supply = supplyBefore + _value; LockedBalance memory oldLocked; (oldLocked.amount, oldLocked.end) = (_locked.amount, _locked.end); // Adding to existing lock, or if a lock is expired - creating a new one _locked.amount += int128(int256(_value)); if (unlockTime != 0) { _locked.end = unlockTime; } locked[_tokenId] = _locked; // Possibilities: // Both old_locked.end could be current or expired (>/< block.timestamp) // value == 0 (extend lock) or value > 0 (add to lock or extend lock) // _locked.end > block.timestamp (always) _checkpoint(_tokenId, oldLocked, _locked); address from = msg.sender; if (_value != 0 && depositType != DepositType.MERGE_TYPE) { assert(IERC20(token).transferFrom(from, address(this), _value)); } emit Deposit(from, _tokenId, _value, _locked.end, depositType, block.timestamp); emit Supply(supplyBefore, supplyBefore + _value); } function addBoosts(address _address) external onlyOperator { require(_address != address(0), "0 address"); require(boosts[_address] == false, "Address already exists"); boosts[_address] = true; emit BoostAdded(_address); } function removeBoosts(address _address) external onlyOperator { require(boosts[_address] == true, "Address no exist"); delete boosts[_address]; emit BoostRemoved(_address); } function voting(uint256 _tokenId) external onlyBoost { require(voted[_tokenId] == false, "tokenId voted"); voted[_tokenId] = true; } function abstain(uint256 _tokenId) external onlyBoost { voted[_tokenId] = false; } function merge(uint256 _from, uint256 _to) external { require(!voted[_from], "attached"); require(_from != _to); require(_isApprovedOrOwner(msg.sender, _from), "no owner"); require(_isApprovedOrOwner(msg.sender, _to), "no owner"); LockedBalance memory _locked0 = locked[_from]; LockedBalance memory _locked1 = locked[_to]; uint256 value0 = uint256(int256(_locked0.amount)); uint256 end = _locked0.end >= _locked1.end ? _locked0.end : _locked1.end; locked[_from] = LockedBalance(0, 0); _checkpoint(_from, _locked0, LockedBalance(0, 0)); _burn(_from); _depositFor(_to, value0, end, _locked1, DepositType.MERGE_TYPE); } function checkpoint() external { _checkpoint(0, LockedBalance(0, 0), LockedBalance(0, 0)); } function depositFor(uint256 _tokenId, uint256 _value) external nonReentrant { LockedBalance memory _locked = locked[_tokenId]; require(_value > 0); // dev: need non-zero value require(_locked.amount > 0, "No existing lock found"); require(_locked.end > block.timestamp, "Cannot add to expired lock. Withdraw"); _depositFor(_tokenId, _value, 0, _locked, DepositType.DEPOSIT_FOR_TYPE); } function _createLock( uint256 _value, uint256 _lockDuration, address _to ) internal returns (uint256) { uint256 unlockTime = ((block.timestamp + _lockDuration) / duration) * duration; // Locktime is rounded down to weeks require(_value > 0, "v >0"); require(balanceOf(_to) == 0, "less than 1 nft"); // dev: need non-zero value require(unlockTime > block.timestamp, "Can only lock until time in the future"); require(unlockTime <= block.timestamp + MAXTIME, "Voting lock can be 4 years max"); ++tokenId; uint256 _tokenId = tokenId; _mint(_to, _tokenId); _depositFor(_tokenId, _value, unlockTime, locked[_tokenId], DepositType.CREATE_LOCK_TYPE); return _tokenId; } function createLockFor( uint256 _value, uint256 _lockDuration, address _to ) external nonReentrant returns (uint256) { return _createLock(_value, _lockDuration, _to); } function createLock(uint256 _value, uint256 _lockDuration) external nonReentrant returns (uint256) { return _createLock(_value, _lockDuration, msg.sender); } function increaseAmount(uint256 _tokenId, uint256 _value) external nonReentrant { require(_isApprovedOrOwner(msg.sender, _tokenId), "no owner"); LockedBalance memory _locked = locked[_tokenId]; assert(_value > 0); // dev: need non-zero value require(_locked.amount > 0, "No existing lock found"); require(_locked.end > block.timestamp, "Cannot add to expired lock. Withdraw"); _depositFor(_tokenId, _value, 0, _locked, DepositType.INCREASE_LOCK_AMOUNT); } function increaseUnlockTime(uint256 _tokenId, uint256 _lockDuration) external nonReentrant { require(_isApprovedOrOwner(msg.sender, _tokenId), "no owner"); LockedBalance memory _locked = locked[_tokenId]; uint256 unlockTime = ((block.timestamp + _lockDuration) / duration) * duration; // Locktime is rounded down to weeks require(_locked.end > block.timestamp, "Lock expired"); require(_locked.amount > 0, "Nothing is locked"); require(unlockTime > _locked.end, "Can only increase lock duration"); require(unlockTime <= block.timestamp + MAXTIME, "Voting lock can be 4 years max"); _depositFor(_tokenId, 0, unlockTime, _locked, DepositType.INCREASE_UNLOCK_TIME); } function withdraw(uint256 _tokenId) external nonReentrant { require(_isApprovedOrOwner(msg.sender, _tokenId), "no owner"); require(!voted[_tokenId], "attached"); LockedBalance memory _locked = locked[_tokenId]; require(block.timestamp >= _locked.end, "The lock didn't expire"); uint256 value = uint256(int256(_locked.amount)); locked[_tokenId] = LockedBalance(0, 0); uint256 supplyBefore = supply; supply = supplyBefore - value; // old_locked can have either expired <= timestamp or zero end // _locked has only 0 end // Both can have >= 0 amount _checkpoint(_tokenId, _locked, LockedBalance(0, 0)); assert(IERC20(token).transfer(msg.sender, value)); // Burn the NFT _burn(_tokenId); emit Withdraw(msg.sender, _tokenId, value, block.timestamp); emit Supply(supplyBefore, supplyBefore - value); } function emergencyWithdraw(uint256 _tokenId) public nonReentrant { require(_isApprovedOrOwner(msg.sender, _tokenId), "no owner"); voted[_tokenId] = false; LockedBalance memory _locked = locked[_tokenId]; require(block.timestamp >= _locked.end, "The lock didn't expire"); uint256 value = uint256(int256(_locked.amount)); locked[_tokenId] = LockedBalance(0, 0); uint256 supplyBefore = supply; supply = supplyBefore - value; assert(IERC20(token).transfer(msg.sender, value)); // Burn the NFT _burn(_tokenId); emit Withdraw(msg.sender, _tokenId, value, block.timestamp); emit Supply(supplyBefore, supplyBefore - value); } function _findBlockEpoch(uint256 _block, uint256 maxEpoch) internal view returns (uint256) { // Binary search uint256 _min = 0; uint256 _max = maxEpoch; for (uint256 i = 0; i < 128; ++i) { // Will be always enough for 128-bit numbers if (_min >= _max) { break; } uint256 _mid = (_min + _max + 1) / 2; if (pointHistory[_mid].blk <= _block) { _min = _mid; } else { _max = _mid - 1; } } return _min; } function _balanceOfNFT(uint256 _tokenId, uint256 _t) internal view returns (uint256) { uint256 _epoch = userPointEpoch[_tokenId]; if (_epoch == 0) { return 0; } else { Point memory lastPoint = userPointHistory[_tokenId][_epoch]; lastPoint.bias -= lastPoint.slope * int128(int256(_t) - int256(lastPoint.ts)); if (lastPoint.bias < 0) { lastPoint.bias = 0; } return uint256(int256(lastPoint.bias)); } } function tokenURI(uint256 _tokenId) external view returns (string memory) { require(_idToOwner[_tokenId] != address(0), "Query for nonexistent token"); LockedBalance memory _locked = locked[_tokenId]; return _tokenURI(_tokenId, _balanceOfNFT(_tokenId, block.timestamp), _locked.end, uint256(int256(_locked.amount))); } function balanceOfNFT(uint256 _tokenId) external view returns (uint256) { if (ownershipChange[_tokenId] == block.number) return 0; return _balanceOfNFT(_tokenId, block.timestamp); } function balanceOfNFTAt(uint256 _tokenId, uint256 _t) external view returns (uint256) { return _balanceOfNFT(_tokenId, _t); } function _balanceOfAtNFT(uint256 _tokenId, uint256 _block) internal view returns (uint256) { // Copying and pasting totalSupply code because Vyper cannot pass by // reference yet assert(_block <= block.number); // Binary search uint256 _min = 0; uint256 _max = userPointEpoch[_tokenId]; for (uint256 i = 0; i < 128; ++i) { // Will be always enough for 128-bit numbers if (_min >= _max) { break; } uint256 _mid = (_min + _max + 1) / 2; if (userPointHistory[_tokenId][_mid].blk <= _block) { _min = _mid; } else { _max = _mid - 1; } } Point memory upoint = userPointHistory[_tokenId][_min]; uint256 maxEpoch = epoch; uint256 _epoch = _findBlockEpoch(_block, maxEpoch); Point memory point0 = pointHistory[_epoch]; uint256 dBlock = 0; uint256 dt = 0; if (_epoch < maxEpoch) { Point memory point1 = pointHistory[_epoch + 1]; dBlock = point1.blk - point0.blk; dt = point1.ts - point0.ts; } else { dBlock = block.number - point0.blk; dt = block.timestamp - point0.ts; } uint256 blockTime = point0.ts; if (dBlock != 0) { blockTime += (dt * (_block - point0.blk)) / dBlock; } upoint.bias -= upoint.slope * int128(int256(blockTime - upoint.ts)); if (upoint.bias >= 0) { return uint256(uint128(upoint.bias)); } else { return 0; } } function balanceOfAtNFT(uint256 _tokenId, uint256 _block) external view returns (uint256) { return _balanceOfAtNFT(_tokenId, _block); } function _supplyAt(Point memory point, uint256 t) internal view returns (uint256) { Point memory lastPoint = point; uint256 ti = (lastPoint.ts / duration) * duration; for (uint256 i = 0; i < 255; ++i) { ti += duration; int128 dSlope = 0; if (ti > t) { ti = t; } else { dSlope = slopeChanges[ti]; } lastPoint.bias -= lastPoint.slope * int128(int256(ti - lastPoint.ts)); if (ti == t) { break; } lastPoint.slope += dSlope; lastPoint.ts = ti; } if (lastPoint.bias < 0) { lastPoint.bias = 0; } return uint256(uint128(lastPoint.bias)); } function totalSupplyAtT(uint256 t) public view returns (uint256) { uint256 _epoch = epoch; Point memory lastPoint = pointHistory[_epoch]; return _supplyAt(lastPoint, t); } function totalSupply() external view returns (uint256) { return totalSupplyAtT(block.timestamp); } function totalSupplyAt(uint256 _block) external view returns (uint256) { assert(_block <= block.number); uint256 _epoch = epoch; uint256 targetEpoch = _findBlockEpoch(_block, _epoch); Point memory point = pointHistory[targetEpoch]; uint256 dt = 0; if (targetEpoch < _epoch) { Point memory pointNext = pointHistory[targetEpoch + 1]; if (point.blk != pointNext.blk) { dt = ((_block - point.blk) * (pointNext.ts - point.ts)) / (pointNext.blk - point.blk); } } else { if (point.blk != block.number) { dt = ((_block - point.blk) * (block.timestamp - point.ts)) / (block.number - point.blk); } } // Now dt contains info on how far are we beyond point return _supplyAt(point, point.ts + dt); } function _tokenURI( uint256 _tokenId, uint256 _balanceOf, uint256 _lockedEnd, uint256 _value ) internal pure returns (string memory output) { output = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base">'; output = string( abi.encodePacked(output, "token ", _toString(_tokenId), '</text><text x="10" y="40" class="base">') ); output = string( abi.encodePacked(output, "balanceOf ", _toString(_balanceOf), '</text><text x="10" y="60" class="base">') ); output = string( abi.encodePacked(output, "locked_end ", _toString(_lockedEnd), '</text><text x="10" y="80" class="base">') ); output = string(abi.encodePacked(output, "value ", _toString(_value), "</text></svg>")); string memory json = Base64.encode( bytes( string( abi.encodePacked( '{"name": "lock #', _toString(_tokenId), '", "description": "Solidly locks, can be used to boost gauge yields, vote on token emission, and receive bribes", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}' ) ) ) ); output = string(abi.encodePacked("data:application/json;base64,", json)); } function _toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } function _burn(uint256 _tokenId) internal { require(_isApprovedOrOwner(msg.sender, _tokenId), "caller is not owner nor approved"); address owner = ownerOf(_tokenId); // Clear approval approve(address(0), _tokenId); // Remove token _removeTokenFrom(msg.sender, _tokenId); emit Transfer(owner, address(0), _tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_operatorMsg","type":"address"},{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"BoostAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"BoostRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"locktime","type":"uint256"},{"indexed":false,"internalType":"enum Locker.DepositType","name":"depositType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"SetOperatorContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"Supply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"I_MAXTIME","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXTIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MULTIPLIER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"abstain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addBoosts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"balanceOfAtNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"balanceOfNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_t","type":"uint256"}],"name":"balanceOfNFTAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boosts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"}],"name":"check","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_lockDuration","type":"uint256"}],"name":"createLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_lockDuration","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"createLockFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"depositFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getLastUserSlope","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_lockDuration","type":"uint256"}],"name":"increaseUnlockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"locked","outputs":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint256","name":"end","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"lockedEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"merge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatable","outputs":[{"internalType":"contract Operatable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownershipChange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pointHistory","outputs":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"uint256","name":"blk","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeBoosts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oper","type":"address"}],"name":"setOperContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"slopeChanges","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenIndex","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","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":"uint256","name":"_block","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"t","type":"uint256"}],"name":"totalSupplyAtT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"userPointEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userPointHistory","outputs":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"uint256","name":"blk","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_idx","type":"uint256"}],"name":"userPointHistoryTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"voting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b506040516200482e3803806200482e8339810160408190526200003491620001d6565b6001600081815581546001600160a01b0319166001600160a01b038616908117909255604051859291907f3ccbb406b985dd76fe05e172b432487a2ff9fe4257642d3acc350f167cb1d577908290a3506001600160a01b03821660a052437f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4fa55427f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f955608081905260136020527f317681100331673b27c2499894e78912f138ae85f2dd790e454ff96a89cf2d77805460ff1990811660019081179092557f5829b1f18259a9cdcd4268c3b072804d2f8e3dedbb1b883db1fa2055bb26d84f8054821683179055635b5e139f60e01b60009081527f65cb089fa41783e5af12e88573d882f263c09532a373334f0b809825d5a904ab80549092169092179055600c54604051909130916000805160206200480e833981519152908290a4600c5460405160009030906000805160206200480e833981519152908390a450505062000217565b80516001600160a01b0381168114620001d157600080fd5b919050565b600080600060608486031215620001ec57600080fd5b620001f784620001b9565b92506200020760208501620001b9565b9150604084015190509250925092565b60805160a05161458b620002836000396000818161097601528181610ee40152818161132901526122960152600081816104d6015281816118ad015281816127030152818161274901528181612bf301528181612c1401528181612c5f01526130b1015261458b6000f3fe608060405234801561001057600080fd5b50600436106103a45760003560e01c80637116c60c116101e9578063c1f0fb9f1161010f578063e7e242d4116100ad578063f52a36f71161007c578063f52a36f71461094e578063fc0c546a14610971578063fd4a77f114610998578063fdabc986146109ab57600080fd5b8063e7e242d4146108e1578063e985e9c5146108f4578063ec32e6df14610930578063ee00ef3a1461094357600080fd5b8063c87b56dd116100e9578063c87b56dd14610888578063d1c2babb1461089b578063e0514aba146108ae578063e58f5947146108c157600080fd5b8063c1f0fb9f1461085a578063c23697a81461086d578063c2c4c5c11461088057600080fd5b806395d89b4111610187578063b2383e5511610156578063b2383e55146107d9578063b45a3c0e146107ec578063b52c05fe14610834578063b88d4fde1461084757600080fd5b806395d89b4114610424578063981b24d0146107a05780639d507b8b146107b3578063a22cb465146107c657600080fd5b80638da5cb5b116101c35780638da5cb5b146107595780638fbb38ff14610761578063900cf0cf1461078457806390e056ab1461078d57600080fd5b80637116c60c146106f55780638ad4c447146107085780638c2c9baf1461074657600080fd5b80632e1a7d4d116102ce57806348ee26a31161026c578063570ca7351161023b578063570ca7351461068e578063626944df146106965780636352211e146106b957806370a08231146106e257600080fd5b806348ee26a3146106315780635312ea8e1461064457806354fd4d50146106575780635633e0a61461067b57600080fd5b8063418517c6116102a8578063418517c6146105bd57806342842e0e146105d0578063430c2081146105e357806344acb42a146105f657600080fd5b80632e1a7d4d1461055a5780632f745c591461056d578063313ce567146105a357600080fd5b80630ec84dda1161034657806318160ddd1161031557806318160ddd146105015780631fdbfd511461050957806323857d511461052757806323b872dd1461054757600080fd5b80630ec84dda146104ab5780630f589d63146104be5780630fb5a6b4146104d157806317d70f7c146104f857600080fd5b806305ae4f8c1161038257806305ae4f8c1461041157806306fdde0314610424578063081812fc14610455578063095ea7b31461049657600080fd5b806301ffc9a7146103a9578063047fc9aa146103eb578063059f8b1614610402575b600080fd5b6103d66103b73660046139a9565b6001600160e01b03191660009081526013602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6103f460025481565b6040519081526020016103e2565b6103f4670de0b6b3a764000081565b6103f461041f3660046139c6565b6109ce565b610448604051806040016040528060058152602001641d9953919560da1b81525081565b6040516103e29190613a40565b61047e610463366004613a53565b6000908152600e60205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016103e2565b6104a96104a4366004613a81565b610a01565b005b6104a96104b93660046139c6565b610aea565b6104a96104cc366004613aad565b610bda565b6103f47f000000000000000000000000000000000000000000000000000000000000000081565b6103f4600c5481565b6103f4610d38565b610514630784ce0081565b604051600f9190910b81526020016103e2565b6103f4610535366004613a53565b60046020526000908152604090205481565b6104a9610555366004613aca565b610d48565b6104a9610568366004613a53565b610d59565b6103f461057b366004613a81565b6001600160a01b03919091166000908152601060209081526040808320938352929052205490565b6105ab601281565b60405160ff90911681526020016103e2565b6104a96105cb366004613aad565b611000565b6104a96105de366004613aca565b61116a565b6103d66105f1366004613a81565b611185565b6106096106043660046139c6565b611198565b60408051600f95860b81529390940b60208401529282015260608101919091526080016103e2565b60015461047e906001600160a01b031681565b6104a9610652366004613a53565b6111df565b610448604051806040016040528060058152602001640312e302e360dc1b81525081565b610514610689366004613a53565b611360565b61047e6113a3565b6103f46106a4366004613a53565b60009081526003602052604090206001015490565b61047e6106c7366004613a53565b6000908152600d60205260409020546001600160a01b031690565b6103f46106f0366004613aad565b611411565b6103f4610703366004613a53565b61142f565b610609610716366004613a53565b600660205260009081526040902080546001820154600290920154600f82810b93600160801b909304900b919084565b6103f46107543660046139c6565b61148f565b61047e61149b565b6103d661076f366004613a53565b600a6020526000908152604090205460ff1681565b6103f460055481565b6104a961079b366004613aad565b6114e5565b6103f46107ae366004613a53565b61168f565b6104a96107c13660046139c6565b611831565b6104a96107d4366004613b19565b611a44565b6104a96107e73660046139c6565b611ac9565b61081a6107fa366004613a53565b60036020526000908152604090208054600190910154600f9190910b9082565b60408051600f9390930b83526020830191909152016103e2565b6103f46108423660046139c6565b611bcf565b6104a9610855366004613b68565b611c10565b6104a9610868366004613a53565b611d3d565b6103d661087b366004613aad565b611da1565b6104a9611e10565b610448610896366004613a53565b611e50565b6104a96108a93660046139c6565b611efd565b6103f46108bc3660046139c6565b612079565b6103f46108cf366004613a53565b60086020526000908152604090205481565b6103f46108ef366004613a53565b612085565b6103d6610902366004613c48565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205460ff1690565b6103f461093e366004613c76565b6120ad565b6103f4630784ce0081565b61051461095c366004613a53565b600960205260009081526040902054600f0b81565b61047e7f000000000000000000000000000000000000000000000000000000000000000081565b6104a96109a6366004613a53565b6120ef565b6103d66109b9366004613aad565b600b6020526000908152604090205460ff1681565b600082815260076020526040812082633b9aca0081106109f0576109f0613caf565b600302016001015490505b92915050565b6000818152600d60205260409020546001600160a01b031680610a2357600080fd5b806001600160a01b0316836001600160a01b03161415610a4257600080fd5b6000828152600d60209081526040808320546001600160a01b0385811685526012845282852033808752945291909320549216149060ff168180610a835750805b610a8c57600080fd5b6000848152600e602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b60026000541415610b165760405162461bcd60e51b8152600401610b0d90613cc5565b60405180910390fd5b600260009081558281526003602090815260409182902082518084019093528054600f0b8352600101549082015281610b4e57600080fd5b60008160000151600f0b13610b9e5760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610b0d565b42816020015111610bc15760405162461bcd60e51b8152600401610b0d90613cfc565b610bd0838360008460006121a5565b5050600160005550565b60015460408051638da5cb5b60e01b8152905133926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610c23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c479190613d40565b6001600160a01b031614610c9d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0d565b6001600160a01b038116610ce65760405162461bcd60e51b815260206004820152601060248201526f3130b2103732bb9037b832b930ba37b960811b6044820152606401610b0d565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f3ccbb406b985dd76fe05e172b432487a2ff9fe4257642d3acc350f167cb1d57790600090a35050565b6000610d434261142f565b905090565b610d54838383336123aa565b505050565b60026000541415610d7c5760405162461bcd60e51b8152600401610b0d90613cc5565b6002600055610d8b338261246b565b610da75760405162461bcd60e51b8152600401610b0d90613d5d565b6000818152600a602052604090205460ff1615610dd65760405162461bcd60e51b8152600401610b0d90613d7f565b60008181526003602090815260409182902082518084019093528054600f0b835260010154908201819052421015610e495760405162461bcd60e51b8152602060048201526016602482015275546865206c6f636b206469646e27742065787069726560501b6044820152606401610b0d565b8051604080518082018252600080825260208083018281528783526003909152929020905181546001600160801b0319166001600160801b039091161781559051600190910155600254600f9190910b90610ea48282613db7565b6002556040805180820190915260008082526020820152610ec890859085906124d1565b60405163a9059cbb60e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044015b6020604051808303816000875af1158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5a9190613dce565b610f6657610f66613deb565b610f6f84612b2a565b60408051858152602081018490524281830152905133917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca94919081900360600190a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c81610fdd8482613db7565b6040805192835260208301919091520160405180910390a1505060016000555050565b6001546040805163570ca73560e01b8152905133926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106d9190613d40565b6001600160a01b0316146110b25760405162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b6044820152606401610b0d565b6001600160a01b0381166000908152600b602052604090205460ff1615156001146111125760405162461bcd60e51b815260206004820152601060248201526f1059191c995cdcc81b9bc8195e1a5cdd60821b6044820152606401610b0d565b6001600160a01b0381166000818152600b6020908152604091829020805460ff1916905590519182527f127991bbd1c9df376a37f8311f693c9ac6efa87dda46e3518437ffd7d64cd17091015b60405180910390a150565b610d5483838360405180602001604052806000815250611c10565b6000611191838361246b565b9392505050565b600760205281600052604060002081633b9aca0081106111b757600080fd5b6003020180546001820154600290920154600f82810b9550600160801b90920490910b925084565b600260005414156112025760405162461bcd60e51b8152600401610b0d90613cc5565b6002600055611211338261246b565b61122d5760405162461bcd60e51b8152600401610b0d90613d5d565b6000818152600a60209081526040808320805460ff19169055600382529182902082518084019093528054600f0b8352600101549082018190524210156112af5760405162461bcd60e51b8152602060048201526016602482015275546865206c6f636b206469646e27742065787069726560501b6044820152606401610b0d565b8051604080518082018252600080825260208083018281528783526003909152929020905181546001600160801b0319166001600160801b039091161781559051600190910155600254600f9190910b9061130a8282613db7565b60025560405163a9059cbb60e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb90604401610f17565b6000818152600860209081526040808320546007909252822081633b9aca00811061138d5761138d613caf565b6003020154600160801b9004600f0b9392505050565b6001546040805163570ca73560e01b815290516000926001600160a01b03169163570ca7359160048083019260209291908290030181865afa1580156113ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d439190613d40565b6001600160a01b0381166000908152600f60205260408120546109fb565b600554600081815260066020908152604080832081516080810183528154600f81810b8352600160801b909104900b938101939093526001810154918301919091526002015460608201529091906114878185612be9565b949350505050565b60006111918383612d45565b60015460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa1580156113ed573d6000803e3d6000fd5b6001546040805163570ca73560e01b8152905133926001600160a01b03169163570ca7359160048083019260209291908290030181865afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115529190613d40565b6001600160a01b0316146115975760405162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b6044820152606401610b0d565b6001600160a01b0381166115d95760405162461bcd60e51b815260206004820152600960248201526830206164647265737360b81b6044820152606401610b0d565b6001600160a01b0381166000908152600b602052604090205460ff161561163b5760405162461bcd60e51b81526020600482015260166024820152754164647265737320616c72656164792065786973747360501b6044820152606401610b0d565b6001600160a01b0381166000818152600b6020908152604091829020805460ff1916600117905590519182527fd0f1faec010b3b1384e0407d8df907b92913d2e83b3407a77051eacebe4fe214910161115f565b6000438211156116a1576116a1613deb565b60055460006116b08483613022565b600081815260066020908152604080832081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060820152919250838310156117bf576000600681611713866001613e01565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060808301829052850151919250146117b9578260600151816060015161177f9190613db7565b836040015182604001516117939190613db7565b60608501516117a2908a613db7565b6117ac9190613e19565b6117b69190613e4e565b91505b5061180e565b4382606001511461180e5760608201516117d99043613db7565b60408301516117e89042613db7565b60608401516117f79089613db7565b6118019190613e19565b61180b9190613e4e565b90505b611827828284604001516118229190613e01565b612be9565b9695505050505050565b600260005414156118545760405162461bcd60e51b8152600401610b0d90613cc5565b6002600055611863338361246b565b61187f5760405162461bcd60e51b8152600401610b0d90613d5d565b600082815260036020908152604080832081518083019092528054600f0b82526001015491810191909152907f0000000000000000000000000000000000000000000000000000000000000000806118d78542613e01565b6118e19190613e4e565b6118eb9190613e19565b90504282602001511161192f5760405162461bcd60e51b815260206004820152600c60248201526b131bd8dac8195e1c1a5c995960a21b6044820152606401610b0d565b60008260000151600f0b1361197a5760405162461bcd60e51b8152602060048201526011602482015270139bdd1a1a5b99c81a5cc81b1bd8dad959607a1b6044820152606401610b0d565b816020015181116119cd5760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006044820152606401610b0d565b6119db630784ce0042613e01565b811115611a2a5760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610b0d565b611a39846000838560036121a5565b505060016000555050565b6001600160a01b038216331415611a5d57611a5d613deb565b3360008181526012602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60026000541415611aec5760405162461bcd60e51b8152600401610b0d90613cc5565b6002600055611afb338361246b565b611b175760405162461bcd60e51b8152600401610b0d90613d5d565b60008281526003602090815260409182902082518084019093528054600f0b8352600101549082015281611b4d57611b4d613deb565b60008160000151600f0b13611b9d5760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610b0d565b42816020015111611bc05760405162461bcd60e51b8152600401610b0d90613cfc565b610bd0838360008460026121a5565b600060026000541415611bf45760405162461bcd60e51b8152600401610b0d90613cc5565b6002600055611c048383336130ac565b60016000559392505050565b611c1c848484336123aa565b823b15611d3757604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611c55903390889087908790600401613e62565b6020604051808303816000875af1925050508015611c90575060408051601f3d908101601f19168201909252611c8d91810190613e95565b60015b611d35573d808015611cbe576040519150601f19603f3d011682016040523d82523d6000602084013e611cc3565b606091505b508051611d2d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b0d565b805181602001fd5b505b50505050565b336000908152600b602052604090205460ff16611d895760405162461bcd60e51b815260206004820152600a60248201526937b7363c903b37ba32b960b11b6044820152606401610b0d565b6000908152600a60205260409020805460ff19169055565b600154604051631846d2f560e31b81526001600160a01b038381166004830152600092169063c23697a890602401602060405180830381865afa158015611dec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fb9190613dce565b611e4e600060405180604001604052806000600f0b8152602001600081525060405180604001604052806000600f0b815260200160008152506124d1565b565b6000818152600d60205260409020546060906001600160a01b0316611eb75760405162461bcd60e51b815260206004820152601b60248201527f517565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610b0d565b60008281526003602090815260409182902082518084019093528054600f0b8352600101549082015261119183611eee8142613294565b60208401518451600f0b613366565b6000828152600a602052604090205460ff1615611f2c5760405162461bcd60e51b8152600401610b0d90613d7f565b80821415611f3957600080fd5b611f43338361246b565b611f5f5760405162461bcd60e51b8152600401610b0d90613d5d565b611f69338261246b565b611f855760405162461bcd60e51b8152600401610b0d90613d5d565b6000828152600360208181526040808420815180830183528154600f90810b825260019283015482860190815288885295855283872084518086019095528054820b855290920154938301849052805194519095929490910b921115611fef578260200151611ff5565b83602001515b604080518082018252600080825260208083018281528b835260038252848320935184546001600160801b0319166001600160801b039091161784555160019093019290925582518084019093528083529082015290915061205a90879086906124d1565b61206386612b2a565b6120718583838660046121a5565b505050505050565b60006111918383613294565b6000818152600460205260408120544314156120a357506000919050565b6109fb8242613294565b6000600260005414156120d25760405162461bcd60e51b8152600401610b0d90613cc5565b60026000556120e28484846130ac565b6001600055949350505050565b336000908152600b602052604090205460ff1661213b5760405162461bcd60e51b815260206004820152600a60248201526937b7363c903b37ba32b960b11b6044820152606401610b0d565b6000818152600a602052604090205460ff161561218a5760405162461bcd60e51b815260206004820152600d60248201526c1d1bdad95b9259081d9bdd1959609a1b6044820152606401610b0d565b6000908152600a60205260409020805460ff19166001179055565b60025482906121b48682613e01565b6002556040805180820190915260008082526020820152825160208085015190830152600f0b81528251879084906121ed908390613eb2565b600f0b905250851561220157602083018690525b6000888152600360209081526040909120845181546001600160801b0319166001600160801b03909116178155908401516001909101556122438882856124d1565b3387158015906122655750600485600481111561226257612262613f01565b14155b1561230f576040516323b872dd60e01b81526001600160a01b038281166004830152306024830152604482018a90527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303816000875af11580156122df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123039190613dce565b61230f5761230f613deb565b8360200151816001600160a01b03167fff04ccafc360e16b67d682d17bd9503c4c6b9a131f6be6325762dc9ffc7de6248b8b89426040516123539493929190613f17565b60405180910390a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c836123878a82613e01565b6040805192835260208301919091520160405180910390a1505050505050505050565b6000828152600a602052604090205460ff16156123d95760405162461bcd60e51b8152600401610b0d90613d7f565b6123e3818361246b565b6123ff5760405162461bcd60e51b8152600401610b0d90613d5d565b612409848361349d565b6124138483613504565b61241d8383613585565b6000828152600460205260408082204390555183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050565b6000818152600d6020908152604080832054600e8352818420546001600160a01b039182168086526012855283862088841680885295529285205492938085149392909116149060ff1682806124be5750815b806124c65750805b979650505050505050565b6040805160808101825260008082526020820181905291810182905260608101919091526040805160808101825260008082526020820181905291810182905260608101919091526005546000908190871561263d57428760200151118015612541575060008760000151600f0b135b1561258657865161255790630784ce0090613f55565b600f0b602080870191909152870151612571904290613db7565b85602001516125809190613f93565b600f0b85525b4286602001511180156125a0575060008660000151600f0b135b156125e55785516125b690630784ce0090613f55565b600f0b6020808601919091528601516125d0904290613db7565b84602001516125df9190613f93565b600f0b84525b602080880151600090815260098252604090205490870151600f9190910b93501561263d578660200151866020015114156126225782915061263d565b602080870151600090815260099091526040902054600f0b91505b6040805160808101825260008082526020820152429181019190915243606082015281156126b2575060008181526006602090815260409182902082516080810184528154600f81810b8352600160801b909104900b9281019290925260018101549282019290925260029091015460608201525b6040810151816000428310156126ff5760408401516126d19042613db7565b60608501516126e09043613db7565b6126f290670de0b6b3a7640000613e19565b6126fc9190613e4e565b90505b60007f000000000000000000000000000000000000000000000000000000000000000061272c8186613e4e565b6127369190613e19565b905060005b60ff8110156128ce5761276e7f000000000000000000000000000000000000000000000000000000000000000083613e01565b915060004283111561278257429250612796565b50600082815260096020526040902054600f0b5b6127a08684613db7565b87602001516127af9190613f93565b875188906127be908390614028565b600f0b9052506020870180518291906127d8908390613eb2565b600f90810b90915288516000910b121590506127f357600087525b60008760200151600f0b121561280b57600060208801525b60408088018490528501519295508592670de0b6b3a76400009061282f9085613db7565b6128399086613e19565b6128439190613e4e565b85606001516128529190613e01565b6060880152612862600189613e01565b97504283141561287857504360608701526128ce565b6000888152600660209081526040918290208951918a01516001600160801b03908116600160801b0292169190911781559088015160018201556060880151600290910155506128c781614078565b905061273b565b505060058590558b1561295957886020015188602001516128ef9190614028565b846020018181516129009190613eb2565b600f0b905250885188516129149190614028565b84518590612923908390613eb2565b600f90810b90915260208601516000910b1215905061294457600060208501525b60008460000151600f0b121561295957600084525b6000858152600660209081526040918290208651918701516001600160801b03908116600160801b02921691909117815590850151600182015560608501516002909101558b15612b1c57428b602001511115612a115760208901516129bf9088613eb2565b96508a602001518a6020015114156129e35760208801516129e09088614028565b96505b60208b810151600090815260099091526040902080546001600160801b0319166001600160801b0389161790555b428a602001511115612a6c578a602001518a602001511115612a6c576020880151612a3c9087614028565b60208b810151600090815260099091526040902080546001600160801b0319166001600160801b03831617905595505b60008c815260086020526040812054612a86906001613e01565b905080600860008f815260200190815260200160002081905550428960400181815250504389606001818152505088600760008f815260200190815260200160002082633b9aca008110612adc57612adc613caf565b825160208401516001600160801b03908116600160801b029116176003919091029190910190815560408201516001820155606090910151600290910155505b505050505050505050505050565b612b34338261246b565b612b805760405162461bcd60e51b815260206004820181905260248201527f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b0d565b6000818152600d60205260408120546001600160a01b031690612ba39083610a01565b612bad3383613504565b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008083905060007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008360400151612c429190613e4e565b612c4c9190613e19565b905060005b60ff811015612d1d57612c847f000000000000000000000000000000000000000000000000000000000000000083613e01565b9150600085831115612c9857859250612cac565b50600082815260096020526040902054600f0b5b6040840151612cbb9084613db7565b8460200151612cca9190613f93565b84518590612cd9908390614028565b600f0b90525082861415612ced5750612d1d565b8084602001818151612cff9190613eb2565b600f0b9052505060408301829052612d1681614078565b9050612c51565b5060008260000151600f0b1215612d3357600082525b50516001600160801b03169392505050565b600043821115612d5757612d57613deb565b600083815260086020526040812054815b6080811015612dfb57818310612d7d57612dfb565b60006002612d8b8486613e01565b612d96906001613e01565b612da09190613e4e565b6000888152600760205260409020909150869082633b9aca008110612dc757612dc7613caf565b600302016002015411612ddc57809350612dea565b612de7600182613db7565b92505b50612df481614078565b9050612d68565b50600085815260076020526040812083633b9aca008110612e1e57612e1e613caf565b60408051608081018252600392909202929092018054600f81810b8452600160801b909104900b602083015260018101549282019290925260029091015460608201526005549091506000612e738783613022565b600081815260066020908152604080832081516080810183528154600f81810b8352600160801b909104900b938101939093526001810154918301919091526002015460608201529192508084841015612f52576000600681612ed7876001613e01565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060808301829052860151919250612f349190613db7565b925083604001518160400151612f4a9190613db7565b915050612f76565b6060830151612f619043613db7565b9150826040015142612f739190613db7565b90505b60408301518215612fb3578284606001518c612f929190613db7565b612f9c9084613e19565b612fa69190613e4e565b612fb09082613e01565b90505b6040870151612fc29082613db7565b8760200151612fd19190613f93565b87518890612fe0908390614028565b600f90810b90915288516000910b12905061301057505093516001600160801b031696506109fb95505050505050565b600099505050505050505050506109fb565b60008082815b60808110156130a25781831061303d576130a2565b6000600261304b8486613e01565b613056906001613e01565b6130609190613e4e565b600081815260066020526040902060020154909150871061308357809350613091565b61308e600182613db7565b92505b5061309b81614078565b9050613028565b5090949350505050565b6000807f0000000000000000000000000000000000000000000000000000000000000000806130db8642613e01565b6130e59190613e4e565b6130ef9190613e19565b90506000851161312a5760405162461bcd60e51b8152600401610b0d90602080825260049082015263076203e360e41b604082015260600190565b61313383611411565b156131725760405162461bcd60e51b815260206004820152600f60248201526e1b195cdcc81d1a185b880c481b999d608a1b6044820152606401610b0d565b4281116131d05760405162461bcd60e51b815260206004820152602660248201527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e207468652060448201526566757475726560d01b6064820152608401610b0d565b6131de630784ce0042613e01565b81111561322d5760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610b0d565b600c6000815461323c90614078565b90915550600c5461324d848261361b565b5060008181526003602090815260409182902082518084019093528054600f0b83526001908101549183019190915261328b918391899186916121a5565b95945050505050565b600082815260086020526040812054806132b25760009150506109fb565b600084815260076020526040812082633b9aca0081106132d4576132d4613caf565b60408051608081018252600392909202929092018054600f81810b8452600160801b909104900b6020830152600181015492820183905260020154606082015291506133209085614093565b816020015161332f9190613f93565b8151829061333e908390614028565b600f90810b90915282516000910b1215905061335957600081525b51600f0b91506109fb9050565b606060405180610120016040528060fd815260200161441960fd913990508061338e8661367e565b60405160200161339f9291906140d2565b6040516020818303038152906040529050806133ba8561367e565b6040516020016133cb92919061414e565b6040516020818303038152906040529050806133e68461367e565b6040516020016133f79291906141ce565b6040516020818303038152906040529050806134128361367e565b60405160200161342392919061424f565b604051602081830303815290604052905060006134706134428761367e565b61344b8461377c565b60405160200161345c9291906142aa565b60405160208183030381529060405261377c565b90508060405160200161348391906143bf565b604051602081830303815290604052915050949350505050565b6000818152600d60205260409020546001600160a01b038381169116146134c6576134c6613deb565b6000818152600e60205260409020546001600160a01b031615613500576000818152600e6020526040902080546001600160a01b03191690555b5050565b6000818152600d60205260409020546001600160a01b0383811691161461352d5761352d613deb565b6000818152600d6020526040902080546001600160a01b031916905561355382826138d0565b6001600160a01b0382166000908152600f6020526040812080546001929061357c908490613db7565b90915550505050565b6000818152600d60205260409020546001600160a01b0316156135aa576135aa613deb565b6000818152600d6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600f8084528285208054601086528487208188528652848720889055878752601186529386209390935590845290915280546001929061357c908490613e01565b60006001600160a01b03831661363357613633613deb565b61363d8383613585565b60405182906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450600192915050565b6060816136a25750506040805180820190915260018152600360fc1b602082015290565b8160005b81156136cc57806136b681614078565b91506136c59050600a83613e4e565b91506136a6565b60008167ffffffffffffffff8111156136e7576136e7613b52565b6040519080825280601f01601f191660200182016040528015613711576020820181803683370190505b5090505b841561148757613726600183613db7565b9150613733600a86614404565b61373e906030613e01565b60f81b81838151811061375357613753613caf565b60200101906001600160f81b031916908160001a905350613775600a86613e4e565b9450613715565b606081516000141561379c57505060408051602081019091526000815290565b600060405180606001604052806040815260200161451660409139905060006003845160026137cb9190613e01565b6137d59190613e4e565b6137e0906004613e19565b67ffffffffffffffff8111156137f8576137f8613b52565b6040519080825280601f01601f191660200182016040528015613822576020820181803683370190505b509050600182016020820185865187015b8082101561388e576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250613833565b50506003865106600181146138aa57600281146138bd576138c5565b603d6001830353603d60028303536138c5565b603d60018303535b509195945050505050565b6001600160a01b0382166000908152600f60205260408120546138f590600190613db7565b60008381526011602052604090205490915080821415613945576001600160a01b038416600090815260106020908152604080832085845282528083208390558583526011909152812055611d37565b6001600160a01b039390931660009081526010602090815260408083209383529281528282208054868452848420819055835260119091528282209490945592839055908252812055565b6001600160e01b0319811681146139a657600080fd5b50565b6000602082840312156139bb57600080fd5b813561119181613990565b600080604083850312156139d957600080fd5b50508035926020909101359150565b60005b83811015613a035781810151838201526020016139eb565b83811115611d375750506000910152565b60008151808452613a2c8160208601602086016139e8565b601f01601f19169290920160200192915050565b6020815260006111916020830184613a14565b600060208284031215613a6557600080fd5b5035919050565b6001600160a01b03811681146139a657600080fd5b60008060408385031215613a9457600080fd5b8235613a9f81613a6c565b946020939093013593505050565b600060208284031215613abf57600080fd5b813561119181613a6c565b600080600060608486031215613adf57600080fd5b8335613aea81613a6c565b92506020840135613afa81613a6c565b929592945050506040919091013590565b80151581146139a657600080fd5b60008060408385031215613b2c57600080fd5b8235613b3781613a6c565b91506020830135613b4781613b0b565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215613b7e57600080fd5b8435613b8981613a6c565b93506020850135613b9981613a6c565b925060408501359150606085013567ffffffffffffffff80821115613bbd57600080fd5b818701915087601f830112613bd157600080fd5b813581811115613be357613be3613b52565b604051601f8201601f19908116603f01168101908382118183101715613c0b57613c0b613b52565b816040528281528a6020848701011115613c2457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215613c5b57600080fd5b8235613c6681613a6c565b91506020830135613b4781613a6c565b600080600060608486031215613c8b57600080fd5b83359250602084013591506040840135613ca481613a6c565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526024908201527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686040820152636472617760e01b606082015260800190565b600060208284031215613d5257600080fd5b815161119181613a6c565b60208082526008908201526737379037bbb732b960c11b604082015260600190565b602080825260089082015267185d1d1858da195960c21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613dc957613dc9613da1565b500390565b600060208284031215613de057600080fd5b815161119181613b0b565b634e487b7160e01b600052600160045260246000fd5b60008219821115613e1457613e14613da1565b500190565b6000816000190483118215151615613e3357613e33613da1565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613e5d57613e5d613e38565b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061182790830184613a14565b600060208284031215613ea757600080fd5b815161119181613990565b600081600f0b83600f0b600082128260016001607f1b0303821381151615613edc57613edc613da1565b8260016001607f1b0319038212811615613ef857613ef8613da1565b50019392505050565b634e487b7160e01b600052602160045260246000fd5b848152602081018490526080810160058410613f4357634e487b7160e01b600052602160045260246000fd5b60408201939093526060015292915050565b600081600f0b83600f0b80613f6c57613f6c613e38565b60016001607f1b0319821460001982141615613f8a57613f8a613da1565b90059392505050565b600081600f0b83600f0b60016001607f1b03600082136000841383830485118282161615613fc357613fc3613da1565b60016001607f1b03196000851282811687830587121615613fe657613fe6613da1565b6000871292508582058712848416161561400257614002613da1565b8585058712818416161561401857614018613da1565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561405357614053613da1565b8160016001607f1b0301831381161561406e5761406e613da1565b5090039392505050565b600060001982141561408c5761408c613da1565b5060010190565b60008083128015600160ff1b8501841216156140b1576140b1613da1565b6001600160ff1b03840183138116156140cc576140cc613da1565b50500390565b600083516140e48184602088016139e8565b6503a37b5b2b7160d51b90830190815283516141078160068401602088016139e8565b7f3c2f746578743e3c7465787420783d2231302220793d2234302220636c61737360069290910191820152671e913130b9b2911f60c11b6026820152602e01949350505050565b600083516141608184602088016139e8565b6903130b630b731b2a7b3160b51b908301908152835161418781600a8401602088016139e8565b7f3c2f746578743e3c7465787420783d2231302220793d2236302220636c617373600a9290910191820152671e913130b9b2911f60c11b602a820152603201949350505050565b600083516141e08184602088016139e8565b6a03637b1b5b2b22fb2b732160ad1b908301908152835161420881600b8401602088016139e8565b7f3c2f746578743e3c7465787420783d2231302220793d2238302220636c617373600b9290910191820152671e913130b9b2911f60c11b602b820152603301949350505050565b600083516142618184602088016139e8565b6503b30b63ab2960d51b90830190815283516142848160068401602088016139e8565b6c1e17ba32bc3a1f1e17b9bb339f60991b60069290910191820152601301949350505050565b6f7b226e616d65223a20226c6f636b202360801b815282516000906142d68160108501602088016139e8565b7f222c20226465736372697074696f6e223a2022536f6c69646c79206c6f636b736010918401918201527f2c2063616e206265207573656420746f20626f6f73742067617567652079696560308201527f6c64732c20766f7465206f6e20746f6b656e20656d697373696f6e2c20616e6460508201527f207265636569766520627269626573222c2022696d616765223a2022646174616070820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b609082015283516143a48160a68401602088016139e8565b61227d60f01b60a6929091019182015260a801949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516143f781601d8501602087016139e8565b91909101601d0192915050565b60008261441357614413613e38565b50069056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220433e30d3ca1fff6dec01eac8057bade0845e78bd8dc9097ac6b69bf70b27035c64736f6c634300080a0033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000000000000000000000077c80b164f4b17466c49708c5fa522435435b049000000000000000000000000b44e11153316bd02d26c2f7c5b402e8a95ea66d80000000000000000000000000000000000000000000000000000000000127500
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103a45760003560e01c80637116c60c116101e9578063c1f0fb9f1161010f578063e7e242d4116100ad578063f52a36f71161007c578063f52a36f71461094e578063fc0c546a14610971578063fd4a77f114610998578063fdabc986146109ab57600080fd5b8063e7e242d4146108e1578063e985e9c5146108f4578063ec32e6df14610930578063ee00ef3a1461094357600080fd5b8063c87b56dd116100e9578063c87b56dd14610888578063d1c2babb1461089b578063e0514aba146108ae578063e58f5947146108c157600080fd5b8063c1f0fb9f1461085a578063c23697a81461086d578063c2c4c5c11461088057600080fd5b806395d89b4111610187578063b2383e5511610156578063b2383e55146107d9578063b45a3c0e146107ec578063b52c05fe14610834578063b88d4fde1461084757600080fd5b806395d89b4114610424578063981b24d0146107a05780639d507b8b146107b3578063a22cb465146107c657600080fd5b80638da5cb5b116101c35780638da5cb5b146107595780638fbb38ff14610761578063900cf0cf1461078457806390e056ab1461078d57600080fd5b80637116c60c146106f55780638ad4c447146107085780638c2c9baf1461074657600080fd5b80632e1a7d4d116102ce57806348ee26a31161026c578063570ca7351161023b578063570ca7351461068e578063626944df146106965780636352211e146106b957806370a08231146106e257600080fd5b806348ee26a3146106315780635312ea8e1461064457806354fd4d50146106575780635633e0a61461067b57600080fd5b8063418517c6116102a8578063418517c6146105bd57806342842e0e146105d0578063430c2081146105e357806344acb42a146105f657600080fd5b80632e1a7d4d1461055a5780632f745c591461056d578063313ce567146105a357600080fd5b80630ec84dda1161034657806318160ddd1161031557806318160ddd146105015780631fdbfd511461050957806323857d511461052757806323b872dd1461054757600080fd5b80630ec84dda146104ab5780630f589d63146104be5780630fb5a6b4146104d157806317d70f7c146104f857600080fd5b806305ae4f8c1161038257806305ae4f8c1461041157806306fdde0314610424578063081812fc14610455578063095ea7b31461049657600080fd5b806301ffc9a7146103a9578063047fc9aa146103eb578063059f8b1614610402575b600080fd5b6103d66103b73660046139a9565b6001600160e01b03191660009081526013602052604090205460ff1690565b60405190151581526020015b60405180910390f35b6103f460025481565b6040519081526020016103e2565b6103f4670de0b6b3a764000081565b6103f461041f3660046139c6565b6109ce565b610448604051806040016040528060058152602001641d9953919560da1b81525081565b6040516103e29190613a40565b61047e610463366004613a53565b6000908152600e60205260409020546001600160a01b031690565b6040516001600160a01b0390911681526020016103e2565b6104a96104a4366004613a81565b610a01565b005b6104a96104b93660046139c6565b610aea565b6104a96104cc366004613aad565b610bda565b6103f47f000000000000000000000000000000000000000000000000000000000012750081565b6103f4600c5481565b6103f4610d38565b610514630784ce0081565b604051600f9190910b81526020016103e2565b6103f4610535366004613a53565b60046020526000908152604090205481565b6104a9610555366004613aca565b610d48565b6104a9610568366004613a53565b610d59565b6103f461057b366004613a81565b6001600160a01b03919091166000908152601060209081526040808320938352929052205490565b6105ab601281565b60405160ff90911681526020016103e2565b6104a96105cb366004613aad565b611000565b6104a96105de366004613aca565b61116a565b6103d66105f1366004613a81565b611185565b6106096106043660046139c6565b611198565b60408051600f95860b81529390940b60208401529282015260608101919091526080016103e2565b60015461047e906001600160a01b031681565b6104a9610652366004613a53565b6111df565b610448604051806040016040528060058152602001640312e302e360dc1b81525081565b610514610689366004613a53565b611360565b61047e6113a3565b6103f46106a4366004613a53565b60009081526003602052604090206001015490565b61047e6106c7366004613a53565b6000908152600d60205260409020546001600160a01b031690565b6103f46106f0366004613aad565b611411565b6103f4610703366004613a53565b61142f565b610609610716366004613a53565b600660205260009081526040902080546001820154600290920154600f82810b93600160801b909304900b919084565b6103f46107543660046139c6565b61148f565b61047e61149b565b6103d661076f366004613a53565b600a6020526000908152604090205460ff1681565b6103f460055481565b6104a961079b366004613aad565b6114e5565b6103f46107ae366004613a53565b61168f565b6104a96107c13660046139c6565b611831565b6104a96107d4366004613b19565b611a44565b6104a96107e73660046139c6565b611ac9565b61081a6107fa366004613a53565b60036020526000908152604090208054600190910154600f9190910b9082565b60408051600f9390930b83526020830191909152016103e2565b6103f46108423660046139c6565b611bcf565b6104a9610855366004613b68565b611c10565b6104a9610868366004613a53565b611d3d565b6103d661087b366004613aad565b611da1565b6104a9611e10565b610448610896366004613a53565b611e50565b6104a96108a93660046139c6565b611efd565b6103f46108bc3660046139c6565b612079565b6103f46108cf366004613a53565b60086020526000908152604090205481565b6103f46108ef366004613a53565b612085565b6103d6610902366004613c48565b6001600160a01b03918216600090815260126020908152604080832093909416825291909152205460ff1690565b6103f461093e366004613c76565b6120ad565b6103f4630784ce0081565b61051461095c366004613a53565b600960205260009081526040902054600f0b81565b61047e7f000000000000000000000000b44e11153316bd02d26c2f7c5b402e8a95ea66d881565b6104a96109a6366004613a53565b6120ef565b6103d66109b9366004613aad565b600b6020526000908152604090205460ff1681565b600082815260076020526040812082633b9aca0081106109f0576109f0613caf565b600302016001015490505b92915050565b6000818152600d60205260409020546001600160a01b031680610a2357600080fd5b806001600160a01b0316836001600160a01b03161415610a4257600080fd5b6000828152600d60209081526040808320546001600160a01b0385811685526012845282852033808752945291909320549216149060ff168180610a835750805b610a8c57600080fd5b6000848152600e602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b60026000541415610b165760405162461bcd60e51b8152600401610b0d90613cc5565b60405180910390fd5b600260009081558281526003602090815260409182902082518084019093528054600f0b8352600101549082015281610b4e57600080fd5b60008160000151600f0b13610b9e5760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610b0d565b42816020015111610bc15760405162461bcd60e51b8152600401610b0d90613cfc565b610bd0838360008460006121a5565b5050600160005550565b60015460408051638da5cb5b60e01b8152905133926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa158015610c23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c479190613d40565b6001600160a01b031614610c9d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0d565b6001600160a01b038116610ce65760405162461bcd60e51b815260206004820152601060248201526f3130b2103732bb9037b832b930ba37b960811b6044820152606401610b0d565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f3ccbb406b985dd76fe05e172b432487a2ff9fe4257642d3acc350f167cb1d57790600090a35050565b6000610d434261142f565b905090565b610d54838383336123aa565b505050565b60026000541415610d7c5760405162461bcd60e51b8152600401610b0d90613cc5565b6002600055610d8b338261246b565b610da75760405162461bcd60e51b8152600401610b0d90613d5d565b6000818152600a602052604090205460ff1615610dd65760405162461bcd60e51b8152600401610b0d90613d7f565b60008181526003602090815260409182902082518084019093528054600f0b835260010154908201819052421015610e495760405162461bcd60e51b8152602060048201526016602482015275546865206c6f636b206469646e27742065787069726560501b6044820152606401610b0d565b8051604080518082018252600080825260208083018281528783526003909152929020905181546001600160801b0319166001600160801b039091161781559051600190910155600254600f9190910b90610ea48282613db7565b6002556040805180820190915260008082526020820152610ec890859085906124d1565b60405163a9059cbb60e01b8152336004820152602481018390527f000000000000000000000000b44e11153316bd02d26c2f7c5b402e8a95ea66d86001600160a01b03169063a9059cbb906044015b6020604051808303816000875af1158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5a9190613dce565b610f6657610f66613deb565b610f6f84612b2a565b60408051858152602081018490524281830152905133917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca94919081900360600190a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c81610fdd8482613db7565b6040805192835260208301919091520160405180910390a1505060016000555050565b6001546040805163570ca73560e01b8152905133926001600160a01b03169163570ca7359160048083019260209291908290030181865afa158015611049573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106d9190613d40565b6001600160a01b0316146110b25760405162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b6044820152606401610b0d565b6001600160a01b0381166000908152600b602052604090205460ff1615156001146111125760405162461bcd60e51b815260206004820152601060248201526f1059191c995cdcc81b9bc8195e1a5cdd60821b6044820152606401610b0d565b6001600160a01b0381166000818152600b6020908152604091829020805460ff1916905590519182527f127991bbd1c9df376a37f8311f693c9ac6efa87dda46e3518437ffd7d64cd17091015b60405180910390a150565b610d5483838360405180602001604052806000815250611c10565b6000611191838361246b565b9392505050565b600760205281600052604060002081633b9aca0081106111b757600080fd5b6003020180546001820154600290920154600f82810b9550600160801b90920490910b925084565b600260005414156112025760405162461bcd60e51b8152600401610b0d90613cc5565b6002600055611211338261246b565b61122d5760405162461bcd60e51b8152600401610b0d90613d5d565b6000818152600a60209081526040808320805460ff19169055600382529182902082518084019093528054600f0b8352600101549082018190524210156112af5760405162461bcd60e51b8152602060048201526016602482015275546865206c6f636b206469646e27742065787069726560501b6044820152606401610b0d565b8051604080518082018252600080825260208083018281528783526003909152929020905181546001600160801b0319166001600160801b039091161781559051600190910155600254600f9190910b9061130a8282613db7565b60025560405163a9059cbb60e01b8152336004820152602481018390527f000000000000000000000000b44e11153316bd02d26c2f7c5b402e8a95ea66d86001600160a01b03169063a9059cbb90604401610f17565b6000818152600860209081526040808320546007909252822081633b9aca00811061138d5761138d613caf565b6003020154600160801b9004600f0b9392505050565b6001546040805163570ca73560e01b815290516000926001600160a01b03169163570ca7359160048083019260209291908290030181865afa1580156113ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d439190613d40565b6001600160a01b0381166000908152600f60205260408120546109fb565b600554600081815260066020908152604080832081516080810183528154600f81810b8352600160801b909104900b938101939093526001810154918301919091526002015460608201529091906114878185612be9565b949350505050565b60006111918383612d45565b60015460408051638da5cb5b60e01b815290516000926001600160a01b031691638da5cb5b9160048083019260209291908290030181865afa1580156113ed573d6000803e3d6000fd5b6001546040805163570ca73560e01b8152905133926001600160a01b03169163570ca7359160048083019260209291908290030181865afa15801561152e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115529190613d40565b6001600160a01b0316146115975760405162461bcd60e51b815260206004820152600c60248201526b3737ba1037b832b930ba37b960a11b6044820152606401610b0d565b6001600160a01b0381166115d95760405162461bcd60e51b815260206004820152600960248201526830206164647265737360b81b6044820152606401610b0d565b6001600160a01b0381166000908152600b602052604090205460ff161561163b5760405162461bcd60e51b81526020600482015260166024820152754164647265737320616c72656164792065786973747360501b6044820152606401610b0d565b6001600160a01b0381166000818152600b6020908152604091829020805460ff1916600117905590519182527fd0f1faec010b3b1384e0407d8df907b92913d2e83b3407a77051eacebe4fe214910161115f565b6000438211156116a1576116a1613deb565b60055460006116b08483613022565b600081815260066020908152604080832081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060820152919250838310156117bf576000600681611713866001613e01565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060808301829052850151919250146117b9578260600151816060015161177f9190613db7565b836040015182604001516117939190613db7565b60608501516117a2908a613db7565b6117ac9190613e19565b6117b69190613e4e565b91505b5061180e565b4382606001511461180e5760608201516117d99043613db7565b60408301516117e89042613db7565b60608401516117f79089613db7565b6118019190613e19565b61180b9190613e4e565b90505b611827828284604001516118229190613e01565b612be9565b9695505050505050565b600260005414156118545760405162461bcd60e51b8152600401610b0d90613cc5565b6002600055611863338361246b565b61187f5760405162461bcd60e51b8152600401610b0d90613d5d565b600082815260036020908152604080832081518083019092528054600f0b82526001015491810191909152907f0000000000000000000000000000000000000000000000000000000000127500806118d78542613e01565b6118e19190613e4e565b6118eb9190613e19565b90504282602001511161192f5760405162461bcd60e51b815260206004820152600c60248201526b131bd8dac8195e1c1a5c995960a21b6044820152606401610b0d565b60008260000151600f0b1361197a5760405162461bcd60e51b8152602060048201526011602482015270139bdd1a1a5b99c81a5cc81b1bd8dad959607a1b6044820152606401610b0d565b816020015181116119cd5760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006044820152606401610b0d565b6119db630784ce0042613e01565b811115611a2a5760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610b0d565b611a39846000838560036121a5565b505060016000555050565b6001600160a01b038216331415611a5d57611a5d613deb565b3360008181526012602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60026000541415611aec5760405162461bcd60e51b8152600401610b0d90613cc5565b6002600055611afb338361246b565b611b175760405162461bcd60e51b8152600401610b0d90613d5d565b60008281526003602090815260409182902082518084019093528054600f0b8352600101549082015281611b4d57611b4d613deb565b60008160000151600f0b13611b9d5760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610b0d565b42816020015111611bc05760405162461bcd60e51b8152600401610b0d90613cfc565b610bd0838360008460026121a5565b600060026000541415611bf45760405162461bcd60e51b8152600401610b0d90613cc5565b6002600055611c048383336130ac565b60016000559392505050565b611c1c848484336123aa565b823b15611d3757604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611c55903390889087908790600401613e62565b6020604051808303816000875af1925050508015611c90575060408051601f3d908101601f19168201909252611c8d91810190613e95565b60015b611d35573d808015611cbe576040519150601f19603f3d011682016040523d82523d6000602084013e611cc3565b606091505b508051611d2d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b0d565b805181602001fd5b505b50505050565b336000908152600b602052604090205460ff16611d895760405162461bcd60e51b815260206004820152600a60248201526937b7363c903b37ba32b960b11b6044820152606401610b0d565b6000908152600a60205260409020805460ff19169055565b600154604051631846d2f560e31b81526001600160a01b038381166004830152600092169063c23697a890602401602060405180830381865afa158015611dec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fb9190613dce565b611e4e600060405180604001604052806000600f0b8152602001600081525060405180604001604052806000600f0b815260200160008152506124d1565b565b6000818152600d60205260409020546060906001600160a01b0316611eb75760405162461bcd60e51b815260206004820152601b60248201527f517565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610b0d565b60008281526003602090815260409182902082518084019093528054600f0b8352600101549082015261119183611eee8142613294565b60208401518451600f0b613366565b6000828152600a602052604090205460ff1615611f2c5760405162461bcd60e51b8152600401610b0d90613d7f565b80821415611f3957600080fd5b611f43338361246b565b611f5f5760405162461bcd60e51b8152600401610b0d90613d5d565b611f69338261246b565b611f855760405162461bcd60e51b8152600401610b0d90613d5d565b6000828152600360208181526040808420815180830183528154600f90810b825260019283015482860190815288885295855283872084518086019095528054820b855290920154938301849052805194519095929490910b921115611fef578260200151611ff5565b83602001515b604080518082018252600080825260208083018281528b835260038252848320935184546001600160801b0319166001600160801b039091161784555160019093019290925582518084019093528083529082015290915061205a90879086906124d1565b61206386612b2a565b6120718583838660046121a5565b505050505050565b60006111918383613294565b6000818152600460205260408120544314156120a357506000919050565b6109fb8242613294565b6000600260005414156120d25760405162461bcd60e51b8152600401610b0d90613cc5565b60026000556120e28484846130ac565b6001600055949350505050565b336000908152600b602052604090205460ff1661213b5760405162461bcd60e51b815260206004820152600a60248201526937b7363c903b37ba32b960b11b6044820152606401610b0d565b6000818152600a602052604090205460ff161561218a5760405162461bcd60e51b815260206004820152600d60248201526c1d1bdad95b9259081d9bdd1959609a1b6044820152606401610b0d565b6000908152600a60205260409020805460ff19166001179055565b60025482906121b48682613e01565b6002556040805180820190915260008082526020820152825160208085015190830152600f0b81528251879084906121ed908390613eb2565b600f0b905250851561220157602083018690525b6000888152600360209081526040909120845181546001600160801b0319166001600160801b03909116178155908401516001909101556122438882856124d1565b3387158015906122655750600485600481111561226257612262613f01565b14155b1561230f576040516323b872dd60e01b81526001600160a01b038281166004830152306024830152604482018a90527f000000000000000000000000b44e11153316bd02d26c2f7c5b402e8a95ea66d816906323b872dd906064016020604051808303816000875af11580156122df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123039190613dce565b61230f5761230f613deb565b8360200151816001600160a01b03167fff04ccafc360e16b67d682d17bd9503c4c6b9a131f6be6325762dc9ffc7de6248b8b89426040516123539493929190613f17565b60405180910390a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c836123878a82613e01565b6040805192835260208301919091520160405180910390a1505050505050505050565b6000828152600a602052604090205460ff16156123d95760405162461bcd60e51b8152600401610b0d90613d7f565b6123e3818361246b565b6123ff5760405162461bcd60e51b8152600401610b0d90613d5d565b612409848361349d565b6124138483613504565b61241d8383613585565b6000828152600460205260408082204390555183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050565b6000818152600d6020908152604080832054600e8352818420546001600160a01b039182168086526012855283862088841680885295529285205492938085149392909116149060ff1682806124be5750815b806124c65750805b979650505050505050565b6040805160808101825260008082526020820181905291810182905260608101919091526040805160808101825260008082526020820181905291810182905260608101919091526005546000908190871561263d57428760200151118015612541575060008760000151600f0b135b1561258657865161255790630784ce0090613f55565b600f0b602080870191909152870151612571904290613db7565b85602001516125809190613f93565b600f0b85525b4286602001511180156125a0575060008660000151600f0b135b156125e55785516125b690630784ce0090613f55565b600f0b6020808601919091528601516125d0904290613db7565b84602001516125df9190613f93565b600f0b84525b602080880151600090815260098252604090205490870151600f9190910b93501561263d578660200151866020015114156126225782915061263d565b602080870151600090815260099091526040902054600f0b91505b6040805160808101825260008082526020820152429181019190915243606082015281156126b2575060008181526006602090815260409182902082516080810184528154600f81810b8352600160801b909104900b9281019290925260018101549282019290925260029091015460608201525b6040810151816000428310156126ff5760408401516126d19042613db7565b60608501516126e09043613db7565b6126f290670de0b6b3a7640000613e19565b6126fc9190613e4e565b90505b60007f000000000000000000000000000000000000000000000000000000000012750061272c8186613e4e565b6127369190613e19565b905060005b60ff8110156128ce5761276e7f000000000000000000000000000000000000000000000000000000000012750083613e01565b915060004283111561278257429250612796565b50600082815260096020526040902054600f0b5b6127a08684613db7565b87602001516127af9190613f93565b875188906127be908390614028565b600f0b9052506020870180518291906127d8908390613eb2565b600f90810b90915288516000910b121590506127f357600087525b60008760200151600f0b121561280b57600060208801525b60408088018490528501519295508592670de0b6b3a76400009061282f9085613db7565b6128399086613e19565b6128439190613e4e565b85606001516128529190613e01565b6060880152612862600189613e01565b97504283141561287857504360608701526128ce565b6000888152600660209081526040918290208951918a01516001600160801b03908116600160801b0292169190911781559088015160018201556060880151600290910155506128c781614078565b905061273b565b505060058590558b1561295957886020015188602001516128ef9190614028565b846020018181516129009190613eb2565b600f0b905250885188516129149190614028565b84518590612923908390613eb2565b600f90810b90915260208601516000910b1215905061294457600060208501525b60008460000151600f0b121561295957600084525b6000858152600660209081526040918290208651918701516001600160801b03908116600160801b02921691909117815590850151600182015560608501516002909101558b15612b1c57428b602001511115612a115760208901516129bf9088613eb2565b96508a602001518a6020015114156129e35760208801516129e09088614028565b96505b60208b810151600090815260099091526040902080546001600160801b0319166001600160801b0389161790555b428a602001511115612a6c578a602001518a602001511115612a6c576020880151612a3c9087614028565b60208b810151600090815260099091526040902080546001600160801b0319166001600160801b03831617905595505b60008c815260086020526040812054612a86906001613e01565b905080600860008f815260200190815260200160002081905550428960400181815250504389606001818152505088600760008f815260200190815260200160002082633b9aca008110612adc57612adc613caf565b825160208401516001600160801b03908116600160801b029116176003919091029190910190815560408201516001820155606090910151600290910155505b505050505050505050505050565b612b34338261246b565b612b805760405162461bcd60e51b815260206004820181905260248201527f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b0d565b6000818152600d60205260408120546001600160a01b031690612ba39083610a01565b612bad3383613504565b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008083905060007f00000000000000000000000000000000000000000000000000000000001275007f00000000000000000000000000000000000000000000000000000000001275008360400151612c429190613e4e565b612c4c9190613e19565b905060005b60ff811015612d1d57612c847f000000000000000000000000000000000000000000000000000000000012750083613e01565b9150600085831115612c9857859250612cac565b50600082815260096020526040902054600f0b5b6040840151612cbb9084613db7565b8460200151612cca9190613f93565b84518590612cd9908390614028565b600f0b90525082861415612ced5750612d1d565b8084602001818151612cff9190613eb2565b600f0b9052505060408301829052612d1681614078565b9050612c51565b5060008260000151600f0b1215612d3357600082525b50516001600160801b03169392505050565b600043821115612d5757612d57613deb565b600083815260086020526040812054815b6080811015612dfb57818310612d7d57612dfb565b60006002612d8b8486613e01565b612d96906001613e01565b612da09190613e4e565b6000888152600760205260409020909150869082633b9aca008110612dc757612dc7613caf565b600302016002015411612ddc57809350612dea565b612de7600182613db7565b92505b50612df481614078565b9050612d68565b50600085815260076020526040812083633b9aca008110612e1e57612e1e613caf565b60408051608081018252600392909202929092018054600f81810b8452600160801b909104900b602083015260018101549282019290925260029091015460608201526005549091506000612e738783613022565b600081815260066020908152604080832081516080810183528154600f81810b8352600160801b909104900b938101939093526001810154918301919091526002015460608201529192508084841015612f52576000600681612ed7876001613e01565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060808301829052860151919250612f349190613db7565b925083604001518160400151612f4a9190613db7565b915050612f76565b6060830151612f619043613db7565b9150826040015142612f739190613db7565b90505b60408301518215612fb3578284606001518c612f929190613db7565b612f9c9084613e19565b612fa69190613e4e565b612fb09082613e01565b90505b6040870151612fc29082613db7565b8760200151612fd19190613f93565b87518890612fe0908390614028565b600f90810b90915288516000910b12905061301057505093516001600160801b031696506109fb95505050505050565b600099505050505050505050506109fb565b60008082815b60808110156130a25781831061303d576130a2565b6000600261304b8486613e01565b613056906001613e01565b6130609190613e4e565b600081815260066020526040902060020154909150871061308357809350613091565b61308e600182613db7565b92505b5061309b81614078565b9050613028565b5090949350505050565b6000807f0000000000000000000000000000000000000000000000000000000000127500806130db8642613e01565b6130e59190613e4e565b6130ef9190613e19565b90506000851161312a5760405162461bcd60e51b8152600401610b0d90602080825260049082015263076203e360e41b604082015260600190565b61313383611411565b156131725760405162461bcd60e51b815260206004820152600f60248201526e1b195cdcc81d1a185b880c481b999d608a1b6044820152606401610b0d565b4281116131d05760405162461bcd60e51b815260206004820152602660248201527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e207468652060448201526566757475726560d01b6064820152608401610b0d565b6131de630784ce0042613e01565b81111561322d5760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610b0d565b600c6000815461323c90614078565b90915550600c5461324d848261361b565b5060008181526003602090815260409182902082518084019093528054600f0b83526001908101549183019190915261328b918391899186916121a5565b95945050505050565b600082815260086020526040812054806132b25760009150506109fb565b600084815260076020526040812082633b9aca0081106132d4576132d4613caf565b60408051608081018252600392909202929092018054600f81810b8452600160801b909104900b6020830152600181015492820183905260020154606082015291506133209085614093565b816020015161332f9190613f93565b8151829061333e908390614028565b600f90810b90915282516000910b1215905061335957600081525b51600f0b91506109fb9050565b606060405180610120016040528060fd815260200161441960fd913990508061338e8661367e565b60405160200161339f9291906140d2565b6040516020818303038152906040529050806133ba8561367e565b6040516020016133cb92919061414e565b6040516020818303038152906040529050806133e68461367e565b6040516020016133f79291906141ce565b6040516020818303038152906040529050806134128361367e565b60405160200161342392919061424f565b604051602081830303815290604052905060006134706134428761367e565b61344b8461377c565b60405160200161345c9291906142aa565b60405160208183030381529060405261377c565b90508060405160200161348391906143bf565b604051602081830303815290604052915050949350505050565b6000818152600d60205260409020546001600160a01b038381169116146134c6576134c6613deb565b6000818152600e60205260409020546001600160a01b031615613500576000818152600e6020526040902080546001600160a01b03191690555b5050565b6000818152600d60205260409020546001600160a01b0383811691161461352d5761352d613deb565b6000818152600d6020526040902080546001600160a01b031916905561355382826138d0565b6001600160a01b0382166000908152600f6020526040812080546001929061357c908490613db7565b90915550505050565b6000818152600d60205260409020546001600160a01b0316156135aa576135aa613deb565b6000818152600d6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600f8084528285208054601086528487208188528652848720889055878752601186529386209390935590845290915280546001929061357c908490613e01565b60006001600160a01b03831661363357613633613deb565b61363d8383613585565b60405182906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450600192915050565b6060816136a25750506040805180820190915260018152600360fc1b602082015290565b8160005b81156136cc57806136b681614078565b91506136c59050600a83613e4e565b91506136a6565b60008167ffffffffffffffff8111156136e7576136e7613b52565b6040519080825280601f01601f191660200182016040528015613711576020820181803683370190505b5090505b841561148757613726600183613db7565b9150613733600a86614404565b61373e906030613e01565b60f81b81838151811061375357613753613caf565b60200101906001600160f81b031916908160001a905350613775600a86613e4e565b9450613715565b606081516000141561379c57505060408051602081019091526000815290565b600060405180606001604052806040815260200161451660409139905060006003845160026137cb9190613e01565b6137d59190613e4e565b6137e0906004613e19565b67ffffffffffffffff8111156137f8576137f8613b52565b6040519080825280601f01601f191660200182016040528015613822576020820181803683370190505b509050600182016020820185865187015b8082101561388e576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250613833565b50506003865106600181146138aa57600281146138bd576138c5565b603d6001830353603d60028303536138c5565b603d60018303535b509195945050505050565b6001600160a01b0382166000908152600f60205260408120546138f590600190613db7565b60008381526011602052604090205490915080821415613945576001600160a01b038416600090815260106020908152604080832085845282528083208390558583526011909152812055611d37565b6001600160a01b039390931660009081526010602090815260408083209383529281528282208054868452848420819055835260119091528282209490945592839055908252812055565b6001600160e01b0319811681146139a657600080fd5b50565b6000602082840312156139bb57600080fd5b813561119181613990565b600080604083850312156139d957600080fd5b50508035926020909101359150565b60005b83811015613a035781810151838201526020016139eb565b83811115611d375750506000910152565b60008151808452613a2c8160208601602086016139e8565b601f01601f19169290920160200192915050565b6020815260006111916020830184613a14565b600060208284031215613a6557600080fd5b5035919050565b6001600160a01b03811681146139a657600080fd5b60008060408385031215613a9457600080fd5b8235613a9f81613a6c565b946020939093013593505050565b600060208284031215613abf57600080fd5b813561119181613a6c565b600080600060608486031215613adf57600080fd5b8335613aea81613a6c565b92506020840135613afa81613a6c565b929592945050506040919091013590565b80151581146139a657600080fd5b60008060408385031215613b2c57600080fd5b8235613b3781613a6c565b91506020830135613b4781613b0b565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215613b7e57600080fd5b8435613b8981613a6c565b93506020850135613b9981613a6c565b925060408501359150606085013567ffffffffffffffff80821115613bbd57600080fd5b818701915087601f830112613bd157600080fd5b813581811115613be357613be3613b52565b604051601f8201601f19908116603f01168101908382118183101715613c0b57613c0b613b52565b816040528281528a6020848701011115613c2457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215613c5b57600080fd5b8235613c6681613a6c565b91506020830135613b4781613a6c565b600080600060608486031215613c8b57600080fd5b83359250602084013591506040840135613ca481613a6c565b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526024908201527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686040820152636472617760e01b606082015260800190565b600060208284031215613d5257600080fd5b815161119181613a6c565b60208082526008908201526737379037bbb732b960c11b604082015260600190565b602080825260089082015267185d1d1858da195960c21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015613dc957613dc9613da1565b500390565b600060208284031215613de057600080fd5b815161119181613b0b565b634e487b7160e01b600052600160045260246000fd5b60008219821115613e1457613e14613da1565b500190565b6000816000190483118215151615613e3357613e33613da1565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613e5d57613e5d613e38565b500490565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061182790830184613a14565b600060208284031215613ea757600080fd5b815161119181613990565b600081600f0b83600f0b600082128260016001607f1b0303821381151615613edc57613edc613da1565b8260016001607f1b0319038212811615613ef857613ef8613da1565b50019392505050565b634e487b7160e01b600052602160045260246000fd5b848152602081018490526080810160058410613f4357634e487b7160e01b600052602160045260246000fd5b60408201939093526060015292915050565b600081600f0b83600f0b80613f6c57613f6c613e38565b60016001607f1b0319821460001982141615613f8a57613f8a613da1565b90059392505050565b600081600f0b83600f0b60016001607f1b03600082136000841383830485118282161615613fc357613fc3613da1565b60016001607f1b03196000851282811687830587121615613fe657613fe6613da1565b6000871292508582058712848416161561400257614002613da1565b8585058712818416161561401857614018613da1565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561405357614053613da1565b8160016001607f1b0301831381161561406e5761406e613da1565b5090039392505050565b600060001982141561408c5761408c613da1565b5060010190565b60008083128015600160ff1b8501841216156140b1576140b1613da1565b6001600160ff1b03840183138116156140cc576140cc613da1565b50500390565b600083516140e48184602088016139e8565b6503a37b5b2b7160d51b90830190815283516141078160068401602088016139e8565b7f3c2f746578743e3c7465787420783d2231302220793d2234302220636c61737360069290910191820152671e913130b9b2911f60c11b6026820152602e01949350505050565b600083516141608184602088016139e8565b6903130b630b731b2a7b3160b51b908301908152835161418781600a8401602088016139e8565b7f3c2f746578743e3c7465787420783d2231302220793d2236302220636c617373600a9290910191820152671e913130b9b2911f60c11b602a820152603201949350505050565b600083516141e08184602088016139e8565b6a03637b1b5b2b22fb2b732160ad1b908301908152835161420881600b8401602088016139e8565b7f3c2f746578743e3c7465787420783d2231302220793d2238302220636c617373600b9290910191820152671e913130b9b2911f60c11b602b820152603301949350505050565b600083516142618184602088016139e8565b6503b30b63ab2960d51b90830190815283516142848160068401602088016139e8565b6c1e17ba32bc3a1f1e17b9bb339f60991b60069290910191820152601301949350505050565b6f7b226e616d65223a20226c6f636b202360801b815282516000906142d68160108501602088016139e8565b7f222c20226465736372697074696f6e223a2022536f6c69646c79206c6f636b736010918401918201527f2c2063616e206265207573656420746f20626f6f73742067617567652079696560308201527f6c64732c20766f7465206f6e20746f6b656e20656d697373696f6e2c20616e6460508201527f207265636569766520627269626573222c2022696d616765223a2022646174616070820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b609082015283516143a48160a68401602088016139e8565b61227d60f01b60a6929091019182015260a801949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516143f781601d8501602087016139e8565b91909101601d0192915050565b60008261441357614413613e38565b50069056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220433e30d3ca1fff6dec01eac8057bade0845e78bd8dc9097ac6b69bf70b27035c64736f6c634300080a0033
Deployed Bytecode Sourcemap
27515:36806:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31286:145;;;;;;:::i;:::-;-1:-1:-1;;;;;;31385:34:0;31357:4;31385:34;;;:20;:34;;;;;;;;;31286:145;;;;565:14:1;;558:22;540:41;;528:2;513:18;31286:145:0;;;;;;;;28814:21;;;;;;;;;738:25:1;;;726:2;711:18;28814:21:0;592:177:1;28670:44:0;;28707:7;28670:44;;31660:161;;;;;;:::i;:::-;;:::i;29466:37::-;;;;;;;;;;;;;;;-1:-1:-1;;;29466:37:0;;;;;;;;;;;;:::i;32366:129::-;;;;;;:::i;:::-;32428:7;32459:24;;;:14;:24;;;;;;-1:-1:-1;;;;;32459:24:0;;32366:129;;;;-1:-1:-1;;;;;2127:32:1;;;2109:51;;2097:2;2082:18;32366:129:0;1963:203:1;38857:717:0;;;;;;:::i;:::-;;:::i;:::-;;49888:474;;;;;;:::i;:::-;;:::i;26217:292::-;;;;;;:::i;:::-;;:::i;28727:33::-;;;;;29910:22;;;;;;60182:120;;;:::i;28609:50::-;;28644:15;28609:50;;;;;3052:2:1;3041:22;;;;3023:41;;3011:2;2996:18;28609:50:0;2879:191:1;28906:50:0;;;;;;:::i;:::-;;;;;;;;;;;;;;37065:201;;;;;;:::i;:::-;;:::i;53089:1037::-;;;;;;:::i;:::-;;:::i;32681:174::-;;;;;;:::i;:::-;-1:-1:-1;;;;;32801:29:0;;;;32770:7;32801:29;;;:21;:29;;;;;;;;:42;;;;;;;;;32681:174;29615:35;;29648:2;29615:35;;;;;3708:4:1;3696:17;;;3678:36;;3666:2;3651:18;29615:35:0;3536:184:1;48436:222:0;;;;;;:::i;:::-;;:::i;38645:200::-;;;;;;:::i;:::-;;:::i;33331:164::-;;;;;;:::i;:::-;;:::i;29083:61::-;;;;;;:::i;:::-;;:::i;:::-;;;;3981:2:1;3970:22;;;3952:41;;4029:22;;;;4024:2;4009:18;;4002:50;4068:18;;;4061:34;4126:2;4111:18;;4104:34;;;;3939:3;3924:19;29083:61:0;3725:419:1;25259:28:0;;;;;-1:-1:-1;;;;;25259:28:0;;;54138:803;;;;;;:::i;:::-;;:::i;29564:40::-;;;;;;;;;;;;;;;-1:-1:-1;;;29564:40:0;;;;;31443:205;;;;;;:::i;:::-;;:::i;25971:114::-;;;:::i;31833:123::-;;;;;;:::i;:::-;31893:7;31924:16;;;:6;:16;;;;;:20;;;;31833:123;32235:119;;;;;;:::i;:::-;32291:7;32322:20;;;:10;:20;;;;;;-1:-1:-1;;;;;32322:20:0;;32235:119;32108:115;;;;;;:::i;:::-;;:::i;59951:219::-;;;;;;:::i;:::-;;:::i;29000:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29000:45:0;;;;;;;;;58887:157;;;;;;:::i;:::-;;:::i;26097:108::-;;;:::i;29336:37::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28969:20;;;;;;48141:283;;;;;;:::i;:::-;;:::i;60314:954::-;;;;;;:::i;:::-;;:::i;52281:796::-;;;;;;:::i;:::-;;:::i;39586:322::-;;;;;;:::i;:::-;;:::i;51708:561::-;;;;;;:::i;:::-;;:::i;28846:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5086:2:1;5075:22;;;;5057:41;;5129:2;5114:18;;5107:34;;;;5030:18;28846:47:0;4885:262:1;51517:179:0;;;;;;:::i;:::-;;:::i;37712:921::-;;;;;;:::i;:::-;;:::i;48849:104::-;;;;;;:::i;:::-;;:::i;26521:127::-;;;;;;:::i;:::-;;:::i;49762:114::-;;;:::i;56227:383::-;;;;;;:::i;:::-;;:::i;48965:785::-;;;;;;:::i;:::-;;:::i;56850:147::-;;;;;;:::i;:::-;;:::i;29186:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;56622:216;;;;;;:::i;:::-;;:::i;32507:162::-;;;;;;:::i;:::-;-1:-1:-1;;;;;32620:25:0;;;32591:4;32620:25;;;:17;:25;;;;;;;;32619:38;;;;;;;;;;;;;;;32507:162;51267:238;;;;;;:::i;:::-;;:::i;28549:49::-;;28583:15;28549:49;;29246:46;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28771:30;;;;;48670:167;;;;;;:::i;:::-;;:::i;29384:38::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;31660:161;31743:7;31774:26;;;:16;:26;;;;;31801:4;31774:32;;;;;;;:::i;:::-;;;;:35;;;31767:42;;31660:161;;;;;:::o;38857:717::-;38933:13;38949:20;;;:10;:20;;;;;;-1:-1:-1;;;;;38949:20:0;39048:19;39040:28;;;;;;39163:5;-1:-1:-1;;;;;39150:18:0;:9;-1:-1:-1;;;;;39150:18:0;;;39142:27;;;;;;39219:18;39241:20;;;:10;:20;;;;;;;;;-1:-1:-1;;;;;39322:24:0;;;;;:17;:24;;;;;39265:10;39321:38;;;;;;;;;;39241:20;;:34;;39321:38;;39241:34;;39382:39;;;39399:22;39382:39;39374:48;;;;;;39470:24;;;;:14;:24;;;;;;:36;;-1:-1:-1;;;;;;39470:36:0;-1:-1:-1;;;;;39470:36:0;;;;;;;;;39526;;39470:24;;39526:36;;;;;;;38918:656;;;38857:717;;:::o;49888:474::-;17430:1;18078:7;;:19;;18070:63;;;;-1:-1:-1;;;18070:63:0;;;;;;;:::i;:::-;;;;;;;;;17430:1;18219:7;:18;;;50010:16;;;:6:::1;:16;::::0;;;;;;;;49979:47;;;;::::1;::::0;;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;50051:10;50043:19:::1;;;::::0;::::1;;50143:1;50126:7;:14;;;:18;;;50118:53;;;::::0;-1:-1:-1;;;50118:53:0;;8030:2:1;50118:53:0::1;::::0;::::1;8012:21:1::0;8069:2;8049:18;;;8042:30;-1:-1:-1;;;8088:18:1;;;8081:52;8150:18;;50118:53:0::1;7828:346:1::0;50118:53:0::1;50208:15;50194:7;:11;;;:29;50186:78;;;;-1:-1:-1::0;;;50186:78:0::1;;;;;;;:::i;:::-;50279:71;50291:8;50301:6;50309:1;50312:7;50321:28;50279:11;:71::i;:::-;-1:-1:-1::0;;17382:1:0;18414:7;:22;-1:-1:-1;49888:474:0:o;26217:292::-;25594:10;;:18;;;-1:-1:-1;;;25594:18:0;;;;25616:10;;-1:-1:-1;;;;;25594:10:0;;:16;;:18;;;;;;;;;;;;;;:10;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25594:32:0;;25586:77;;;;-1:-1:-1;;;25586:77:0;;9042:2:1;25586:77:0;;;9024:21:1;;;9061:18;;;9054:30;9120:34;9100:18;;;9093:62;9172:18;;25586:77:0;8840:356:1;25586:77:0;-1:-1:-1;;;;;26297:19:0;::::1;26289:48;;;::::0;-1:-1:-1;;;26289:48:0;;9403:2:1;26289:48:0::1;::::0;::::1;9385:21:1::0;9442:2;9422:18;;;9415:30;-1:-1:-1;;;9461:18:1;;;9454:46;9517:18;;26289:48:0::1;9201:340:1::0;26289:48:0::1;26382:10;::::0;;-1:-1:-1;;;;;26408:30:0;;::::1;-1:-1:-1::0;;;;;;26408:30:0;::::1;::::0;::::1;::::0;;;26458:39:::1;::::0;26382:10;::::1;::::0;26408:30;26382:10;;26458:39:::1;::::0;26352:19:::1;::::0;26458:39:::1;26274:235;26217:292:::0;:::o;60182:120::-;60228:7;60259:31;60274:15;60259:14;:31::i;:::-;60252:38;;60182:120;:::o;37065:201::-;37207:47;37221:5;37228:3;37233:8;37243:10;37207:13;:47::i;:::-;37065:201;;;:::o;53089:1037::-;17430:1;18078:7;;:19;;18070:63;;;;-1:-1:-1;;;18070:63:0;;;;;;;:::i;:::-;17430:1;18219:7;:18;53170:40:::1;53189:10;53201:8:::0;53170:18:::1;:40::i;:::-;53162:61;;;;-1:-1:-1::0;;;53162:61:0::1;;;;;;;:::i;:::-;53247:15;::::0;;;:5:::1;:15;::::0;;;;;::::1;;53246:16;53238:37;;;;-1:-1:-1::0;;;53238:37:0::1;;;;;;;:::i;:::-;53292:28;53323:16:::0;;;:6:::1;:16;::::0;;;;;;;;53292:47;;;;::::1;::::0;;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;53362:15:::1;:30;;53354:65;;;::::0;-1:-1:-1;;;53354:65:0;;10420:2:1;53354:65:0::1;::::0;::::1;10402:21:1::0;10459:2;10439:18;;;10432:30;-1:-1:-1;;;10478:18:1;;;10471:52;10540:18;;53354:65:0::1;10218:346:1::0;53354:65:0::1;53465:14:::0;;53517:19:::1;::::0;;;;::::1;::::0;;-1:-1:-1;53517:19:0;;;::::1;::::0;;::::1;::::0;;;53498:16;;;:6:::1;:16:::0;;;;;;:38;;;;-1:-1:-1;;;;;;53498:38:0::1;-1:-1:-1::0;;;;;53498:38:0;;;::::1;::::0;;;;-1:-1:-1;53498:38:0;;::::1;::::0;53574:6:::1;::::0;53458:22:::1;::::0;;;::::1;::::0;53604:20:::1;53458:22:::0;53574:6;53604:20:::1;:::i;:::-;53595:6;:29:::0;53829:19:::1;::::0;;;;::::1;::::0;;;-1:-1:-1;53829:19:0;;;::::1;::::0;::::1;::::0;53798:51:::1;::::0;53810:8;;53820:7;;53798:11:::1;:51::i;:::-;53873:41;::::0;-1:-1:-1;;;53873:41:0;;53896:10:::1;53873:41;::::0;::::1;11005:51:1::0;11072:18;;;11065:34;;;53880:5:0::1;-1:-1:-1::0;;;;;53873:22:0::1;::::0;::::1;::::0;10978:18:1;;53873:41:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53866:49;;;;:::i;:::-;53961:15;53967:8;53961:5;:15::i;:::-;53998:54;::::0;;11694:25:1;;;11750:2;11735:18;;11728:34;;;54036:15:0::1;11778:18:1::0;;;11771:34;53998:54:0;;54007:10:::1;::::0;53998:54:::1;::::0;;;;;11682:2:1;53998:54:0;;::::1;54072:42;54079:12:::0;54093:20:::1;54108:5:::0;54079:12;54093:20:::1;:::i;:::-;54072:42;::::0;;11990:25:1;;;12046:2;12031:18;;12024:34;;;;11963:18;54072:42:0::1;;;;;;;-1:-1:-1::0;;17382:1:0;18414:7;:22;-1:-1:-1;;53089:1037:0:o;48436:222::-;25750:10;;:21;;;-1:-1:-1;;;25750:21:0;;;;25775:10;;-1:-1:-1;;;;;25750:10:0;;:19;;:21;;;;;;;;;;;;;;:10;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25750:35:0;;25742:60;;;;-1:-1:-1;;;25742:60:0;;12271:2:1;25742:60:0;;;12253:21:1;12310:2;12290:18;;;12283:30;-1:-1:-1;;;12329:18:1;;;12322:42;12381:18;;25742:60:0;12069:336:1;25742:60:0;-1:-1:-1;;;;;48521:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;::::1;;:24;;:16:::0;:24:::1;48513:53;;;::::0;-1:-1:-1;;;48513:53:0;;12612:2:1;48513:53:0::1;::::0;::::1;12594:21:1::0;12651:2;12631:18;;;12624:30;-1:-1:-1;;;12670:18:1;;;12663:46;12726:18;;48513:53:0::1;12410:340:1::0;48513:53:0::1;-1:-1:-1::0;;;;;48588:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;;;;48581:23;;-1:-1:-1;;48581:23:0::1;::::0;;48624:22;;2109:51:1;;;48624:22:0::1;::::0;2082:18:1;48624:22:0::1;;;;;;;;48436:222:::0;:::o;38645:200::-;38791:42;38808:5;38815:3;38820:8;38791:42;;;;;;;;;;;;:16;:42::i;33331:164::-;33417:4;33445:38;33464:8;33474;33445:18;:38::i;:::-;33438:45;33331:164;-1:-1:-1;;;33331:164:0:o;29083:61::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;29083:61:0;;;;;;;-1:-1:-1;29083:61:0;:::o;54138:803::-;17430:1;18078:7;;:19;;18070:63;;;;-1:-1:-1;;;18070:63:0;;;;;;;:::i;:::-;17430:1;18219:7;:18;54226:40:::1;54245:10;54257:8:::0;54226:18:::1;:40::i;:::-;54218:61;;;;-1:-1:-1::0;;;54218:61:0::1;;;;;;;:::i;:::-;54312:5;54294:15:::0;;;:5:::1;:15;::::0;;;;;;;:23;;-1:-1:-1;;54294:23:0::1;::::0;;54363:6:::1;:16:::0;;;;;;54332:47;;;;::::1;::::0;;;;;::::1;;::::0;;54294:23;54332:47:::1;::::0;;;::::1;::::0;;;54402:15:::1;:30;;54394:65;;;::::0;-1:-1:-1;;;54394:65:0;;10420:2:1;54394:65:0::1;::::0;::::1;10402:21:1::0;10459:2;10439:18;;;10432:30;-1:-1:-1;;;10478:18:1;;;10471:52;10540:18;;54394:65:0::1;10218:346:1::0;54394:65:0::1;54505:14:::0;;54557:19:::1;::::0;;;;::::1;::::0;;-1:-1:-1;54557:19:0;;;::::1;::::0;;::::1;::::0;;;54538:16;;;:6:::1;:16:::0;;;;;;:38;;;;-1:-1:-1;;;;;;54538:38:0::1;-1:-1:-1::0;;;;;54538:38:0;;;::::1;::::0;;;;-1:-1:-1;54538:38:0;;::::1;::::0;54614:6:::1;::::0;54498:22:::1;::::0;;;::::1;::::0;54644:20:::1;54498:22:::0;54614:6;54644:20:::1;:::i;:::-;54635:6;:29:::0;54688:41:::1;::::0;-1:-1:-1;;;54688:41:0;;54711:10:::1;54688:41;::::0;::::1;11005:51:1::0;11072:18;;;11065:34;;;54695:5:0::1;-1:-1:-1::0;;;;;54688:22:0::1;::::0;::::1;::::0;10978:18:1;;54688:41:0::1;10831:274:1::0;31443:205:0;31510:6;31550:24;;;:14;:24;;;;;;;;;31596:16;:26;;;;;31550:24;31596:34;;;;;;;:::i;:::-;;;;:40;-1:-1:-1;;;31596:40:0;;;;;31443:205;-1:-1:-1;;;31443:205:0:o;25971:114::-;26052:10;;:21;;;-1:-1:-1;;;26052:21:0;;;;26021:7;;-1:-1:-1;;;;;26052:10:0;;:19;;:21;;;;;;;;;;;;;;:10;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32108:115::-;-1:-1:-1;;;;;32056:28:0;;32164:7;32056:28;;;:20;:28;;;;;;32195:16;31968:128;59951:219;60048:5;;60007:7;60093:20;;;:12;:20;;;;;;;;60068:45;;;;;;;;;;;;;;;-1:-1:-1;;;60068:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60007:7;;60048:5;60135:23;60068:45;60156:1;60135:9;:23::i;:::-;60128:30;59951:219;-1:-1:-1;;;;59951:219:0:o;58887:157::-;58968:7;58999:33;59015:8;59025:6;58999:15;:33::i;26097:108::-;26175:10;;:18;;;-1:-1:-1;;;26175:18:0;;;;26144:7;;-1:-1:-1;;;;;26175:10:0;;:16;;:18;;;;;;;;;;;;;;:10;:18;;;;;;;;;;;;;;48141:283;25750:10;;:21;;;-1:-1:-1;;;25750:21:0;;;;25775:10;;-1:-1:-1;;;;;25750:10:0;;:19;;:21;;;;;;;;;;;;;;:10;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;25750:35:0;;25742:60;;;;-1:-1:-1;;;25742:60:0;;12271:2:1;25742:60:0;;;12253:21:1;12310:2;12290:18;;;12283:30;-1:-1:-1;;;12329:18:1;;;12322:42;12381:18;;25742:60:0;12069:336:1;25742:60:0;-1:-1:-1;;;;;48223:22:0;::::1;48215:44;;;::::0;-1:-1:-1;;;48215:44:0;;12957:2:1;48215:44:0::1;::::0;::::1;12939:21:1::0;12996:1;12976:18;;;12969:29;-1:-1:-1;;;13014:18:1;;;13007:39;13063:18;;48215:44:0::1;12755:332:1::0;48215:44:0::1;-1:-1:-1::0;;;;;48282:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;::::1;;:25;48274:60;;;::::0;-1:-1:-1;;;48274:60:0;;13294:2:1;48274:60:0::1;::::0;::::1;13276:21:1::0;13333:2;13313:18;;;13306:30;-1:-1:-1;;;13352:18:1;;;13345:52;13414:18;;48274:60:0::1;13092:346:1::0;48274:60:0::1;-1:-1:-1::0;;;;;48349:16:0;::::1;;::::0;;;:6:::1;:16;::::0;;;;;;;;:23;;-1:-1:-1;;48349:23:0::1;48368:4;48349:23;::::0;;48392:20;;2109:51:1;;;48392:20:0::1;::::0;2082:18:1;48392:20:0::1;1963:203:1::0;60314:954:0;60376:7;60417:12;60407:6;:22;;60400:30;;;;:::i;:::-;60462:5;;60445:14;60504:31;60520:6;60462:5;60504:15;:31::i;:::-;60552:18;60573:25;;;:12;:25;;;;;;;;60552:46;;;;;;;;;;;;;;;-1:-1:-1;;;60552:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60482:53;;-1:-1:-1;60646:20:0;;;60642:494;;;60687:22;60712:12;60687:22;60725:15;:11;60739:1;60725:15;:::i;:::-;60712:29;;;;;;;;;;;;;;-1:-1:-1;60712:29:0;60687:54;;;;;;;;;;;;;;;-1:-1:-1;;;60687:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60764:9;;;60687:54;;-1:-1:-1;60764:26:0;60760:160;;60890:5;:9;;;60874;:13;;;:25;;;;:::i;:::-;60860:5;:8;;;60845:9;:12;;;:23;;;;:::i;:::-;60831:9;;;;60822:18;;:6;:18;:::i;:::-;60821:48;;;;:::i;:::-;60820:80;;;;:::i;:::-;60815:85;;60760:160;60668:267;60642:494;;;60977:12;60964:5;:9;;;:25;60960:161;;61091:9;;;;61076:24;;:12;:24;:::i;:::-;61062:8;;;;61044:26;;:15;:26;:::i;:::-;61030:9;;;;61021:18;;:6;:18;:::i;:::-;61020:51;;;;:::i;:::-;61019:82;;;;:::i;:::-;61014:87;;60960:161;61225:31;61235:5;61253:2;61242:5;:8;;;:13;;;;:::i;:::-;61225:9;:31::i;:::-;61218:38;60314:954;-1:-1:-1;;;;;;60314:954:0:o;52281:796::-;17430:1;18078:7;;:19;;18070:63;;;;-1:-1:-1;;;18070:63:0;;;;;;;:::i;:::-;17430:1;18219:7;:18;52395:40:::1;52414:10;52426:8:::0;52395:18:::1;:40::i;:::-;52387:61;;;;-1:-1:-1::0;;;52387:61:0::1;;;;;;;:::i;:::-;52465:28;52496:16:::0;;;:6:::1;:16;::::0;;;;;;;52465:47;;;;::::1;::::0;;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;;;52597:8:::1;::::0;52550:31:::1;52568:13:::0;52550:15:::1;:31;:::i;:::-;52549:44;;;;:::i;:::-;52548:57;;;;:::i;:::-;52527:78;;52694:15;52680:7;:11;;;:29;52672:54;;;::::0;-1:-1:-1;;;52672:54:0;;14208:2:1;52672:54:0::1;::::0;::::1;14190:21:1::0;14247:2;14227:18;;;14220:30;-1:-1:-1;;;14266:18:1;;;14259:42;14318:18;;52672:54:0::1;14006:336:1::0;52672:54:0::1;52766:1;52749:7;:14;;;:18;;;52741:48;;;::::0;-1:-1:-1;;;52741:48:0;;14549:2:1;52741:48:0::1;::::0;::::1;14531:21:1::0;14588:2;14568:18;;;14561:30;-1:-1:-1;;;14607:18:1;;;14600:47;14664:18;;52741:48:0::1;14347:341:1::0;52741:48:0::1;52825:7;:11;;;52812:10;:24;52804:68;;;::::0;-1:-1:-1;;;52804:68:0;;14895:2:1;52804:68:0::1;::::0;::::1;14877:21:1::0;14934:2;14914:18;;;14907:30;14973:33;14953:18;;;14946:61;15024:18;;52804:68:0::1;14693:355:1::0;52804:68:0::1;52909:25;28583:15;52909;:25;:::i;:::-;52895:10;:39;;52887:82;;;::::0;-1:-1:-1;;;52887:82:0;;15255:2:1;52887:82:0::1;::::0;::::1;15237:21:1::0;15294:2;15274:18;;;15267:30;15333:32;15313:18;;;15306:60;15383:18;;52887:82:0::1;15053:354:1::0;52887:82:0::1;52986:79;52998:8;53008:1;53011:10;53023:7;53032:32;52986:11;:79::i;:::-;-1:-1:-1::0;;17382:1:0;18414:7;:22;-1:-1:-1;;52281:796:0:o;39586:322::-;-1:-1:-1;;;;;39737:23:0;;39750:10;39737:23;;39730:31;;;;:::i;:::-;39794:10;39776:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;39776:40:0;;;;;;;;;;;;:52;;-1:-1:-1;;39776:52:0;;;;;;;;;;39848:48;;540:41:1;;;39776:40:0;;39794:10;39848:48;;513:18:1;39848:48:0;;;;;;;39586:322;;:::o;51708:561::-;17430:1;18078:7;;:19;;18070:63;;;;-1:-1:-1;;;18070:63:0;;;;;;;:::i;:::-;17430:1;18219:7;:18;51811:40:::1;51830:10;51842:8:::0;51811:18:::1;:40::i;:::-;51803:61;;;;-1:-1:-1::0;;;51803:61:0::1;;;;;;;:::i;:::-;51881:28;51912:16:::0;;;:6:::1;:16;::::0;;;;;;;;51881:47;;;;::::1;::::0;;;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;51952:10;51945:18:::1;;;;:::i;:::-;52044:1;52027:7;:14;;;:18;;;52019:53;;;::::0;-1:-1:-1;;;52019:53:0;;8030:2:1;52019:53:0::1;::::0;::::1;8012:21:1::0;8069:2;8049:18;;;8042:30;-1:-1:-1;;;8088:18:1;;;8081:52;8150:18;;52019:53:0::1;7828:346:1::0;52019:53:0::1;52109:15;52095:7;:11;;;:29;52087:78;;;;-1:-1:-1::0;;;52087:78:0::1;;;;;;;:::i;:::-;52182:75;52194:8;52204:6;52212:1;52215:7;52224:32;52182:11;:75::i;51517:179::-:0;51607:7;17430:1;18078:7;;:19;;18070:63;;;;-1:-1:-1;;;18070:63:0;;;;;;;:::i;:::-;17430:1;18219:7;:18;51638:46:::1;51650:6:::0;51658:13;51673:10:::1;51638:11;:46::i;:::-;17382:1:::0;18414:7;:22;51631:53;51517:179;-1:-1:-1;;;51517:179:0:o;37712:921::-;37889:47;37903:5;37910:3;37915:8;37925:10;37889:13;:47::i;:::-;37624:20;;37680:8;37953:669;;38107:73;;-1:-1:-1;;;38107:73:0;;-1:-1:-1;;;;;38107:37:0;;;;;:73;;38145:10;;38157:5;;38164:8;;38174:5;;38107:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38107:73:0;;;;;;;;-1:-1:-1;;38107:73:0;;;;;;;;;;;;:::i;:::-;;;38103:504;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38296:13:0;;38292:296;;38343:60;;-1:-1:-1;;;38343:60:0;;16362:2:1;38343:60:0;;;16344:21:1;16401:2;16381:18;;;16374:30;16440:34;16420:18;;;16413:62;-1:-1:-1;;;16491:18:1;;;16484:48;16549:19;;38343:60:0;16160:414:1;38292:296:0;38530:6;38524:13;38515:6;38511:2;38507:15;38500:38;38103:504;38181:19;38103:504;37712:921;;;;:::o;48849:104::-;31220:10;31213:18;;;;:6;:18;;;;;;;;31205:41;;;;-1:-1:-1;;;31205:41:0;;16781:2:1;31205:41:0;;;16763:21:1;16820:2;16800:18;;;16793:30;-1:-1:-1;;;16839:18:1;;;16832:40;16889:18;;31205:41:0;16579:334:1;31205:41:0;48936:5:::1;48918:15:::0;;;:5:::1;:15;::::0;;;;:23;;-1:-1:-1;;48918:23:0::1;::::0;;48849:104::o;26521:127::-;26611:10;;:25;;-1:-1:-1;;;26611:25:0;;-1:-1:-1;;;;;2127:32:1;;;26611:25:0;;;2109:51:1;26583:4:0;;26611:10;;:16;;2082:18:1;;26611:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49762:114::-;49808:56;49820:1;49823:19;;;;;;;;49837:1;49823:19;;;;;;49840:1;49823:19;;;49844;;;;;;;;49858:1;49844:19;;;;;;49861:1;49844:19;;;49808:11;:56::i;:::-;49762:114::o;56227:383::-;56356:1;56324:20;;;:10;:20;;;;;;56286:13;;-1:-1:-1;;;;;56324:20:0;56316:74;;;;-1:-1:-1;;;56316:74:0;;17120:2:1;56316:74:0;;;17102:21:1;17159:2;17139:18;;;17132:30;17198:29;17178:18;;;17171:57;17245:18;;56316:74:0;16918:351:1;56316:74:0;56405:28;56436:16;;;:6;:16;;;;;;;;;56405:47;;;;;;;;;;;;;;;;;;;;;56491:107;56443:8;56511:40;56443:8;56535:15;56511:13;:40::i;:::-;56553:11;;;;56581:14;;56574:22;;56491:9;:107::i;48965:785::-;49041:12;;;;:5;:12;;;;;;;;49040:13;49032:34;;;;-1:-1:-1;;;49032:34:0;;;;;;;:::i;:::-;49098:3;49089:5;:12;;49081:21;;;;;;49125:37;49144:10;49156:5;49125:18;:37::i;:::-;49117:58;;;;-1:-1:-1;;;49117:58:0;;;;;;;:::i;:::-;49198:35;49217:10;49229:3;49198:18;:35::i;:::-;49190:56;;;;-1:-1:-1;;;49190:56:0;;;;;;;:::i;:::-;49263:29;49295:13;;;:6;:13;;;;;;;;49263:45;;;;;;;;;;;;;;;;;;;;;;;;;;49355:11;;;;;;;;;49323:43;;;;;;;;;;;;;;;;;;;;;;;;49413:15;;49459:12;;49263:45;;49323:43;;49406:23;;;;-1:-1:-1;49459:28:0;:58;;49505:8;:12;;;49459:58;;;49490:8;:12;;;49459:58;49550:19;;;;;;;;-1:-1:-1;49550:19:0;;;;;;;;;;49534:13;;;:6;:13;;;;;:35;;;;-1:-1:-1;;;;;;49534:35:0;-1:-1:-1;;;;;49534:35:0;;;;;;;-1:-1:-1;49534:35:0;;;;;;;49613:19;;;;;;;;;;;;;;;49445:72;;-1:-1:-1;49584:49:0;;49534:13;;49603:8;;49584:11;:49::i;:::-;49648:12;49654:5;49648;:12::i;:::-;49675:63;49687:3;49692:6;49700:3;49705:8;49715:22;49675:11;:63::i;:::-;49017:733;;;;48965:785;;:::o;56850:147::-;56927:7;56958:27;56972:8;56982:2;56958:13;:27::i;56622:216::-;56685:7;56713:25;;;:15;:25;;;;;;56742:12;56713:41;56709:55;;;-1:-1:-1;56763:1:0;;56622:216;-1:-1:-1;56622:216:0:o;56709:55::-;56786:40;56800:8;56810:15;56786:13;:40::i;51267:238::-;51423:7;17430:1;18078:7;;:19;;18070:63;;;;-1:-1:-1;;;18070:63:0;;;;;;;:::i;:::-;17430:1;18219:7;:18;51454:39:::1;51466:6:::0;51474:13;51489:3;51454:11:::1;:39::i;:::-;17382:1:::0;18414:7;:22;51447:46;51267:238;-1:-1:-1;;;;51267:238:0:o;48670:167::-;31220:10;31213:18;;;;:6;:18;;;;;;;;31205:41;;;;-1:-1:-1;;;31205:41:0;;16781:2:1;31205:41:0;;;16763:21:1;16820:2;16800:18;;;16793:30;-1:-1:-1;;;16839:18:1;;;16832:40;16889:18;;31205:41:0;16579:334:1;31205:41:0;48746:15:::1;::::0;;;:5:::1;:15;::::0;;;;;::::1;;:24;48738:50;;;::::0;-1:-1:-1;;;48738:50:0;;17476:2:1;48738:50:0::1;::::0;::::1;17458:21:1::0;17515:2;17495:18;;;17488:30;-1:-1:-1;;;17534:18:1;;;17527:43;17587:18;;48738:50:0::1;17274:337:1::0;48738:50:0::1;48803:15;::::0;;;:5:::1;:15;::::0;;;;:22;;-1:-1:-1;;48803:22:0::1;48821:4;48803:22;::::0;;48670:167::o;46661:1468::-;46979:6;;46928:13;;47011:21;47026:6;46979;47011:21;:::i;:::-;47002:6;:30;-1:-1:-1;;;;;;;;;;;;;;;;;47129:14:0;;47145:11;;;;;47111:13;;;47092:65;;;;;47258:40;;47290:6;;47129:7;;47258:40;;47290:6;;47258:40;:::i;:::-;;;;;-1:-1:-1;47317:15:0;;47313:80;;47353:11;;;:24;;;47313:80;47407:16;;;;:6;:16;;;;;;;;:26;;;;-1:-1:-1;;;;;;47407:26:0;-1:-1:-1;;;;;47407:26:0;;;;;;;;;;-1:-1:-1;47407:26:0;;;;47705:41;47407:16;47727:9;47407:26;47705:11;:41::i;:::-;47778:10;47807:11;;;;;:52;;-1:-1:-1;47837:22:0;47822:11;:37;;;;;;;;:::i;:::-;;;47807:52;47803:156;;;47887:55;;-1:-1:-1;;;47887:55:0;;-1:-1:-1;;;;;18407:15:1;;;47887:55:0;;;18389:34:1;47928:4:0;18439:18:1;;;18432:43;18491:18;;;18484:34;;;47894:5:0;47887:26;;;;18324:18:1;;47887:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47880:63;;;;:::i;:::-;48012:7;:11;;;47988:4;-1:-1:-1;;;;;47980:74:0;;47994:8;48004:6;48025:11;48038:15;47980:74;;;;;;;;;:::i;:::-;;;;;;;;48074:43;48081:12;48095:21;48110:6;48081:12;48095:21;:::i;:::-;48074:43;;;11990:25:1;;;12046:2;12031:18;;12024:34;;;;11963:18;48074:43:0;;;;;;;46882:1247;;;;46661:1468;;;;;:::o;36204:849::-;36386:15;;;;:5;:15;;;;;;;;36385:16;36377:37;;;;-1:-1:-1;;;36377:37:0;;;;;;;:::i;:::-;36472;36491:7;36500:8;36472:18;:37::i;:::-;36464:58;;;;-1:-1:-1;;;36464:58:0;;;;;;;:::i;:::-;36612:31;36627:5;36634:8;36612:14;:31::i;:::-;36726:33;36743:5;36750:8;36726:16;:33::i;:::-;36798:26;36810:3;36815:8;36798:11;:26::i;:::-;36918:25;;;;:15;:25;;;;;;36946:12;36918:40;;37011:30;36934:8;;-1:-1:-1;;;;;37011:30:0;;;;;;;;;;;36204:849;;;;:::o;32867:452::-;32954:4;32991:20;;;:10;:20;;;;;;;;;33117:14;:24;;;;;;-1:-1:-1;;;;;32991:20:0;;;33188:24;;;:17;:24;;;;;33048:17;;;33187:36;;;;;;;;;32991:20;;33048:17;;;;33117:24;;;;33105:36;;33187;;33048:17;;33245:35;;;33263:17;33245:35;:62;;;;33284:23;33245:62;33238:69;32867:452;-1:-1:-1;;;;;;;32867:452:0:o;40290:6359::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40618:5:0;;40531:16;;;;40644:13;;40640:1235;;40797:15;40781:9;:13;;;:31;:55;;;;;40835:1;40816:9;:16;;;:20;;;40781:55;40777:240;;;40874:16;;:28;;28644:15;;40874:28;:::i;:::-;40861:41;;:10;;;;:41;;;;40964:13;;;:31;;40980:15;;40964:31;:::i;:::-;40937:4;:10;;;:60;;;;:::i;:::-;40925:72;;;;40777:240;41055:15;41039:9;:13;;;:31;:55;;;;;41093:1;41074:9;:16;;;:20;;;41039:55;41035:240;;;41132:16;;:28;;28644:15;;41132:28;:::i;:::-;41119:41;;:10;;;;:41;;;;41222:13;;;:31;;41238:15;;41222:31;:::i;:::-;41195:4;:10;;;:60;;;;:::i;:::-;41183:72;;;;41035:240;41557:13;;;;;41544:27;;;;:12;:27;;;;;;41594:13;;;;41544:27;;;;;;-1:-1:-1;41594:18:0;41590:270;;41658:9;:13;;;41641:9;:13;;;:30;41637:204;;;41712:9;41700:21;;41637:204;;;41803:13;;;;;41790:27;;;;:12;:27;;;;;;;;;;-1:-1:-1;41637:204:0;41916:66;;;;;;;;41891:22;41916:66;;;;;;;41946:15;41916:66;;;;;;;41968:12;41916:66;;;;42001:10;;41997:83;;-1:-1:-1;42044:20:0;;;;:12;:20;;;;;;;;;42032:32;;;;;;;;;;;;;;;-1:-1:-1;;;42032:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41997:83;42119:12;;;;:9;42094:22;42497:15;:30;-1:-1:-1;42493:164:0;;;42628:12;;;;42610:30;;:15;:30;:::i;:::-;42591:13;;;;42576:28;;:12;:28;:::i;:::-;42562:43;;28707:7;42562:43;:::i;:::-;42561:80;;;;:::i;:::-;42548:93;;42493:164;42916:10;42959:8;42930:25;42959:8;42930:14;:25;:::i;:::-;42929:38;;;;:::i;:::-;42916:51;;42991:9;42986:1478;43010:3;43006:1;:7;42986:1478;;;43228:14;43234:8;43228:14;;:::i;:::-;;;43265:13;43314:15;43309:2;:20;43305:179;;;43363:15;43358:20;;43305:179;;;-1:-1:-1;43444:16:0;;;;:12;:16;;;;;;;;43305:179;43556:19;43561:14;43556:2;:19;:::i;:::-;43524:9;:15;;;:53;;;;:::i;:::-;43506:71;;:9;;:71;;;;;:::i;:::-;;;;;-1:-1:-1;43600:15:0;;;:25;;43619:6;;43600:15;:25;;43619:6;;43600:25;:::i;:::-;;;;;;;;43652:14;;43669:1;43652:18;;;43648:137;;-1:-1:-1;43648:137:0;;43760:1;43743:18;;43648:137;43829:1;43811:9;:15;;;:19;;;43807:157;;;43939:1;43921:15;;;:19;43807:157;44028:12;;;;:17;;;44127:19;;;44003:2;;-1:-1:-1;44003:2:0;;28707:7;;44122:24;;44003:2;44122:24;:::i;:::-;44108:39;;:10;:39;:::i;:::-;44107:54;;;;:::i;:::-;44084:16;:20;;;:77;;;;:::i;:::-;44068:13;;;:93;44184:11;44194:1;44184:11;;:::i;:::-;;;44228:15;44222:2;:21;44218:227;;;-1:-1:-1;44288:12:0;44272:13;;;:28;44327:5;;44218:227;44389:20;;;;:12;:20;;;;;;;;;:32;;;;;;-1:-1:-1;;;;;44389:32:0;;;-1:-1:-1;;;44389:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43015:3:0;;;:::i;:::-;;;42986:1478;;;-1:-1:-1;;44495:5:0;:14;;;44585:13;;44581:517;;44803:4;:10;;;44790:4;:10;;;:23;;;;:::i;:::-;44770:9;:15;;:44;;;;;;;:::i;:::-;;;;;-1:-1:-1;44864:9:0;;44852;;:21;;44864:9;44852:21;:::i;:::-;44833:41;;:9;;:41;;;;;:::i;:::-;;;;;;;;44897:15;;;;44915:1;44897:19;;;44893:87;;-1:-1:-1;44893:87:0;;44959:1;44941:15;;;:19;44893:87;45019:1;45002:9;:14;;;:18;;;44998:85;;;45062:1;45045:18;;44998:85;45168:20;;;;:12;:20;;;;;;;;;:32;;;;;;-1:-1:-1;;;;;45168:32:0;;;-1:-1:-1;;;45168:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;45221:13;;45217:1421;;45476:15;45460:9;:13;;;:31;45456:445;;;45613:10;;;;45600:23;;;;:::i;:::-;;;45667:9;:13;;;45650:9;:13;;;:30;45646:174;;;45722:10;;;;45709:23;;;;:::i;:::-;;;45646:174;45855:13;;;;;45842:27;;;;:12;:27;;;;;;:39;;-1:-1:-1;;;;;;45842:39:0;-1:-1:-1;;;;;45842:39:0;;;;;45456:445;45941:15;45925:9;:13;;;:31;45921:385;;;46001:9;:13;;;45985:9;:13;;;:29;45981:239;;;46056:10;;;;46043:23;;;;:::i;:::-;46170:13;;;;;46157:27;;;;:12;:27;;;;;;:39;;-1:-1:-1;;;;;;46157:39:0;-1:-1:-1;;;;;46157:39:0;;;;;;-1:-1:-1;45981:239:0;46368:17;46388:24;;;:14;:24;;;;;;:28;;46415:1;46388:28;:::i;:::-;46368:48;;46464:9;46437:14;:24;46452:8;46437:24;;;;;;;;;;;:36;;;;46502:15;46492:4;:7;;:25;;;;;46547:12;46536:4;:8;;:23;;;;;46618:4;46578:16;:26;46595:8;46578:26;;;;;;;;;;;46605:9;46578:37;;;;;;;:::i;:::-;:44;;;;;;-1:-1:-1;;;;;46578:44:0;;;-1:-1:-1;;;46578:44:0;;;;:37;;;;;;;;;:44;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45217:1421:0;40452:6197;;;;;;;;;40290:6359;;;:::o;63894:420::-;63959:40;63978:10;63990:8;63959:18;:40::i;:::-;63951:85;;;;-1:-1:-1;;;63951:85:0;;20849:2:1;63951:85:0;;;20831:21:1;;;20868:18;;;20861:30;20927:34;20907:18;;;20900:62;20979:18;;63951:85:0;20647:356:1;63951:85:0;64053:13;32322:20;;;:10;:20;;;;;;-1:-1:-1;;;;;32322:20:0;;64134:29;;32322:20;64134:7;:29::i;:::-;64207:38;64224:10;64236:8;64207:16;:38::i;:::-;64265:37;;64293:8;;64289:1;;-1:-1:-1;;;;;64265:37:0;;;;;64289:1;;64265:37;63936:378;63894:420;:::o;59056:883::-;59129:7;59153:22;59178:5;59153:30;;59198:10;59239:8;59227;59212:9;:12;;;:23;;;;:::i;:::-;59211:36;;;;:::i;:::-;59198:49;;59267:9;59262:519;59286:3;59282:1;:7;59262:519;;;59315:14;59321:8;59315:14;;:::i;:::-;;;59348:13;59393:1;59388:2;:6;59384:135;;;59424:1;59419:6;;59384:135;;;-1:-1:-1;59483:16:0;;;;:12;:16;;;;;;;;59384:135;59592:12;;;;59587:17;;:2;:17;:::i;:::-;59555:9;:15;;;:51;;;;:::i;:::-;59537:69;;:9;;:69;;;;;:::i;:::-;;;;;-1:-1:-1;59629:7:0;;;59625:61;;;59661:5;;;59625:61;59723:6;59704:9;:15;;:25;;;;;;;:::i;:::-;;;;;-1:-1:-1;;59748:12:0;;;:17;;;59291:3;;;:::i;:::-;;;59262:519;;;;59818:1;59801:9;:14;;;:18;;;59797:77;;;59857:1;59840:18;;59797:77;-1:-1:-1;59911:14:0;-1:-1:-1;;;;;59895:32:0;;59056:883;-1:-1:-1;;;59056:883:0:o;57009:1866::-;57091:7;57244:12;57234:6;:22;;57227:30;;;;:::i;:::-;57304:12;57350:24;;;:14;:24;;;;;;57304:12;57389:439;57413:3;57409:1;:7;57389:439;;;57516:4;57508;:12;57504:66;;57545:5;;57504:66;57588:12;57623:1;57604:11;57611:4;57604;:11;:::i;:::-;:15;;57618:1;57604:15;:::i;:::-;57603:21;;;;:::i;:::-;57647:26;;;;:16;:26;;;;;57588:36;;-1:-1:-1;57687:6:0;;57588:36;57647:32;;;;;;;:::i;:::-;;;;:36;;;:46;57643:170;;57725:4;57718:11;;57643:170;;;57785:8;57792:1;57785:4;:8;:::i;:::-;57778:15;;57643:170;-1:-1:-1;57418:3:0;;;:::i;:::-;;;57389:439;;;-1:-1:-1;57844:19:0;57866:26;;;:16;:26;;;;;57893:4;57866:32;;;;;;;:::i;:::-;57844:54;;;;;;;;57866:32;;;;;;;;;57844:54;;;;;;;;-1:-1:-1;;;57844:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57934:5;;57844:54;;-1:-1:-1;;57971:33:0;57987:6;57934:5;57971:15;:33::i;:::-;58019:19;58041:20;;;:12;:20;;;;;;;;58019:42;;;;;;;;;;;;;;;-1:-1:-1;;;58019:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57954:50;;-1:-1:-1;58019:19:0;58142:17;;;58138:326;;;58180:19;58202:12;58180:19;58215:10;:6;58224:1;58215:10;:::i;:::-;58202:24;;;;;;;;;;;;;;-1:-1:-1;58202:24:0;58180:46;;;;;;;;;;;;;;;-1:-1:-1;;;58180:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58267:10;;;58180:46;;-1:-1:-1;58254:23:0;;58267:10;58254:23;:::i;:::-;58245:32;;58313:6;:9;;;58301:6;:9;;;:21;;;;:::i;:::-;58296:26;;58161:177;58138:326;;;58387:10;;;;58372:25;;:12;:25;:::i;:::-;58363:34;;58439:6;:9;;;58421:15;:27;;;;:::i;:::-;58416:32;;58138:326;58498:9;;;;58526:11;;58522:102;;58602:6;58587;:10;;;58578:6;:19;;;;:::i;:::-;58572:26;;:2;:26;:::i;:::-;58571:37;;;;:::i;:::-;58558:50;;;;:::i;:::-;;;58522:102;58696:9;;;;58684:21;;:9;:21;:::i;:::-;58655:6;:12;;;:52;;;;:::i;:::-;58640:67;;:6;;:67;;;;;:::i;:::-;;;;;;;;58726:11;;58741:1;58726:16;;;;-1:-1:-1;58722:142:0;;-1:-1:-1;;58786:11:0;;-1:-1:-1;;;;;58770:29:0;;-1:-1:-1;58763:36:0;;-1:-1:-1;;;;;;58763:36:0;58722:142;58847:1;58840:8;;;;;;;;;;;;;54953:667;55035:7;;55135:8;55035:7;55158:425;55182:3;55178:1;:7;55158:425;;;55285:4;55277;:12;55273:66;;55314:5;;55273:66;55357:12;55392:1;55373:11;55380:4;55373;:11;:::i;:::-;:15;;55387:1;55373:15;:::i;:::-;55372:21;;;;:::i;:::-;55416:18;;;;:12;:18;;;;;:22;;;55357:36;;-1:-1:-1;55416:32:0;-1:-1:-1;55412:156:0;;55480:4;55473:11;;55412:156;;;55540:8;55547:1;55540:4;:8;:::i;:::-;55533:15;;55412:156;-1:-1:-1;55187:3:0;;;:::i;:::-;;;55158:425;;;-1:-1:-1;55604:4:0;;54953:667;-1:-1:-1;;;;54953:667:0:o;50374:881::-;50515:7;;50609:8;;50562:31;50580:13;50562:15;:31;:::i;:::-;50561:44;;;;:::i;:::-;50560:57;;;;:::i;:::-;50539:78;;50701:1;50692:6;:10;50684:27;;;;-1:-1:-1;;;50684:27:0;;;;;;21210:2:1;21192:21;;;21249:1;21229:18;;;21222:29;-1:-1:-1;;;21282:2:1;21267:18;;21260:34;21326:2;21311:18;;21008:327;50684:27:0;50734:14;50744:3;50734:9;:14::i;:::-;:19;50726:47;;;;-1:-1:-1;;;50726:47:0;;21542:2:1;50726:47:0;;;21524:21:1;21581:2;21561:18;;;21554:30;-1:-1:-1;;;21600:18:1;;;21593:45;21655:18;;50726:47:0;21340:339:1;50726:47:0;50850:15;50837:10;:28;50829:79;;;;-1:-1:-1;;;50829:79:0;;21886:2:1;50829:79:0;;;21868:21:1;21925:2;21905:18;;;21898:30;21964:34;21944:18;;;21937:62;-1:-1:-1;;;22015:18:1;;;22008:36;22061:19;;50829:79:0;21684:402:1;50829:79:0;50945:25;28583:15;50945;:25;:::i;:::-;50931:10;:39;;50923:82;;;;-1:-1:-1;;;50923:82:0;;15255:2:1;50923:82:0;;;15237:21:1;15294:2;15274:18;;;15267:30;15333:32;15313:18;;;15306:60;15383:18;;50923:82:0;15053:354:1;50923:82:0;51024:7;;51022:9;;;;;:::i;:::-;;;;-1:-1:-1;51065:7:0;;51087:20;51093:3;51065:7;51087:5;:20::i;:::-;-1:-1:-1;51166:16:0;;;;:6;:16;;;;;;;;;51124:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;51136:8;;51146:6;;51154:10;;51124:11;:89::i;:::-;51235:8;50374:881;-1:-1:-1;;;;;50374:881:0:o;55632:583::-;55708:7;55749:24;;;:14;:24;;;;;;55792:11;55788:416;;55831:1;55824:8;;;;;55788:416;55873:22;55898:26;;;:16;:26;;;;;55925:6;55898:34;;;;;;;:::i;:::-;55873:59;;;;;;;;55898:34;;;;;;;;;55873:59;;;;;;;;-1:-1:-1;;;55873:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55994:33:0;;56001:2;55994:33;:::i;:::-;55969:9;:15;;;:59;;;;:::i;:::-;55951:77;;:9;;:77;;;;;:::i;:::-;;;;;;;;56051:14;;56068:1;56051:18;;;56047:85;;-1:-1:-1;56047:85:0;;56111:1;56094:18;;56047:85;56172:14;56165:22;;;-1:-1:-1;56150:38:0;;-1:-1:-1;56150:38:0;61280:1790;61459:20;61496:264;;;;;;;;;;;;;;;;;;;61826:6;61844:19;61854:8;61844:9;:19::i;:::-;61809:99;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61775:148;;61989:6;62011:21;62021:10;62011:9;:21::i;:::-;61972:105;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61938:154;;62158:6;62181:21;62191:10;62181:9;:21::i;:::-;62141:106;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62107:155;;62310:6;62328:17;62338:6;62328:9;:17::i;:::-;62293:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62277:87;;62381:18;62402:569;62591:19;62601:8;62591:9;:19::i;:::-;62824:28;62844:6;62824:13;:28::i;:::-;62495:419;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62402:13;:569::i;:::-;62381:590;;63052:4;63002:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;62986:72;;61481:1589;61280:1790;;;;;;:::o;35834:358::-;35983:20;;;;:10;:20;;;;;;-1:-1:-1;;;;;35983:30:0;;;:20;;:30;35976:38;;;;:::i;:::-;36069:1;36033:24;;;:14;:24;;;;;;-1:-1:-1;;;;;36033:24:0;:38;36029:152;;36163:1;36128:24;;;:14;:24;;;;;:37;;-1:-1:-1;;;;;;36128:37:0;;;36029:152;35834:358;;:::o;35358:464::-;35507:20;;;;:10;:20;;;;;;-1:-1:-1;;;;;35507:29:0;;;:20;;:29;35500:37;;;;:::i;:::-;35616:1;35585:20;;;:10;:20;;;;;:33;;-1:-1:-1;;;;;;35585:33:0;;;35683:42;35709:5;35596:8;35683:25;:42::i;:::-;-1:-1:-1;;;;;35778:27:0;;;;;;:20;:27;;;;;:32;;35809:1;;35778:27;:32;;35809:1;;35778:32;:::i;:::-;;;;-1:-1:-1;;;;35358:464:0:o;34902:444::-;35074:1;35042:20;;;:10;:20;;;;;;-1:-1:-1;;;;;35042:20:0;:34;35035:42;;;;:::i;:::-;35125:20;;;;:10;:20;;;;;;;;:26;;-1:-1:-1;;;;;;35125:26:0;-1:-1:-1;;;;;35125:26:0;;;;;;;;32056:28;;;:20;:28;;;;;;;;33645:21;:26;;;;;:40;;;;;;;;:51;;;33711:28;;;:18;:28;;;;;:43;;;;35304:25;;;;;;:30;;-1:-1:-1;;35125:20:0;35304:30;;-1:-1:-1;;35304:30:0;:::i;39920:358::-;39984:4;-1:-1:-1;;;;;40060:17:0;;40053:25;;;;:::i;:::-;40159:26;40171:3;40176:8;40159:11;:26::i;:::-;40205:35;;40231:8;;-1:-1:-1;;;;;40205:35:0;;;40222:1;;40205:35;;40222:1;;40205:35;-1:-1:-1;40262:4:0;39920:358;;;;:::o;63082:800::-;63139:13;63372:10;63368:61;;-1:-1:-1;;63403:10:0;;;;;;;;;;;;-1:-1:-1;;;63403:10:0;;;;;63082:800::o;63368:61::-;63458:5;63443:12;63507:90;63514:9;;63507:90;;63544:8;;;;:::i;:::-;;-1:-1:-1;63571:10:0;;-1:-1:-1;63579:2:0;63571:10;;:::i;:::-;;;63507:90;;;63611:19;63643:6;63633:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63633:17:0;;63611:39;;63665:170;63672:10;;63665:170;;63703:11;63713:1;63703:11;;:::i;:::-;;-1:-1:-1;63776:10:0;63784:2;63776:5;:10;:::i;:::-;63763:24;;:2;:24;:::i;:::-;63750:39;;63733:6;63740;63733:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;63733:56:0;;;;;;;;-1:-1:-1;63808:11:0;63817:2;63808:11;;:::i;:::-;;;63665:170;;782:3278;840:13;1094:4;:11;1109:1;1094:16;1090:31;;;-1:-1:-1;;1112:9:0;;;;;;;;;-1:-1:-1;1112:9:0;;;782:3278::o;1090:31::-;1182:19;1204:6;;;;;;;;;;;;;;;;;1182:28;;1649:20;1708:1;1689:4;:11;1703:1;1689:15;;;;:::i;:::-;1688:21;;;;:::i;:::-;1683:27;;:1;:27;:::i;:::-;1672:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1672:39:0;;1649:62;;1859:1;1852:5;1848:13;1971:2;1963:6;1959:15;2094:4;2150;2144:11;2138:4;2134:22;2052:1524;2188:6;2179:7;2176:19;2052:1524;;;2306:1;2297:7;2293:15;2282:26;;2349:7;2343:14;3034:4;3026:5;3022:2;3018:14;3014:25;3004:8;3000:40;2994:47;2983:9;2975:67;3092:1;3081:9;3077:17;3064:30;;3188:4;3180:5;3176:2;3172:14;3168:25;3158:8;3154:40;3148:47;3137:9;3129:67;3246:1;3235:9;3231:17;3218:30;;3341:4;3333:5;3330:1;3326:13;3322:24;3312:8;3308:39;3302:46;3291:9;3283:66;3399:1;3388:9;3384:17;3371:30;;3486:4;3479:5;3475:16;3465:8;3461:31;3455:38;3444:9;3436:58;;3544:1;3533:9;3529:17;3516:30;;2052:1524;;;2056:119;;3750:1;3743:4;3737:11;3733:19;3775:1;3770:135;;;;3928:1;3923:81;;;;3726:278;;3770:135;3827:4;3823:1;3812:9;3808:17;3800:32;3881:4;3877:1;3866:9;3862:17;3854:32;3770:135;;3923:81;3980:4;3976:1;3965:9;3961:17;3953:32;3726:278;-1:-1:-1;4042:6:0;;782:3278;-1:-1:-1;;;;;782:3278:0:o;33778:1112::-;-1:-1:-1;;;;;32056:28:0;;33893:20;32056:28;;;:20;:28;;;;;;33916:19;;33934:1;;33916:19;:::i;:::-;33950:20;33973:28;;;:18;:28;;;;;;33893:42;;-1:-1:-1;34022:28:0;;;34018:861;;;-1:-1:-1;;;;;34119:28:0;;34164:1;34119:28;;;:21;:28;;;;;;;;:42;;;;;;;;:46;;;34229:28;;;:18;:28;;;;;:32;34018:861;;;-1:-1:-1;;;;;34324:28:0;;;;34302:19;34324:28;;;:21;:28;;;;;;;;:42;;;;;;;;;;;34459;;;;;;:56;;;34579:31;;:18;:31;;;;;;:46;;;;34721;;;;34831:28;;;;;:32;33778:1112::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:248::-;842:6;850;903:2;891:9;882:7;878:23;874:32;871:52;;;919:1;916;909:12;871:52;-1:-1:-1;;942:23:1;;;1012:2;997:18;;;984:32;;-1:-1:-1;774:248:1:o;1027:258::-;1099:1;1109:113;1123:6;1120:1;1117:13;1109:113;;;1199:11;;;1193:18;1180:11;;;1173:39;1145:2;1138:10;1109:113;;;1240:6;1237:1;1234:13;1231:48;;;-1:-1:-1;;1275:1:1;1257:16;;1250:27;1027:258::o;1290:::-;1332:3;1370:5;1364:12;1397:6;1392:3;1385:19;1413:63;1469:6;1462:4;1457:3;1453:14;1446:4;1439:5;1435:16;1413:63;:::i;:::-;1530:2;1509:15;-1:-1:-1;;1505:29:1;1496:39;;;;1537:4;1492:50;;1290:258;-1:-1:-1;;1290:258:1:o;1553:220::-;1702:2;1691:9;1684:21;1665:4;1722:45;1763:2;1752:9;1748:18;1740:6;1722:45;:::i;1778:180::-;1837:6;1890:2;1878:9;1869:7;1865:23;1861:32;1858:52;;;1906:1;1903;1896:12;1858:52;-1:-1:-1;1929:23:1;;1778:180;-1:-1:-1;1778:180:1:o;2171:131::-;-1:-1:-1;;;;;2246:31:1;;2236:42;;2226:70;;2292:1;2289;2282:12;2307:315;2375:6;2383;2436:2;2424:9;2415:7;2411:23;2407:32;2404:52;;;2452:1;2449;2442:12;2404:52;2491:9;2478:23;2510:31;2535:5;2510:31;:::i;:::-;2560:5;2612:2;2597:18;;;;2584:32;;-1:-1:-1;;;2307:315:1:o;2627:247::-;2686:6;2739:2;2727:9;2718:7;2714:23;2710:32;2707:52;;;2755:1;2752;2745:12;2707:52;2794:9;2781:23;2813:31;2838:5;2813:31;:::i;3075:456::-;3152:6;3160;3168;3221:2;3209:9;3200:7;3196:23;3192:32;3189:52;;;3237:1;3234;3227:12;3189:52;3276:9;3263:23;3295:31;3320:5;3295:31;:::i;:::-;3345:5;-1:-1:-1;3402:2:1;3387:18;;3374:32;3415:33;3374:32;3415:33;:::i;:::-;3075:456;;3467:7;;-1:-1:-1;;;3521:2:1;3506:18;;;;3493:32;;3075:456::o;4375:118::-;4461:5;4454:13;4447:21;4440:5;4437:32;4427:60;;4483:1;4480;4473:12;4498:382;4563:6;4571;4624:2;4612:9;4603:7;4599:23;4595:32;4592:52;;;4640:1;4637;4630:12;4592:52;4679:9;4666:23;4698:31;4723:5;4698:31;:::i;:::-;4748:5;-1:-1:-1;4805:2:1;4790:18;;4777:32;4818:30;4777:32;4818:30;:::i;:::-;4867:7;4857:17;;;4498:382;;;;;:::o;5152:127::-;5213:10;5208:3;5204:20;5201:1;5194:31;5244:4;5241:1;5234:15;5268:4;5265:1;5258:15;5284:1266;5379:6;5387;5395;5403;5456:3;5444:9;5435:7;5431:23;5427:33;5424:53;;;5473:1;5470;5463:12;5424:53;5512:9;5499:23;5531:31;5556:5;5531:31;:::i;:::-;5581:5;-1:-1:-1;5638:2:1;5623:18;;5610:32;5651:33;5610:32;5651:33;:::i;:::-;5703:7;-1:-1:-1;5757:2:1;5742:18;;5729:32;;-1:-1:-1;5812:2:1;5797:18;;5784:32;5835:18;5865:14;;;5862:34;;;5892:1;5889;5882:12;5862:34;5930:6;5919:9;5915:22;5905:32;;5975:7;5968:4;5964:2;5960:13;5956:27;5946:55;;5997:1;5994;5987:12;5946:55;6033:2;6020:16;6055:2;6051;6048:10;6045:36;;;6061:18;;:::i;:::-;6136:2;6130:9;6104:2;6190:13;;-1:-1:-1;;6186:22:1;;;6210:2;6182:31;6178:40;6166:53;;;6234:18;;;6254:22;;;6231:46;6228:72;;;6280:18;;:::i;:::-;6320:10;6316:2;6309:22;6355:2;6347:6;6340:18;6395:7;6390:2;6385;6381;6377:11;6373:20;6370:33;6367:53;;;6416:1;6413;6406:12;6367:53;6472:2;6467;6463;6459:11;6454:2;6446:6;6442:15;6429:46;6517:1;6512:2;6507;6499:6;6495:15;6491:24;6484:35;6538:6;6528:16;;;;;;;5284:1266;;;;;;;:::o;6555:388::-;6623:6;6631;6684:2;6672:9;6663:7;6659:23;6655:32;6652:52;;;6700:1;6697;6690:12;6652:52;6739:9;6726:23;6758:31;6783:5;6758:31;:::i;:::-;6808:5;-1:-1:-1;6865:2:1;6850:18;;6837:32;6878:33;6837:32;6878:33;:::i;6948:383::-;7025:6;7033;7041;7094:2;7082:9;7073:7;7069:23;7065:32;7062:52;;;7110:1;7107;7100:12;7062:52;7146:9;7133:23;7123:33;;7203:2;7192:9;7188:18;7175:32;7165:42;;7257:2;7246:9;7242:18;7229:32;7270:31;7295:5;7270:31;:::i;:::-;7320:5;7310:15;;;6948:383;;;;;:::o;7336:127::-;7397:10;7392:3;7388:20;7385:1;7378:31;7428:4;7425:1;7418:15;7452:4;7449:1;7442:15;7468:355;7670:2;7652:21;;;7709:2;7689:18;;;7682:30;7748:33;7743:2;7728:18;;7721:61;7814:2;7799:18;;7468:355::o;8179:400::-;8381:2;8363:21;;;8420:2;8400:18;;;8393:30;8459:34;8454:2;8439:18;;8432:62;-1:-1:-1;;;8525:2:1;8510:18;;8503:34;8569:3;8554:19;;8179:400::o;8584:251::-;8654:6;8707:2;8695:9;8686:7;8682:23;8678:32;8675:52;;;8723:1;8720;8713:12;8675:52;8755:9;8749:16;8774:31;8799:5;8774:31;:::i;9546:331::-;9748:2;9730:21;;;9787:1;9767:18;;;9760:29;-1:-1:-1;;;9820:2:1;9805:18;;9798:38;9868:2;9853:18;;9546:331::o;9882:::-;10084:2;10066:21;;;10123:1;10103:18;;;10096:29;-1:-1:-1;;;10156:2:1;10141:18;;10134:38;10204:2;10189:18;;9882:331::o;10569:127::-;10630:10;10625:3;10621:20;10618:1;10611:31;10661:4;10658:1;10651:15;10685:4;10682:1;10675:15;10701:125;10741:4;10769:1;10766;10763:8;10760:34;;;10774:18;;:::i;:::-;-1:-1:-1;10811:9:1;;10701:125::o;11110:245::-;11177:6;11230:2;11218:9;11209:7;11205:23;11201:32;11198:52;;;11246:1;11243;11236:12;11198:52;11278:9;11272:16;11297:28;11319:5;11297:28;:::i;11360:127::-;11421:10;11416:3;11412:20;11409:1;11402:31;11452:4;11449:1;11442:15;11476:4;11473:1;11466:15;13443:128;13483:3;13514:1;13510:6;13507:1;13504:13;13501:39;;;13520:18;;:::i;:::-;-1:-1:-1;13556:9:1;;13443:128::o;13576:168::-;13616:7;13682:1;13678;13674:6;13670:14;13667:1;13664:21;13659:1;13652:9;13645:17;13641:45;13638:71;;;13689:18;;:::i;:::-;-1:-1:-1;13729:9:1;;13576:168::o;13749:127::-;13810:10;13805:3;13801:20;13798:1;13791:31;13841:4;13838:1;13831:15;13865:4;13862:1;13855:15;13881:120;13921:1;13947;13937:35;;13952:18;;:::i;:::-;-1:-1:-1;13986:9:1;;13881:120::o;15412:489::-;-1:-1:-1;;;;;15681:15:1;;;15663:34;;15733:15;;15728:2;15713:18;;15706:43;15780:2;15765:18;;15758:34;;;15828:3;15823:2;15808:18;;15801:31;;;15606:4;;15849:46;;15875:19;;15867:6;15849:46;:::i;15906:249::-;15975:6;16028:2;16016:9;16007:7;16003:23;15999:32;15996:52;;;16044:1;16041;16034:12;15996:52;16076:9;16070:16;16095:30;16119:5;16095:30;:::i;17616:396::-;17655:3;17699:1;17695:2;17684:17;17736:1;17732:2;17721:17;17766:1;17761:3;17757:11;17845:3;-1:-1:-1;;;;;17805:44:1;17800:3;17796:54;17791:2;17784:10;17780:71;17777:97;;;17854:18;;:::i;:::-;17948:3;-1:-1:-1;;;;;17907:39:1;17903:49;17898:3;17894:59;17890:2;17886:68;17883:94;;;17957:18;;:::i;:::-;-1:-1:-1;17993:13:1;;17616:396;-1:-1:-1;;;17616:396:1:o;18017:127::-;18078:10;18073:3;18069:20;18066:1;18059:31;18109:4;18106:1;18099:15;18133:4;18130:1;18123:15;18529:557;18773:25;;;18829:2;18814:18;;18807:34;;;18760:3;18745:19;;18871:1;18860:13;;18850:144;;18916:10;18911:3;18907:20;18904:1;18897:31;18951:4;18948:1;18941:15;18979:4;18976:1;18969:15;18850:144;19025:2;19010:18;;19003:34;;;;19068:2;19053:18;19046:34;18529:557;;-1:-1:-1;;18529:557:1:o;19091:305::-;19130:1;19172;19168:2;19157:17;19209:1;19205:2;19194:17;19230:3;19220:37;;19237:18;;:::i;:::-;-1:-1:-1;;;;;;19273:48:1;;-1:-1:-1;;19323:15:1;;19269:70;19266:96;;;19342:18;;:::i;:::-;19376:14;;;19091:305;-1:-1:-1;;;19091:305:1:o;19401:698::-;19440:7;19488:1;19484:2;19473:17;19525:1;19521:2;19510:17;-1:-1:-1;;;;;19608:1:1;19603:3;19599:11;19638:1;19633:3;19629:11;19685:3;19681:2;19677:12;19672:3;19669:21;19664:2;19660;19656:11;19652:39;19649:65;;;19694:18;;:::i;:::-;-1:-1:-1;;;;;;19800:1:1;19791:11;;19818;;;19840:13;;;19831:23;;19814:41;19811:67;;;19858:18;;:::i;:::-;19906:1;19901:3;19897:11;19887:21;;19955:3;19951:2;19946:13;19941:3;19937:23;19932:2;19928;19924:11;19920:41;19917:67;;;19964:18;;:::i;:::-;20031:3;20027:2;20022:13;20017:3;20013:23;20008:2;20004;20000:11;19996:41;19993:67;;;20040:18;;:::i;:::-;-1:-1:-1;;;20080:13:1;;;;;19401:698;-1:-1:-1;;;;;19401:698:1:o;20104:398::-;20143:4;20188:1;20184:2;20173:17;20225:1;20221:2;20210:17;20255:1;20250:3;20246:11;20339:3;-1:-1:-1;;;;;20298:39:1;20294:49;20289:3;20285:59;20280:2;20273:10;20269:76;20266:102;;;20348:18;;:::i;:::-;20437:3;-1:-1:-1;;;;;20397:44:1;20392:3;20388:54;20384:2;20380:63;20377:89;;;20446:18;;:::i;:::-;-1:-1:-1;20483:13:1;;;20104:398;-1:-1:-1;;;20104:398:1:o;20507:135::-;20546:3;-1:-1:-1;;20567:17:1;;20564:43;;;20587:18;;:::i;:::-;-1:-1:-1;20634:1:1;20623:13;;20507:135::o;22091:267::-;22130:4;22159:9;;;22184:10;;-1:-1:-1;;;22203:19:1;;22196:27;;22180:44;22177:70;;;22227:18;;:::i;:::-;-1:-1:-1;;;;;22274:27:1;;22267:35;;22259:44;;22256:70;;;22306:18;;:::i;:::-;-1:-1:-1;;22343:9:1;;22091:267::o;22363:895::-;22744:3;22782:6;22776:13;22798:53;22844:6;22839:3;22832:4;22824:6;22820:17;22798:53;:::i;:::-;-1:-1:-1;;;22873:16:1;;;22898:23;;;22946:13;;22968:65;22946:13;23020:1;23009:13;;23002:4;22990:17;;22968:65;:::i;:::-;23100:66;23096:1;23052:20;;;;23088:10;;;23081:86;-1:-1:-1;;;23191:2:1;23183:11;;23176:49;23249:2;23241:11;;22363:895;-1:-1:-1;;;;22363:895:1:o;23263:901::-;23644:3;23682:6;23676:13;23698:53;23744:6;23739:3;23732:4;23724:6;23720:17;23698:53;:::i;:::-;-1:-1:-1;;;23773:16:1;;;23798:27;;;23850:13;;23872:66;23850:13;23924:2;23913:14;;23906:4;23894:17;;23872:66;:::i;:::-;24006;24001:2;23957:20;;;;23993:11;;;23986:87;-1:-1:-1;;;24097:2:1;24089:11;;24082:49;24155:2;24147:11;;23263:901;-1:-1:-1;;;;23263:901:1:o;24169:902::-;24550:3;24588:6;24582:13;24604:53;24650:6;24645:3;24638:4;24630:6;24626:17;24604:53;:::i;:::-;-1:-1:-1;;;24679:16:1;;;24704:28;;;24757:13;;24779:66;24757:13;24831:2;24820:14;;24813:4;24801:17;;24779:66;:::i;:::-;24913;24908:2;24864:20;;;;24900:11;;;24893:87;-1:-1:-1;;;25004:2:1;24996:11;;24989:49;25062:2;25054:11;;24169:902;-1:-1:-1;;;;24169:902:1:o;25076:786::-;25457:3;25495:6;25489:13;25511:53;25557:6;25552:3;25545:4;25537:6;25533:17;25511:53;:::i;:::-;-1:-1:-1;;;25586:16:1;;;25611:23;;;25659:13;;25681:65;25659:13;25733:1;25722:13;;25715:4;25703:17;;25681:65;:::i;:::-;-1:-1:-1;;;25809:1:1;25765:20;;;;25801:10;;;25794:35;25853:2;25845:11;;25076:786;-1:-1:-1;;;;25076:786:1:o;25867:1301::-;-1:-1:-1;;;26367:57:1;;26447:13;;26349:3;;26469:62;26447:13;26519:2;26510:12;;26503:4;26491:17;;26469:62;:::i;:::-;26595:66;26590:2;26550:16;;;26582:11;;;26575:87;26691:34;26686:2;26678:11;;26671:55;26755:34;26750:2;26742:11;;26735:55;26820:66;26814:3;26806:12;;26799:88;-1:-1:-1;;;26911:3:1;26903:12;;26896:46;26967:13;;26989:64;26967:13;27038:3;27030:12;;27023:4;27011:17;;26989:64;:::i;:::-;-1:-1:-1;;;27113:3:1;27072:17;;;;27105:12;;;27098:36;27158:3;27150:12;;25867:1301;-1:-1:-1;;;;25867:1301:1:o;27173:448::-;27435:31;27430:3;27423:44;27405:3;27496:6;27490:13;27512:62;27567:6;27562:2;27557:3;27553:12;27546:4;27538:6;27534:17;27512:62;:::i;:::-;27594:16;;;;27612:2;27590:25;;27173:448;-1:-1:-1;;27173:448:1:o;27626:112::-;27658:1;27684;27674:35;;27689:18;;:::i;:::-;-1:-1:-1;27723:9:1;;27626:112::o
Swarm Source
ipfs://433e30d3ca1fff6dec01eac8057bade0845e78bd8dc9097ac6b69bf70b27035c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.