Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 18 from a total of 18 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 15776298 | 821 days ago | IN | 0 ETH | 0.00115419 | ||||
Add_user | 15776291 | 821 days ago | IN | 0 ETH | 0.00179151 | ||||
Mint | 15776290 | 821 days ago | IN | 0 ETH | 0.00160091 | ||||
Clear_users | 15776287 | 821 days ago | IN | 0 ETH | 0.00061442 | ||||
Add_user | 15776274 | 821 days ago | IN | 0 ETH | 0.00174427 | ||||
Clear_users | 15776272 | 821 days ago | IN | 0 ETH | 0.0012164 | ||||
Mint | 15776223 | 821 days ago | IN | 0 ETH | 0.00496572 | ||||
Add_user | 15772095 | 821 days ago | IN | 0 ETH | 0.00071768 | ||||
Set_contract_b | 15772091 | 821 days ago | IN | 0 ETH | 0.00044533 | ||||
Mint | 15772080 | 821 days ago | IN | 0 ETH | 0.00248014 | ||||
Add_user | 15772009 | 821 days ago | IN | 0 ETH | 0.00076361 | ||||
Set Approval For... | 15771983 | 821 days ago | IN | 0 ETH | 0.0007077 | ||||
Add_users | 15771979 | 821 days ago | IN | 0 ETH | 0.00162199 | ||||
Set Approval For... | 15771966 | 821 days ago | IN | 0 ETH | 0.00068551 | ||||
Mint | 15771960 | 821 days ago | IN | 0 ETH | 0.00163539 | ||||
Set URI | 15771958 | 821 days ago | IN | 0 ETH | 0.00147383 | ||||
Add_user | 15771946 | 821 days ago | IN | 0 ETH | 0.00116255 | ||||
Set_contract_b | 15771941 | 821 days ago | IN | 0 ETH | 0.00070053 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ERC1155PresetMinterPauser
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-18 */ // File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @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.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ 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; if (lastIndex != toDeleteIndex) { 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] = valueIndex; // Replace lastValue's index to valueIndex } // 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) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { 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(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, 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(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set 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(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // 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(uint160(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(uint160(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(uint160(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(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // 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 Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal 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); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/access/IAccessControlEnumerable.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/access/AccessControlEnumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: address zero is not a valid owner"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Pausable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC1155 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. * * _Available since v3.1._ */ abstract contract ERC1155Pausable is ERC1155, Pausable { /** * @dev See {ERC1155-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); require(!paused(), "ERC1155Pausable: token transfer while paused"); } } // File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC1155} that allows token holders to destroy both their * own tokens and those that they have been approved to use. * * _Available since v3.1._ */ abstract contract ERC1155Burnable is ERC1155 { function burn( address account, uint256 id, uint256 value ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _burn(account, id, value); } function burnBatch( address account, uint256[] memory ids, uint256[] memory values ) public virtual { require( account == _msgSender() || isApprovedForAll(account, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _burnBatch(account, ids, values); } } // File: contracts/TOKEN_A.sol pragma solidity ^0.8.0; interface TOKEN_B { function mint( address to, uint256 id, uint256 amount, bytes memory data ) external; } contract ERC1155PresetMinterPauser is Context, AccessControlEnumerable, ERC1155Burnable, ERC1155Pausable { bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); address[] public user_list; address public contract_b; constructor(string memory uri) ERC1155(uri) { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setupRole(MINTER_ROLE, _msgSender()); _setupRole(PAUSER_ROLE, _msgSender()); } function mint( address to, uint256 id, uint256 amount, bytes memory data ) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); _mint(to, id, amount, data); } function add_user( address user ) public { user_list.push(user); } function set_contract_b( address contract_b_arg ) public { contract_b = contract_b_arg; } function add_users( address[] memory users ) public { for (uint i=0; i < users.length; i++) { user_list.push(users[i]); } } function clear_users( ) public { delete user_list; } function get_users() public view returns(address[] memory){ return user_list; } function mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual { require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); _mintBatch(to, ids, amounts, data); } function pause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have pauser role to pause"); _pause(); } function unpause() public virtual { require(hasRole(PAUSER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have pauser role to unpause"); _unpause(); } function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable, ERC1155) returns (bool) { return super.supportsInterface(interfaceId); } function setURI(string memory newuri) public { require(hasRole(MINTER_ROLE, _msgSender()), "ERC1155PresetMinterPauser: must have minter role to mint"); _setURI(newuri); } function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual override(ERC1155, ERC1155Pausable) { for (uint i=0; i < user_list.length; i++) { TOKEN_B(contract_b).mint(user_list[i], i, 1, bytes("0x00")); } super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"add_user","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"add_users","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clear_users","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contract_b","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_users","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contract_b_arg","type":"address"}],"name":"set_contract_b","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":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"user_list","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005bbd38038062005bbd8339818101604052810190620000379190620004f2565b8062000049816200011260201b60201c565b506000600560006101000a81548160ff021916908315150217905550620000896000801b6200007d6200012e60201b60201c565b6200013660201b60201c565b620000ca7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000be6200012e60201b60201c565b6200013660201b60201c565b6200010b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620000ff6200012e60201b60201c565b6200013660201b60201c565b50620006c7565b80600490805190602001906200012a929190620003c4565b5050565b600033905090565b6200014882826200014c60201b60201c565b5050565b6200016382826200019460201b620012b01760201c565b6200018f81600160008581526020019081526020016000206200028560201b620013901790919060201c565b505050565b620001a68282620002bd60201b60201c565b6200028157600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002266200012e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620002b5836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200032760201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006200033b8383620003a160201b60201c565b620003965782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200039b565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620003d290620005d8565b90600052602060002090601f016020900481019282620003f6576000855562000442565b82601f106200041157805160ff191683800117855562000442565b8280016001018555821562000442579182015b828111156200044157825182559160200191906001019062000424565b5b50905062000451919062000455565b5090565b5b808211156200047057600081600090555060010162000456565b5090565b60006200048b62000485846200056c565b62000543565b905082815260208101848484011115620004aa57620004a9620006a7565b5b620004b7848285620005a2565b509392505050565b600082601f830112620004d757620004d6620006a2565b5b8151620004e984826020860162000474565b91505092915050565b6000602082840312156200050b576200050a620006b1565b5b600082015167ffffffffffffffff8111156200052c576200052b620006ac565b5b6200053a84828501620004bf565b91505092915050565b60006200054f62000562565b90506200055d82826200060e565b919050565b6000604051905090565b600067ffffffffffffffff8211156200058a576200058962000673565b5b6200059582620006b6565b9050602081019050919050565b60005b83811015620005c2578082015181840152602081019050620005a5565b83811115620005d2576000848401525b50505050565b60006002820490506001821680620005f157607f821691505b6020821081141562000608576200060762000644565b5b50919050565b6200061982620006b6565b810181811067ffffffffffffffff821117156200063b576200063a62000673565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6154e680620006d76000396000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638456cb591161011a578063c197436f116100ad578063e63ab1e91161007c578063e63ab1e914610595578063e985e9c5146105b3578063ed66aa1b146105e3578063f242432a14610601578063f5298aca1461061d576101fa565b8063c197436f1461050f578063ca15c8731461052b578063d53913931461055b578063d547741f14610579576101fa565b8063a22cb465116100e9578063a22cb46514610489578063a9a3a391146104a5578063b0ce739d146104c1578063b17a747c146104f1576101fa565b80638456cb59146104015780639010d07c1461040b57806391d148541461043b578063a217fddf1461046b576101fa565b80632f2ff15d116101925780634e1273f4116101615780634e1273f41461037b5780635c975abb146103ab5780636b20c454146103c9578063731133e9146103e5576101fa565b80632f2ff15d1461032f578063338eeacb1461034b57806336568abe146103555780633f4ba83a14610371576101fa565b80631f7fdffa116101ce5780631f7fdffa146102ab578063248a9ca3146102c75780632d581e71146102f75780632eb2c2d614610313576101fa565b8062fdd58e146101ff57806301ffc9a71461022f57806302fe53051461025f5780630e89341c1461027b575b600080fd5b61021960048036038101906102149190613aef565b610639565b60405161022691906147f3565b60405180910390f35b61024960048036038101906102449190613d73565b610703565b604051610256919061451b565b60405180910390f35b61027960048036038101906102749190613dcd565b610715565b005b61029560048036038101906102909190613e16565b610791565b6040516102a29190614551565b60405180910390f35b6102c560048036038101906102c091906139f4565b610825565b005b6102e160048036038101906102dc9190613cc6565b6108a7565b6040516102ee9190614536565b60405180910390f35b610311600480360381019061030c9190613796565b6108c6565b005b61032d60048036038101906103289190613803565b61092c565b005b61034960048036038101906103449190613cf3565b6109cd565b005b6103536109ee565b005b61036f600480360381019061036a9190613cf3565b6109fe565b005b610379610a81565b005b61039560048036038101906103909190613c4e565b610afb565b6040516103a291906144c2565b60405180910390f35b6103b3610c14565b6040516103c0919061451b565b60405180910390f35b6103e360048036038101906103de9190613969565b610c2b565b005b6103ff60048036038101906103fa9190613b82565b610cc8565b005b610409610d4a565b005b61042560048036038101906104209190613d33565b610dc4565b6040516104329190614377565b60405180910390f35b61045560048036038101906104509190613cf3565b610df3565b604051610462919061451b565b60405180910390f35b610473610e5d565b6040516104809190614536565b60405180910390f35b6104a3600480360381019061049e9190613aaf565b610e64565b005b6104bf60048036038101906104ba9190613c05565b610e7a565b005b6104db60048036038101906104d69190613e16565b610f1a565b6040516104e89190614377565b60405180910390f35b6104f9610f59565b6040516105069190614377565b60405180910390f35b61052960048036038101906105249190613796565b610f7f565b005b61054560048036038101906105409190613cc6565b610fc3565b60405161055291906147f3565b60405180910390f35b610563610fe7565b6040516105709190614536565b60405180910390f35b610593600480360381019061058e9190613cf3565b61100b565b005b61059d61102c565b6040516105aa9190614536565b60405180910390f35b6105cd60048036038101906105c891906137c3565b611050565b6040516105da919061451b565b60405180910390f35b6105eb6110e4565b6040516105f891906144a0565b60405180910390f35b61061b600480360381019061061691906138d2565b611172565b005b61063760048036038101906106329190613b2f565b611213565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a190614653565b60405180910390fd5b6002600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061070e826113c0565b9050919050565b6107467f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66107416114a2565b610df3565b610785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077c906146d3565b60405180910390fd5b61078e816114aa565b50565b6060600480546107a090614bab565b80601f01602080910402602001604051908101604052809291908181526020018280546107cc90614bab565b80156108195780601f106107ee57610100808354040283529160200191610819565b820191906000526020600020905b8154815290600101906020018083116107fc57829003601f168201915b50505050509050919050565b6108567f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108516114a2565b610df3565b610895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088c906146d3565b60405180910390fd5b6108a1848484846114c4565b50505050565b6000806000838152602001908152602001600020600101549050919050565b6006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109346114a2565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061097a5750610979856109746114a2565b611050565b5b6109b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b090614593565b60405180910390fd5b6109c685858585856116f2565b5050505050565b6109d6826108a7565b6109df81611a17565b6109e98383611a2b565b505050565b600660006109fc9190613438565b565b610a066114a2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a906147d3565b60405180910390fd5b610a7d8282611a5f565b5050565b610ab27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610aad6114a2565b610df3565b610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890614713565b60405180910390fd5b610af9611a93565b565b60608151835114610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890614773565b60405180910390fd5b6000835167ffffffffffffffff811115610b5e57610b5d614d13565b5b604051908082528060200260200182016040528015610b8c5781602001602082028036833780820191505090505b50905060005b8451811015610c0957610bd9858281518110610bb157610bb0614ce4565b5b6020026020010151858381518110610bcc57610bcb614ce4565b5b6020026020010151610639565b828281518110610bec57610beb614ce4565b5b60200260200101818152505080610c0290614c0e565b9050610b92565b508091505092915050565b6000600560009054906101000a900460ff16905090565b610c336114a2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610c795750610c7883610c736114a2565b611050565b5b610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caf90614593565b60405180910390fd5b610cc3838383611af6565b505050565b610cf97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610cf46114a2565b610df3565b610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f906146d3565b60405180910390fd5b610d4484848484611dc7565b50505050565b610d7b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610d766114a2565b610df3565b610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190614733565b60405180910390fd5b610dc2611f79565b565b6000610deb8260016000868152602001908152602001600020611fdc90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b610e76610e6f6114a2565b8383611ff6565b5050565b60005b8151811015610f16576006828281518110610e9b57610e9a614ce4565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080610f0e90614c0e565b915050610e7d565b5050565b60068181548110610f2a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610fe060016000848152602001908152602001600020612163565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611014826108a7565b61101d81611a17565b6110278383611a5f565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600680548060200260200160405190810160405280929190818152602001828054801561116857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161111e575b5050505050905090565b61117a6114a2565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806111c057506111bf856111ba6114a2565b611050565b5b6111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690614593565b60405180910390fd5b61120c8585858585612178565b5050505050565b61121b6114a2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061126157506112608361125b6114a2565b611050565b5b6112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129790614593565b60405180910390fd5b6112ab838383612417565b505050565b6112ba8282610df3565b61138c57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506113316114a2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006113b8836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612660565b905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061148b57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061149b575061149a826126d0565b5b9050919050565b600033905090565b80600490805190602001906114c0929190613459565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b906147b3565b60405180910390fd5b8151835114611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f90614793565b60405180910390fd5b60006115826114a2565b90506115938160008787878761274a565b60005b845181101561164d578381815181106115b2576115b1614ce4565b5b6020026020010151600260008784815181106115d1576115d0614ce4565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461163391906149cb565b92505081905550808061164590614c0e565b915050611596565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516116c59291906144e4565b60405180910390a46116dc8160008787878761288b565b6116eb81600087878787612893565b5050505050565b8151835114611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d90614793565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156117a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179d90614693565b60405180910390fd5b60006117b06114a2565b90506117c081878787878761274a565b60005b84518110156119745760008582815181106117e1576117e0614ce4565b5b602002602001015190506000858381518110611800576117ff614ce4565b5b6020026020010151905060006002600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906146f3565b60405180910390fd5b8181036002600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461195991906149cb565b925050819055505050508061196d90614c0e565b90506117c3565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119eb9291906144e4565b60405180910390a4611a0181878787878761288b565b611a0f818787878787612893565b505050505050565b611a2881611a236114a2565b612a7a565b50565b611a3582826112b0565b611a5a816001600085815260200190815260200160002061139090919063ffffffff16565b505050565b611a698282612b17565b611a8e8160016000858152602001908152602001600020612bf890919063ffffffff16565b505050565b611a9b612c28565b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611adf6114a2565b604051611aec9190614377565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d906146b3565b60405180910390fd5b8051825114611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190614793565b60405180910390fd5b6000611bb46114a2565b9050611bd48185600086866040518060200160405280600081525061274a565b60005b8351811015611d23576000848281518110611bf557611bf4614ce4565b5b602002602001015190506000848381518110611c1457611c13614ce4565b5b6020026020010151905060006002600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cad90614613565b60405180910390fd5b8181036002600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611d1b90614c0e565b915050611bd7565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611d9b9291906144e4565b60405180910390a4611dc18185600086866040518060200160405280600081525061288b565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e906147b3565b60405180910390fd5b6000611e416114a2565b90506000611e4e85612c71565b90506000611e5b85612c71565b9050611e6c8360008985858961274a565b846002600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ecc91906149cb565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611f4a92919061480e565b60405180910390a4611f618360008985858961288b565b611f7083600089898989612ceb565b50505050505050565b611f81612ed2565b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fc56114a2565b604051611fd29190614377565b60405180910390a1565b6000611feb8360000183612f1c565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205c90614753565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612156919061451b565b60405180910390a3505050565b600061217182600001612f47565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df90614693565b60405180910390fd5b60006121f26114a2565b905060006121ff85612c71565b9050600061220c85612c71565b905061221c83898985858961274a565b60006002600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab906146f3565b60405180910390fd5b8581036002600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856002600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461236b91906149cb565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516123e892919061480e565b60405180910390a46123fe848a8a86868a61288b565b61240c848a8a8a8a8a612ceb565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247e906146b3565b60405180910390fd5b60006124916114a2565b9050600061249e84612c71565b905060006124ab84612c71565b90506124cb8387600085856040518060200160405280600081525061274a565b60006002600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255a90614613565b60405180910390fd5b8481036002600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161263192919061480e565b60405180910390a46126578488600086866040518060200160405280600081525061288b565b50505050505050565b600061266c8383612f58565b6126c55782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506126ca565b600090505b92915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612743575061274282612f7b565b5b9050919050565b60005b60068054905081101561287457600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663731133e9600683815481106127ac576127ab614ce4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360016040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152506040518563ffffffff1660e01b815260040161282f9493929190614454565b600060405180830381600087803b15801561284957600080fd5b505af115801561285d573d6000803e3d6000fd5b50505050808061286c90614c0e565b91505061274d565b50612883868686868686612ff5565b505050505050565b505050505050565b6128b28473ffffffffffffffffffffffffffffffffffffffff16613053565b15612a72578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016128f8959493929190614392565b602060405180830381600087803b15801561291257600080fd5b505af192505050801561294357506040513d601f19601f820116820180604052508101906129409190613da0565b60015b6129e95761294f614d42565b806308c379a014156129ac57506129646153a7565b8061296f57506129ae565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a39190614551565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e090614573565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a67906145d3565b60405180910390fd5b505b505050505050565b612a848282610df3565b612b1357612aa98173ffffffffffffffffffffffffffffffffffffffff166014613076565b612ab78360001c6020613076565b604051602001612ac892919061433d565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0a9190614551565b60405180910390fd5b5050565b612b218282610df3565b15612bf457600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612b996114a2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612c20836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6132b2565b905092915050565b612c30610c14565b612c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c66906145f3565b60405180910390fd5b565b60606000600167ffffffffffffffff811115612c9057612c8f614d13565b5b604051908082528060200260200182016040528015612cbe5781602001602082028036833780820191505090505b5090508281600081518110612cd657612cd5614ce4565b5b60200260200101818152505080915050919050565b612d0a8473ffffffffffffffffffffffffffffffffffffffff16613053565b15612eca578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612d509594939291906143fa565b602060405180830381600087803b158015612d6a57600080fd5b505af1925050508015612d9b57506040513d601f19601f82011682018060405250810190612d989190613da0565b60015b612e4157612da7614d42565b806308c379a01415612e045750612dbc6153a7565b80612dc75750612e06565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfb9190614551565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3890614573565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebf906145d3565b60405180910390fd5b505b505050505050565b612eda610c14565b15612f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1190614673565b60405180910390fd5b565b6000826000018281548110612f3457612f33614ce4565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fee5750612fed826133c6565b5b9050919050565b613003868686868686613430565b61300b610c14565b1561304b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304290614633565b60405180910390fd5b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060600060028360026130899190614a21565b61309391906149cb565b67ffffffffffffffff8111156130ac576130ab614d13565b5b6040519080825280601f01601f1916602001820160405280156130de5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061311657613115614ce4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061317a57613179614ce4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026131ba9190614a21565b6131c491906149cb565b90505b6001811115613264577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061320657613205614ce4565b5b1a60f81b82828151811061321d5761321c614ce4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061325d90614b81565b90506131c7565b50600084146132a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329f906145b3565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020549050600081146133ba5760006001826132e49190614a7b565b90506000600186600001805490506132fc9190614a7b565b905081811461336b57600086600001828154811061331d5761331c614ce4565b5b906000526020600020015490508087600001848154811061334157613340614ce4565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061337f5761337e614cb5565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506133c0565b60009150505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050505050565b508054600082559060005260206000209081019061345691906134df565b50565b82805461346590614bab565b90600052602060002090601f01602090048101928261348757600085556134ce565b82601f106134a057805160ff19168380011785556134ce565b828001600101855582156134ce579182015b828111156134cd5782518255916020019190600101906134b2565b5b5090506134db91906134df565b5090565b5b808211156134f85760008160009055506001016134e0565b5090565b600061350f61350a8461485c565b614837565b9050808382526020820190508285602086028201111561353257613531614d69565b5b60005b8581101561356257816135488882613660565b845260208401935060208301925050600181019050613535565b5050509392505050565b600061357f61357a84614888565b614837565b905080838252602082019050828560208602820111156135a2576135a1614d69565b5b60005b858110156135d257816135b88882613781565b8452602084019350602083019250506001810190506135a5565b5050509392505050565b60006135ef6135ea846148b4565b614837565b90508281526020810184848401111561360b5761360a614d6e565b5b613616848285614b3f565b509392505050565b600061363161362c846148e5565b614837565b90508281526020810184848401111561364d5761364c614d6e565b5b613658848285614b3f565b509392505050565b60008135905061366f8161543d565b92915050565b600082601f83011261368a57613689614d64565b5b813561369a8482602086016134fc565b91505092915050565b600082601f8301126136b8576136b7614d64565b5b81356136c884826020860161356c565b91505092915050565b6000813590506136e081615454565b92915050565b6000813590506136f58161546b565b92915050565b60008135905061370a81615482565b92915050565b60008151905061371f81615482565b92915050565b600082601f83011261373a57613739614d64565b5b813561374a8482602086016135dc565b91505092915050565b600082601f83011261376857613767614d64565b5b813561377884826020860161361e565b91505092915050565b60008135905061379081615499565b92915050565b6000602082840312156137ac576137ab614d78565b5b60006137ba84828501613660565b91505092915050565b600080604083850312156137da576137d9614d78565b5b60006137e885828601613660565b92505060206137f985828601613660565b9150509250929050565b600080600080600060a0868803121561381f5761381e614d78565b5b600061382d88828901613660565b955050602061383e88828901613660565b945050604086013567ffffffffffffffff81111561385f5761385e614d73565b5b61386b888289016136a3565b935050606086013567ffffffffffffffff81111561388c5761388b614d73565b5b613898888289016136a3565b925050608086013567ffffffffffffffff8111156138b9576138b8614d73565b5b6138c588828901613725565b9150509295509295909350565b600080600080600060a086880312156138ee576138ed614d78565b5b60006138fc88828901613660565b955050602061390d88828901613660565b945050604061391e88828901613781565b935050606061392f88828901613781565b925050608086013567ffffffffffffffff8111156139505761394f614d73565b5b61395c88828901613725565b9150509295509295909350565b60008060006060848603121561398257613981614d78565b5b600061399086828701613660565b935050602084013567ffffffffffffffff8111156139b1576139b0614d73565b5b6139bd868287016136a3565b925050604084013567ffffffffffffffff8111156139de576139dd614d73565b5b6139ea868287016136a3565b9150509250925092565b60008060008060808587031215613a0e57613a0d614d78565b5b6000613a1c87828801613660565b945050602085013567ffffffffffffffff811115613a3d57613a3c614d73565b5b613a49878288016136a3565b935050604085013567ffffffffffffffff811115613a6a57613a69614d73565b5b613a76878288016136a3565b925050606085013567ffffffffffffffff811115613a9757613a96614d73565b5b613aa387828801613725565b91505092959194509250565b60008060408385031215613ac657613ac5614d78565b5b6000613ad485828601613660565b9250506020613ae5858286016136d1565b9150509250929050565b60008060408385031215613b0657613b05614d78565b5b6000613b1485828601613660565b9250506020613b2585828601613781565b9150509250929050565b600080600060608486031215613b4857613b47614d78565b5b6000613b5686828701613660565b9350506020613b6786828701613781565b9250506040613b7886828701613781565b9150509250925092565b60008060008060808587031215613b9c57613b9b614d78565b5b6000613baa87828801613660565b9450506020613bbb87828801613781565b9350506040613bcc87828801613781565b925050606085013567ffffffffffffffff811115613bed57613bec614d73565b5b613bf987828801613725565b91505092959194509250565b600060208284031215613c1b57613c1a614d78565b5b600082013567ffffffffffffffff811115613c3957613c38614d73565b5b613c4584828501613675565b91505092915050565b60008060408385031215613c6557613c64614d78565b5b600083013567ffffffffffffffff811115613c8357613c82614d73565b5b613c8f85828601613675565b925050602083013567ffffffffffffffff811115613cb057613caf614d73565b5b613cbc858286016136a3565b9150509250929050565b600060208284031215613cdc57613cdb614d78565b5b6000613cea848285016136e6565b91505092915050565b60008060408385031215613d0a57613d09614d78565b5b6000613d18858286016136e6565b9250506020613d2985828601613660565b9150509250929050565b60008060408385031215613d4a57613d49614d78565b5b6000613d58858286016136e6565b9250506020613d6985828601613781565b9150509250929050565b600060208284031215613d8957613d88614d78565b5b6000613d97848285016136fb565b91505092915050565b600060208284031215613db657613db5614d78565b5b6000613dc484828501613710565b91505092915050565b600060208284031215613de357613de2614d78565b5b600082013567ffffffffffffffff811115613e0157613e00614d73565b5b613e0d84828501613753565b91505092915050565b600060208284031215613e2c57613e2b614d78565b5b6000613e3a84828501613781565b91505092915050565b6000613e4f8383613e73565b60208301905092915050565b6000613e67838361431f565b60208301905092915050565b613e7c81614aaf565b82525050565b613e8b81614aaf565b82525050565b6000613e9c82614936565b613ea6818561497c565b9350613eb183614916565b8060005b83811015613ee2578151613ec98882613e43565b9750613ed483614962565b925050600181019050613eb5565b5085935050505092915050565b6000613efa82614941565b613f04818561498d565b9350613f0f83614926565b8060005b83811015613f40578151613f278882613e5b565b9750613f328361496f565b925050600181019050613f13565b5085935050505092915050565b613f5681614ac1565b82525050565b613f6581614acd565b82525050565b6000613f768261494c565b613f80818561499e565b9350613f90818560208601614b4e565b613f9981614d7d565b840191505092915050565b613fad81614b2d565b82525050565b6000613fbe82614957565b613fc881856149af565b9350613fd8818560208601614b4e565b613fe181614d7d565b840191505092915050565b6000613ff782614957565b61400181856149c0565b9350614011818560208601614b4e565b80840191505092915050565b600061402a6034836149af565b915061403582614d9b565b604082019050919050565b600061404d602f836149af565b915061405882614dea565b604082019050919050565b60006140706020836149af565b915061407b82614e39565b602082019050919050565b60006140936028836149af565b915061409e82614e62565b604082019050919050565b60006140b66014836149af565b91506140c182614eb1565b602082019050919050565b60006140d96024836149af565b91506140e482614eda565b604082019050919050565b60006140fc602c836149af565b915061410782614f29565b604082019050919050565b600061411f602a836149af565b915061412a82614f78565b604082019050919050565b60006141426010836149af565b915061414d82614fc7565b602082019050919050565b60006141656025836149af565b915061417082614ff0565b604082019050919050565b60006141886023836149af565b91506141938261503f565b604082019050919050565b60006141ab6038836149af565b91506141b68261508e565b604082019050919050565b60006141ce602a836149af565b91506141d9826150dd565b604082019050919050565b60006141f1603b836149af565b91506141fc8261512c565b604082019050919050565b60006142146039836149af565b915061421f8261517b565b604082019050919050565b60006142376017836149c0565b9150614242826151ca565b601782019050919050565b600061425a6029836149af565b9150614265826151f3565b604082019050919050565b600061427d6029836149af565b915061428882615242565b604082019050919050565b60006142a06028836149af565b91506142ab82615291565b604082019050919050565b60006142c36021836149af565b91506142ce826152e0565b604082019050919050565b60006142e66011836149c0565b91506142f18261532f565b601182019050919050565b6000614309602f836149af565b915061431482615358565b604082019050919050565b61432881614b23565b82525050565b61433781614b23565b82525050565b60006143488261422a565b91506143548285613fec565b915061435f826142d9565b915061436b8284613fec565b91508190509392505050565b600060208201905061438c6000830184613e82565b92915050565b600060a0820190506143a76000830188613e82565b6143b46020830187613e82565b81810360408301526143c68186613eef565b905081810360608301526143da8185613eef565b905081810360808301526143ee8184613f6b565b90509695505050505050565b600060a08201905061440f6000830188613e82565b61441c6020830187613e82565b614429604083018661432e565b614436606083018561432e565b81810360808301526144488184613f6b565b90509695505050505050565b60006080820190506144696000830187613e82565b614476602083018661432e565b6144836040830185613fa4565b81810360608301526144958184613f6b565b905095945050505050565b600060208201905081810360008301526144ba8184613e91565b905092915050565b600060208201905081810360008301526144dc8184613eef565b905092915050565b600060408201905081810360008301526144fe8185613eef565b905081810360208301526145128184613eef565b90509392505050565b60006020820190506145306000830184613f4d565b92915050565b600060208201905061454b6000830184613f5c565b92915050565b6000602082019050818103600083015261456b8184613fb3565b905092915050565b6000602082019050818103600083015261458c8161401d565b9050919050565b600060208201905081810360008301526145ac81614040565b9050919050565b600060208201905081810360008301526145cc81614063565b9050919050565b600060208201905081810360008301526145ec81614086565b9050919050565b6000602082019050818103600083015261460c816140a9565b9050919050565b6000602082019050818103600083015261462c816140cc565b9050919050565b6000602082019050818103600083015261464c816140ef565b9050919050565b6000602082019050818103600083015261466c81614112565b9050919050565b6000602082019050818103600083015261468c81614135565b9050919050565b600060208201905081810360008301526146ac81614158565b9050919050565b600060208201905081810360008301526146cc8161417b565b9050919050565b600060208201905081810360008301526146ec8161419e565b9050919050565b6000602082019050818103600083015261470c816141c1565b9050919050565b6000602082019050818103600083015261472c816141e4565b9050919050565b6000602082019050818103600083015261474c81614207565b9050919050565b6000602082019050818103600083015261476c8161424d565b9050919050565b6000602082019050818103600083015261478c81614270565b9050919050565b600060208201905081810360008301526147ac81614293565b9050919050565b600060208201905081810360008301526147cc816142b6565b9050919050565b600060208201905081810360008301526147ec816142fc565b9050919050565b6000602082019050614808600083018461432e565b92915050565b6000604082019050614823600083018561432e565b614830602083018461432e565b9392505050565b6000614841614852565b905061484d8282614bdd565b919050565b6000604051905090565b600067ffffffffffffffff82111561487757614876614d13565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148a3576148a2614d13565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148cf576148ce614d13565b5b6148d882614d7d565b9050602081019050919050565b600067ffffffffffffffff821115614900576148ff614d13565b5b61490982614d7d565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006149d682614b23565b91506149e183614b23565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a1657614a15614c57565b5b828201905092915050565b6000614a2c82614b23565b9150614a3783614b23565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a7057614a6f614c57565b5b828202905092915050565b6000614a8682614b23565b9150614a9183614b23565b925082821015614aa457614aa3614c57565b5b828203905092915050565b6000614aba82614b03565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614b3882614b23565b9050919050565b82818337600083830152505050565b60005b83811015614b6c578082015181840152602081019050614b51565b83811115614b7b576000848401525b50505050565b6000614b8c82614b23565b91506000821415614ba057614b9f614c57565b5b600182039050919050565b60006002820490506001821680614bc357607f821691505b60208210811415614bd757614bd6614c86565b5b50919050565b614be682614d7d565b810181811067ffffffffffffffff82111715614c0557614c04614d13565b5b80604052505050565b6000614c1982614b23565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c4c57614c4b614c57565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614d615760046000803e614d5e600051614d8e565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135355061757361626c653a20746f6b656e207472616e736665722060008201527f7768696c65207061757365640000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135355072657365744d696e7465725061757365723a206d7573742060008201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f455243313135355072657365744d696e7465725061757365723a206d7573742060008201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b7f455243313135355072657365744d696e7465725061757365723a206d7573742060008201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600060443d10156153b75761543a565b6153bf614852565b60043d036004823e80513d602482011167ffffffffffffffff821117156153e757505061543a565b808201805167ffffffffffffffff811115615405575050505061543a565b80602083010160043d03850181111561542257505050505061543a565b61543182602001850186614bdd565b82955050505050505b90565b61544681614aaf565b811461545157600080fd5b50565b61545d81614ac1565b811461546857600080fd5b50565b61547481614acd565b811461547f57600080fd5b50565b61548b81614ad7565b811461549657600080fd5b50565b6154a281614b23565b81146154ad57600080fd5b5056fea2646970667358221220a3ee0f1babc769bf5ce29ba624c30970f87befc4ff0a775da3c6431bd4352c5464736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c80638456cb591161011a578063c197436f116100ad578063e63ab1e91161007c578063e63ab1e914610595578063e985e9c5146105b3578063ed66aa1b146105e3578063f242432a14610601578063f5298aca1461061d576101fa565b8063c197436f1461050f578063ca15c8731461052b578063d53913931461055b578063d547741f14610579576101fa565b8063a22cb465116100e9578063a22cb46514610489578063a9a3a391146104a5578063b0ce739d146104c1578063b17a747c146104f1576101fa565b80638456cb59146104015780639010d07c1461040b57806391d148541461043b578063a217fddf1461046b576101fa565b80632f2ff15d116101925780634e1273f4116101615780634e1273f41461037b5780635c975abb146103ab5780636b20c454146103c9578063731133e9146103e5576101fa565b80632f2ff15d1461032f578063338eeacb1461034b57806336568abe146103555780633f4ba83a14610371576101fa565b80631f7fdffa116101ce5780631f7fdffa146102ab578063248a9ca3146102c75780632d581e71146102f75780632eb2c2d614610313576101fa565b8062fdd58e146101ff57806301ffc9a71461022f57806302fe53051461025f5780630e89341c1461027b575b600080fd5b61021960048036038101906102149190613aef565b610639565b60405161022691906147f3565b60405180910390f35b61024960048036038101906102449190613d73565b610703565b604051610256919061451b565b60405180910390f35b61027960048036038101906102749190613dcd565b610715565b005b61029560048036038101906102909190613e16565b610791565b6040516102a29190614551565b60405180910390f35b6102c560048036038101906102c091906139f4565b610825565b005b6102e160048036038101906102dc9190613cc6565b6108a7565b6040516102ee9190614536565b60405180910390f35b610311600480360381019061030c9190613796565b6108c6565b005b61032d60048036038101906103289190613803565b61092c565b005b61034960048036038101906103449190613cf3565b6109cd565b005b6103536109ee565b005b61036f600480360381019061036a9190613cf3565b6109fe565b005b610379610a81565b005b61039560048036038101906103909190613c4e565b610afb565b6040516103a291906144c2565b60405180910390f35b6103b3610c14565b6040516103c0919061451b565b60405180910390f35b6103e360048036038101906103de9190613969565b610c2b565b005b6103ff60048036038101906103fa9190613b82565b610cc8565b005b610409610d4a565b005b61042560048036038101906104209190613d33565b610dc4565b6040516104329190614377565b60405180910390f35b61045560048036038101906104509190613cf3565b610df3565b604051610462919061451b565b60405180910390f35b610473610e5d565b6040516104809190614536565b60405180910390f35b6104a3600480360381019061049e9190613aaf565b610e64565b005b6104bf60048036038101906104ba9190613c05565b610e7a565b005b6104db60048036038101906104d69190613e16565b610f1a565b6040516104e89190614377565b60405180910390f35b6104f9610f59565b6040516105069190614377565b60405180910390f35b61052960048036038101906105249190613796565b610f7f565b005b61054560048036038101906105409190613cc6565b610fc3565b60405161055291906147f3565b60405180910390f35b610563610fe7565b6040516105709190614536565b60405180910390f35b610593600480360381019061058e9190613cf3565b61100b565b005b61059d61102c565b6040516105aa9190614536565b60405180910390f35b6105cd60048036038101906105c891906137c3565b611050565b6040516105da919061451b565b60405180910390f35b6105eb6110e4565b6040516105f891906144a0565b60405180910390f35b61061b600480360381019061061691906138d2565b611172565b005b61063760048036038101906106329190613b2f565b611213565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a190614653565b60405180910390fd5b6002600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061070e826113c0565b9050919050565b6107467f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66107416114a2565b610df3565b610785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077c906146d3565b60405180910390fd5b61078e816114aa565b50565b6060600480546107a090614bab565b80601f01602080910402602001604051908101604052809291908181526020018280546107cc90614bab565b80156108195780601f106107ee57610100808354040283529160200191610819565b820191906000526020600020905b8154815290600101906020018083116107fc57829003601f168201915b50505050509050919050565b6108567f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66108516114a2565b610df3565b610895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088c906146d3565b60405180910390fd5b6108a1848484846114c4565b50505050565b6000806000838152602001908152602001600020600101549050919050565b6006819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109346114a2565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061097a5750610979856109746114a2565b611050565b5b6109b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b090614593565b60405180910390fd5b6109c685858585856116f2565b5050505050565b6109d6826108a7565b6109df81611a17565b6109e98383611a2b565b505050565b600660006109fc9190613438565b565b610a066114a2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6a906147d3565b60405180910390fd5b610a7d8282611a5f565b5050565b610ab27f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610aad6114a2565b610df3565b610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890614713565b60405180910390fd5b610af9611a93565b565b60608151835114610b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3890614773565b60405180910390fd5b6000835167ffffffffffffffff811115610b5e57610b5d614d13565b5b604051908082528060200260200182016040528015610b8c5781602001602082028036833780820191505090505b50905060005b8451811015610c0957610bd9858281518110610bb157610bb0614ce4565b5b6020026020010151858381518110610bcc57610bcb614ce4565b5b6020026020010151610639565b828281518110610bec57610beb614ce4565b5b60200260200101818152505080610c0290614c0e565b9050610b92565b508091505092915050565b6000600560009054906101000a900460ff16905090565b610c336114a2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610c795750610c7883610c736114a2565b611050565b5b610cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610caf90614593565b60405180910390fd5b610cc3838383611af6565b505050565b610cf97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610cf46114a2565b610df3565b610d38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2f906146d3565b60405180910390fd5b610d4484848484611dc7565b50505050565b610d7b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610d766114a2565b610df3565b610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190614733565b60405180910390fd5b610dc2611f79565b565b6000610deb8260016000868152602001908152602001600020611fdc90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000801b81565b610e76610e6f6114a2565b8383611ff6565b5050565b60005b8151811015610f16576006828281518110610e9b57610e9a614ce4565b5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080610f0e90614c0e565b915050610e7d565b5050565b60068181548110610f2a57600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610fe060016000848152602001908152602001600020612163565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611014826108a7565b61101d81611a17565b6110278383611a5f565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600680548060200260200160405190810160405280929190818152602001828054801561116857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161111e575b5050505050905090565b61117a6114a2565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806111c057506111bf856111ba6114a2565b611050565b5b6111ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f690614593565b60405180910390fd5b61120c8585858585612178565b5050505050565b61121b6114a2565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061126157506112608361125b6114a2565b611050565b5b6112a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129790614593565b60405180910390fd5b6112ab838383612417565b505050565b6112ba8282610df3565b61138c57600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506113316114a2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006113b8836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612660565b905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061148b57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061149b575061149a826126d0565b5b9050919050565b600033905090565b80600490805190602001906114c0929190613459565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152b906147b3565b60405180910390fd5b8151835114611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f90614793565b60405180910390fd5b60006115826114a2565b90506115938160008787878761274a565b60005b845181101561164d578381815181106115b2576115b1614ce4565b5b6020026020010151600260008784815181106115d1576115d0614ce4565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461163391906149cb565b92505081905550808061164590614c0e565b915050611596565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516116c59291906144e4565b60405180910390a46116dc8160008787878761288b565b6116eb81600087878787612893565b5050505050565b8151835114611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d90614793565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156117a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179d90614693565b60405180910390fd5b60006117b06114a2565b90506117c081878787878761274a565b60005b84518110156119745760008582815181106117e1576117e0614ce4565b5b602002602001015190506000858381518110611800576117ff614ce4565b5b6020026020010151905060006002600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156118a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611899906146f3565b60405180910390fd5b8181036002600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461195991906149cb565b925050819055505050508061196d90614c0e565b90506117c3565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516119eb9291906144e4565b60405180910390a4611a0181878787878761288b565b611a0f818787878787612893565b505050505050565b611a2881611a236114a2565b612a7a565b50565b611a3582826112b0565b611a5a816001600085815260200190815260200160002061139090919063ffffffff16565b505050565b611a698282612b17565b611a8e8160016000858152602001908152602001600020612bf890919063ffffffff16565b505050565b611a9b612c28565b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611adf6114a2565b604051611aec9190614377565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5d906146b3565b60405180910390fd5b8051825114611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190614793565b60405180910390fd5b6000611bb46114a2565b9050611bd48185600086866040518060200160405280600081525061274a565b60005b8351811015611d23576000848281518110611bf557611bf4614ce4565b5b602002602001015190506000848381518110611c1457611c13614ce4565b5b6020026020010151905060006002600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cad90614613565b60405180910390fd5b8181036002600085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611d1b90614c0e565b915050611bd7565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611d9b9291906144e4565b60405180910390a4611dc18185600086866040518060200160405280600081525061288b565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e906147b3565b60405180910390fd5b6000611e416114a2565b90506000611e4e85612c71565b90506000611e5b85612c71565b9050611e6c8360008985858961274a565b846002600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ecc91906149cb565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611f4a92919061480e565b60405180910390a4611f618360008985858961288b565b611f7083600089898989612ceb565b50505050505050565b611f81612ed2565b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fc56114a2565b604051611fd29190614377565b60405180910390a1565b6000611feb8360000183612f1c565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612065576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205c90614753565b60405180910390fd5b80600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612156919061451b565b60405180910390a3505050565b600061217182600001612f47565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df90614693565b60405180910390fd5b60006121f26114a2565b905060006121ff85612c71565b9050600061220c85612c71565b905061221c83898985858961274a565b60006002600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156122b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ab906146f3565b60405180910390fd5b8581036002600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856002600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461236b91906149cb565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516123e892919061480e565b60405180910390a46123fe848a8a86868a61288b565b61240c848a8a8a8a8a612ceb565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247e906146b3565b60405180910390fd5b60006124916114a2565b9050600061249e84612c71565b905060006124ab84612c71565b90506124cb8387600085856040518060200160405280600081525061274a565b60006002600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015612563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255a90614613565b60405180910390fd5b8481036002600088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62898960405161263192919061480e565b60405180910390a46126578488600086866040518060200160405280600081525061288b565b50505050505050565b600061266c8383612f58565b6126c55782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506126ca565b600090505b92915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612743575061274282612f7b565b5b9050919050565b60005b60068054905081101561287457600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663731133e9600683815481106127ac576127ab614ce4565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360016040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152506040518563ffffffff1660e01b815260040161282f9493929190614454565b600060405180830381600087803b15801561284957600080fd5b505af115801561285d573d6000803e3d6000fd5b50505050808061286c90614c0e565b91505061274d565b50612883868686868686612ff5565b505050505050565b505050505050565b6128b28473ffffffffffffffffffffffffffffffffffffffff16613053565b15612a72578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016128f8959493929190614392565b602060405180830381600087803b15801561291257600080fd5b505af192505050801561294357506040513d601f19601f820116820180604052508101906129409190613da0565b60015b6129e95761294f614d42565b806308c379a014156129ac57506129646153a7565b8061296f57506129ae565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a39190614551565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e090614573565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612a70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a67906145d3565b60405180910390fd5b505b505050505050565b612a848282610df3565b612b1357612aa98173ffffffffffffffffffffffffffffffffffffffff166014613076565b612ab78360001c6020613076565b604051602001612ac892919061433d565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0a9190614551565b60405180910390fd5b5050565b612b218282610df3565b15612bf457600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612b996114a2565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612c20836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6132b2565b905092915050565b612c30610c14565b612c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c66906145f3565b60405180910390fd5b565b60606000600167ffffffffffffffff811115612c9057612c8f614d13565b5b604051908082528060200260200182016040528015612cbe5781602001602082028036833780820191505090505b5090508281600081518110612cd657612cd5614ce4565b5b60200260200101818152505080915050919050565b612d0a8473ffffffffffffffffffffffffffffffffffffffff16613053565b15612eca578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612d509594939291906143fa565b602060405180830381600087803b158015612d6a57600080fd5b505af1925050508015612d9b57506040513d601f19601f82011682018060405250810190612d989190613da0565b60015b612e4157612da7614d42565b806308c379a01415612e045750612dbc6153a7565b80612dc75750612e06565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfb9190614551565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e3890614573565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ebf906145d3565b60405180910390fd5b505b505050505050565b612eda610c14565b15612f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1190614673565b60405180910390fd5b565b6000826000018281548110612f3457612f33614ce4565b5b9060005260206000200154905092915050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fee5750612fed826133c6565b5b9050919050565b613003868686868686613430565b61300b610c14565b1561304b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304290614633565b60405180910390fd5b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060600060028360026130899190614a21565b61309391906149cb565b67ffffffffffffffff8111156130ac576130ab614d13565b5b6040519080825280601f01601f1916602001820160405280156130de5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061311657613115614ce4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061317a57613179614ce4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026131ba9190614a21565b6131c491906149cb565b90505b6001811115613264577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061320657613205614ce4565b5b1a60f81b82828151811061321d5761321c614ce4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061325d90614b81565b90506131c7565b50600084146132a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329f906145b3565b60405180910390fd5b8091505092915050565b600080836001016000848152602001908152602001600020549050600081146133ba5760006001826132e49190614a7b565b90506000600186600001805490506132fc9190614a7b565b905081811461336b57600086600001828154811061331d5761331c614ce4565b5b906000526020600020015490508087600001848154811061334157613340614ce4565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061337f5761337e614cb5565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506133c0565b60009150505b92915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050505050565b508054600082559060005260206000209081019061345691906134df565b50565b82805461346590614bab565b90600052602060002090601f01602090048101928261348757600085556134ce565b82601f106134a057805160ff19168380011785556134ce565b828001600101855582156134ce579182015b828111156134cd5782518255916020019190600101906134b2565b5b5090506134db91906134df565b5090565b5b808211156134f85760008160009055506001016134e0565b5090565b600061350f61350a8461485c565b614837565b9050808382526020820190508285602086028201111561353257613531614d69565b5b60005b8581101561356257816135488882613660565b845260208401935060208301925050600181019050613535565b5050509392505050565b600061357f61357a84614888565b614837565b905080838252602082019050828560208602820111156135a2576135a1614d69565b5b60005b858110156135d257816135b88882613781565b8452602084019350602083019250506001810190506135a5565b5050509392505050565b60006135ef6135ea846148b4565b614837565b90508281526020810184848401111561360b5761360a614d6e565b5b613616848285614b3f565b509392505050565b600061363161362c846148e5565b614837565b90508281526020810184848401111561364d5761364c614d6e565b5b613658848285614b3f565b509392505050565b60008135905061366f8161543d565b92915050565b600082601f83011261368a57613689614d64565b5b813561369a8482602086016134fc565b91505092915050565b600082601f8301126136b8576136b7614d64565b5b81356136c884826020860161356c565b91505092915050565b6000813590506136e081615454565b92915050565b6000813590506136f58161546b565b92915050565b60008135905061370a81615482565b92915050565b60008151905061371f81615482565b92915050565b600082601f83011261373a57613739614d64565b5b813561374a8482602086016135dc565b91505092915050565b600082601f83011261376857613767614d64565b5b813561377884826020860161361e565b91505092915050565b60008135905061379081615499565b92915050565b6000602082840312156137ac576137ab614d78565b5b60006137ba84828501613660565b91505092915050565b600080604083850312156137da576137d9614d78565b5b60006137e885828601613660565b92505060206137f985828601613660565b9150509250929050565b600080600080600060a0868803121561381f5761381e614d78565b5b600061382d88828901613660565b955050602061383e88828901613660565b945050604086013567ffffffffffffffff81111561385f5761385e614d73565b5b61386b888289016136a3565b935050606086013567ffffffffffffffff81111561388c5761388b614d73565b5b613898888289016136a3565b925050608086013567ffffffffffffffff8111156138b9576138b8614d73565b5b6138c588828901613725565b9150509295509295909350565b600080600080600060a086880312156138ee576138ed614d78565b5b60006138fc88828901613660565b955050602061390d88828901613660565b945050604061391e88828901613781565b935050606061392f88828901613781565b925050608086013567ffffffffffffffff8111156139505761394f614d73565b5b61395c88828901613725565b9150509295509295909350565b60008060006060848603121561398257613981614d78565b5b600061399086828701613660565b935050602084013567ffffffffffffffff8111156139b1576139b0614d73565b5b6139bd868287016136a3565b925050604084013567ffffffffffffffff8111156139de576139dd614d73565b5b6139ea868287016136a3565b9150509250925092565b60008060008060808587031215613a0e57613a0d614d78565b5b6000613a1c87828801613660565b945050602085013567ffffffffffffffff811115613a3d57613a3c614d73565b5b613a49878288016136a3565b935050604085013567ffffffffffffffff811115613a6a57613a69614d73565b5b613a76878288016136a3565b925050606085013567ffffffffffffffff811115613a9757613a96614d73565b5b613aa387828801613725565b91505092959194509250565b60008060408385031215613ac657613ac5614d78565b5b6000613ad485828601613660565b9250506020613ae5858286016136d1565b9150509250929050565b60008060408385031215613b0657613b05614d78565b5b6000613b1485828601613660565b9250506020613b2585828601613781565b9150509250929050565b600080600060608486031215613b4857613b47614d78565b5b6000613b5686828701613660565b9350506020613b6786828701613781565b9250506040613b7886828701613781565b9150509250925092565b60008060008060808587031215613b9c57613b9b614d78565b5b6000613baa87828801613660565b9450506020613bbb87828801613781565b9350506040613bcc87828801613781565b925050606085013567ffffffffffffffff811115613bed57613bec614d73565b5b613bf987828801613725565b91505092959194509250565b600060208284031215613c1b57613c1a614d78565b5b600082013567ffffffffffffffff811115613c3957613c38614d73565b5b613c4584828501613675565b91505092915050565b60008060408385031215613c6557613c64614d78565b5b600083013567ffffffffffffffff811115613c8357613c82614d73565b5b613c8f85828601613675565b925050602083013567ffffffffffffffff811115613cb057613caf614d73565b5b613cbc858286016136a3565b9150509250929050565b600060208284031215613cdc57613cdb614d78565b5b6000613cea848285016136e6565b91505092915050565b60008060408385031215613d0a57613d09614d78565b5b6000613d18858286016136e6565b9250506020613d2985828601613660565b9150509250929050565b60008060408385031215613d4a57613d49614d78565b5b6000613d58858286016136e6565b9250506020613d6985828601613781565b9150509250929050565b600060208284031215613d8957613d88614d78565b5b6000613d97848285016136fb565b91505092915050565b600060208284031215613db657613db5614d78565b5b6000613dc484828501613710565b91505092915050565b600060208284031215613de357613de2614d78565b5b600082013567ffffffffffffffff811115613e0157613e00614d73565b5b613e0d84828501613753565b91505092915050565b600060208284031215613e2c57613e2b614d78565b5b6000613e3a84828501613781565b91505092915050565b6000613e4f8383613e73565b60208301905092915050565b6000613e67838361431f565b60208301905092915050565b613e7c81614aaf565b82525050565b613e8b81614aaf565b82525050565b6000613e9c82614936565b613ea6818561497c565b9350613eb183614916565b8060005b83811015613ee2578151613ec98882613e43565b9750613ed483614962565b925050600181019050613eb5565b5085935050505092915050565b6000613efa82614941565b613f04818561498d565b9350613f0f83614926565b8060005b83811015613f40578151613f278882613e5b565b9750613f328361496f565b925050600181019050613f13565b5085935050505092915050565b613f5681614ac1565b82525050565b613f6581614acd565b82525050565b6000613f768261494c565b613f80818561499e565b9350613f90818560208601614b4e565b613f9981614d7d565b840191505092915050565b613fad81614b2d565b82525050565b6000613fbe82614957565b613fc881856149af565b9350613fd8818560208601614b4e565b613fe181614d7d565b840191505092915050565b6000613ff782614957565b61400181856149c0565b9350614011818560208601614b4e565b80840191505092915050565b600061402a6034836149af565b915061403582614d9b565b604082019050919050565b600061404d602f836149af565b915061405882614dea565b604082019050919050565b60006140706020836149af565b915061407b82614e39565b602082019050919050565b60006140936028836149af565b915061409e82614e62565b604082019050919050565b60006140b66014836149af565b91506140c182614eb1565b602082019050919050565b60006140d96024836149af565b91506140e482614eda565b604082019050919050565b60006140fc602c836149af565b915061410782614f29565b604082019050919050565b600061411f602a836149af565b915061412a82614f78565b604082019050919050565b60006141426010836149af565b915061414d82614fc7565b602082019050919050565b60006141656025836149af565b915061417082614ff0565b604082019050919050565b60006141886023836149af565b91506141938261503f565b604082019050919050565b60006141ab6038836149af565b91506141b68261508e565b604082019050919050565b60006141ce602a836149af565b91506141d9826150dd565b604082019050919050565b60006141f1603b836149af565b91506141fc8261512c565b604082019050919050565b60006142146039836149af565b915061421f8261517b565b604082019050919050565b60006142376017836149c0565b9150614242826151ca565b601782019050919050565b600061425a6029836149af565b9150614265826151f3565b604082019050919050565b600061427d6029836149af565b915061428882615242565b604082019050919050565b60006142a06028836149af565b91506142ab82615291565b604082019050919050565b60006142c36021836149af565b91506142ce826152e0565b604082019050919050565b60006142e66011836149c0565b91506142f18261532f565b601182019050919050565b6000614309602f836149af565b915061431482615358565b604082019050919050565b61432881614b23565b82525050565b61433781614b23565b82525050565b60006143488261422a565b91506143548285613fec565b915061435f826142d9565b915061436b8284613fec565b91508190509392505050565b600060208201905061438c6000830184613e82565b92915050565b600060a0820190506143a76000830188613e82565b6143b46020830187613e82565b81810360408301526143c68186613eef565b905081810360608301526143da8185613eef565b905081810360808301526143ee8184613f6b565b90509695505050505050565b600060a08201905061440f6000830188613e82565b61441c6020830187613e82565b614429604083018661432e565b614436606083018561432e565b81810360808301526144488184613f6b565b90509695505050505050565b60006080820190506144696000830187613e82565b614476602083018661432e565b6144836040830185613fa4565b81810360608301526144958184613f6b565b905095945050505050565b600060208201905081810360008301526144ba8184613e91565b905092915050565b600060208201905081810360008301526144dc8184613eef565b905092915050565b600060408201905081810360008301526144fe8185613eef565b905081810360208301526145128184613eef565b90509392505050565b60006020820190506145306000830184613f4d565b92915050565b600060208201905061454b6000830184613f5c565b92915050565b6000602082019050818103600083015261456b8184613fb3565b905092915050565b6000602082019050818103600083015261458c8161401d565b9050919050565b600060208201905081810360008301526145ac81614040565b9050919050565b600060208201905081810360008301526145cc81614063565b9050919050565b600060208201905081810360008301526145ec81614086565b9050919050565b6000602082019050818103600083015261460c816140a9565b9050919050565b6000602082019050818103600083015261462c816140cc565b9050919050565b6000602082019050818103600083015261464c816140ef565b9050919050565b6000602082019050818103600083015261466c81614112565b9050919050565b6000602082019050818103600083015261468c81614135565b9050919050565b600060208201905081810360008301526146ac81614158565b9050919050565b600060208201905081810360008301526146cc8161417b565b9050919050565b600060208201905081810360008301526146ec8161419e565b9050919050565b6000602082019050818103600083015261470c816141c1565b9050919050565b6000602082019050818103600083015261472c816141e4565b9050919050565b6000602082019050818103600083015261474c81614207565b9050919050565b6000602082019050818103600083015261476c8161424d565b9050919050565b6000602082019050818103600083015261478c81614270565b9050919050565b600060208201905081810360008301526147ac81614293565b9050919050565b600060208201905081810360008301526147cc816142b6565b9050919050565b600060208201905081810360008301526147ec816142fc565b9050919050565b6000602082019050614808600083018461432e565b92915050565b6000604082019050614823600083018561432e565b614830602083018461432e565b9392505050565b6000614841614852565b905061484d8282614bdd565b919050565b6000604051905090565b600067ffffffffffffffff82111561487757614876614d13565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148a3576148a2614d13565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148cf576148ce614d13565b5b6148d882614d7d565b9050602081019050919050565b600067ffffffffffffffff821115614900576148ff614d13565b5b61490982614d7d565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006149d682614b23565b91506149e183614b23565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a1657614a15614c57565b5b828201905092915050565b6000614a2c82614b23565b9150614a3783614b23565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a7057614a6f614c57565b5b828202905092915050565b6000614a8682614b23565b9150614a9183614b23565b925082821015614aa457614aa3614c57565b5b828203905092915050565b6000614aba82614b03565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000614b3882614b23565b9050919050565b82818337600083830152505050565b60005b83811015614b6c578082015181840152602081019050614b51565b83811115614b7b576000848401525b50505050565b6000614b8c82614b23565b91506000821415614ba057614b9f614c57565b5b600182039050919050565b60006002820490506001821680614bc357607f821691505b60208210811415614bd757614bd6614c86565b5b50919050565b614be682614d7d565b810181811067ffffffffffffffff82111715614c0557614c04614d13565b5b80604052505050565b6000614c1982614b23565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c4c57614c4b614c57565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614d615760046000803e614d5e600051614d8e565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135355061757361626c653a20746f6b656e207472616e736665722060008201527f7768696c65207061757365640000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135355072657365744d696e7465725061757365723a206d7573742060008201527f68617665206d696e74657220726f6c6520746f206d696e740000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f455243313135355072657365744d696e7465725061757365723a206d7573742060008201527f686176652070617573657220726f6c6520746f20756e70617573650000000000602082015250565b7f455243313135355072657365744d696e7465725061757365723a206d7573742060008201527f686176652070617573657220726f6c6520746f20706175736500000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b600060443d10156153b75761543a565b6153bf614852565b60043d036004823e80513d602482011167ffffffffffffffff821117156153e757505061543a565b808201805167ffffffffffffffff811115615405575050505061543a565b80602083010160043d03850181111561542257505050505061543a565b61543182602001850186614bdd565b82955050505050505b90565b61544681614aaf565b811461545157600080fd5b50565b61545d81614ac1565b811461546857600080fd5b50565b61547481614acd565b811461547f57600080fd5b50565b61548b81614ad7565b811461549657600080fd5b50565b6154a281614b23565b81146154ad57600080fd5b5056fea2646970667358221220a3ee0f1babc769bf5ce29ba624c30970f87befc4ff0a775da3c6431bd4352c5464736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : uri (string):
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
72179:3294:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54133:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74477:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74742:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53877:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73732:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38357:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73070:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56077:439;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38798:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73526:81;;;:::i;:::-;;39942:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74279:186;;;:::i;:::-;;54529:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22463:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71558:359;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72743:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74087:180;;;:::i;:::-;;43595:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36817:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35922:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55126:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73328:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72439:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72474:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73184:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43922:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72293:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39238:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72364:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55353:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73619:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55593:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71223:327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54133:230;54219:7;54266:1;54247:21;;:7;:21;;;;54239:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54333:9;:13;54343:2;54333:13;;;;;;;;;;;:22;54347:7;54333:22;;;;;;;;;;;;;;;;54326:29;;54133:230;;;;:::o;74477:253::-;74651:4;74684:36;74708:11;74684:23;:36::i;:::-;74677:43;;74477:253;;;:::o;74742:201::-;74810:34;72331:24;74831:12;:10;:12::i;:::-;74810:7;:34::i;:::-;74802:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;74918:15;74926:6;74918:7;:15::i;:::-;74742:201;:::o;53877:105::-;53937:13;53970:4;53963:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53877:105;;;:::o;73732:343::-;73919:34;72331:24;73940:12;:10;:12::i;:::-;73919:7;:34::i;:::-;73911:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;74031:34;74042:2;74046:3;74051:7;74060:4;74031:10;:34::i;:::-;73732:343;;;;:::o;38357:131::-;38431:7;38458:6;:12;38465:4;38458:12;;;;;;;;;;;:22;;;38451:29;;38357:131;;;:::o;73070:102::-;73142:9;73157:4;73142:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73070:102;:::o;56077:439::-;56318:12;:10;:12::i;:::-;56310:20;;:4;:20;;;:60;;;;56334:36;56351:4;56357:12;:10;:12::i;:::-;56334:16;:36::i;:::-;56310:60;56288:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;56456:52;56479:4;56485:2;56489:3;56494:7;56503:4;56456:22;:52::i;:::-;56077:439;;;;;:::o;38798:147::-;38881:18;38894:4;38881:12;:18::i;:::-;36413:16;36424:4;36413:10;:16::i;:::-;38912:25:::1;38923:4;38929:7;38912:10;:25::i;:::-;38798:147:::0;;;:::o;73526:81::-;73588:9;;73581:16;;;;:::i;:::-;73526:81::o;39942:218::-;40049:12;:10;:12::i;:::-;40038:23;;:7;:23;;;40030:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;40126:26;40138:4;40144:7;40126:11;:26::i;:::-;39942:218;;:::o;74279:186::-;74334:34;72402:24;74355:12;:10;:12::i;:::-;74334:7;:34::i;:::-;74326:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;74445:10;:8;:10::i;:::-;74279:186::o;54529:524::-;54685:16;54746:3;:10;54727:8;:15;:29;54719:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;54815:30;54862:8;:15;54848:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54815:63;;54896:9;54891:122;54915:8;:15;54911:1;:19;54891:122;;;54971:30;54981:8;54990:1;54981:11;;;;;;;;:::i;:::-;;;;;;;;54994:3;54998:1;54994:6;;;;;;;;:::i;:::-;;;;;;;;54971:9;:30::i;:::-;54952:13;54966:1;54952:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;54932:3;;;;:::i;:::-;;;54891:122;;;;55032:13;55025:20;;;54529:524;;;;:::o;22463:86::-;22510:4;22534:7;;;;;;;;;;;22527:14;;22463:86;:::o;71558:359::-;71734:12;:10;:12::i;:::-;71723:23;;:7;:23;;;:66;;;;71750:39;71767:7;71776:12;:10;:12::i;:::-;71750:16;:39::i;:::-;71723:66;71701:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;71877:32;71888:7;71897:3;71902:6;71877:10;:32::i;:::-;71558:359;;;:::o;72743:311::-;72905:34;72331:24;72926:12;:10;:12::i;:::-;72905:7;:34::i;:::-;72897:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;73017:27;73023:2;73027;73031:6;73039:4;73017:5;:27::i;:::-;72743:311;;;;:::o;74087:180::-;74140:34;72402:24;74161:12;:10;:12::i;:::-;74140:7;:34::i;:::-;74132:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;74249:8;:6;:8::i;:::-;74087:180::o;43595:153::-;43685:7;43712:28;43734:5;43712:12;:18;43725:4;43712:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;43705:35;;43595:153;;;;:::o;36817:147::-;36903:4;36927:6;:12;36934:4;36927:12;;;;;;;;;;;:20;;:29;36948:7;36927:29;;;;;;;;;;;;;;;;;;;;;;;;;36920:36;;36817:147;;;;:::o;35922:49::-;35967:4;35922:49;;;:::o;55126:155::-;55221:52;55240:12;:10;:12::i;:::-;55254:8;55264;55221:18;:52::i;:::-;55126:155;;:::o;73328:186::-;73417:6;73412:93;73431:5;:12;73427:1;:16;73412:93;;;73467:9;73482:5;73488:1;73482:8;;;;;;;;:::i;:::-;;;;;;;;73467:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73445:3;;;;;:::i;:::-;;;;73412:93;;;;73328:186;:::o;72439:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72474:25::-;;;;;;;;;;;;;:::o;73184:124::-;73284:14;73271:10;;:27;;;;;;;;;;;;;;;;;;73184:124;:::o;43922:142::-;44002:7;44029:27;:12;:18;44042:4;44029:18;;;;;;;;;;;:25;:27::i;:::-;44022:34;;43922:142;;;:::o;72293:62::-;72331:24;72293:62;:::o;39238:149::-;39322:18;39335:4;39322:12;:18::i;:::-;36413:16;36424:4;36413:10;:16::i;:::-;39353:26:::1;39365:4;39371:7;39353:11;:26::i;:::-;39238:149:::0;;;:::o;72364:62::-;72402:24;72364:62;:::o;55353:168::-;55452:4;55476:18;:27;55495:7;55476:27;;;;;;;;;;;;;;;:37;55504:8;55476:37;;;;;;;;;;;;;;;;;;;;;;;;;55469:44;;55353:168;;;;:::o;73619:97::-;73660:16;73697:9;73690:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73619:97;:::o;55593:407::-;55809:12;:10;:12::i;:::-;55801:20;;:4;:20;;;:60;;;;55825:36;55842:4;55848:12;:10;:12::i;:::-;55825:16;:36::i;:::-;55801:60;55779:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;55947:45;55965:4;55971:2;55975;55979:6;55987:4;55947:17;:45::i;:::-;55593:407;;;;;:::o;71223:327::-;71374:12;:10;:12::i;:::-;71363:23;;:7;:23;;;:66;;;;71390:39;71407:7;71416:12;:10;:12::i;:::-;71390:16;:39::i;:::-;71363:66;71341:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;71517:25;71523:7;71532:2;71536:5;71517;:25::i;:::-;71223:327;;;:::o;41539:238::-;41623:22;41631:4;41637:7;41623;:22::i;:::-;41618:152;;41694:4;41662:6;:12;41669:4;41662:12;;;;;;;;;;;:20;;:29;41683:7;41662:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;41745:12;:10;:12::i;:::-;41718:40;;41736:7;41718:40;;41730:4;41718:40;;;;;;;;;;41618:152;41539:238;;:::o;8296:152::-;8366:4;8390:50;8395:3;:10;;8431:5;8415:23;;8407:32;;8390:4;:50::i;:::-;8383:57;;8296:152;;;;:::o;53156:310::-;53258:4;53310:26;53295:41;;;:11;:41;;;;:110;;;;53368:37;53353:52;;;:11;:52;;;;53295:110;:163;;;;53422:36;53446:11;53422:23;:36::i;:::-;53295:163;53275:183;;53156:310;;;:::o;20576:98::-;20629:7;20656:10;20649:17;;20576:98;:::o;60302:88::-;60376:6;60369:4;:13;;;;;;;;;;;;:::i;:::-;;60302:88;:::o;61908:813::-;62100:1;62086:16;;:2;:16;;;;62078:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;62173:7;:14;62159:3;:10;:28;62151:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;62245:16;62264:12;:10;:12::i;:::-;62245:31;;62289:66;62310:8;62328:1;62332:2;62336:3;62341:7;62350:4;62289:20;:66::i;:::-;62373:9;62368:103;62392:3;:10;62388:1;:14;62368:103;;;62449:7;62457:1;62449:10;;;;;;;;:::i;:::-;;;;;;;;62424:9;:17;62434:3;62438:1;62434:6;;;;;;;;:::i;:::-;;;;;;;;62424:17;;;;;;;;;;;:21;62442:2;62424:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;62404:3;;;;;:::i;:::-;;;;62368:103;;;;62524:2;62488:53;;62520:1;62488:53;;62502:8;62488:53;;;62528:3;62533:7;62488:53;;;;;;;:::i;:::-;;;;;;;;62554:65;62574:8;62592:1;62596:2;62600:3;62605:7;62614:4;62554:19;:65::i;:::-;62632:81;62668:8;62686:1;62690:2;62694:3;62699:7;62708:4;62632:35;:81::i;:::-;62067:654;61908:813;;;;:::o;58312:1146::-;58539:7;:14;58525:3;:10;:28;58517:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;58631:1;58617:16;;:2;:16;;;;58609:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;58688:16;58707:12;:10;:12::i;:::-;58688:31;;58732:60;58753:8;58763:4;58769:2;58773:3;58778:7;58787:4;58732:20;:60::i;:::-;58810:9;58805:421;58829:3;:10;58825:1;:14;58805:421;;;58861:10;58874:3;58878:1;58874:6;;;;;;;;:::i;:::-;;;;;;;;58861:19;;58895:14;58912:7;58920:1;58912:10;;;;;;;;:::i;:::-;;;;;;;;58895:27;;58939:19;58961:9;:13;58971:2;58961:13;;;;;;;;;;;:19;58975:4;58961:19;;;;;;;;;;;;;;;;58939:41;;59018:6;59003:11;:21;;58995:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;59151:6;59137:11;:20;59115:9;:13;59125:2;59115:13;;;;;;;;;;;:19;59129:4;59115:19;;;;;;;;;;;;;;;:42;;;;59208:6;59187:9;:13;59197:2;59187:13;;;;;;;;;;;:17;59201:2;59187:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;58846:380;;;58841:3;;;;:::i;:::-;;;58805:421;;;;59273:2;59243:47;;59267:4;59243:47;;59257:8;59243:47;;;59277:3;59282:7;59243:47;;;;;;;:::i;:::-;;;;;;;;59303:59;59323:8;59333:4;59339:2;59343:3;59348:7;59357:4;59303:19;:59::i;:::-;59375:75;59411:8;59421:4;59427:2;59431:3;59436:7;59445:4;59375:35;:75::i;:::-;58506:952;58312:1146;;;;;:::o;37268:105::-;37335:30;37346:4;37352:12;:10;:12::i;:::-;37335:10;:30::i;:::-;37268:105;:::o;44157:169::-;44245:31;44262:4;44268:7;44245:16;:31::i;:::-;44287;44310:7;44287:12;:18;44300:4;44287:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;44157:169;;:::o;44420:174::-;44509:32;44527:4;44533:7;44509:17;:32::i;:::-;44552:34;44578:7;44552:12;:18;44565:4;44552:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;44420:174;;:::o;23318:120::-;22327:16;:14;:16::i;:::-;23387:5:::1;23377:7;;:15;;;;;;;;;;;;;;;;;;23408:22;23417:12;:10;:12::i;:::-;23408:22;;;;;;:::i;:::-;;;;;;;;23318:120::o:0;64077:969::-;64245:1;64229:18;;:4;:18;;;;64221:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;64320:7;:14;64306:3;:10;:28;64298:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;64392:16;64411:12;:10;:12::i;:::-;64392:31;;64436:66;64457:8;64467:4;64481:1;64485:3;64490:7;64436:66;;;;;;;;;;;;:20;:66::i;:::-;64520:9;64515:373;64539:3;:10;64535:1;:14;64515:373;;;64571:10;64584:3;64588:1;64584:6;;;;;;;;:::i;:::-;;;;;;;;64571:19;;64605:14;64622:7;64630:1;64622:10;;;;;;;;:::i;:::-;;;;;;;;64605:27;;64649:19;64671:9;:13;64681:2;64671:13;;;;;;;;;;;:19;64685:4;64671:19;;;;;;;;;;;;;;;;64649:41;;64728:6;64713:11;:21;;64705:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;64855:6;64841:11;:20;64819:9;:13;64829:2;64819:13;;;;;;;;;;;:19;64833:4;64819:19;;;;;;;;;;;;;;;:42;;;;64556:332;;;64551:3;;;;;:::i;:::-;;;;64515:373;;;;64943:1;64905:55;;64929:4;64905:55;;64919:8;64905:55;;;64947:3;64952:7;64905:55;;;;;;;:::i;:::-;;;;;;;;64973:65;64993:8;65003:4;65017:1;65021:3;65026:7;64973:65;;;;;;;;;;;;:19;:65::i;:::-;64210:836;64077:969;;;:::o;60776:729::-;60943:1;60929:16;;:2;:16;;;;60921:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;60996:16;61015:12;:10;:12::i;:::-;60996:31;;61038:20;61061:21;61079:2;61061:17;:21::i;:::-;61038:44;;61093:24;61120:25;61138:6;61120:17;:25::i;:::-;61093:52;;61158:66;61179:8;61197:1;61201:2;61205:3;61210:7;61219:4;61158:20;:66::i;:::-;61258:6;61237:9;:13;61247:2;61237:13;;;;;;;;;;;:17;61251:2;61237:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;61317:2;61280:52;;61313:1;61280:52;;61295:8;61280:52;;;61321:2;61325:6;61280:52;;;;;;;:::i;:::-;;;;;;;;61345:65;61365:8;61383:1;61387:2;61391:3;61396:7;61405:4;61345:19;:65::i;:::-;61423:74;61454:8;61472:1;61476:2;61480;61484:6;61492:4;61423:30;:74::i;:::-;60910:595;;;60776:729;;;;:::o;23059:118::-;22068:19;:17;:19::i;:::-;23129:4:::1;23119:7;;:14;;;;;;;;;;;;;;;;;;23149:20;23156:12;:10;:12::i;:::-;23149:20;;;;;;:::i;:::-;;;;;;;;23059:118::o:0;9592:158::-;9666:7;9717:22;9721:3;:10;;9733:5;9717:3;:22::i;:::-;9709:31;;9686:56;;9592:158;;;;:::o;65189:331::-;65344:8;65335:17;;:5;:17;;;;65327:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;65447:8;65409:18;:25;65428:5;65409:25;;;;;;;;;;;;;;;:35;65435:8;65409:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;65493:8;65471:41;;65486:5;65471:41;;;65503:8;65471:41;;;;;;:::i;:::-;;;;;;;;65189:331;;;:::o;9121:117::-;9184:7;9211:19;9219:3;:10;;9211:7;:19::i;:::-;9204:26;;9121:117;;;:::o;56980:974::-;57182:1;57168:16;;:2;:16;;;;57160:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;57239:16;57258:12;:10;:12::i;:::-;57239:31;;57281:20;57304:21;57322:2;57304:17;:21::i;:::-;57281:44;;57336:24;57363:25;57381:6;57363:17;:25::i;:::-;57336:52;;57401:60;57422:8;57432:4;57438:2;57442:3;57447:7;57456:4;57401:20;:60::i;:::-;57474:19;57496:9;:13;57506:2;57496:13;;;;;;;;;;;:19;57510:4;57496:19;;;;;;;;;;;;;;;;57474:41;;57549:6;57534:11;:21;;57526:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;57674:6;57660:11;:20;57638:9;:13;57648:2;57638:13;;;;;;;;;;;:19;57652:4;57638:19;;;;;;;;;;;;;;;:42;;;;57723:6;57702:9;:13;57712:2;57702:13;;;;;;;;;;;:17;57716:2;57702:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;57778:2;57747:46;;57772:4;57747:46;;57762:8;57747:46;;;57782:2;57786:6;57747:46;;;;;;;:::i;:::-;;;;;;;;57806:59;57826:8;57836:4;57842:2;57846:3;57851:7;57860:4;57806:19;:59::i;:::-;57878:68;57909:8;57919:4;57925:2;57929;57933:6;57941:4;57878:30;:68::i;:::-;57149:805;;;;56980:974;;;;;:::o;63019:808::-;63162:1;63146:18;;:4;:18;;;;63138:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;63217:16;63236:12;:10;:12::i;:::-;63217:31;;63259:20;63282:21;63300:2;63282:17;:21::i;:::-;63259:44;;63314:24;63341:25;63359:6;63341:17;:25::i;:::-;63314:52;;63379:66;63400:8;63410:4;63424:1;63428:3;63433:7;63379:66;;;;;;;;;;;;:20;:66::i;:::-;63458:19;63480:9;:13;63490:2;63480:13;;;;;;;;;;;:19;63494:4;63480:19;;;;;;;;;;;;;;;;63458:41;;63533:6;63518:11;:21;;63510:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;63652:6;63638:11;:20;63616:9;:13;63626:2;63616:13;;;;;;;;;;;:19;63630:4;63616:19;;;;;;;;;;;;;;;:42;;;;63726:1;63687:54;;63712:4;63687:54;;63702:8;63687:54;;;63730:2;63734:6;63687:54;;;;;;;:::i;:::-;;;;;;;;63754:65;63774:8;63784:4;63798:1;63802:3;63807:7;63754:65;;;;;;;;;;;;:19;:65::i;:::-;63127:700;;;;63019:808;;;:::o;2211:414::-;2274:4;2296:21;2306:3;2311:5;2296:9;:21::i;:::-;2291:327;;2334:3;:11;;2351:5;2334:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2517:3;:11;;:18;;;;2495:3;:12;;:19;2508:5;2495:19;;;;;;;;;;;:40;;;;2557:4;2550:11;;;;2291:327;2601:5;2594:12;;2211:414;;;;;:::o;42782:214::-;42867:4;42906:42;42891:57;;;:11;:57;;;;:97;;;;42952:36;42976:11;42952:23;:36::i;:::-;42891:97;42884:104;;42782:214;;;:::o;74959:509::-;75249:6;75244:132;75263:9;:16;;;;75259:1;:20;75244:132;;;75311:10;;;;;;;;;;;75303:24;;;75328:9;75338:1;75328:12;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;75342:1;75345;75348:13;;;;;;;;;;;;;;;;;75303:59;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75281:3;;;;;:::i;:::-;;;;75244:132;;;;75392:66;75419:8;75429:4;75435:2;75439:3;75444:7;75453:4;75392:26;:66::i;:::-;74959:509;;;;;;:::o;67654:220::-;;;;;;;:::o;68634:813::-;68874:15;:2;:13;;;:15::i;:::-;68870:570;;;68927:2;68910:43;;;68954:8;68964:4;68970:3;68975:7;68984:4;68910:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;68906:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;69302:6;69295:14;;;;;;;;;;;:::i;:::-;;;;;;;;68906:523;;;69351:62;;;;;;;;;;:::i;:::-;;;;;;;;68906:523;69083:48;;;69071:60;;;:8;:60;;;;69067:159;;69156:50;;;;;;;;;;:::i;:::-;;;;;;;;69067:159;68990:251;68870:570;68634:813;;;;;;:::o;37663:505::-;37752:22;37760:4;37766:7;37752;:22::i;:::-;37747:414;;37940:41;37968:7;37940:41;;37978:2;37940:19;:41::i;:::-;38054:38;38082:4;38074:13;;38089:2;38054:19;:38::i;:::-;37845:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37791:358;;;;;;;;;;;:::i;:::-;;;;;;;;37747:414;37663:505;;:::o;41957:239::-;42041:22;42049:4;42055:7;42041;:22::i;:::-;42037:152;;;42112:5;42080:6;:12;42087:4;42080:12;;;;;;;;;;;:20;;:29;42101:7;42080:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;42164:12;:10;:12::i;:::-;42137:40;;42155:7;42137:40;;42149:4;42137:40;;;;;;;;;;42037:152;41957:239;;:::o;8624:158::-;8697:4;8721:53;8729:3;:10;;8765:5;8749:23;;8741:32;;8721:7;:53::i;:::-;8714:60;;8624:158;;;;:::o;22807:108::-;22874:8;:6;:8::i;:::-;22866:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;22807:108::o;69455:198::-;69521:16;69550:22;69589:1;69575:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69550:41;;69613:7;69602:5;69608:1;69602:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;69640:5;69633:12;;;69455:198;;;:::o;67882:744::-;68097:15;:2;:13;;;:15::i;:::-;68093:526;;;68150:2;68133:38;;;68172:8;68182:4;68188:2;68192:6;68200:4;68133:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;68129:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;68481:6;68474:14;;;;;;;;;;;:::i;:::-;;;;;;;;68129:479;;;68530:62;;;;;;;;;;:::i;:::-;;;;;;;;68129:479;68267:43;;;68255:55;;;:8;:55;;;;68251:154;;68335:50;;;;;;;;;;:::i;:::-;;;;;;;;68251:154;68206:214;68093:526;67882:744;;;;;;:::o;22622:108::-;22693:8;:6;:8::i;:::-;22692:9;22684:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;22622:108::o;4985:120::-;5052:7;5079:3;:11;;5091:5;5079:18;;;;;;;;:::i;:::-;;;;;;;;;;5072:25;;4985:120;;;;:::o;4522:109::-;4578:7;4605:3;:11;;:18;;;;4598:25;;4522:109;;;:::o;4307:129::-;4380:4;4427:1;4404:3;:12;;:19;4417:5;4404:19;;;;;;;;;;;;:24;;4397:31;;4307:129;;;;:::o;36521:204::-;36606:4;36645:32;36630:47;;;:11;:47;;;;:87;;;;36681:36;36705:11;36681:23;:36::i;:::-;36630:87;36623:94;;36521:204;;;:::o;70378:392::-;70617:66;70644:8;70654:4;70660:2;70664:3;70669:7;70678:4;70617:26;:66::i;:::-;70705:8;:6;:8::i;:::-;70704:9;70696:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;70378:392;;;;;;:::o;24678:326::-;24738:4;24995:1;24973:7;:19;;;:23;24966:30;;24678:326;;;:::o;14820:451::-;14895:13;14921:19;14966:1;14957:6;14953:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;14943:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14921:47;;14979:15;:6;14986:1;14979:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;15005;:6;15012:1;15005:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;15036:9;15061:1;15052:6;15048:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;15036:26;;15031:135;15068:1;15064;:5;15031:135;;;15103:12;15124:3;15116:5;:11;15103:25;;;;;;;:::i;:::-;;;;;15091:6;15098:1;15091:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;15153:1;15143:11;;;;;15071:3;;;;:::i;:::-;;;15031:135;;;;15193:1;15184:5;:10;15176:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;15256:6;15242:21;;;14820:451;;;;:::o;2801:1420::-;2867:4;2985:18;3006:3;:12;;:19;3019:5;3006:19;;;;;;;;;;;;2985:40;;3056:1;3042:10;:15;3038:1176;;3417:21;3454:1;3441:10;:14;;;;:::i;:::-;3417:38;;3470:17;3511:1;3490:3;:11;;:18;;;;:22;;;;:::i;:::-;3470:42;;3546:13;3533:9;:26;3529:405;;3580:17;3600:3;:11;;3612:9;3600:22;;;;;;;;:::i;:::-;;;;;;;;;;3580:42;;3754:9;3725:3;:11;;3737:13;3725:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3865:10;3839:3;:12;;:23;3852:9;3839:23;;;;;;;;;;;:36;;;;3561:373;3529:405;4015:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4110:3;:12;;:19;4123:5;4110:19;;;;;;;;;;;4103:26;;;4153:4;4146:11;;;;;;;3038:1176;4197:5;4190:12;;;2801:1420;;;;;:::o;33780:157::-;33865:4;33904:25;33889:40;;;:11;:40;;;;33882:47;;33780:157;;;:::o;66478:221::-;;;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:139::-;3447:5;3485:6;3472:20;3463:29;;3501:33;3528:5;3501:33;:::i;:::-;3401:139;;;;:::o;3546:137::-;3591:5;3629:6;3616:20;3607:29;;3645:32;3671:5;3645:32;:::i;:::-;3546:137;;;;:::o;3689:141::-;3745:5;3776:6;3770:13;3761:22;;3792:32;3818:5;3792:32;:::i;:::-;3689:141;;;;:::o;3849:338::-;3904:5;3953:3;3946:4;3938:6;3934:17;3930:27;3920:122;;3961:79;;:::i;:::-;3920:122;4078:6;4065:20;4103:78;4177:3;4169:6;4162:4;4154:6;4150:17;4103:78;:::i;:::-;4094:87;;3910:277;3849:338;;;;:::o;4207:340::-;4263:5;4312:3;4305:4;4297:6;4293:17;4289:27;4279:122;;4320:79;;:::i;:::-;4279:122;4437:6;4424:20;4462:79;4537:3;4529:6;4522:4;4514:6;4510:17;4462:79;:::i;:::-;4453:88;;4269:278;4207:340;;;;:::o;4553:139::-;4599:5;4637:6;4624:20;4615:29;;4653:33;4680:5;4653:33;:::i;:::-;4553:139;;;;:::o;4698:329::-;4757:6;4806:2;4794:9;4785:7;4781:23;4777:32;4774:119;;;4812:79;;:::i;:::-;4774:119;4932:1;4957:53;5002:7;4993:6;4982:9;4978:22;4957:53;:::i;:::-;4947:63;;4903:117;4698:329;;;;:::o;5033:474::-;5101:6;5109;5158:2;5146:9;5137:7;5133:23;5129:32;5126:119;;;5164:79;;:::i;:::-;5126:119;5284:1;5309:53;5354:7;5345:6;5334:9;5330:22;5309:53;:::i;:::-;5299:63;;5255:117;5411:2;5437:53;5482:7;5473:6;5462:9;5458:22;5437:53;:::i;:::-;5427:63;;5382:118;5033:474;;;;;:::o;5513:1509::-;5667:6;5675;5683;5691;5699;5748:3;5736:9;5727:7;5723:23;5719:33;5716:120;;;5755:79;;:::i;:::-;5716:120;5875:1;5900:53;5945:7;5936:6;5925:9;5921:22;5900:53;:::i;:::-;5890:63;;5846:117;6002:2;6028:53;6073:7;6064:6;6053:9;6049:22;6028:53;:::i;:::-;6018:63;;5973:118;6158:2;6147:9;6143:18;6130:32;6189:18;6181:6;6178:30;6175:117;;;6211:79;;:::i;:::-;6175:117;6316:78;6386:7;6377:6;6366:9;6362:22;6316:78;:::i;:::-;6306:88;;6101:303;6471:2;6460:9;6456:18;6443:32;6502:18;6494:6;6491:30;6488:117;;;6524:79;;:::i;:::-;6488:117;6629:78;6699:7;6690:6;6679:9;6675:22;6629:78;:::i;:::-;6619:88;;6414:303;6784:3;6773:9;6769:19;6756:33;6816:18;6808:6;6805:30;6802:117;;;6838:79;;:::i;:::-;6802:117;6943:62;6997:7;6988:6;6977:9;6973:22;6943:62;:::i;:::-;6933:72;;6727:288;5513:1509;;;;;;;;:::o;7028:1089::-;7132:6;7140;7148;7156;7164;7213:3;7201:9;7192:7;7188:23;7184:33;7181:120;;;7220:79;;:::i;:::-;7181:120;7340:1;7365:53;7410:7;7401:6;7390:9;7386:22;7365:53;:::i;:::-;7355:63;;7311:117;7467:2;7493:53;7538:7;7529:6;7518:9;7514:22;7493:53;:::i;:::-;7483:63;;7438:118;7595:2;7621:53;7666:7;7657:6;7646:9;7642:22;7621:53;:::i;:::-;7611:63;;7566:118;7723:2;7749:53;7794:7;7785:6;7774:9;7770:22;7749:53;:::i;:::-;7739:63;;7694:118;7879:3;7868:9;7864:19;7851:33;7911:18;7903:6;7900:30;7897:117;;;7933:79;;:::i;:::-;7897:117;8038:62;8092:7;8083:6;8072:9;8068:22;8038:62;:::i;:::-;8028:72;;7822:288;7028:1089;;;;;;;;:::o;8123:1039::-;8250:6;8258;8266;8315:2;8303:9;8294:7;8290:23;8286:32;8283:119;;;8321:79;;:::i;:::-;8283:119;8441:1;8466:53;8511:7;8502:6;8491:9;8487:22;8466:53;:::i;:::-;8456:63;;8412:117;8596:2;8585:9;8581:18;8568:32;8627:18;8619:6;8616:30;8613:117;;;8649:79;;:::i;:::-;8613:117;8754:78;8824:7;8815:6;8804:9;8800:22;8754:78;:::i;:::-;8744:88;;8539:303;8909:2;8898:9;8894:18;8881:32;8940:18;8932:6;8929:30;8926:117;;;8962:79;;:::i;:::-;8926:117;9067:78;9137:7;9128:6;9117:9;9113:22;9067:78;:::i;:::-;9057:88;;8852:303;8123:1039;;;;;:::o;9168:1363::-;9313:6;9321;9329;9337;9386:3;9374:9;9365:7;9361:23;9357:33;9354:120;;;9393:79;;:::i;:::-;9354:120;9513:1;9538:53;9583:7;9574:6;9563:9;9559:22;9538:53;:::i;:::-;9528:63;;9484:117;9668:2;9657:9;9653:18;9640:32;9699:18;9691:6;9688:30;9685:117;;;9721:79;;:::i;:::-;9685:117;9826:78;9896:7;9887:6;9876:9;9872:22;9826:78;:::i;:::-;9816:88;;9611:303;9981:2;9970:9;9966:18;9953:32;10012:18;10004:6;10001:30;9998:117;;;10034:79;;:::i;:::-;9998:117;10139:78;10209:7;10200:6;10189:9;10185:22;10139:78;:::i;:::-;10129:88;;9924:303;10294:2;10283:9;10279:18;10266:32;10325:18;10317:6;10314:30;10311:117;;;10347:79;;:::i;:::-;10311:117;10452:62;10506:7;10497:6;10486:9;10482:22;10452:62;:::i;:::-;10442:72;;10237:287;9168:1363;;;;;;;:::o;10537:468::-;10602:6;10610;10659:2;10647:9;10638:7;10634:23;10630:32;10627:119;;;10665:79;;:::i;:::-;10627:119;10785:1;10810:53;10855:7;10846:6;10835:9;10831:22;10810:53;:::i;:::-;10800:63;;10756:117;10912:2;10938:50;10980:7;10971:6;10960:9;10956:22;10938:50;:::i;:::-;10928:60;;10883:115;10537:468;;;;;:::o;11011:474::-;11079:6;11087;11136:2;11124:9;11115:7;11111:23;11107:32;11104:119;;;11142:79;;:::i;:::-;11104:119;11262:1;11287:53;11332:7;11323:6;11312:9;11308:22;11287:53;:::i;:::-;11277:63;;11233:117;11389:2;11415:53;11460:7;11451:6;11440:9;11436:22;11415:53;:::i;:::-;11405:63;;11360:118;11011:474;;;;;:::o;11491:619::-;11568:6;11576;11584;11633:2;11621:9;11612:7;11608:23;11604:32;11601:119;;;11639:79;;:::i;:::-;11601:119;11759:1;11784:53;11829:7;11820:6;11809:9;11805:22;11784:53;:::i;:::-;11774:63;;11730:117;11886:2;11912:53;11957:7;11948:6;11937:9;11933:22;11912:53;:::i;:::-;11902:63;;11857:118;12014:2;12040:53;12085:7;12076:6;12065:9;12061:22;12040:53;:::i;:::-;12030:63;;11985:118;11491:619;;;;;:::o;12116:943::-;12211:6;12219;12227;12235;12284:3;12272:9;12263:7;12259:23;12255:33;12252:120;;;12291:79;;:::i;:::-;12252:120;12411:1;12436:53;12481:7;12472:6;12461:9;12457:22;12436:53;:::i;:::-;12426:63;;12382:117;12538:2;12564:53;12609:7;12600:6;12589:9;12585:22;12564:53;:::i;:::-;12554:63;;12509:118;12666:2;12692:53;12737:7;12728:6;12717:9;12713:22;12692:53;:::i;:::-;12682:63;;12637:118;12822:2;12811:9;12807:18;12794:32;12853:18;12845:6;12842:30;12839:117;;;12875:79;;:::i;:::-;12839:117;12980:62;13034:7;13025:6;13014:9;13010:22;12980:62;:::i;:::-;12970:72;;12765:287;12116:943;;;;;;;:::o;13065:539::-;13149:6;13198:2;13186:9;13177:7;13173:23;13169:32;13166:119;;;13204:79;;:::i;:::-;13166:119;13352:1;13341:9;13337:17;13324:31;13382:18;13374:6;13371:30;13368:117;;;13404:79;;:::i;:::-;13368:117;13509:78;13579:7;13570:6;13559:9;13555:22;13509:78;:::i;:::-;13499:88;;13295:302;13065:539;;;;:::o;13610:894::-;13728:6;13736;13785:2;13773:9;13764:7;13760:23;13756:32;13753:119;;;13791:79;;:::i;:::-;13753:119;13939:1;13928:9;13924:17;13911:31;13969:18;13961:6;13958:30;13955:117;;;13991:79;;:::i;:::-;13955:117;14096:78;14166:7;14157:6;14146:9;14142:22;14096:78;:::i;:::-;14086:88;;13882:302;14251:2;14240:9;14236:18;14223:32;14282:18;14274:6;14271:30;14268:117;;;14304:79;;:::i;:::-;14268:117;14409:78;14479:7;14470:6;14459:9;14455:22;14409:78;:::i;:::-;14399:88;;14194:303;13610:894;;;;;:::o;14510:329::-;14569:6;14618:2;14606:9;14597:7;14593:23;14589:32;14586:119;;;14624:79;;:::i;:::-;14586:119;14744:1;14769:53;14814:7;14805:6;14794:9;14790:22;14769:53;:::i;:::-;14759:63;;14715:117;14510:329;;;;:::o;14845:474::-;14913:6;14921;14970:2;14958:9;14949:7;14945:23;14941:32;14938:119;;;14976:79;;:::i;:::-;14938:119;15096:1;15121:53;15166:7;15157:6;15146:9;15142:22;15121:53;:::i;:::-;15111:63;;15067:117;15223:2;15249:53;15294:7;15285:6;15274:9;15270:22;15249:53;:::i;:::-;15239:63;;15194:118;14845:474;;;;;:::o;15325:::-;15393:6;15401;15450:2;15438:9;15429:7;15425:23;15421:32;15418:119;;;15456:79;;:::i;:::-;15418:119;15576:1;15601:53;15646:7;15637:6;15626:9;15622:22;15601:53;:::i;:::-;15591:63;;15547:117;15703:2;15729:53;15774:7;15765:6;15754:9;15750:22;15729:53;:::i;:::-;15719:63;;15674:118;15325:474;;;;;:::o;15805:327::-;15863:6;15912:2;15900:9;15891:7;15887:23;15883:32;15880:119;;;15918:79;;:::i;:::-;15880:119;16038:1;16063:52;16107:7;16098:6;16087:9;16083:22;16063:52;:::i;:::-;16053:62;;16009:116;15805:327;;;;:::o;16138:349::-;16207:6;16256:2;16244:9;16235:7;16231:23;16227:32;16224:119;;;16262:79;;:::i;:::-;16224:119;16382:1;16407:63;16462:7;16453:6;16442:9;16438:22;16407:63;:::i;:::-;16397:73;;16353:127;16138:349;;;;:::o;16493:509::-;16562:6;16611:2;16599:9;16590:7;16586:23;16582:32;16579:119;;;16617:79;;:::i;:::-;16579:119;16765:1;16754:9;16750:17;16737:31;16795:18;16787:6;16784:30;16781:117;;;16817:79;;:::i;:::-;16781:117;16922:63;16977:7;16968:6;16957:9;16953:22;16922:63;:::i;:::-;16912:73;;16708:287;16493:509;;;;:::o;17008:329::-;17067:6;17116:2;17104:9;17095:7;17091:23;17087:32;17084:119;;;17122:79;;:::i;:::-;17084:119;17242:1;17267:53;17312:7;17303:6;17292:9;17288:22;17267:53;:::i;:::-;17257:63;;17213:117;17008:329;;;;:::o;17343:179::-;17412:10;17433:46;17475:3;17467:6;17433:46;:::i;:::-;17511:4;17506:3;17502:14;17488:28;;17343:179;;;;:::o;17528:::-;17597:10;17618:46;17660:3;17652:6;17618:46;:::i;:::-;17696:4;17691:3;17687:14;17673:28;;17528:179;;;;:::o;17713:108::-;17790:24;17808:5;17790:24;:::i;:::-;17785:3;17778:37;17713:108;;:::o;17827:118::-;17914:24;17932:5;17914:24;:::i;:::-;17909:3;17902:37;17827:118;;:::o;17981:732::-;18100:3;18129:54;18177:5;18129:54;:::i;:::-;18199:86;18278:6;18273:3;18199:86;:::i;:::-;18192:93;;18309:56;18359:5;18309:56;:::i;:::-;18388:7;18419:1;18404:284;18429:6;18426:1;18423:13;18404:284;;;18505:6;18499:13;18532:63;18591:3;18576:13;18532:63;:::i;:::-;18525:70;;18618:60;18671:6;18618:60;:::i;:::-;18608:70;;18464:224;18451:1;18448;18444:9;18439:14;;18404:284;;;18408:14;18704:3;18697:10;;18105:608;;;17981:732;;;;:::o;18749:::-;18868:3;18897:54;18945:5;18897:54;:::i;:::-;18967:86;19046:6;19041:3;18967:86;:::i;:::-;18960:93;;19077:56;19127:5;19077:56;:::i;:::-;19156:7;19187:1;19172:284;19197:6;19194:1;19191:13;19172:284;;;19273:6;19267:13;19300:63;19359:3;19344:13;19300:63;:::i;:::-;19293:70;;19386:60;19439:6;19386:60;:::i;:::-;19376:70;;19232:224;19219:1;19216;19212:9;19207:14;;19172:284;;;19176:14;19472:3;19465:10;;18873:608;;;18749:732;;;;:::o;19487:109::-;19568:21;19583:5;19568:21;:::i;:::-;19563:3;19556:34;19487:109;;:::o;19602:118::-;19689:24;19707:5;19689:24;:::i;:::-;19684:3;19677:37;19602:118;;:::o;19726:360::-;19812:3;19840:38;19872:5;19840:38;:::i;:::-;19894:70;19957:6;19952:3;19894:70;:::i;:::-;19887:77;;19973:52;20018:6;20013:3;20006:4;19999:5;19995:16;19973:52;:::i;:::-;20050:29;20072:6;20050:29;:::i;:::-;20045:3;20041:39;20034:46;;19816:270;19726:360;;;;:::o;20092:147::-;20187:45;20226:5;20187:45;:::i;:::-;20182:3;20175:58;20092:147;;:::o;20245:364::-;20333:3;20361:39;20394:5;20361:39;:::i;:::-;20416:71;20480:6;20475:3;20416:71;:::i;:::-;20409:78;;20496:52;20541:6;20536:3;20529:4;20522:5;20518:16;20496:52;:::i;:::-;20573:29;20595:6;20573:29;:::i;:::-;20568:3;20564:39;20557:46;;20337:272;20245:364;;;;:::o;20615:377::-;20721:3;20749:39;20782:5;20749:39;:::i;:::-;20804:89;20886:6;20881:3;20804:89;:::i;:::-;20797:96;;20902:52;20947:6;20942:3;20935:4;20928:5;20924:16;20902:52;:::i;:::-;20979:6;20974:3;20970:16;20963:23;;20725:267;20615:377;;;;:::o;20998:366::-;21140:3;21161:67;21225:2;21220:3;21161:67;:::i;:::-;21154:74;;21237:93;21326:3;21237:93;:::i;:::-;21355:2;21350:3;21346:12;21339:19;;20998:366;;;:::o;21370:::-;21512:3;21533:67;21597:2;21592:3;21533:67;:::i;:::-;21526:74;;21609:93;21698:3;21609:93;:::i;:::-;21727:2;21722:3;21718:12;21711:19;;21370:366;;;:::o;21742:::-;21884:3;21905:67;21969:2;21964:3;21905:67;:::i;:::-;21898:74;;21981:93;22070:3;21981:93;:::i;:::-;22099:2;22094:3;22090:12;22083:19;;21742:366;;;:::o;22114:::-;22256:3;22277:67;22341:2;22336:3;22277:67;:::i;:::-;22270:74;;22353:93;22442:3;22353:93;:::i;:::-;22471:2;22466:3;22462:12;22455:19;;22114:366;;;:::o;22486:::-;22628:3;22649:67;22713:2;22708:3;22649:67;:::i;:::-;22642:74;;22725:93;22814:3;22725:93;:::i;:::-;22843:2;22838:3;22834:12;22827:19;;22486:366;;;:::o;22858:::-;23000:3;23021:67;23085:2;23080:3;23021:67;:::i;:::-;23014:74;;23097:93;23186:3;23097:93;:::i;:::-;23215:2;23210:3;23206:12;23199:19;;22858:366;;;:::o;23230:::-;23372:3;23393:67;23457:2;23452:3;23393:67;:::i;:::-;23386:74;;23469:93;23558:3;23469:93;:::i;:::-;23587:2;23582:3;23578:12;23571:19;;23230:366;;;:::o;23602:::-;23744:3;23765:67;23829:2;23824:3;23765:67;:::i;:::-;23758:74;;23841:93;23930:3;23841:93;:::i;:::-;23959:2;23954:3;23950:12;23943:19;;23602:366;;;:::o;23974:::-;24116:3;24137:67;24201:2;24196:3;24137:67;:::i;:::-;24130:74;;24213:93;24302:3;24213:93;:::i;:::-;24331:2;24326:3;24322:12;24315:19;;23974:366;;;:::o;24346:::-;24488:3;24509:67;24573:2;24568:3;24509:67;:::i;:::-;24502:74;;24585:93;24674:3;24585:93;:::i;:::-;24703:2;24698:3;24694:12;24687:19;;24346:366;;;:::o;24718:::-;24860:3;24881:67;24945:2;24940:3;24881:67;:::i;:::-;24874:74;;24957:93;25046:3;24957:93;:::i;:::-;25075:2;25070:3;25066:12;25059:19;;24718:366;;;:::o;25090:::-;25232:3;25253:67;25317:2;25312:3;25253:67;:::i;:::-;25246:74;;25329:93;25418:3;25329:93;:::i;:::-;25447:2;25442:3;25438:12;25431:19;;25090:366;;;:::o;25462:::-;25604:3;25625:67;25689:2;25684:3;25625:67;:::i;:::-;25618:74;;25701:93;25790:3;25701:93;:::i;:::-;25819:2;25814:3;25810:12;25803:19;;25462:366;;;:::o;25834:::-;25976:3;25997:67;26061:2;26056:3;25997:67;:::i;:::-;25990:74;;26073:93;26162:3;26073:93;:::i;:::-;26191:2;26186:3;26182:12;26175:19;;25834:366;;;:::o;26206:::-;26348:3;26369:67;26433:2;26428:3;26369:67;:::i;:::-;26362:74;;26445:93;26534:3;26445:93;:::i;:::-;26563:2;26558:3;26554:12;26547:19;;26206:366;;;:::o;26578:402::-;26738:3;26759:85;26841:2;26836:3;26759:85;:::i;:::-;26752:92;;26853:93;26942:3;26853:93;:::i;:::-;26971:2;26966:3;26962:12;26955:19;;26578:402;;;:::o;26986:366::-;27128:3;27149:67;27213:2;27208:3;27149:67;:::i;:::-;27142:74;;27225:93;27314:3;27225:93;:::i;:::-;27343:2;27338:3;27334:12;27327:19;;26986:366;;;:::o;27358:::-;27500:3;27521:67;27585:2;27580:3;27521:67;:::i;:::-;27514:74;;27597:93;27686:3;27597:93;:::i;:::-;27715:2;27710:3;27706:12;27699:19;;27358:366;;;:::o;27730:::-;27872:3;27893:67;27957:2;27952:3;27893:67;:::i;:::-;27886:74;;27969:93;28058:3;27969:93;:::i;:::-;28087:2;28082:3;28078:12;28071:19;;27730:366;;;:::o;28102:::-;28244:3;28265:67;28329:2;28324:3;28265:67;:::i;:::-;28258:74;;28341:93;28430:3;28341:93;:::i;:::-;28459:2;28454:3;28450:12;28443:19;;28102:366;;;:::o;28474:402::-;28634:3;28655:85;28737:2;28732:3;28655:85;:::i;:::-;28648:92;;28749:93;28838:3;28749:93;:::i;:::-;28867:2;28862:3;28858:12;28851:19;;28474:402;;;:::o;28882:366::-;29024:3;29045:67;29109:2;29104:3;29045:67;:::i;:::-;29038:74;;29121:93;29210:3;29121:93;:::i;:::-;29239:2;29234:3;29230:12;29223:19;;28882:366;;;:::o;29254:108::-;29331:24;29349:5;29331:24;:::i;:::-;29326:3;29319:37;29254:108;;:::o;29368:118::-;29455:24;29473:5;29455:24;:::i;:::-;29450:3;29443:37;29368:118;;:::o;29492:967::-;29874:3;29896:148;30040:3;29896:148;:::i;:::-;29889:155;;30061:95;30152:3;30143:6;30061:95;:::i;:::-;30054:102;;30173:148;30317:3;30173:148;:::i;:::-;30166:155;;30338:95;30429:3;30420:6;30338:95;:::i;:::-;30331:102;;30450:3;30443:10;;29492:967;;;;;:::o;30465:222::-;30558:4;30596:2;30585:9;30581:18;30573:26;;30609:71;30677:1;30666:9;30662:17;30653:6;30609:71;:::i;:::-;30465:222;;;;:::o;30693:1053::-;31016:4;31054:3;31043:9;31039:19;31031:27;;31068:71;31136:1;31125:9;31121:17;31112:6;31068:71;:::i;:::-;31149:72;31217:2;31206:9;31202:18;31193:6;31149:72;:::i;:::-;31268:9;31262:4;31258:20;31253:2;31242:9;31238:18;31231:48;31296:108;31399:4;31390:6;31296:108;:::i;:::-;31288:116;;31451:9;31445:4;31441:20;31436:2;31425:9;31421:18;31414:48;31479:108;31582:4;31573:6;31479:108;:::i;:::-;31471:116;;31635:9;31629:4;31625:20;31619:3;31608:9;31604:19;31597:49;31663:76;31734:4;31725:6;31663:76;:::i;:::-;31655:84;;30693:1053;;;;;;;;:::o;31752:751::-;31975:4;32013:3;32002:9;31998:19;31990:27;;32027:71;32095:1;32084:9;32080:17;32071:6;32027:71;:::i;:::-;32108:72;32176:2;32165:9;32161:18;32152:6;32108:72;:::i;:::-;32190;32258:2;32247:9;32243:18;32234:6;32190:72;:::i;:::-;32272;32340:2;32329:9;32325:18;32316:6;32272:72;:::i;:::-;32392:9;32386:4;32382:20;32376:3;32365:9;32361:19;32354:49;32420:76;32491:4;32482:6;32420:76;:::i;:::-;32412:84;;31752:751;;;;;;;;:::o;32509:656::-;32712:4;32750:3;32739:9;32735:19;32727:27;;32764:71;32832:1;32821:9;32817:17;32808:6;32764:71;:::i;:::-;32845:72;32913:2;32902:9;32898:18;32889:6;32845:72;:::i;:::-;32927:80;33003:2;32992:9;32988:18;32979:6;32927:80;:::i;:::-;33054:9;33048:4;33044:20;33039:2;33028:9;33024:18;33017:48;33082:76;33153:4;33144:6;33082:76;:::i;:::-;33074:84;;32509:656;;;;;;;:::o;33171:373::-;33314:4;33352:2;33341:9;33337:18;33329:26;;33401:9;33395:4;33391:20;33387:1;33376:9;33372:17;33365:47;33429:108;33532:4;33523:6;33429:108;:::i;:::-;33421:116;;33171:373;;;;:::o;33550:::-;33693:4;33731:2;33720:9;33716:18;33708:26;;33780:9;33774:4;33770:20;33766:1;33755:9;33751:17;33744:47;33808:108;33911:4;33902:6;33808:108;:::i;:::-;33800:116;;33550:373;;;;:::o;33929:634::-;34150:4;34188:2;34177:9;34173:18;34165:26;;34237:9;34231:4;34227:20;34223:1;34212:9;34208:17;34201:47;34265:108;34368:4;34359:6;34265:108;:::i;:::-;34257:116;;34420:9;34414:4;34410:20;34405:2;34394:9;34390:18;34383:48;34448:108;34551:4;34542:6;34448:108;:::i;:::-;34440:116;;33929:634;;;;;:::o;34569:210::-;34656:4;34694:2;34683:9;34679:18;34671:26;;34707:65;34769:1;34758:9;34754:17;34745:6;34707:65;:::i;:::-;34569:210;;;;:::o;34785:222::-;34878:4;34916:2;34905:9;34901:18;34893:26;;34929:71;34997:1;34986:9;34982:17;34973:6;34929:71;:::i;:::-;34785:222;;;;:::o;35013:313::-;35126:4;35164:2;35153:9;35149:18;35141:26;;35213:9;35207:4;35203:20;35199:1;35188:9;35184:17;35177:47;35241:78;35314:4;35305:6;35241:78;:::i;:::-;35233:86;;35013:313;;;;:::o;35332:419::-;35498:4;35536:2;35525:9;35521:18;35513:26;;35585:9;35579:4;35575:20;35571:1;35560:9;35556:17;35549:47;35613:131;35739:4;35613:131;:::i;:::-;35605:139;;35332:419;;;:::o;35757:::-;35923:4;35961:2;35950:9;35946:18;35938:26;;36010:9;36004:4;36000:20;35996:1;35985:9;35981:17;35974:47;36038:131;36164:4;36038:131;:::i;:::-;36030:139;;35757:419;;;:::o;36182:::-;36348:4;36386:2;36375:9;36371:18;36363:26;;36435:9;36429:4;36425:20;36421:1;36410:9;36406:17;36399:47;36463:131;36589:4;36463:131;:::i;:::-;36455:139;;36182:419;;;:::o;36607:::-;36773:4;36811:2;36800:9;36796:18;36788:26;;36860:9;36854:4;36850:20;36846:1;36835:9;36831:17;36824:47;36888:131;37014:4;36888:131;:::i;:::-;36880:139;;36607:419;;;:::o;37032:::-;37198:4;37236:2;37225:9;37221:18;37213:26;;37285:9;37279:4;37275:20;37271:1;37260:9;37256:17;37249:47;37313:131;37439:4;37313:131;:::i;:::-;37305:139;;37032:419;;;:::o;37457:::-;37623:4;37661:2;37650:9;37646:18;37638:26;;37710:9;37704:4;37700:20;37696:1;37685:9;37681:17;37674:47;37738:131;37864:4;37738:131;:::i;:::-;37730:139;;37457:419;;;:::o;37882:::-;38048:4;38086:2;38075:9;38071:18;38063:26;;38135:9;38129:4;38125:20;38121:1;38110:9;38106:17;38099:47;38163:131;38289:4;38163:131;:::i;:::-;38155:139;;37882:419;;;:::o;38307:::-;38473:4;38511:2;38500:9;38496:18;38488:26;;38560:9;38554:4;38550:20;38546:1;38535:9;38531:17;38524:47;38588:131;38714:4;38588:131;:::i;:::-;38580:139;;38307:419;;;:::o;38732:::-;38898:4;38936:2;38925:9;38921:18;38913:26;;38985:9;38979:4;38975:20;38971:1;38960:9;38956:17;38949:47;39013:131;39139:4;39013:131;:::i;:::-;39005:139;;38732:419;;;:::o;39157:::-;39323:4;39361:2;39350:9;39346:18;39338:26;;39410:9;39404:4;39400:20;39396:1;39385:9;39381:17;39374:47;39438:131;39564:4;39438:131;:::i;:::-;39430:139;;39157:419;;;:::o;39582:::-;39748:4;39786:2;39775:9;39771:18;39763:26;;39835:9;39829:4;39825:20;39821:1;39810:9;39806:17;39799:47;39863:131;39989:4;39863:131;:::i;:::-;39855:139;;39582:419;;;:::o;40007:::-;40173:4;40211:2;40200:9;40196:18;40188:26;;40260:9;40254:4;40250:20;40246:1;40235:9;40231:17;40224:47;40288:131;40414:4;40288:131;:::i;:::-;40280:139;;40007:419;;;:::o;40432:::-;40598:4;40636:2;40625:9;40621:18;40613:26;;40685:9;40679:4;40675:20;40671:1;40660:9;40656:17;40649:47;40713:131;40839:4;40713:131;:::i;:::-;40705:139;;40432:419;;;:::o;40857:::-;41023:4;41061:2;41050:9;41046:18;41038:26;;41110:9;41104:4;41100:20;41096:1;41085:9;41081:17;41074:47;41138:131;41264:4;41138:131;:::i;:::-;41130:139;;40857:419;;;:::o;41282:::-;41448:4;41486:2;41475:9;41471:18;41463:26;;41535:9;41529:4;41525:20;41521:1;41510:9;41506:17;41499:47;41563:131;41689:4;41563:131;:::i;:::-;41555:139;;41282:419;;;:::o;41707:::-;41873:4;41911:2;41900:9;41896:18;41888:26;;41960:9;41954:4;41950:20;41946:1;41935:9;41931:17;41924:47;41988:131;42114:4;41988:131;:::i;:::-;41980:139;;41707:419;;;:::o;42132:::-;42298:4;42336:2;42325:9;42321:18;42313:26;;42385:9;42379:4;42375:20;42371:1;42360:9;42356:17;42349:47;42413:131;42539:4;42413:131;:::i;:::-;42405:139;;42132:419;;;:::o;42557:::-;42723:4;42761:2;42750:9;42746:18;42738:26;;42810:9;42804:4;42800:20;42796:1;42785:9;42781:17;42774:47;42838:131;42964:4;42838:131;:::i;:::-;42830:139;;42557:419;;;:::o;42982:::-;43148:4;43186:2;43175:9;43171:18;43163:26;;43235:9;43229:4;43225:20;43221:1;43210:9;43206:17;43199:47;43263:131;43389:4;43263:131;:::i;:::-;43255:139;;42982:419;;;:::o;43407:::-;43573:4;43611:2;43600:9;43596:18;43588:26;;43660:9;43654:4;43650:20;43646:1;43635:9;43631:17;43624:47;43688:131;43814:4;43688:131;:::i;:::-;43680:139;;43407:419;;;:::o;43832:222::-;43925:4;43963:2;43952:9;43948:18;43940:26;;43976:71;44044:1;44033:9;44029:17;44020:6;43976:71;:::i;:::-;43832:222;;;;:::o;44060:332::-;44181:4;44219:2;44208:9;44204:18;44196:26;;44232:71;44300:1;44289:9;44285:17;44276:6;44232:71;:::i;:::-;44313:72;44381:2;44370:9;44366:18;44357:6;44313:72;:::i;:::-;44060:332;;;;;:::o;44398:129::-;44432:6;44459:20;;:::i;:::-;44449:30;;44488:33;44516:4;44508:6;44488:33;:::i;:::-;44398:129;;;:::o;44533:75::-;44566:6;44599:2;44593:9;44583:19;;44533:75;:::o;44614:311::-;44691:4;44781:18;44773:6;44770:30;44767:56;;;44803:18;;:::i;:::-;44767:56;44853:4;44845:6;44841:17;44833:25;;44913:4;44907;44903:15;44895:23;;44614:311;;;:::o;44931:::-;45008:4;45098:18;45090:6;45087:30;45084:56;;;45120:18;;:::i;:::-;45084:56;45170:4;45162:6;45158:17;45150:25;;45230:4;45224;45220:15;45212:23;;44931:311;;;:::o;45248:307::-;45309:4;45399:18;45391:6;45388:30;45385:56;;;45421:18;;:::i;:::-;45385:56;45459:29;45481:6;45459:29;:::i;:::-;45451:37;;45543:4;45537;45533:15;45525:23;;45248:307;;;:::o;45561:308::-;45623:4;45713:18;45705:6;45702:30;45699:56;;;45735:18;;:::i;:::-;45699:56;45773:29;45795:6;45773:29;:::i;:::-;45765:37;;45857:4;45851;45847:15;45839:23;;45561:308;;;:::o;45875:132::-;45942:4;45965:3;45957:11;;45995:4;45990:3;45986:14;45978:22;;45875:132;;;:::o;46013:::-;46080:4;46103:3;46095:11;;46133:4;46128:3;46124:14;46116:22;;46013:132;;;:::o;46151:114::-;46218:6;46252:5;46246:12;46236:22;;46151:114;;;:::o;46271:::-;46338:6;46372:5;46366:12;46356:22;;46271:114;;;:::o;46391:98::-;46442:6;46476:5;46470:12;46460:22;;46391:98;;;:::o;46495:99::-;46547:6;46581:5;46575:12;46565:22;;46495:99;;;:::o;46600:113::-;46670:4;46702;46697:3;46693:14;46685:22;;46600:113;;;:::o;46719:::-;46789:4;46821;46816:3;46812:14;46804:22;;46719:113;;;:::o;46838:184::-;46937:11;46971:6;46966:3;46959:19;47011:4;47006:3;47002:14;46987:29;;46838:184;;;;:::o;47028:::-;47127:11;47161:6;47156:3;47149:19;47201:4;47196:3;47192:14;47177:29;;47028:184;;;;:::o;47218:168::-;47301:11;47335:6;47330:3;47323:19;47375:4;47370:3;47366:14;47351:29;;47218:168;;;;:::o;47392:169::-;47476:11;47510:6;47505:3;47498:19;47550:4;47545:3;47541:14;47526:29;;47392:169;;;;:::o;47567:148::-;47669:11;47706:3;47691:18;;47567:148;;;;:::o;47721:305::-;47761:3;47780:20;47798:1;47780:20;:::i;:::-;47775:25;;47814:20;47832:1;47814:20;:::i;:::-;47809:25;;47968:1;47900:66;47896:74;47893:1;47890:81;47887:107;;;47974:18;;:::i;:::-;47887:107;48018:1;48015;48011:9;48004:16;;47721:305;;;;:::o;48032:348::-;48072:7;48095:20;48113:1;48095:20;:::i;:::-;48090:25;;48129:20;48147:1;48129:20;:::i;:::-;48124:25;;48317:1;48249:66;48245:74;48242:1;48239:81;48234:1;48227:9;48220:17;48216:105;48213:131;;;48324:18;;:::i;:::-;48213:131;48372:1;48369;48365:9;48354:20;;48032:348;;;;:::o;48386:191::-;48426:4;48446:20;48464:1;48446:20;:::i;:::-;48441:25;;48480:20;48498:1;48480:20;:::i;:::-;48475:25;;48519:1;48516;48513:8;48510:34;;;48524:18;;:::i;:::-;48510:34;48569:1;48566;48562:9;48554:17;;48386:191;;;;:::o;48583:96::-;48620:7;48649:24;48667:5;48649:24;:::i;:::-;48638:35;;48583:96;;;:::o;48685:90::-;48719:7;48762:5;48755:13;48748:21;48737:32;;48685:90;;;:::o;48781:77::-;48818:7;48847:5;48836:16;;48781:77;;;:::o;48864:149::-;48900:7;48940:66;48933:5;48929:78;48918:89;;48864:149;;;:::o;49019:126::-;49056:7;49096:42;49089:5;49085:54;49074:65;;49019:126;;;:::o;49151:77::-;49188:7;49217:5;49206:16;;49151:77;;;:::o;49234:121::-;49292:9;49325:24;49343:5;49325:24;:::i;:::-;49312:37;;49234:121;;;:::o;49361:154::-;49445:6;49440:3;49435;49422:30;49507:1;49498:6;49493:3;49489:16;49482:27;49361:154;;;:::o;49521:307::-;49589:1;49599:113;49613:6;49610:1;49607:13;49599:113;;;49698:1;49693:3;49689:11;49683:18;49679:1;49674:3;49670:11;49663:39;49635:2;49632:1;49628:10;49623:15;;49599:113;;;49730:6;49727:1;49724:13;49721:101;;;49810:1;49801:6;49796:3;49792:16;49785:27;49721:101;49570:258;49521:307;;;:::o;49834:171::-;49873:3;49896:24;49914:5;49896:24;:::i;:::-;49887:33;;49942:4;49935:5;49932:15;49929:41;;;49950:18;;:::i;:::-;49929:41;49997:1;49990:5;49986:13;49979:20;;49834:171;;;:::o;50011:320::-;50055:6;50092:1;50086:4;50082:12;50072:22;;50139:1;50133:4;50129:12;50160:18;50150:81;;50216:4;50208:6;50204:17;50194:27;;50150:81;50278:2;50270:6;50267:14;50247:18;50244:38;50241:84;;;50297:18;;:::i;:::-;50241:84;50062:269;50011:320;;;:::o;50337:281::-;50420:27;50442:4;50420:27;:::i;:::-;50412:6;50408:40;50550:6;50538:10;50535:22;50514:18;50502:10;50499:34;50496:62;50493:88;;;50561:18;;:::i;:::-;50493:88;50601:10;50597:2;50590:22;50380:238;50337:281;;:::o;50624:233::-;50663:3;50686:24;50704:5;50686:24;:::i;:::-;50677:33;;50732:66;50725:5;50722:77;50719:103;;;50802:18;;:::i;:::-;50719:103;50849:1;50842:5;50838:13;50831:20;;50624:233;;;:::o;50863:180::-;50911:77;50908:1;50901:88;51008:4;51005:1;50998:15;51032:4;51029:1;51022:15;51049:180;51097:77;51094:1;51087:88;51194:4;51191:1;51184:15;51218:4;51215:1;51208:15;51235:180;51283:77;51280:1;51273:88;51380:4;51377:1;51370:15;51404:4;51401:1;51394:15;51421:180;51469:77;51466:1;51459:88;51566:4;51563:1;51556:15;51590:4;51587:1;51580:15;51607:180;51655:77;51652:1;51645:88;51752:4;51749:1;51742:15;51776:4;51773:1;51766:15;51793:183;51828:3;51866:1;51848:16;51845:23;51842:128;;;51904:1;51901;51898;51883:23;51926:34;51957:1;51951:8;51926:34;:::i;:::-;51919:41;;51842:128;51793:183;:::o;51982:117::-;52091:1;52088;52081:12;52105:117;52214:1;52211;52204:12;52228:117;52337:1;52334;52327:12;52351:117;52460:1;52457;52450:12;52474:117;52583:1;52580;52573:12;52597:102;52638:6;52689:2;52685:7;52680:2;52673:5;52669:14;52665:28;52655:38;;52597:102;;;:::o;52705:106::-;52749:8;52798:5;52793:3;52789:15;52768:36;;52705:106;;;:::o;52817:239::-;52957:34;52953:1;52945:6;52941:14;52934:58;53026:22;53021:2;53013:6;53009:15;53002:47;52817:239;:::o;53062:234::-;53202:34;53198:1;53190:6;53186:14;53179:58;53271:17;53266:2;53258:6;53254:15;53247:42;53062:234;:::o;53302:182::-;53442:34;53438:1;53430:6;53426:14;53419:58;53302:182;:::o;53490:227::-;53630:34;53626:1;53618:6;53614:14;53607:58;53699:10;53694:2;53686:6;53682:15;53675:35;53490:227;:::o;53723:170::-;53863:22;53859:1;53851:6;53847:14;53840:46;53723:170;:::o;53899:223::-;54039:34;54035:1;54027:6;54023:14;54016:58;54108:6;54103:2;54095:6;54091:15;54084:31;53899:223;:::o;54128:231::-;54268:34;54264:1;54256:6;54252:14;54245:58;54337:14;54332:2;54324:6;54320:15;54313:39;54128:231;:::o;54365:229::-;54505:34;54501:1;54493:6;54489:14;54482:58;54574:12;54569:2;54561:6;54557:15;54550:37;54365:229;:::o;54600:166::-;54740:18;54736:1;54728:6;54724:14;54717:42;54600:166;:::o;54772:224::-;54912:34;54908:1;54900:6;54896:14;54889:58;54981:7;54976:2;54968:6;54964:15;54957:32;54772:224;:::o;55002:222::-;55142:34;55138:1;55130:6;55126:14;55119:58;55211:5;55206:2;55198:6;55194:15;55187:30;55002:222;:::o;55230:243::-;55370:34;55366:1;55358:6;55354:14;55347:58;55439:26;55434:2;55426:6;55422:15;55415:51;55230:243;:::o;55479:229::-;55619:34;55615:1;55607:6;55603:14;55596:58;55688:12;55683:2;55675:6;55671:15;55664:37;55479:229;:::o;55714:246::-;55854:34;55850:1;55842:6;55838:14;55831:58;55923:29;55918:2;55910:6;55906:15;55899:54;55714:246;:::o;55966:244::-;56106:34;56102:1;56094:6;56090:14;56083:58;56175:27;56170:2;56162:6;56158:15;56151:52;55966:244;:::o;56216:173::-;56356:25;56352:1;56344:6;56340:14;56333:49;56216:173;:::o;56395:228::-;56535:34;56531:1;56523:6;56519:14;56512:58;56604:11;56599:2;56591:6;56587:15;56580:36;56395:228;:::o;56629:::-;56769:34;56765:1;56757:6;56753:14;56746:58;56838:11;56833:2;56825:6;56821:15;56814:36;56629:228;:::o;56863:227::-;57003:34;56999:1;56991:6;56987:14;56980:58;57072:10;57067:2;57059:6;57055:15;57048:35;56863:227;:::o;57096:220::-;57236:34;57232:1;57224:6;57220:14;57213:58;57305:3;57300:2;57292:6;57288:15;57281:28;57096:220;:::o;57322:167::-;57462:19;57458:1;57450:6;57446:14;57439:43;57322:167;:::o;57495:234::-;57635:34;57631:1;57623:6;57619:14;57612:58;57704:17;57699:2;57691:6;57687:15;57680:42;57495:234;:::o;57735:711::-;57774:3;57812:4;57794:16;57791:26;57788:39;;;57820:5;;57788:39;57849:20;;:::i;:::-;57924:1;57906:16;57902:24;57899:1;57893:4;57878:49;57957:4;57951:11;58056:16;58049:4;58041:6;58037:17;58034:39;58001:18;57993:6;57990:30;57974:113;57971:146;;;58102:5;;;;57971:146;58148:6;58142:4;58138:17;58184:3;58178:10;58211:18;58203:6;58200:30;58197:43;;;58233:5;;;;;;58197:43;58281:6;58274:4;58269:3;58265:14;58261:27;58340:1;58322:16;58318:24;58312:4;58308:35;58303:3;58300:44;58297:57;;;58347:5;;;;;;;58297:57;58364;58412:6;58406:4;58402:17;58394:6;58390:30;58384:4;58364:57;:::i;:::-;58437:3;58430:10;;57778:668;;;;;57735:711;;:::o;58452:122::-;58525:24;58543:5;58525:24;:::i;:::-;58518:5;58515:35;58505:63;;58564:1;58561;58554:12;58505:63;58452:122;:::o;58580:116::-;58650:21;58665:5;58650:21;:::i;:::-;58643:5;58640:32;58630:60;;58686:1;58683;58676:12;58630:60;58580:116;:::o;58702:122::-;58775:24;58793:5;58775:24;:::i;:::-;58768:5;58765:35;58755:63;;58814:1;58811;58804:12;58755:63;58702:122;:::o;58830:120::-;58902:23;58919:5;58902:23;:::i;:::-;58895:5;58892:34;58882:62;;58940:1;58937;58930:12;58882:62;58830:120;:::o;58956:122::-;59029:24;59047:5;59029:24;:::i;:::-;59022:5;59019:35;59009:63;;59068:1;59065;59058:12;59009:63;58956:122;:::o
Swarm Source
ipfs://a3ee0f1babc769bf5ce29ba624c30970f87befc4ff0a775da3c6431bd4352c54
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.