Overview
MATIC Balance
MATIC Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator:
TokenTracker
Multi Chain
Multichain Addresses
2 addresses found via
Latest 25 from a total of 31,518 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 50686220 | 2 days 22 hrs ago | IN | 0 MATIC | 0.00014137 | ||||
Safe Transfer Fr... | 50469965 | 8 days 8 hrs ago | IN | 0 MATIC | 0.00370363 | ||||
Set Approval For... | 50374994 | 10 days 18 hrs ago | IN | 0 MATIC | 0.00193965 | ||||
Set Approval For... | 50239591 | 14 days 2 hrs ago | IN | 0 MATIC | 0.00123645 | ||||
Set Approval For... | 50186658 | 15 days 10 hrs ago | IN | 0 MATIC | 0.00145895 | ||||
Set Approval For... | 49860722 | 23 days 14 hrs ago | IN | 0 MATIC | 0.00201803 | ||||
Set Approval For... | 49778409 | 25 days 16 hrs ago | IN | 0 MATIC | 0.00997821 | ||||
Set Approval For... | 49732273 | 26 days 19 hrs ago | IN | 0 MATIC | 0.0103543 | ||||
Set Approval For... | 49659155 | 28 days 15 hrs ago | IN | 0 MATIC | 0.00894376 | ||||
Set Approval For... | 49521280 | 32 days 2 hrs ago | IN | 0 MATIC | 0.00193075 | ||||
Set Approval For... | 49363883 | 36 days 1 hr ago | IN | 0 MATIC | 0.00358017 | ||||
Set Approval For... | 49079641 | 43 days 4 hrs ago | IN | 0 MATIC | 0.00437626 | ||||
Set Approval For... | 49026097 | 44 days 14 hrs ago | IN | 0 MATIC | 0.00388398 | ||||
Set Approval For... | 48519645 | 57 days 14 hrs ago | IN | 0 MATIC | 0.00404412 | ||||
Set Approval For... | 48487424 | 58 days 10 hrs ago | IN | 0 MATIC | 0.00314707 | ||||
Set Approval For... | 48350757 | 61 days 22 hrs ago | IN | 0 MATIC | 0.00190084 | ||||
Set Approval For... | 48321137 | 62 days 16 hrs ago | IN | 0 MATIC | 0.00235462 | ||||
Safe Transfer Fr... | 47981692 | 71 days 10 hrs ago | IN | 0 MATIC | 0.00731431 | ||||
Set Approval For... | 47942172 | 72 days 10 hrs ago | IN | 0 MATIC | 0.00214724 | ||||
Set Approval For... | 47775755 | 76 days 15 hrs ago | IN | 0 MATIC | 0.00202695 | ||||
Safe Transfer Fr... | 47524624 | 82 days 23 hrs ago | IN | 0 MATIC | 0.00990551 | ||||
Safe Transfer Fr... | 47434269 | 85 days 6 hrs ago | IN | 0 MATIC | 0.01755253 | ||||
Set Approval For... | 47404329 | 86 days 23 mins ago | IN | 0 MATIC | 0.00869545 | ||||
Set Approval For... | 47327101 | 87 days 23 hrs ago | IN | 0 MATIC | 0.0024843 | ||||
Set Approval For... | 47327095 | 87 days 23 hrs ago | IN | 0 MATIC | 0.00254042 |
Loading...
Loading
Contract Name:
NFTweet
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-18 */ pragma solidity ^0.6.6; pragma experimental ABIEncoderV2; // SPDX-License-Identifier: MIT /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.0.0, only sets of type `address` (`AddressSet`) and `uint256` * (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(value))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(value))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint256(_at(set._inner, index))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { return _get(map, key, "EnumerableMap: nonexistent key"); } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(value))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element stored at position `index` in the set. O(1). * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint256(value))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint256(_get(map._inner, bytes32(key)))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint256(_get(map._inner, bytes32(key), errorMessage))); } } /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = byte(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } /** * @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); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transfered 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; } /** * @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); } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @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); } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @dev See {IERC721Metadata-name}. */ function name() public view override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; // If there is no base URI, return the token URI. if (bytes(_baseURI).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(_baseURI, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(_baseURI, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @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. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mecanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view returns (bool) { return _tokenOwners.contains(tokenId); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(tokenId); emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (!to.isContract()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } function _approve(address to, uint256 tokenId) private { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } contract NFTweet is ERC721 { address private admin; address[] private delegateHistory; mapping(address => bool) private delegates; modifier onlyAdmin { require(msg.sender == admin, "Only Admin"); _; } modifier onlyDelegates { require(delegates[msg.sender] || msg.sender == admin, "Only Delegates"); _; } constructor() public ERC721("Tweets", "TWEET") { admin = msg.sender; _setBaseURI("https://v.cent.co/data/token?m="); } /** * Delegate APIs */ function mint(address _to, uint256 _tokenId, string memory _tokenURI) public onlyDelegates { _mint(_to, _tokenId); _setTokenURI(_tokenId, _tokenURI); } function mintMany(address[] memory _tos, uint256[] memory _tokenIds, string[] memory _tokenURIs) public onlyDelegates { uint256 numMinting = _tos.length; require(numMinting == _tokenIds.length && numMinting == _tokenURIs.length, "Invalid arguments"); for (uint i = 0; i < numMinting; i++) { _mint(_tos[i], _tokenIds[i]); _setTokenURI(_tokenIds[i], _tokenURIs[i]); } } /** * Admin APIs */ /** * @dev admin function to set minting delegate. * * @param delegate address the address to set minting privileges of * @param privileged bool whether or not this address can mint nftweets */ function setDelegate(address delegate, bool privileged) public onlyAdmin { delegates[delegate] = privileged; if (privileged) { delegateHistory.push(delegate); } } /** * @dev admin function to set new root admin. * * @param newAdmin address the new admin to assign, which manages delegates */ function changeAdmin(address newAdmin) public onlyAdmin { admin = newAdmin; } function setBaseURI(string memory uri) public onlyAdmin { _setBaseURI(uri); } /** * Read APIs */ function getDelegateHistory() public view returns (address[] memory) { return delegateHistory; } function isDelegate(address delegate) public view returns (bool) { return delegates[delegate]; } function getAdmin() public view returns (address) { return admin; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":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"},{"inputs":[{"internalType":"address","name":"to","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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"changeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDelegateHistory","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","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":"delegate","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tos","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"_tokenURIs","type":"string[]"}],"name":"mintMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"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":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"bool","name":"privileged","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","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":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600681526020017f54776565747300000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f5457454554000000000000000000000000000000000000000000000000000000815250620000966301ffc9a760e01b6200019f60201b60201c565b8160069080519060200190620000ae92919062000293565b508060079080519060200190620000c792919062000293565b50620000e06380ac58cd60e01b6200019f60201b60201c565b620000f8635b5e139f60e01b6200019f60201b60201c565b6200011063780e9d6360e01b6200019f60201b60201c565b505033600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001996040518060400160405280601f81526020017f68747470733a2f2f762e63656e742e636f2f646174612f746f6b656e3f6d3d008152506200027760201b60201c565b620003ae565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200020b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000202906200037b565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b80600990805190602001906200028f92919062000293565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d657805160ff191683800117855562000307565b8280016001018555821562000307579182015b8281111562000306578251825591602001919060010190620002e9565b5b5090506200031691906200031a565b5090565b5b80821115620003355760008160009055506001016200031b565b5090565b600062000348601c836200039d565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b60006020820190508181036000830152620003968162000339565b9050919050565b600082825260208201905092915050565b613bb280620003be6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806355f804b3116100de57806395d89b4111610097578063c87b56dd11610071578063c87b56dd1461045a578063d3fc98641461048a578063e20b9cff146104a6578063e985e9c5146104c457610173565b806395d89b4114610404578063a22cb46514610422578063b88d4fde1461043e57610173565b806355f804b3146103305780636352211e1461034c5780636c0360eb1461037c5780636e9960c31461039a57806370a08231146103b85780638f283970146103e857610173565b806318160ddd1161013057806318160ddd1461025e57806323b872dd1461027c5780632f745c591461029857806342842e0e146102c85780634a994eef146102e45780634f6ccce71461030057610173565b806301ffc9a71461017857806306fdde03146101a857806307779627146101c657806307eaf637146101f6578063081812fc14610212578063095ea7b314610242575b600080fd5b610192600480360381019061018d9190612aea565b6104f4565b60405161019f919061357b565b60405180910390f35b6101b061055b565b6040516101bd9190613596565b60405180910390f35b6101e060048036038101906101db9190612845565b6105fd565b6040516101ed919061357b565b60405180910390f35b610210600480360381019061020b9190612a53565b610653565b005b61022c60048036038101906102279190612b7d565b61080b565b60405161023991906134f2565b60405180910390f35b61025c600480360381019061025791906129b0565b610890565b005b6102666109a8565b6040516102739190613838565b60405180910390f35b610296600480360381019061029191906128aa565b6109b9565b005b6102b260048036038101906102ad91906129b0565b610a19565b6040516102bf9190613838565b60405180910390f35b6102e260048036038101906102dd91906128aa565b610a74565b005b6102fe60048036038101906102f99190612974565b610a94565b005b61031a60048036038101906103159190612b7d565b610be9565b6040516103279190613838565b60405180910390f35b61034a60048036038101906103459190612b3c565b610c0c565b005b61036660048036038101906103619190612b7d565b610ca8565b60405161037391906134f2565b60405180910390f35b610384610cdf565b6040516103919190613596565b60405180910390f35b6103a2610d81565b6040516103af91906134f2565b60405180910390f35b6103d260048036038101906103cd9190612845565b610dab565b6040516103df9190613838565b60405180910390f35b61040260048036038101906103fd9190612845565b610e6a565b005b61040c610f3e565b6040516104199190613596565b60405180910390f35b61043c60048036038101906104379190612974565b610fe0565b005b610458600480360381019061045391906128f9565b611161565b005b610474600480360381019061046f9190612b7d565b6111c3565b6040516104819190613596565b60405180910390f35b6104a4600480360381019061049f91906129ec565b61134e565b005b6104ae61144b565b6040516104bb9190613559565b60405180910390f35b6104de60048036038101906104d9919061286e565b6114d9565b6040516104eb919061357b565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105f35780601f106105c8576101008083540402835291602001916105f3565b820191906000526020600020905b8154815290600101906020018083116105d657829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806106f85750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072e90613818565b60405180910390fd5b60008351905082518114801561074d5750815181145b61078c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390613678565b60405180910390fd5b60005b81811015610804576107c78582815181106107a657fe5b60200260200101518583815181106107ba57fe5b602002602001015161156d565b6107f78482815181106107d657fe5b60200260200101518483815181106107ea57fe5b60200260200101516116fb565b808060010191505061078f565b5050505050565b60006108168261176f565b610855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084c90613718565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061089b82610ca8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090390613798565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661092b61178c565b73ffffffffffffffffffffffffffffffffffffffff16148061095a57506109598161095461178c565b6114d9565b5b610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099090613698565b60405180910390fd5b6109a38383611794565b505050565b60006109b4600261184d565b905090565b6109ca6109c461178c565b82611862565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a00906137d8565b60405180910390fd5b610a14838383611940565b505050565b6000610a6c82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611b5790919063ffffffff16565b905092915050565b610a8f83838360405180602001604052806000815250611161565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1b906137b8565b60405180910390fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015610be557600b829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b600080610c00836002611b7190919063ffffffff16565b50905080915050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c93906137b8565b60405180910390fd5b610ca581611b9d565b50565b6000610cd882604051806060016040528060298152602001613b54602991396002611bb79092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e13906136b8565b60405180910390fd5b610e63600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611bd6565b9050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef1906137b8565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fd65780601f10610fab57610100808354040283529160200191610fd6565b820191906000526020600020905b815481529060010190602001808311610fb957829003601f168201915b5050505050905090565b610fe861178c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104d90613638565b60405180910390fd5b806005600061106361178c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661111061178c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611155919061357b565b60405180910390a35050565b61117261116c61178c565b83611862565b6111b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a8906137d8565b60405180910390fd5b6111bd84848484611beb565b50505050565b60606111ce8261176f565b61120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613778565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b505050505090506000600980546001816001161561010002031660029004905014156112e55780915050611349565b60008151111561131a576009816040516020016113039291906134ce565b604051602081830303815290604052915050611349565b600961132584611c47565b6040516020016113369291906134ce565b6040516020818303038152906040529150505b919050565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806113f35750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990613818565b60405180910390fd5b61143c838361156d565b61144682826116fb565b505050565b6060600b8054806020026020016040519081016040528092919081815260200182805480156114cf57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611485575b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d4906136f8565b60405180910390fd5b6115e68161176f565b15611626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161d906135f8565b60405180910390fd5b61163260008383611d8e565b61168381600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d9390919063ffffffff16565b5061169a81836002611dad9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6117048261176f565b611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613738565b60405180910390fd5b8060086000848152602001908152602001600020908051906020019061176a92919061251d565b505050565b6000611785826002611de290919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661180783610ca8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061185b82600001611dfc565b9050919050565b600061186d8261176f565b6118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a390613658565b60405180910390fd5b60006118b783610ca8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061192657508373ffffffffffffffffffffffffffffffffffffffff1661190e8461080b565b73ffffffffffffffffffffffffffffffffffffffff16145b80611937575061193681856114d9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661196082610ca8565b73ffffffffffffffffffffffffffffffffffffffff16146119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90613758565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1d90613618565b60405180910390fd5b611a31838383611d8e565b611a3c600082611794565b611a8d81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611e0d90919063ffffffff16565b50611adf81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d9390919063ffffffff16565b50611af681836002611dad9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611b668360000183611e27565b60001c905092915050565b600080600080611b848660000186611e94565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190611bb392919061251d565b5050565b6000611bca846000018460001b84611f17565b60001c90509392505050565b6000611be482600001611fa8565b9050919050565b611bf6848484611940565b611c0284848484611fb9565b611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c38906135d8565b60405180910390fd5b50505050565b60606000821415611c8f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d89565b600082905060005b60008214611cb9578080600101915050600a8281611cb157fe5b049150611c97565b60608167ffffffffffffffff81118015611cd257600080fd5b506040519080825280601f01601f191660200182016040528015611d055781602001600182028036833780820191505090505b50905060006001830390508593505b60008414611d8157600a8481611d2657fe5b0660300160f81b82828060019003935081518110611d4057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481611d7957fe5b049350611d14565b819450505050505b919050565b505050565b6000611da5836000018360001b61211d565b905092915050565b6000611dd9846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61218d565b90509392505050565b6000611df4836000018360001b612269565b905092915050565b600081600001805490509050919050565b6000611e1f836000018360001b61228c565b905092915050565b600081836000018054905011611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e69906135b8565b60405180910390fd5b826000018281548110611e8157fe5b9060005260206000200154905092915050565b60008082846000018054905011611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed7906136d8565b60405180910390fd5b6000846000018481548110611ef157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f709190613596565b60405180910390fd5b50846000016001820381548110611f8c57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000611fda8473ffffffffffffffffffffffffffffffffffffffff16612374565b611fe75760019050612115565b60606120ae63150b7a0260e01b611ffc61178c565b888787604051602401612012949392919061350d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001613b22603291398773ffffffffffffffffffffffffffffffffffffffff166123bf9092919063ffffffff16565b90506000818060200190518101906120c69190612b13565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600061212983836123d7565b612182578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612187565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561223457846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612262565b8285600001600183038154811061224757fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461236857600060018203905060006001866000018054905003905060008660000182815481106122d757fe5b90600052602060002001549050808760000184815481106122f457fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061232c57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061236e565b60009150505b92915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156123b657506000801b8214155b92505050919050565b60606123ce84846000856123fa565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606061240585612374565b612444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b906137f8565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff16858760405161246e91906134b7565b60006040518083038185875af1925050503d80600081146124ab576040519150601f19603f3d011682016040523d82523d6000602084013e6124b0565b606091505b509150915081156124c5578092505050612515565b6000815111156124d85780518082602001fd5b836040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250c9190613596565b60405180910390fd5b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061255e57805160ff191683800117855561258c565b8280016001018555821561258c579182015b8281111561258b578251825591602001919060010190612570565b5b509050612599919061259d565b5090565b5b808211156125b657600081600090555060010161259e565b5090565b6000813590506125c981613ac5565b92915050565b600082601f8301126125e057600080fd5b81356125f36125ee82613880565b613853565b9150818183526020840193506020810190508385602084028201111561261857600080fd5b60005b83811015612648578161262e88826125ba565b84526020840193506020830192505060018101905061261b565b5050505092915050565b600082601f83011261266357600080fd5b8135612676612671826138a8565b613853565b9150818183526020840193506020810190508360005b838110156126bc57813586016126a288826127dc565b84526020840193506020830192505060018101905061268c565b5050505092915050565b600082601f8301126126d757600080fd5b81356126ea6126e5826138d0565b613853565b9150818183526020840193506020810190508385602084028201111561270f57600080fd5b60005b8381101561273f57816127258882612830565b845260208401935060208301925050600181019050612712565b5050505092915050565b60008135905061275881613adc565b92915050565b60008135905061276d81613af3565b92915050565b60008151905061278281613af3565b92915050565b600082601f83011261279957600080fd5b81356127ac6127a7826138f8565b613853565b915080825260208301602083018583830111156127c857600080fd5b6127d3838284613a72565b50505092915050565b600082601f8301126127ed57600080fd5b81356128006127fb82613924565b613853565b9150808252602083016020830185838301111561281c57600080fd5b612827838284613a72565b50505092915050565b60008135905061283f81613b0a565b92915050565b60006020828403121561285757600080fd5b6000612865848285016125ba565b91505092915050565b6000806040838503121561288157600080fd5b600061288f858286016125ba565b92505060206128a0858286016125ba565b9150509250929050565b6000806000606084860312156128bf57600080fd5b60006128cd868287016125ba565b93505060206128de868287016125ba565b92505060406128ef86828701612830565b9150509250925092565b6000806000806080858703121561290f57600080fd5b600061291d878288016125ba565b945050602061292e878288016125ba565b935050604061293f87828801612830565b925050606085013567ffffffffffffffff81111561295c57600080fd5b61296887828801612788565b91505092959194509250565b6000806040838503121561298757600080fd5b6000612995858286016125ba565b92505060206129a685828601612749565b9150509250929050565b600080604083850312156129c357600080fd5b60006129d1858286016125ba565b92505060206129e285828601612830565b9150509250929050565b600080600060608486031215612a0157600080fd5b6000612a0f868287016125ba565b9350506020612a2086828701612830565b925050604084013567ffffffffffffffff811115612a3d57600080fd5b612a49868287016127dc565b9150509250925092565b600080600060608486031215612a6857600080fd5b600084013567ffffffffffffffff811115612a8257600080fd5b612a8e868287016125cf565b935050602084013567ffffffffffffffff811115612aab57600080fd5b612ab7868287016126c6565b925050604084013567ffffffffffffffff811115612ad457600080fd5b612ae086828701612652565b9150509250925092565b600060208284031215612afc57600080fd5b6000612b0a8482850161275e565b91505092915050565b600060208284031215612b2557600080fd5b6000612b3384828501612773565b91505092915050565b600060208284031215612b4e57600080fd5b600082013567ffffffffffffffff811115612b6857600080fd5b612b74848285016127dc565b91505092915050565b600060208284031215612b8f57600080fd5b6000612b9d84828501612830565b91505092915050565b6000612bb28383612bcd565b60208301905092915050565b612bc7816139fe565b82525050565b612bd6816139ec565b82525050565b612be5816139ec565b82525050565b6000612bf682613975565b612c0081856139a3565b9350612c0b83613950565b8060005b83811015612c3c578151612c238882612ba6565b9750612c2e83613996565b925050600181019050612c0f565b5085935050505092915050565b612c5281613a10565b82525050565b6000612c6382613980565b612c6d81856139b4565b9350612c7d818560208601613a81565b612c8681613ab4565b840191505092915050565b6000612c9c82613980565b612ca681856139c5565b9350612cb6818560208601613a81565b80840191505092915050565b6000612ccd8261398b565b612cd781856139d0565b9350612ce7818560208601613a81565b612cf081613ab4565b840191505092915050565b6000612d068261398b565b612d1081856139e1565b9350612d20818560208601613a81565b80840191505092915050565b600081546001811660008114612d495760018114612d6e57612db2565b607f6002830416612d5a81876139e1565b955060ff1983168652808601935050612db2565b60028204612d7c81876139e1565b9550612d8785613960565b60005b82811015612da957815481890152600182019150602081019050612d8a565b82880195505050505b505092915050565b6000612dc76022836139d0565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612e2d6032836139d0565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612e93601c836139d0565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612ed36024836139d0565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f396019836139d0565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612f79602c836139d0565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612fdf6011836139d0565b91507f496e76616c696420617267756d656e74730000000000000000000000000000006000830152602082019050919050565b600061301f6038836139d0565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613085602a836139d0565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006130eb6022836139d0565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131516020836139d0565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613191602c836139d0565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006131f7602c836139d0565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061325d6029836139d0565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132c3602f836139d0565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006133296021836139d0565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061338f600a836139d0565b91507f4f6e6c792041646d696e000000000000000000000000000000000000000000006000830152602082019050919050565b60006133cf6031836139d0565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613435601d836139d0565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000613475600e836139d0565b91507f4f6e6c792044656c6567617465730000000000000000000000000000000000006000830152602082019050919050565b6134b181613a68565b82525050565b60006134c38284612c91565b915081905092915050565b60006134da8285612d2c565b91506134e68284612cfb565b91508190509392505050565b60006020820190506135076000830184612bdc565b92915050565b60006080820190506135226000830187612bbe565b61352f6020830186612bdc565b61353c60408301856134a8565b818103606083015261354e8184612c58565b905095945050505050565b600060208201905081810360008301526135738184612beb565b905092915050565b60006020820190506135906000830184612c49565b92915050565b600060208201905081810360008301526135b08184612cc2565b905092915050565b600060208201905081810360008301526135d181612dba565b9050919050565b600060208201905081810360008301526135f181612e20565b9050919050565b6000602082019050818103600083015261361181612e86565b9050919050565b6000602082019050818103600083015261363181612ec6565b9050919050565b6000602082019050818103600083015261365181612f2c565b9050919050565b6000602082019050818103600083015261367181612f6c565b9050919050565b6000602082019050818103600083015261369181612fd2565b9050919050565b600060208201905081810360008301526136b181613012565b9050919050565b600060208201905081810360008301526136d181613078565b9050919050565b600060208201905081810360008301526136f1816130de565b9050919050565b6000602082019050818103600083015261371181613144565b9050919050565b6000602082019050818103600083015261373181613184565b9050919050565b60006020820190508181036000830152613751816131ea565b9050919050565b6000602082019050818103600083015261377181613250565b9050919050565b60006020820190508181036000830152613791816132b6565b9050919050565b600060208201905081810360008301526137b18161331c565b9050919050565b600060208201905081810360008301526137d181613382565b9050919050565b600060208201905081810360008301526137f1816133c2565b9050919050565b6000602082019050818103600083015261381181613428565b9050919050565b6000602082019050818103600083015261383181613468565b9050919050565b600060208201905061384d60008301846134a8565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561387657600080fd5b8060405250919050565b600067ffffffffffffffff82111561389757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156138bf57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156138e757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561390f57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561393b57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139f782613a48565b9050919050565b6000613a0982613a48565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a9f578082015181840152602081019050613a84565b83811115613aae576000848401525b50505050565b6000601f19601f8301169050919050565b613ace816139ec565b8114613ad957600080fd5b50565b613ae581613a10565b8114613af057600080fd5b50565b613afc81613a1c565b8114613b0757600080fd5b50565b613b1381613a68565b8114613b1e57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212205ab1d5438b8c4f81408d6fb906d6419b86764a017dc7f642180ad46aee4d98ec64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806355f804b3116100de57806395d89b4111610097578063c87b56dd11610071578063c87b56dd1461045a578063d3fc98641461048a578063e20b9cff146104a6578063e985e9c5146104c457610173565b806395d89b4114610404578063a22cb46514610422578063b88d4fde1461043e57610173565b806355f804b3146103305780636352211e1461034c5780636c0360eb1461037c5780636e9960c31461039a57806370a08231146103b85780638f283970146103e857610173565b806318160ddd1161013057806318160ddd1461025e57806323b872dd1461027c5780632f745c591461029857806342842e0e146102c85780634a994eef146102e45780634f6ccce71461030057610173565b806301ffc9a71461017857806306fdde03146101a857806307779627146101c657806307eaf637146101f6578063081812fc14610212578063095ea7b314610242575b600080fd5b610192600480360381019061018d9190612aea565b6104f4565b60405161019f919061357b565b60405180910390f35b6101b061055b565b6040516101bd9190613596565b60405180910390f35b6101e060048036038101906101db9190612845565b6105fd565b6040516101ed919061357b565b60405180910390f35b610210600480360381019061020b9190612a53565b610653565b005b61022c60048036038101906102279190612b7d565b61080b565b60405161023991906134f2565b60405180910390f35b61025c600480360381019061025791906129b0565b610890565b005b6102666109a8565b6040516102739190613838565b60405180910390f35b610296600480360381019061029191906128aa565b6109b9565b005b6102b260048036038101906102ad91906129b0565b610a19565b6040516102bf9190613838565b60405180910390f35b6102e260048036038101906102dd91906128aa565b610a74565b005b6102fe60048036038101906102f99190612974565b610a94565b005b61031a60048036038101906103159190612b7d565b610be9565b6040516103279190613838565b60405180910390f35b61034a60048036038101906103459190612b3c565b610c0c565b005b61036660048036038101906103619190612b7d565b610ca8565b60405161037391906134f2565b60405180910390f35b610384610cdf565b6040516103919190613596565b60405180910390f35b6103a2610d81565b6040516103af91906134f2565b60405180910390f35b6103d260048036038101906103cd9190612845565b610dab565b6040516103df9190613838565b60405180910390f35b61040260048036038101906103fd9190612845565b610e6a565b005b61040c610f3e565b6040516104199190613596565b60405180910390f35b61043c60048036038101906104379190612974565b610fe0565b005b610458600480360381019061045391906128f9565b611161565b005b610474600480360381019061046f9190612b7d565b6111c3565b6040516104819190613596565b60405180910390f35b6104a4600480360381019061049f91906129ec565b61134e565b005b6104ae61144b565b6040516104bb9190613559565b60405180910390f35b6104de60048036038101906104d9919061286e565b6114d9565b6040516104eb919061357b565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105f35780601f106105c8576101008083540402835291602001916105f3565b820191906000526020600020905b8154815290600101906020018083116105d657829003601f168201915b5050505050905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806106f85750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072e90613818565b60405180910390fd5b60008351905082518114801561074d5750815181145b61078c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078390613678565b60405180910390fd5b60005b81811015610804576107c78582815181106107a657fe5b60200260200101518583815181106107ba57fe5b602002602001015161156d565b6107f78482815181106107d657fe5b60200260200101518483815181106107ea57fe5b60200260200101516116fb565b808060010191505061078f565b5050505050565b60006108168261176f565b610855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084c90613718565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061089b82610ca8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090390613798565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661092b61178c565b73ffffffffffffffffffffffffffffffffffffffff16148061095a57506109598161095461178c565b6114d9565b5b610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099090613698565b60405180910390fd5b6109a38383611794565b505050565b60006109b4600261184d565b905090565b6109ca6109c461178c565b82611862565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a00906137d8565b60405180910390fd5b610a14838383611940565b505050565b6000610a6c82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611b5790919063ffffffff16565b905092915050565b610a8f83838360405180602001604052806000815250611161565b505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1b906137b8565b60405180910390fd5b80600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015610be557600b829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b600080610c00836002611b7190919063ffffffff16565b50905080915050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c93906137b8565b60405180910390fd5b610ca581611b9d565b50565b6000610cd882604051806060016040528060298152602001613b54602991396002611bb79092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d775780601f10610d4c57610100808354040283529160200191610d77565b820191906000526020600020905b815481529060010190602001808311610d5a57829003601f168201915b5050505050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e13906136b8565b60405180910390fd5b610e63600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611bd6565b9050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef1906137b8565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060078054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fd65780601f10610fab57610100808354040283529160200191610fd6565b820191906000526020600020905b815481529060010190602001808311610fb957829003601f168201915b5050505050905090565b610fe861178c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611056576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104d90613638565b60405180910390fd5b806005600061106361178c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661111061178c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611155919061357b565b60405180910390a35050565b61117261116c61178c565b83611862565b6111b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a8906137d8565b60405180910390fd5b6111bd84848484611beb565b50505050565b60606111ce8261176f565b61120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120490613778565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112b65780601f1061128b576101008083540402835291602001916112b6565b820191906000526020600020905b81548152906001019060200180831161129957829003601f168201915b505050505090506000600980546001816001161561010002031660029004905014156112e55780915050611349565b60008151111561131a576009816040516020016113039291906134ce565b604051602081830303815290604052915050611349565b600961132584611c47565b6040516020016113369291906134ce565b6040516020818303038152906040529150505b919050565b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806113f35750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142990613818565b60405180910390fd5b61143c838361156d565b61144682826116fb565b505050565b6060600b8054806020026020016040519081016040528092919081815260200182805480156114cf57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611485575b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d4906136f8565b60405180910390fd5b6115e68161176f565b15611626576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161d906135f8565b60405180910390fd5b61163260008383611d8e565b61168381600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d9390919063ffffffff16565b5061169a81836002611dad9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6117048261176f565b611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90613738565b60405180910390fd5b8060086000848152602001908152602001600020908051906020019061176a92919061251d565b505050565b6000611785826002611de290919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661180783610ca8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061185b82600001611dfc565b9050919050565b600061186d8261176f565b6118ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a390613658565b60405180910390fd5b60006118b783610ca8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061192657508373ffffffffffffffffffffffffffffffffffffffff1661190e8461080b565b73ffffffffffffffffffffffffffffffffffffffff16145b80611937575061193681856114d9565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661196082610ca8565b73ffffffffffffffffffffffffffffffffffffffff16146119b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ad90613758565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1d90613618565b60405180910390fd5b611a31838383611d8e565b611a3c600082611794565b611a8d81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611e0d90919063ffffffff16565b50611adf81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611d9390919063ffffffff16565b50611af681836002611dad9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611b668360000183611e27565b60001c905092915050565b600080600080611b848660000186611e94565b915091508160001c8160001c9350935050509250929050565b8060099080519060200190611bb392919061251d565b5050565b6000611bca846000018460001b84611f17565b60001c90509392505050565b6000611be482600001611fa8565b9050919050565b611bf6848484611940565b611c0284848484611fb9565b611c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c38906135d8565b60405180910390fd5b50505050565b60606000821415611c8f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611d89565b600082905060005b60008214611cb9578080600101915050600a8281611cb157fe5b049150611c97565b60608167ffffffffffffffff81118015611cd257600080fd5b506040519080825280601f01601f191660200182016040528015611d055781602001600182028036833780820191505090505b50905060006001830390508593505b60008414611d8157600a8481611d2657fe5b0660300160f81b82828060019003935081518110611d4057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481611d7957fe5b049350611d14565b819450505050505b919050565b505050565b6000611da5836000018360001b61211d565b905092915050565b6000611dd9846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61218d565b90509392505050565b6000611df4836000018360001b612269565b905092915050565b600081600001805490509050919050565b6000611e1f836000018360001b61228c565b905092915050565b600081836000018054905011611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e69906135b8565b60405180910390fd5b826000018281548110611e8157fe5b9060005260206000200154905092915050565b60008082846000018054905011611ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed7906136d8565b60405180910390fd5b6000846000018481548110611ef157fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390611f79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f709190613596565b60405180910390fd5b50846000016001820381548110611f8c57fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000611fda8473ffffffffffffffffffffffffffffffffffffffff16612374565b611fe75760019050612115565b60606120ae63150b7a0260e01b611ffc61178c565b888787604051602401612012949392919061350d565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001613b22603291398773ffffffffffffffffffffffffffffffffffffffff166123bf9092919063ffffffff16565b90506000818060200190518101906120c69190612b13565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600061212983836123d7565b612182578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050612187565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561223457846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050612262565b8285600001600183038154811061224757fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b6000808360010160008481526020019081526020016000205490506000811461236857600060018203905060006001866000018054905003905060008660000182815481106122d757fe5b90600052602060002001549050808760000184815481106122f457fe5b906000526020600020018190555060018301876001016000838152602001908152602001600020819055508660000180548061232c57fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061236e565b60009150505b92915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156123b657506000801b8214155b92505050919050565b60606123ce84846000856123fa565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b606061240585612374565b612444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b906137f8565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff16858760405161246e91906134b7565b60006040518083038185875af1925050503d80600081146124ab576040519150601f19603f3d011682016040523d82523d6000602084013e6124b0565b606091505b509150915081156124c5578092505050612515565b6000815111156124d85780518082602001fd5b836040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250c9190613596565b60405180910390fd5b949350505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061255e57805160ff191683800117855561258c565b8280016001018555821561258c579182015b8281111561258b578251825591602001919060010190612570565b5b509050612599919061259d565b5090565b5b808211156125b657600081600090555060010161259e565b5090565b6000813590506125c981613ac5565b92915050565b600082601f8301126125e057600080fd5b81356125f36125ee82613880565b613853565b9150818183526020840193506020810190508385602084028201111561261857600080fd5b60005b83811015612648578161262e88826125ba565b84526020840193506020830192505060018101905061261b565b5050505092915050565b600082601f83011261266357600080fd5b8135612676612671826138a8565b613853565b9150818183526020840193506020810190508360005b838110156126bc57813586016126a288826127dc565b84526020840193506020830192505060018101905061268c565b5050505092915050565b600082601f8301126126d757600080fd5b81356126ea6126e5826138d0565b613853565b9150818183526020840193506020810190508385602084028201111561270f57600080fd5b60005b8381101561273f57816127258882612830565b845260208401935060208301925050600181019050612712565b5050505092915050565b60008135905061275881613adc565b92915050565b60008135905061276d81613af3565b92915050565b60008151905061278281613af3565b92915050565b600082601f83011261279957600080fd5b81356127ac6127a7826138f8565b613853565b915080825260208301602083018583830111156127c857600080fd5b6127d3838284613a72565b50505092915050565b600082601f8301126127ed57600080fd5b81356128006127fb82613924565b613853565b9150808252602083016020830185838301111561281c57600080fd5b612827838284613a72565b50505092915050565b60008135905061283f81613b0a565b92915050565b60006020828403121561285757600080fd5b6000612865848285016125ba565b91505092915050565b6000806040838503121561288157600080fd5b600061288f858286016125ba565b92505060206128a0858286016125ba565b9150509250929050565b6000806000606084860312156128bf57600080fd5b60006128cd868287016125ba565b93505060206128de868287016125ba565b92505060406128ef86828701612830565b9150509250925092565b6000806000806080858703121561290f57600080fd5b600061291d878288016125ba565b945050602061292e878288016125ba565b935050604061293f87828801612830565b925050606085013567ffffffffffffffff81111561295c57600080fd5b61296887828801612788565b91505092959194509250565b6000806040838503121561298757600080fd5b6000612995858286016125ba565b92505060206129a685828601612749565b9150509250929050565b600080604083850312156129c357600080fd5b60006129d1858286016125ba565b92505060206129e285828601612830565b9150509250929050565b600080600060608486031215612a0157600080fd5b6000612a0f868287016125ba565b9350506020612a2086828701612830565b925050604084013567ffffffffffffffff811115612a3d57600080fd5b612a49868287016127dc565b9150509250925092565b600080600060608486031215612a6857600080fd5b600084013567ffffffffffffffff811115612a8257600080fd5b612a8e868287016125cf565b935050602084013567ffffffffffffffff811115612aab57600080fd5b612ab7868287016126c6565b925050604084013567ffffffffffffffff811115612ad457600080fd5b612ae086828701612652565b9150509250925092565b600060208284031215612afc57600080fd5b6000612b0a8482850161275e565b91505092915050565b600060208284031215612b2557600080fd5b6000612b3384828501612773565b91505092915050565b600060208284031215612b4e57600080fd5b600082013567ffffffffffffffff811115612b6857600080fd5b612b74848285016127dc565b91505092915050565b600060208284031215612b8f57600080fd5b6000612b9d84828501612830565b91505092915050565b6000612bb28383612bcd565b60208301905092915050565b612bc7816139fe565b82525050565b612bd6816139ec565b82525050565b612be5816139ec565b82525050565b6000612bf682613975565b612c0081856139a3565b9350612c0b83613950565b8060005b83811015612c3c578151612c238882612ba6565b9750612c2e83613996565b925050600181019050612c0f565b5085935050505092915050565b612c5281613a10565b82525050565b6000612c6382613980565b612c6d81856139b4565b9350612c7d818560208601613a81565b612c8681613ab4565b840191505092915050565b6000612c9c82613980565b612ca681856139c5565b9350612cb6818560208601613a81565b80840191505092915050565b6000612ccd8261398b565b612cd781856139d0565b9350612ce7818560208601613a81565b612cf081613ab4565b840191505092915050565b6000612d068261398b565b612d1081856139e1565b9350612d20818560208601613a81565b80840191505092915050565b600081546001811660008114612d495760018114612d6e57612db2565b607f6002830416612d5a81876139e1565b955060ff1983168652808601935050612db2565b60028204612d7c81876139e1565b9550612d8785613960565b60005b82811015612da957815481890152600182019150602081019050612d8a565b82880195505050505b505092915050565b6000612dc76022836139d0565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612e2d6032836139d0565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612e93601c836139d0565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612ed36024836139d0565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f396019836139d0565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612f79602c836139d0565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000612fdf6011836139d0565b91507f496e76616c696420617267756d656e74730000000000000000000000000000006000830152602082019050919050565b600061301f6038836139d0565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613085602a836139d0565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006130eb6022836139d0565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131516020836139d0565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613191602c836139d0565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006131f7602c836139d0565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061325d6029836139d0565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006132c3602f836139d0565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006133296021836139d0565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061338f600a836139d0565b91507f4f6e6c792041646d696e000000000000000000000000000000000000000000006000830152602082019050919050565b60006133cf6031836139d0565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613435601d836139d0565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000613475600e836139d0565b91507f4f6e6c792044656c6567617465730000000000000000000000000000000000006000830152602082019050919050565b6134b181613a68565b82525050565b60006134c38284612c91565b915081905092915050565b60006134da8285612d2c565b91506134e68284612cfb565b91508190509392505050565b60006020820190506135076000830184612bdc565b92915050565b60006080820190506135226000830187612bbe565b61352f6020830186612bdc565b61353c60408301856134a8565b818103606083015261354e8184612c58565b905095945050505050565b600060208201905081810360008301526135738184612beb565b905092915050565b60006020820190506135906000830184612c49565b92915050565b600060208201905081810360008301526135b08184612cc2565b905092915050565b600060208201905081810360008301526135d181612dba565b9050919050565b600060208201905081810360008301526135f181612e20565b9050919050565b6000602082019050818103600083015261361181612e86565b9050919050565b6000602082019050818103600083015261363181612ec6565b9050919050565b6000602082019050818103600083015261365181612f2c565b9050919050565b6000602082019050818103600083015261367181612f6c565b9050919050565b6000602082019050818103600083015261369181612fd2565b9050919050565b600060208201905081810360008301526136b181613012565b9050919050565b600060208201905081810360008301526136d181613078565b9050919050565b600060208201905081810360008301526136f1816130de565b9050919050565b6000602082019050818103600083015261371181613144565b9050919050565b6000602082019050818103600083015261373181613184565b9050919050565b60006020820190508181036000830152613751816131ea565b9050919050565b6000602082019050818103600083015261377181613250565b9050919050565b60006020820190508181036000830152613791816132b6565b9050919050565b600060208201905081810360008301526137b18161331c565b9050919050565b600060208201905081810360008301526137d181613382565b9050919050565b600060208201905081810360008301526137f1816133c2565b9050919050565b6000602082019050818103600083015261381181613428565b9050919050565b6000602082019050818103600083015261383181613468565b9050919050565b600060208201905061384d60008301846134a8565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561387657600080fd5b8060405250919050565b600067ffffffffffffffff82111561389757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156138bf57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156138e757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561390f57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561393b57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139f782613a48565b9050919050565b6000613a0982613a48565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613a9f578082015181840152602081019050613a84565b83811115613aae576000848401525b50505050565b6000601f19601f8301169050919050565b613ace816139ec565b8114613ad957600080fd5b50565b613ae581613a10565b8114613af057600080fd5b50565b613afc81613a1c565b8114613b0757600080fd5b50565b613b1381613a68565b8114613b1e57600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea26469706673582212205ab1d5438b8c4f81408d6fb906d6419b86764a017dc7f642180ad46aee4d98ec64736f6c634300060c0033
Deployed Bytecode Sourcemap
55916:2115:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38394:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43308:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57850:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56580:392;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45995:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45539:390;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45033:203;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46869:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44803:154;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47245:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57218:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45313:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57630:82;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43072:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44630:89;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57956:72;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42795:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57543:82;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43469:96;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46280:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47467:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43636:755;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56416:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57744:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46646:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38394:142;38471:4;38495:20;:33;38516:11;38495:33;;;;;;;;;;;;;;;;;;;;;;;;;;;38488:40;;38394:142;;;:::o;43308:92::-;43354:13;43387:5;43380:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43308:92;:::o;57850:101::-;57909:4;57927:9;:19;57937:8;57927:19;;;;;;;;;;;;;;;;;;;;;;;;;57920:26;;57850:101;;;:::o;56580:392::-;56175:9;:21;56185:10;56175:21;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;56214:5;;;;;;;;;;;56200:19;;:10;:19;;;56175:44;56167:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56706:18:::1;56727:4;:11;56706:32;;56765:9;:16;56751:10;:30;:65;;;;;56799:10;:17;56785:10;:31;56751:65;56743:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;56848:6;56843:125;56864:10;56860:1;:14;56843:125;;;56887:28;56893:4;56898:1;56893:7;;;;;;;;;;;;;;56902:9;56912:1;56902:12;;;;;;;;;;;;;;56887:5;:28::i;:::-;56921:41;56934:9;56944:1;56934:12;;;;;;;;;;;;;;56948:10;56959:1;56948:13;;;;;;;;;;;;;;56921:12;:41::i;:::-;56876:3;;;;;;;56843:125;;;;56243:1;56580:392:::0;;;:::o;45995:213::-;46063:7;46091:16;46099:7;46091;:16::i;:::-;46083:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46176:15;:24;46192:7;46176:24;;;;;;;;;;;;;;;;;;;;;46169:31;;45995:213;;;:::o;45539:390::-;45620:13;45636:16;45644:7;45636;:16::i;:::-;45620:32;;45677:5;45671:11;;:2;:11;;;;45663:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45757:5;45741:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;45766:37;45783:5;45790:12;:10;:12::i;:::-;45766:16;:37::i;:::-;45741:62;45733:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;45900:21;45909:2;45913:7;45900:8;:21::i;:::-;45539:390;;;:::o;45033:203::-;45086:7;45207:21;:12;:19;:21::i;:::-;45200:28;;45033:203;:::o;46869:305::-;47030:41;47049:12;:10;:12::i;:::-;47063:7;47030:18;:41::i;:::-;47022:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47138:28;47148:4;47154:2;47158:7;47138:9;:28::i;:::-;46869:305;;;:::o;44803:154::-;44892:7;44919:30;44943:5;44919:13;:20;44933:5;44919:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;44912:37;;44803:154;;;;:::o;47245:151::-;47349:39;47366:4;47372:2;47376:7;47349:39;;;;;;;;;;;;:16;:39::i;:::-;47245:151;;;:::o;57218:177::-;56103:5;;;;;;;;;;;56089:19;;:10;:19;;;56081:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;57318:10:::1;57296:9;:19;57306:8;57296:19;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;57337:10;57333:58;;;57355:15;57376:8;57355:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57333:58;57218:177:::0;;:::o;45313:164::-;45380:7;45401:15;45422:22;45438:5;45422:12;:15;;:22;;;;:::i;:::-;45400:44;;;45462:7;45455:14;;;45313:164;;;:::o;57630:82::-;56103:5;;;;;;;;;;;56089:19;;:10;:19;;;56081:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;57691:16:::1;57703:3;57691:11;:16::i;:::-;57630:82:::0;:::o;43072:169::-;43136:7;43163:70;43180:7;43163:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;43156:77;;43072:169;;;:::o;44630:89::-;44670:13;44703:8;44696:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44630:89;:::o;57956:72::-;57997:7;58018:5;;;;;;;;;;;58011:12;;57956:72;:::o;42795:215::-;42859:7;42904:1;42887:19;;:5;:19;;;;42879:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42973:29;:13;:20;42987:5;42973:20;;;;;;;;;;;;;;;:27;:29::i;:::-;42966:36;;42795:215;;;:::o;57543:82::-;56103:5;;;;;;;;;;;56089:19;;:10;:19;;;56081:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;57612:8:::1;57604:5;;:16;;;;;;;;;;;;;;;;;;57543:82:::0;:::o;43469:96::-;43517:13;43550:7;43543:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43469:96;:::o;46280:295::-;46395:12;:10;:12::i;:::-;46383:24;;:8;:24;;;;46375:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46495:8;46450:18;:32;46469:12;:10;:12::i;:::-;46450:32;;;;;;;;;;;;;;;:42;46483:8;46450:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46548:8;46519:48;;46534:12;:10;:12::i;:::-;46519:48;;;46558:8;46519:48;;;;;;:::i;:::-;;;;;;;;46280:295;;:::o;47467:285::-;47599:41;47618:12;:10;:12::i;:::-;47632:7;47599:18;:41::i;:::-;47591:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47705:39;47719:4;47725:2;47729:7;47738:5;47705:13;:39::i;:::-;47467:285;;;;:::o;43636:755::-;43701:13;43735:16;43743:7;43735;:16::i;:::-;43727:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;43816:23;43842:10;:19;43853:7;43842:19;;;;;;;;;;;43816:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43963:1;43943:8;43937:22;;;;;;;;;;;;;;;;:27;43933:76;;;43988:9;43981:16;;;;;43933:76;44139:1;44119:9;44113:23;:27;44109:112;;;44188:8;44198:9;44171:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44157:52;;;;;44109:112;44353:8;44363:18;:7;:16;:18::i;:::-;44336:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44322:61;;;43636:755;;;;:::o;56416:159::-;56175:9;:21;56185:10;56175:21;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;56214:5;;;;;;;;;;;56200:19;;:10;:19;;;56175:44;56167:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56512:20:::1;56518:3;56523:8;56512:5;:20::i;:::-;56537:33;56550:8;56560:9;56537:12;:33::i;:::-;56416:159:::0;;;:::o;57744:101::-;57795:16;57825:15;57818:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57744:101;:::o;46646:156::-;46735:4;46759:18;:25;46778:5;46759:25;;;;;;;;;;;;;;;:35;46785:8;46759:35;;;;;;;;;;;;;;;;;;;;;;;;;46752:42;;46646:156;;;;:::o;51103:404::-;51197:1;51183:16;;:2;:16;;;;51175:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51256:16;51264:7;51256;:16::i;:::-;51255:17;51247:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51318:45;51347:1;51351:2;51355:7;51318:20;:45::i;:::-;51376:30;51398:7;51376:13;:17;51390:2;51376:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;51419:29;51436:7;51445:2;51419:12;:16;;:29;;;;;:::i;:::-;;51491:7;51487:2;51466:33;;51483:1;51466:33;;;;;;;;;;;;51103:404;;:::o;53323:215::-;53423:16;53431:7;53423;:16::i;:::-;53415:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53521:9;53499:10;:19;53510:7;53499:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;53323:215;;:::o;49218:119::-;49275:4;49299:30;49321:7;49299:12;:21;;:30;;;;:::i;:::-;49292:37;;49218:119;;;:::o;37147:106::-;37200:15;37235:10;37228:17;;37147:106;:::o;55045:158::-;55138:2;55111:15;:24;55127:7;55111:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55187:7;55183:2;55156:39;;55165:16;55173:7;55165;:16::i;:::-;55156:39;;;;;;;;;;;;55045:158;;:::o;26686:123::-;26755:7;26782:19;26790:3;:10;;26782:7;:19::i;:::-;26775:26;;26686:123;;;:::o;49504:333::-;49589:4;49614:16;49622:7;49614;:16::i;:::-;49606:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49690:13;49706:16;49714:7;49706;:16::i;:::-;49690:32;;49752:5;49741:16;;:7;:16;;;:51;;;;49785:7;49761:31;;:20;49773:7;49761:11;:20::i;:::-;:31;;;49741:51;:87;;;;49796:32;49813:5;49820:7;49796:16;:32::i;:::-;49741:87;49733:96;;;49504:333;;;;:::o;52593:574::-;52711:4;52691:24;;:16;52699:7;52691;:16::i;:::-;:24;;;52683:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;52794:1;52780:16;;:2;:16;;;;52772:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52850:39;52871:4;52877:2;52881:7;52850:20;:39::i;:::-;52954:29;52971:1;52975:7;52954:8;:29::i;:::-;52996:35;53023:7;52996:13;:19;53010:4;52996:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;53042:30;53064:7;53042:13;:17;53056:2;53042:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;53085:29;53102:7;53111:2;53085:12;:16;;:29;;;;;:::i;:::-;;53151:7;53147:2;53132:27;;53141:4;53132:27;;;;;;;;;;;;52593:574;;;:::o;19380:137::-;19451:7;19486:22;19490:3;:10;;19502:5;19486:3;:22::i;:::-;19478:31;;19471:38;;19380:137;;;;:::o;27148:227::-;27228:7;27237;27258:11;27271:13;27288:22;27292:3;:10;;27304:5;27288:3;:22::i;:::-;27257:53;;;;27337:3;27329:12;;27359:5;27351:14;;27321:46;;;;;;27148:227;;;;;:::o;53768:100::-;53852:8;53841;:19;;;;;;;;;;;;:::i;:::-;;53768:100;:::o;27810:204::-;27917:7;27960:44;27965:3;:10;;27985:3;27977:12;;27991;27960:4;:44::i;:::-;27952:53;;27937:69;;27810:204;;;;;:::o;18922:114::-;18982:7;19009:19;19017:3;:10;;19009:7;:19::i;:::-;19002:26;;18922:114;;;:::o;48633:272::-;48747:28;48757:4;48763:2;48767:7;48747:9;:28::i;:::-;48794:48;48817:4;48823:2;48827:7;48836:5;48794:22;:48::i;:::-;48786:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;48633:272;;;;:::o;28172:744::-;28228:13;28458:1;28449:5;:10;28445:53;;;28476:10;;;;;;;;;;;;;;;;;;;;;28445:53;28508:12;28523:5;28508:20;;28539:14;28564:78;28579:1;28571:4;:9;28564:78;;28597:8;;;;;;;28628:2;28620:10;;;;;;;;;28564:78;;;28652:19;28684:6;28674:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28652:39;;28702:13;28727:1;28718:6;:10;28702:26;;28746:5;28739:12;;28762:115;28777:1;28769:4;:9;28762:115;;28836:2;28829:4;:9;;;;;;28824:2;:14;28813:27;;28795:6;28802:7;;;;;;;28795:15;;;;;;;;;;;:45;;;;;;;;;;;28863:2;28855:10;;;;;;;;;28762:115;;;28901:6;28887:21;;;;;;28172:744;;;;:::o;55816:93::-;;;;:::o;18160:131::-;18227:4;18251:32;18256:3;:10;;18276:5;18268:14;;18251:4;:32::i;:::-;18244:39;;18160:131;;;;:::o;25879:176::-;25968:4;25992:55;25997:3;:10;;26017:3;26009:12;;26039:5;26031:14;;26023:23;;25992:4;:55::i;:::-;25985:62;;25879:176;;;;;:::o;26447:151::-;26531:4;26555:35;26565:3;:10;;26585:3;26577:12;;26555:9;:35::i;:::-;26548:42;;26447:151;;;;:::o;24069:110::-;24125:7;24152:3;:12;;:19;;;;24145:26;;24069:110;;;:::o;18467:137::-;18537:4;18561:35;18569:3;:10;;18589:5;18581:14;;18561:7;:35::i;:::-;18554:42;;18467:137;;;;:::o;16044:204::-;16111:7;16160:5;16139:3;:11;;:18;;;;:26;16131:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16222:3;:11;;16234:5;16222:18;;;;;;;;;;;;;;;;16215:25;;16044:204;;;;:::o;24534:279::-;24601:7;24610;24660:5;24638:3;:12;;:19;;;;:27;24630:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24717:22;24742:3;:12;;24755:5;24742:19;;;;;;;;;;;;;;;;;;24717:44;;24780:5;:10;;;24792:5;:12;;;24772:33;;;;;24534:279;;;;;:::o;25236:319::-;25330:7;25350:16;25369:3;:12;;:17;25382:3;25369:17;;;;;;;;;;;;25350:36;;25417:1;25405:8;:13;;25420:12;25397:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;25487:3;:12;;25511:1;25500:8;:12;25487:26;;;;;;;;;;;;;;;;;;:33;;;25480:40;;;25236:319;;;;;:::o;15591:109::-;15647:7;15674:3;:11;;:18;;;;15667:25;;15591:109;;;:::o;54433:604::-;54554:4;54581:15;:2;:13;;;:15::i;:::-;54576:60;;54620:4;54613:11;;;;54576:60;54646:23;54672:252;54725:45;;;54785:12;:10;:12::i;:::-;54812:4;54831:7;54853:5;54688:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54672:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;54646:278;;54935:13;54962:10;54951:32;;;;;;;;;;;;:::i;:::-;54935:48;;39798:10;55012:16;;55002:26;;;:6;:26;;;;54994:35;;;;54433:604;;;;;;;:::o;13156:414::-;13219:4;13241:21;13251:3;13256:5;13241:9;:21::i;:::-;13236:327;;13279:3;:11;;13296:5;13279:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13462:3;:11;;:18;;;;13440:3;:12;;:19;13453:5;13440:19;;;;;;;;;;;:40;;;;13502:4;13495:11;;;;13236:327;13546:5;13539:12;;13156:414;;;;;:::o;21349:692::-;21425:4;21541:16;21560:3;:12;;:17;21573:3;21560:17;;;;;;;;;;;;21541:36;;21606:1;21594:8;:13;21590:444;;;21661:3;:12;;21679:38;;;;;;;;21696:3;21679:38;;;;21709:5;21679:38;;;21661:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21876:3;:12;;:19;;;;21856:3;:12;;:17;21869:3;21856:17;;;;;;;;;;;:39;;;;21917:4;21910:11;;;;;21590:444;21990:5;21954:3;:12;;21978:1;21967:8;:12;21954:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;22017:5;22010:12;;;21349:692;;;;;;:::o;23849:125::-;23920:4;23965:1;23944:3;:12;;:17;23957:3;23944:17;;;;;;;;;;;;:22;;23937:29;;23849:125;;;;:::o;13746:1544::-;13812:4;13930:18;13951:3;:12;;:19;13964:5;13951:19;;;;;;;;;;;;13930:40;;14001:1;13987:10;:15;13983:1300;;14349:21;14386:1;14373:10;:14;14349:38;;14402:17;14443:1;14422:3;:11;;:18;;;;:22;14402:42;;14689:17;14709:3;:11;;14721:9;14709:22;;;;;;;;;;;;;;;;14689:42;;14855:9;14826:3;:11;;14838:13;14826:26;;;;;;;;;;;;;;;:38;;;;14974:1;14958:13;:17;14932:3;:12;;:23;14945:9;14932:23;;;;;;;;;;;:43;;;;15084:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;15179:3;:12;;:19;15192:5;15179:19;;;;;;;;;;;15172:26;;;15222:4;15215:11;;;;;;;;13983:1300;15266:5;15259:12;;;13746:1544;;;;;:::o;6076:619::-;6136:4;6398:16;6425:19;6447:66;6425:88;;;;6616:7;6604:20;6592:32;;6656:11;6644:8;:23;;:42;;;;;6683:3;6671:15;;:8;:15;;6644:42;6636:51;;;;6076:619;;;:::o;9191:196::-;9294:12;9326:53;9349:6;9357:4;9363:1;9366:12;9326:22;:53::i;:::-;9319:60;;9191:196;;;;;:::o;15376:129::-;15449:4;15496:1;15473:3;:12;;:19;15486:5;15473:19;;;;;;;;;;;;:24;;15466:31;;15376:129;;;;:::o;10568:979::-;10698:12;10731:18;10742:6;10731:10;:18::i;:::-;10723:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;10857:12;10871:23;10898:6;:11;;10918:8;10929:4;10898:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10856:78;;;;10949:7;10945:595;;;10980:10;10973:17;;;;;;10945:595;11114:1;11094:10;:17;:21;11090:439;;;11357:10;11351:17;11418:15;11405:10;11401:2;11397:19;11390:44;11305:148;11500:12;11493:20;;;;;;;;;;;:::i;:::-;;;;;;;;10568:979;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;160:707::-;;277:3;270:4;262:6;258:17;254:27;244:2;;295:1;292;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;:::-;354:80;:::i;:::-;345:89;;451:5;476:6;469:5;462:21;506:4;498:6;494:17;484:27;;528:4;523:3;519:14;512:21;;581:6;628:3;620:4;612:6;608:17;603:3;599:27;596:36;593:2;;;645:1;642;635:12;593:2;670:1;655:206;680:6;677:1;674:13;655:206;;;738:3;760:37;793:3;781:10;760:37;:::i;:::-;755:3;748:50;821:4;816:3;812:14;805:21;;849:4;844:3;840:14;833:21;;712:149;702:1;699;695:9;690:14;;655:206;;;659:14;237:630;;;;;;;:::o;892:708::-;;1019:3;1012:4;1004:6;1000:17;996:27;986:2;;1037:1;1034;1027:12;986:2;1074:6;1061:20;1096:90;1111:74;1178:6;1111:74;:::i;:::-;1096:90;:::i;:::-;1087:99;;1203:5;1228:6;1221:5;1214:21;1258:4;1250:6;1246:17;1236:27;;1280:4;1275:3;1271:14;1264:21;;1333:6;1366:1;1351:243;1376:6;1373:1;1370:13;1351:243;;;1459:3;1446:17;1438:6;1434:30;1483:47;1526:3;1514:10;1483:47;:::i;:::-;1478:3;1471:60;1554:4;1549:3;1545:14;1538:21;;1582:4;1577:3;1573:14;1566:21;;1408:186;1398:1;1395;1391:9;1386:14;;1351:243;;;1355:14;979:621;;;;;;;:::o;1626:707::-;;1743:3;1736:4;1728:6;1724:17;1720:27;1710:2;;1761:1;1758;1751:12;1710:2;1798:6;1785:20;1820:80;1835:64;1892:6;1835:64;:::i;:::-;1820:80;:::i;:::-;1811:89;;1917:5;1942:6;1935:5;1928:21;1972:4;1964:6;1960:17;1950:27;;1994:4;1989:3;1985:14;1978:21;;2047:6;2094:3;2086:4;2078:6;2074:17;2069:3;2065:27;2062:36;2059:2;;;2111:1;2108;2101:12;2059:2;2136:1;2121:206;2146:6;2143:1;2140:13;2121:206;;;2204:3;2226:37;2259:3;2247:10;2226:37;:::i;:::-;2221:3;2214:50;2287:4;2282:3;2278:14;2271:21;;2315:4;2310:3;2306:14;2299:21;;2178:149;2168:1;2165;2161:9;2156:14;;2121:206;;;2125:14;1703:630;;;;;;;:::o;2341:124::-;;2418:6;2405:20;2396:29;;2430:30;2454:5;2430:30;:::i;:::-;2390:75;;;;:::o;2472:128::-;;2551:6;2538:20;2529:29;;2563:32;2589:5;2563:32;:::i;:::-;2523:77;;;;:::o;2607:132::-;;2690:6;2684:13;2675:22;;2702:32;2728:5;2702:32;:::i;:::-;2669:70;;;;:::o;2747:440::-;;2848:3;2841:4;2833:6;2829:17;2825:27;2815:2;;2866:1;2863;2856:12;2815:2;2903:6;2890:20;2925:64;2940:48;2981:6;2940:48;:::i;:::-;2925:64;:::i;:::-;2916:73;;3009:6;3002:5;2995:21;3045:4;3037:6;3033:17;3078:4;3071:5;3067:16;3113:3;3104:6;3099:3;3095:16;3092:25;3089:2;;;3130:1;3127;3120:12;3089:2;3140:41;3174:6;3169:3;3164;3140:41;:::i;:::-;2808:379;;;;;;;:::o;3196:442::-;;3298:3;3291:4;3283:6;3279:17;3275:27;3265:2;;3316:1;3313;3306:12;3265:2;3353:6;3340:20;3375:65;3390:49;3432:6;3390:49;:::i;:::-;3375:65;:::i;:::-;3366:74;;3460:6;3453:5;3446:21;3496:4;3488:6;3484:17;3529:4;3522:5;3518:16;3564:3;3555:6;3550:3;3546:16;3543:25;3540:2;;;3581:1;3578;3571:12;3540:2;3591:41;3625:6;3620:3;3615;3591:41;:::i;:::-;3258:380;;;;;;;:::o;3646:130::-;;3726:6;3713:20;3704:29;;3738:33;3765:5;3738:33;:::i;:::-;3698:78;;;;:::o;3783:241::-;;3887:2;3875:9;3866:7;3862:23;3858:32;3855:2;;;3903:1;3900;3893:12;3855:2;3938:1;3955:53;4000:7;3991:6;3980:9;3976:22;3955:53;:::i;:::-;3945:63;;3917:97;3849:175;;;;:::o;4031:366::-;;;4152:2;4140:9;4131:7;4127:23;4123:32;4120:2;;;4168:1;4165;4158:12;4120:2;4203:1;4220:53;4265:7;4256:6;4245:9;4241:22;4220:53;:::i;:::-;4210:63;;4182:97;4310:2;4328:53;4373:7;4364:6;4353:9;4349:22;4328:53;:::i;:::-;4318:63;;4289:98;4114:283;;;;;:::o;4404:491::-;;;;4542:2;4530:9;4521:7;4517:23;4513:32;4510:2;;;4558:1;4555;4548:12;4510:2;4593:1;4610:53;4655:7;4646:6;4635:9;4631:22;4610:53;:::i;:::-;4600:63;;4572:97;4700:2;4718:53;4763:7;4754:6;4743:9;4739:22;4718:53;:::i;:::-;4708:63;;4679:98;4808:2;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4787:98;4504:391;;;;;:::o;4902:721::-;;;;;5066:3;5054:9;5045:7;5041:23;5037:33;5034:2;;;5083:1;5080;5073:12;5034:2;5118:1;5135:53;5180:7;5171:6;5160:9;5156:22;5135:53;:::i;:::-;5125:63;;5097:97;5225:2;5243:53;5288:7;5279:6;5268:9;5264:22;5243:53;:::i;:::-;5233:63;;5204:98;5333:2;5351:53;5396:7;5387:6;5376:9;5372:22;5351:53;:::i;:::-;5341:63;;5312:98;5469:2;5458:9;5454:18;5441:32;5493:18;5485:6;5482:30;5479:2;;;5525:1;5522;5515:12;5479:2;5545:62;5599:7;5590:6;5579:9;5575:22;5545:62;:::i;:::-;5535:72;;5420:193;5028:595;;;;;;;:::o;5630:360::-;;;5748:2;5736:9;5727:7;5723:23;5719:32;5716:2;;;5764:1;5761;5754:12;5716:2;5799:1;5816:53;5861:7;5852:6;5841:9;5837:22;5816:53;:::i;:::-;5806:63;;5778:97;5906:2;5924:50;5966:7;5957:6;5946:9;5942:22;5924:50;:::i;:::-;5914:60;;5885:95;5710:280;;;;;:::o;5997:366::-;;;6118:2;6106:9;6097:7;6093:23;6089:32;6086:2;;;6134:1;6131;6124:12;6086:2;6169:1;6186:53;6231:7;6222:6;6211:9;6207:22;6186:53;:::i;:::-;6176:63;;6148:97;6276:2;6294:53;6339:7;6330:6;6319:9;6315:22;6294:53;:::i;:::-;6284:63;;6255:98;6080:283;;;;;:::o;6370:597::-;;;;6518:2;6506:9;6497:7;6493:23;6489:32;6486:2;;;6534:1;6531;6524:12;6486:2;6569:1;6586:53;6631:7;6622:6;6611:9;6607:22;6586:53;:::i;:::-;6576:63;;6548:97;6676:2;6694:53;6739:7;6730:6;6719:9;6715:22;6694:53;:::i;:::-;6684:63;;6655:98;6812:2;6801:9;6797:18;6784:32;6836:18;6828:6;6825:30;6822:2;;;6868:1;6865;6858:12;6822:2;6888:63;6943:7;6934:6;6923:9;6919:22;6888:63;:::i;:::-;6878:73;;6763:194;6480:487;;;;;:::o;6974:919::-;;;;7197:2;7185:9;7176:7;7172:23;7168:32;7165:2;;;7213:1;7210;7203:12;7165:2;7276:1;7265:9;7261:17;7248:31;7299:18;7291:6;7288:30;7285:2;;;7331:1;7328;7321:12;7285:2;7351:78;7421:7;7412:6;7401:9;7397:22;7351:78;:::i;:::-;7341:88;;7227:208;7494:2;7483:9;7479:18;7466:32;7518:18;7510:6;7507:30;7504:2;;;7550:1;7547;7540:12;7504:2;7570:78;7640:7;7631:6;7620:9;7616:22;7570:78;:::i;:::-;7560:88;;7445:209;7713:2;7702:9;7698:18;7685:32;7737:18;7729:6;7726:30;7723:2;;;7769:1;7766;7759:12;7723:2;7789:88;7869:7;7860:6;7849:9;7845:22;7789:88;:::i;:::-;7779:98;;7664:219;7159:734;;;;;:::o;7900:239::-;;8003:2;7991:9;7982:7;7978:23;7974:32;7971:2;;;8019:1;8016;8009:12;7971:2;8054:1;8071:52;8115:7;8106:6;8095:9;8091:22;8071:52;:::i;:::-;8061:62;;8033:96;7965:174;;;;:::o;8146:261::-;;8260:2;8248:9;8239:7;8235:23;8231:32;8228:2;;;8276:1;8273;8266:12;8228:2;8311:1;8328:63;8383:7;8374:6;8363:9;8359:22;8328:63;:::i;:::-;8318:73;;8290:107;8222:185;;;;:::o;8414:347::-;;8528:2;8516:9;8507:7;8503:23;8499:32;8496:2;;;8544:1;8541;8534:12;8496:2;8607:1;8596:9;8592:17;8579:31;8630:18;8622:6;8619:30;8616:2;;;8662:1;8659;8652:12;8616:2;8682:63;8737:7;8728:6;8717:9;8713:22;8682:63;:::i;:::-;8672:73;;8558:193;8490:271;;;;:::o;8768:241::-;;8872:2;8860:9;8851:7;8847:23;8843:32;8840:2;;;8888:1;8885;8878:12;8840:2;8923:1;8940:53;8985:7;8976:6;8965:9;8961:22;8940:53;:::i;:::-;8930:63;;8902:97;8834:175;;;;:::o;9017:173::-;;9104:46;9146:3;9138:6;9104:46;:::i;:::-;9179:4;9174:3;9170:14;9156:28;;9097:93;;;;:::o;9198:137::-;9297:32;9323:5;9297:32;:::i;:::-;9292:3;9285:45;9279:56;;:::o;9342:103::-;9415:24;9433:5;9415:24;:::i;:::-;9410:3;9403:37;9397:48;;:::o;9452:113::-;9535:24;9553:5;9535:24;:::i;:::-;9530:3;9523:37;9517:48;;:::o;9603:690::-;;9748:54;9796:5;9748:54;:::i;:::-;9815:86;9894:6;9889:3;9815:86;:::i;:::-;9808:93;;9922:56;9972:5;9922:56;:::i;:::-;9998:7;10026:1;10011:260;10036:6;10033:1;10030:13;10011:260;;;10103:6;10097:13;10124:63;10183:3;10168:13;10124:63;:::i;:::-;10117:70;;10204:60;10257:6;10204:60;:::i;:::-;10194:70;;10068:203;10058:1;10055;10051:9;10046:14;;10011:260;;;10015:14;10284:3;10277:10;;9727:566;;;;;;;:::o;10301:104::-;10378:21;10393:5;10378:21;:::i;:::-;10373:3;10366:34;10360:45;;:::o;10412:343::-;;10522:38;10554:5;10522:38;:::i;:::-;10572:70;10635:6;10630:3;10572:70;:::i;:::-;10565:77;;10647:52;10692:6;10687:3;10680:4;10673:5;10669:16;10647:52;:::i;:::-;10720:29;10742:6;10720:29;:::i;:::-;10715:3;10711:39;10704:46;;10502:253;;;;;:::o;10762:356::-;;10890:38;10922:5;10890:38;:::i;:::-;10940:88;11021:6;11016:3;10940:88;:::i;:::-;10933:95;;11033:52;11078:6;11073:3;11066:4;11059:5;11055:16;11033:52;:::i;:::-;11106:6;11101:3;11097:16;11090:23;;10870:248;;;;;:::o;11125:347::-;;11237:39;11270:5;11237:39;:::i;:::-;11288:71;11352:6;11347:3;11288:71;:::i;:::-;11281:78;;11364:52;11409:6;11404:3;11397:4;11390:5;11386:16;11364:52;:::i;:::-;11437:29;11459:6;11437:29;:::i;:::-;11432:3;11428:39;11421:46;;11217:255;;;;;:::o;11479:360::-;;11609:39;11642:5;11609:39;:::i;:::-;11660:89;11742:6;11737:3;11660:89;:::i;:::-;11653:96;;11754:52;11799:6;11794:3;11787:4;11780:5;11776:16;11754:52;:::i;:::-;11827:6;11822:3;11818:16;11811:23;;11589:250;;;;;:::o;11871:884::-;;12008:5;12002:12;12042:1;12031:9;12027:17;12055:1;12050:268;;;;12329:1;12324:425;;;;12020:729;;12050:268;12128:4;12124:1;12113:9;12109:17;12105:28;12147:89;12229:6;12224:3;12147:89;:::i;:::-;12140:96;;12274:4;12270:9;12259;12255:25;12250:3;12243:38;12304:6;12299:3;12295:16;12288:23;;12057:261;12050:268;;12324:425;12393:1;12382:9;12378:17;12409:89;12491:6;12486:3;12409:89;:::i;:::-;12402:96;;12520:38;12552:5;12520:38;:::i;:::-;12574:1;12582:130;12596:6;12593:1;12590:13;12582:130;;;12661:7;12655:14;12651:1;12646:3;12642:11;12635:35;12702:1;12693:7;12689:15;12678:26;;12618:4;12615:1;12611:12;12606:17;;12582:130;;;12735:6;12730:3;12726:16;12719:23;;12331:418;;;12020:729;;11978:777;;;;;:::o;12764:371::-;;12924:67;12988:2;12983:3;12924:67;:::i;:::-;12917:74;;13024:34;13020:1;13015:3;13011:11;13004:55;13093:4;13088:2;13083:3;13079:12;13072:26;13126:2;13121:3;13117:12;13110:19;;12910:225;;;:::o;13144:387::-;;13304:67;13368:2;13363:3;13304:67;:::i;:::-;13297:74;;13404:34;13400:1;13395:3;13391:11;13384:55;13473:20;13468:2;13463:3;13459:12;13452:42;13522:2;13517:3;13513:12;13506:19;;13290:241;;;:::o;13540:328::-;;13700:67;13764:2;13759:3;13700:67;:::i;:::-;13693:74;;13800:30;13796:1;13791:3;13787:11;13780:51;13859:2;13854:3;13850:12;13843:19;;13686:182;;;:::o;13877:373::-;;14037:67;14101:2;14096:3;14037:67;:::i;:::-;14030:74;;14137:34;14133:1;14128:3;14124:11;14117:55;14206:6;14201:2;14196:3;14192:12;14185:28;14241:2;14236:3;14232:12;14225:19;;14023:227;;;:::o;14259:325::-;;14419:67;14483:2;14478:3;14419:67;:::i;:::-;14412:74;;14519:27;14515:1;14510:3;14506:11;14499:48;14575:2;14570:3;14566:12;14559:19;;14405:179;;;:::o;14593:381::-;;14753:67;14817:2;14812:3;14753:67;:::i;:::-;14746:74;;14853:34;14849:1;14844:3;14840:11;14833:55;14922:14;14917:2;14912:3;14908:12;14901:36;14965:2;14960:3;14956:12;14949:19;;14739:235;;;:::o;14983:317::-;;15143:67;15207:2;15202:3;15143:67;:::i;:::-;15136:74;;15243:19;15239:1;15234:3;15230:11;15223:40;15291:2;15286:3;15282:12;15275:19;;15129:171;;;:::o;15309:393::-;;15469:67;15533:2;15528:3;15469:67;:::i;:::-;15462:74;;15569:34;15565:1;15560:3;15556:11;15549:55;15638:26;15633:2;15628:3;15624:12;15617:48;15693:2;15688:3;15684:12;15677:19;;15455:247;;;:::o;15711:379::-;;15871:67;15935:2;15930:3;15871:67;:::i;:::-;15864:74;;15971:34;15967:1;15962:3;15958:11;15951:55;16040:12;16035:2;16030:3;16026:12;16019:34;16081:2;16076:3;16072:12;16065:19;;15857:233;;;:::o;16099:371::-;;16259:67;16323:2;16318:3;16259:67;:::i;:::-;16252:74;;16359:34;16355:1;16350:3;16346:11;16339:55;16428:4;16423:2;16418:3;16414:12;16407:26;16461:2;16456:3;16452:12;16445:19;;16245:225;;;:::o;16479:332::-;;16639:67;16703:2;16698:3;16639:67;:::i;:::-;16632:74;;16739:34;16735:1;16730:3;16726:11;16719:55;16802:2;16797:3;16793:12;16786:19;;16625:186;;;:::o;16820:381::-;;16980:67;17044:2;17039:3;16980:67;:::i;:::-;16973:74;;17080:34;17076:1;17071:3;17067:11;17060:55;17149:14;17144:2;17139:3;17135:12;17128:36;17192:2;17187:3;17183:12;17176:19;;16966:235;;;:::o;17210:381::-;;17370:67;17434:2;17429:3;17370:67;:::i;:::-;17363:74;;17470:34;17466:1;17461:3;17457:11;17450:55;17539:14;17534:2;17529:3;17525:12;17518:36;17582:2;17577:3;17573:12;17566:19;;17356:235;;;:::o;17600:378::-;;17760:67;17824:2;17819:3;17760:67;:::i;:::-;17753:74;;17860:34;17856:1;17851:3;17847:11;17840:55;17929:11;17924:2;17919:3;17915:12;17908:33;17969:2;17964:3;17960:12;17953:19;;17746:232;;;:::o;17987:384::-;;18147:67;18211:2;18206:3;18147:67;:::i;:::-;18140:74;;18247:34;18243:1;18238:3;18234:11;18227:55;18316:17;18311:2;18306:3;18302:12;18295:39;18362:2;18357:3;18353:12;18346:19;;18133:238;;;:::o;18380:370::-;;18540:67;18604:2;18599:3;18540:67;:::i;:::-;18533:74;;18640:34;18636:1;18631:3;18627:11;18620:55;18709:3;18704:2;18699:3;18695:12;18688:25;18741:2;18736:3;18732:12;18725:19;;18526:224;;;:::o;18759:310::-;;18919:67;18983:2;18978:3;18919:67;:::i;:::-;18912:74;;19019:12;19015:1;19010:3;19006:11;18999:33;19060:2;19055:3;19051:12;19044:19;;18905:164;;;:::o;19078:386::-;;19238:67;19302:2;19297:3;19238:67;:::i;:::-;19231:74;;19338:34;19334:1;19329:3;19325:11;19318:55;19407:19;19402:2;19397:3;19393:12;19386:41;19455:2;19450:3;19446:12;19439:19;;19224:240;;;:::o;19473:329::-;;19633:67;19697:2;19692:3;19633:67;:::i;:::-;19626:74;;19733:31;19729:1;19724:3;19720:11;19713:52;19793:2;19788:3;19784:12;19777:19;;19619:183;;;:::o;19811:314::-;;19971:67;20035:2;20030:3;19971:67;:::i;:::-;19964:74;;20071:16;20067:1;20062:3;20058:11;20051:37;20116:2;20111:3;20107:12;20100:19;;19957:168;;;:::o;20133:113::-;20216:24;20234:5;20216:24;:::i;:::-;20211:3;20204:37;20198:48;;:::o;20253:271::-;;20406:93;20495:3;20486:6;20406:93;:::i;:::-;20399:100;;20516:3;20509:10;;20387:137;;;;:::o;20531:430::-;;20731:92;20819:3;20810:6;20731:92;:::i;:::-;20724:99;;20841:95;20932:3;20923:6;20841:95;:::i;:::-;20834:102;;20953:3;20946:10;;20712:249;;;;;:::o;20968:222::-;;21095:2;21084:9;21080:18;21072:26;;21109:71;21177:1;21166:9;21162:17;21153:6;21109:71;:::i;:::-;21066:124;;;;:::o;21197:672::-;;21442:3;21431:9;21427:19;21419:27;;21457:87;21541:1;21530:9;21526:17;21517:6;21457:87;:::i;:::-;21555:72;21623:2;21612:9;21608:18;21599:6;21555:72;:::i;:::-;21638;21706:2;21695:9;21691:18;21682:6;21638:72;:::i;:::-;21758:9;21752:4;21748:20;21743:2;21732:9;21728:18;21721:48;21783:76;21854:4;21845:6;21783:76;:::i;:::-;21775:84;;21413:456;;;;;;;:::o;21876:370::-;;22053:2;22042:9;22038:18;22030:26;;22103:9;22097:4;22093:20;22089:1;22078:9;22074:17;22067:47;22128:108;22231:4;22222:6;22128:108;:::i;:::-;22120:116;;22024:222;;;;:::o;22253:210::-;;22374:2;22363:9;22359:18;22351:26;;22388:65;22450:1;22439:9;22435:17;22426:6;22388:65;:::i;:::-;22345:118;;;;:::o;22470:310::-;;22617:2;22606:9;22602:18;22594:26;;22667:9;22661:4;22657:20;22653:1;22642:9;22638:17;22631:47;22692:78;22765:4;22756:6;22692:78;:::i;:::-;22684:86;;22588:192;;;;:::o;22787:416::-;;22987:2;22976:9;22972:18;22964:26;;23037:9;23031:4;23027:20;23023:1;23012:9;23008:17;23001:47;23062:131;23188:4;23062:131;:::i;:::-;23054:139;;22958:245;;;:::o;23210:416::-;;23410:2;23399:9;23395:18;23387:26;;23460:9;23454:4;23450:20;23446:1;23435:9;23431:17;23424:47;23485:131;23611:4;23485:131;:::i;:::-;23477:139;;23381:245;;;:::o;23633:416::-;;23833:2;23822:9;23818:18;23810:26;;23883:9;23877:4;23873:20;23869:1;23858:9;23854:17;23847:47;23908:131;24034:4;23908:131;:::i;:::-;23900:139;;23804:245;;;:::o;24056:416::-;;24256:2;24245:9;24241:18;24233:26;;24306:9;24300:4;24296:20;24292:1;24281:9;24277:17;24270:47;24331:131;24457:4;24331:131;:::i;:::-;24323:139;;24227:245;;;:::o;24479:416::-;;24679:2;24668:9;24664:18;24656:26;;24729:9;24723:4;24719:20;24715:1;24704:9;24700:17;24693:47;24754:131;24880:4;24754:131;:::i;:::-;24746:139;;24650:245;;;:::o;24902:416::-;;25102:2;25091:9;25087:18;25079:26;;25152:9;25146:4;25142:20;25138:1;25127:9;25123:17;25116:47;25177:131;25303:4;25177:131;:::i;:::-;25169:139;;25073:245;;;:::o;25325:416::-;;25525:2;25514:9;25510:18;25502:26;;25575:9;25569:4;25565:20;25561:1;25550:9;25546:17;25539:47;25600:131;25726:4;25600:131;:::i;:::-;25592:139;;25496:245;;;:::o;25748:416::-;;25948:2;25937:9;25933:18;25925:26;;25998:9;25992:4;25988:20;25984:1;25973:9;25969:17;25962:47;26023:131;26149:4;26023:131;:::i;:::-;26015:139;;25919:245;;;:::o;26171:416::-;;26371:2;26360:9;26356:18;26348:26;;26421:9;26415:4;26411:20;26407:1;26396:9;26392:17;26385:47;26446:131;26572:4;26446:131;:::i;:::-;26438:139;;26342:245;;;:::o;26594:416::-;;26794:2;26783:9;26779:18;26771:26;;26844:9;26838:4;26834:20;26830:1;26819:9;26815:17;26808:47;26869:131;26995:4;26869:131;:::i;:::-;26861:139;;26765:245;;;:::o;27017:416::-;;27217:2;27206:9;27202:18;27194:26;;27267:9;27261:4;27257:20;27253:1;27242:9;27238:17;27231:47;27292:131;27418:4;27292:131;:::i;:::-;27284:139;;27188:245;;;:::o;27440:416::-;;27640:2;27629:9;27625:18;27617:26;;27690:9;27684:4;27680:20;27676:1;27665:9;27661:17;27654:47;27715:131;27841:4;27715:131;:::i;:::-;27707:139;;27611:245;;;:::o;27863:416::-;;28063:2;28052:9;28048:18;28040:26;;28113:9;28107:4;28103:20;28099:1;28088:9;28084:17;28077:47;28138:131;28264:4;28138:131;:::i;:::-;28130:139;;28034:245;;;:::o;28286:416::-;;28486:2;28475:9;28471:18;28463:26;;28536:9;28530:4;28526:20;28522:1;28511:9;28507:17;28500:47;28561:131;28687:4;28561:131;:::i;:::-;28553:139;;28457:245;;;:::o;28709:416::-;;28909:2;28898:9;28894:18;28886:26;;28959:9;28953:4;28949:20;28945:1;28934:9;28930:17;28923:47;28984:131;29110:4;28984:131;:::i;:::-;28976:139;;28880:245;;;:::o;29132:416::-;;29332:2;29321:9;29317:18;29309:26;;29382:9;29376:4;29372:20;29368:1;29357:9;29353:17;29346:47;29407:131;29533:4;29407:131;:::i;:::-;29399:139;;29303:245;;;:::o;29555:416::-;;29755:2;29744:9;29740:18;29732:26;;29805:9;29799:4;29795:20;29791:1;29780:9;29776:17;29769:47;29830:131;29956:4;29830:131;:::i;:::-;29822:139;;29726:245;;;:::o;29978:416::-;;30178:2;30167:9;30163:18;30155:26;;30228:9;30222:4;30218:20;30214:1;30203:9;30199:17;30192:47;30253:131;30379:4;30253:131;:::i;:::-;30245:139;;30149:245;;;:::o;30401:416::-;;30601:2;30590:9;30586:18;30578:26;;30651:9;30645:4;30641:20;30637:1;30626:9;30622:17;30615:47;30676:131;30802:4;30676:131;:::i;:::-;30668:139;;30572:245;;;:::o;30824:416::-;;31024:2;31013:9;31009:18;31001:26;;31074:9;31068:4;31064:20;31060:1;31049:9;31045:17;31038:47;31099:131;31225:4;31099:131;:::i;:::-;31091:139;;30995:245;;;:::o;31247:222::-;;31374:2;31363:9;31359:18;31351:26;;31388:71;31456:1;31445:9;31441:17;31432:6;31388:71;:::i;:::-;31345:124;;;;:::o;31476:256::-;;31538:2;31532:9;31522:19;;31576:4;31568:6;31564:17;31675:6;31663:10;31660:22;31639:18;31627:10;31624:34;31621:62;31618:2;;;31696:1;31693;31686:12;31618:2;31716:10;31712:2;31705:22;31516:216;;;;:::o;31739:304::-;;31898:18;31890:6;31887:30;31884:2;;;31930:1;31927;31920:12;31884:2;31965:4;31957:6;31953:17;31945:25;;32028:4;32022;32018:15;32010:23;;31821:222;;;:::o;32050:314::-;;32219:18;32211:6;32208:30;32205:2;;;32251:1;32248;32241:12;32205:2;32286:4;32278:6;32274:17;32266:25;;32349:4;32343;32339:15;32331:23;;32142:222;;;:::o;32371:304::-;;32530:18;32522:6;32519:30;32516:2;;;32562:1;32559;32552:12;32516:2;32597:4;32589:6;32585:17;32577:25;;32660:4;32654;32650:15;32642:23;;32453:222;;;:::o;32682:321::-;;32825:18;32817:6;32814:30;32811:2;;;32857:1;32854;32847:12;32811:2;32924:4;32920:9;32913:4;32905:6;32901:17;32897:33;32889:41;;32988:4;32982;32978:15;32970:23;;32748:255;;;:::o;33010:322::-;;33154:18;33146:6;33143:30;33140:2;;;33186:1;33183;33176:12;33140:2;33253:4;33249:9;33242:4;33234:6;33230:17;33226:33;33218:41;;33317:4;33311;33307:15;33299:23;;33077:255;;;:::o;33339:151::-;;33425:3;33417:11;;33463:4;33458:3;33454:14;33446:22;;33411:79;;;:::o;33497:158::-;;33565:3;33557:11;;33602:3;33599:1;33592:14;33634:4;33631:1;33621:18;33613:26;;33551:104;;;:::o;33662:137::-;;33771:5;33765:12;33755:22;;33736:63;;;:::o;33806:121::-;;33899:5;33893:12;33883:22;;33864:63;;;:::o;33934:122::-;;34028:5;34022:12;34012:22;;33993:63;;;:::o;34063:108::-;;34161:4;34156:3;34152:14;34144:22;;34138:33;;;:::o;34179:178::-;;34309:6;34304:3;34297:19;34346:4;34341:3;34337:14;34322:29;;34290:67;;;;:::o;34366:162::-;;34480:6;34475:3;34468:19;34517:4;34512:3;34508:14;34493:29;;34461:67;;;;:::o;34537:144::-;;34672:3;34657:18;;34650:31;;;;:::o;34690:163::-;;34805:6;34800:3;34793:19;34842:4;34837:3;34833:14;34818:29;;34786:67;;;;:::o;34862:145::-;;34998:3;34983:18;;34976:31;;;;:::o;35015:91::-;;35077:24;35095:5;35077:24;:::i;:::-;35066:35;;35060:46;;;:::o;35113:99::-;;35183:24;35201:5;35183:24;:::i;:::-;35172:35;;35166:46;;;:::o;35219:85::-;;35292:5;35285:13;35278:21;35267:32;;35261:43;;;:::o;35311:144::-;;35383:66;35376:5;35372:78;35361:89;;35355:100;;;:::o;35462:121::-;;35535:42;35528:5;35524:54;35513:65;;35507:76;;;:::o;35590:72::-;;35652:5;35641:16;;35635:27;;;:::o;35670:145::-;35751:6;35746:3;35741;35728:30;35807:1;35798:6;35793:3;35789:16;35782:27;35721:94;;;:::o;35824:268::-;35889:1;35896:101;35910:6;35907:1;35904:13;35896:101;;;35986:1;35981:3;35977:11;35971:18;35967:1;35962:3;35958:11;35951:39;35932:2;35929:1;35925:10;35920:15;;35896:101;;;36012:6;36009:1;36006:13;36003:2;;;36077:1;36068:6;36063:3;36059:16;36052:27;36003:2;35873:219;;;;:::o;36100:97::-;;36188:2;36184:7;36179:2;36172:5;36168:14;36164:28;36154:38;;36148:49;;;:::o;36205:117::-;36274:24;36292:5;36274:24;:::i;:::-;36267:5;36264:35;36254:2;;36313:1;36310;36303:12;36254:2;36248:74;:::o;36329:111::-;36395:21;36410:5;36395:21;:::i;:::-;36388:5;36385:32;36375:2;;36431:1;36428;36421:12;36375:2;36369:71;:::o;36447:115::-;36515:23;36532:5;36515:23;:::i;:::-;36508:5;36505:34;36495:2;;36553:1;36550;36543:12;36495:2;36489:73;:::o;36569:117::-;36638:24;36656:5;36638:24;:::i;:::-;36631:5;36628:35;36618:2;;36677:1;36674;36667:12;36618:2;36612:74;:::o
Swarm Source
ipfs://5ab1d5438b8c4f81408d6fb906d6419b86764a017dc7f642180ad46aee4d98ec
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.