Feature Tip: Add private address tag to any address under My Name Tag !
ERC-1155
Overview
Max Total Supply
1,787 DAN DAO
Holders
1,131
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
DanDao
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.12; import "./ERC1155.sol"; import "./ERC1155Burnable.sol"; import "./ERC1155Supply.sol"; import "./MerkleProof.sol"; import "./ERC2981.sol"; import "./AccessControl.sol"; import "./Address.sol"; import "./Ownable.sol"; contract DanDao is ERC1155, ERC1155Burnable, ERC1155Supply, AccessControl, ERC2981, Ownable { struct User { uint256 count; uint256 mintedTime; } using Address for address; using MerkleProof for bytes32[]; uint256 public constant DD = 0; uint256 public maxSupply; string private _name; string private _symbol; bytes32 private _merkleRoot; uint256 private _publicPrice; bool private _publicActive; address private _ddAddress; mapping(address => User) private refundList; mapping(address => bool) private freeMintList; uint256 private maxFreeMint = 666; constructor( string memory name_, string memory symbol_, uint256 maxSupply_, uint256 publicPrice_, string memory uri_, bytes32 merkleRoot_ ) ERC1155(uri_) { _name = name_; _symbol = symbol_; maxSupply = maxSupply_; _publicPrice = publicPrice_ * 10**15; _publicActive = false; _ddAddress = _msgSender(); _merkleRoot = merkleRoot_; _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); _setDefaultRoyalty(_msgSender(), 10000); } function withdraw(address addr) external onlyOwner { payable(addr).transfer(address(this).balance); } function whiteMint(uint256 amount, address[] memory addrs) external payable { require(totalSupply(DD) + amount <= maxSupply, "Exceeded max supply"); require(amount == 1, "Exceeded max"); require(!freeMintList[_msgSender()], "minted"); require( MerkleProof.verify(addrs, _merkleRoot, _msgSender()), "Not part of list" ); unchecked { freeMintList[_msgSender()] = true; } _mint(_msgSender(), DD, amount, ""); } function mint(uint256 amount) external payable { require(_publicActive, "Not yet started"); require(totalSupply(DD) + amount <= maxSupply, "Exceeded max supply"); if (totalSupply(DD) + amount <= maxFreeMint && amount == 1) { require(!freeMintList[_msgSender()], "error"); freeMintList[_msgSender()] = true; } else { require(_publicPrice * amount <= msg.value, "Value incorrect"); unchecked { refundList[_msgSender()].count = refundList[_msgSender()].count + amount; refundList[_msgSender()].mintedTime = block.timestamp; } } _mint(_msgSender(), DD, amount, ""); } function airDrop(address[] memory addrs, uint256 amount) external onlyOwner { require( totalSupply(DD) + addrs.length * amount <= maxSupply, "Exceeded max supply" ); for (uint256 i = 0; i < addrs.length; i++) { _mint(addrs[i], DD, amount, ""); } } function refund(uint256 amount) external { require(amount <= refundList[_msgSender()].count, "amount incorrect"); require( refundList[_msgSender()].count <= balanceOf(_msgSender(), DD), "amount incorrect" ); require( block.timestamp < refundList[_msgSender()].mintedTime + 604800, "overtime" ); unchecked { refundList[_msgSender()].count = refundList[_msgSender()].count - amount; } bytes memory data = "refund"; safeTransferFrom( _msgSender(), _ddAddress, DD, amount, data ); payable(_msgSender()).transfer(amount * _publicPrice); } function setBaseData(uint256 newPrice, string memory newURI, uint256 newMaxSupply, uint256 _maxFreeMint, bytes32 newRoot) external onlyRole(DEFAULT_ADMIN_ROLE){ _publicPrice = newPrice * 10**15; maxSupply = newMaxSupply; maxFreeMint = _maxFreeMint; _merkleRoot = newRoot; _setURI(newURI); } function setActive(bool newActive) external onlyRole(DEFAULT_ADMIN_ROLE) { _publicActive = newActive; } function getUserStatus(address addr) public view returns ( bool, uint256, bool, uint256, uint256, uint256 ) { return (freeMintList[addr], _publicPrice, _publicActive, maxFreeMint, totalSupply(DD), refundList[addr].count); } function burn(address account, uint256 amount) external { require(_msgSender() == _ddAddress, "Invalid address"); _burn(account, DD, amount); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function merkleRoot() external view returns (bytes32) { return _merkleRoot; } // The following functions are overrides required by Solidity. function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal override(ERC1155, ERC1155Supply) { super._beforeTokenTransfer(operator, from, to, ids, amounts, data); } function supportsInterface(bytes4 interfaceId) public view override(ERC1155, ERC2981, AccessControl) returns (bool) { return super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @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, _msgSender()); _; } /** * @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 `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. */ 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. */ 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`. */ 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. * * [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. */ 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. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; import "./IERC1155Receiver.sol"; import "./IERC1155MetadataURI.sol"; import "./Address.sol"; import "./Context.sol"; import "./ERC165.sol"; /** * @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: balance query for the zero address"); 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 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: transfer caller is not 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(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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); _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); _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(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * 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); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * 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(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); 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); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * 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); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {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 `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 _beforeTokenTransfer( 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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol) pragma solidity ^0.8.0; import "./ERC1155.sol"; /** * @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 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 owner nor approved" ); _burnBatch(account, ids, values); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol) pragma solidity ^0.8.0; import "./ERC1155.sol"; /** * @dev Extension of ERC1155 that adds tracking of total supply per id. * * Useful for scenarios where Fungible and Non-fungible tokens have to be * clearly identified. Note: While a totalSupply of 1 might mean the * corresponding is an NFT, there is no guarantees that no other token with the * same id are not going to be minted. */ abstract contract ERC1155Supply is ERC1155 { mapping(uint256 => uint256) private _totalSupply; /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) public view virtual returns (uint256) { return _totalSupply[id]; } /** * @dev Indicates whether any token exist with a given id, or not. */ function exists(uint256 id) public view virtual returns (bool) { return ERC1155Supply.totalSupply(id) > 0; } /** * @dev See {ERC1155-_beforeTokenTransfer}. */ 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); if (from == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] += amounts[i]; } } if (to == address(0)) { for (uint256 i = 0; i < ids.length; ++i) { _totalSupply[ids[i]] -= amounts[i]; } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; import "./IERC2981.sol"; import "./ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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 be 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; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; import "./IERC1155.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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); }
// SPDX-License-Identifier: MIT // 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( address[] memory addrs, bytes32 root, address sender ) internal pure returns (bool) { bool isIN = false; for (uint256 i = 0; i < addrs.length; i++) { if (addrs[i] == sender) { isIN = true; break; } } return isIN ? keccak256(abi.encodePacked(addrs)) == root : false; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @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); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"maxSupply_","type":"uint256"},{"internalType":"uint256","name":"publicPrice_","type":"uint256"},{"internalType":"string","name":"uri_","type":"string"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"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":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[],"name":"DD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airDrop","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":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"addr","type":"address"}],"name":"getUserStatus","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"bool","name":"newActive","type":"bool"}],"name":"setActive","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":"uint256","name":"newPrice","type":"uint256"},{"internalType":"string","name":"newURI","type":"string"},{"internalType":"uint256","name":"newMaxSupply","type":"uint256"},{"internalType":"uint256","name":"_maxFreeMint","type":"uint256"},{"internalType":"bytes32","name":"newRoot","type":"bytes32"}],"name":"setBaseData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","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":"amount","type":"uint256"},{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"whiteMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405261029a6010553480156200001757600080fd5b5060405162006b6138038062006b6183398181016040528101906200003d919062000857565b816200004f816200018960201b60201c565b506200007062000064620001a560201b60201c565b620001ad60201b60201c565b85600990805190602001906200008892919062000594565b5084600a9080519060200190620000a192919062000594565b508360088190555066038d7ea4c6800083620000be91906200097f565b600c819055506000600d60006101000a81548160ff021916908315150217905550620000ef620001a560201b60201c565b600d60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600b819055506200015a6000801b6200014e620001a560201b60201c565b6200027360201b60201c565b6200017d6200016e620001a560201b60201c565b6127106200028960201b60201c565b50505050505062000b60565b8060029080519060200190620001a192919062000594565b5050565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200028582826200042d60201b60201c565b5050565b620002996200051f60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620002fa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f19062000a67565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200036d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003649062000ad9565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600560008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6200043f82826200052960201b60201c565b6200051b5760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620004c0620001a560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000612710905090565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620005a29062000b2a565b90600052602060002090601f016020900481019282620005c6576000855562000612565b82601f10620005e157805160ff191683800117855562000612565b8280016001018555821562000612579182015b8281111562000611578251825591602001919060010190620005f4565b5b50905062000621919062000625565b5090565b5b808211156200064057600081600090555060010162000626565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006ad8262000662565b810181811067ffffffffffffffff82111715620006cf57620006ce62000673565b5b80604052505050565b6000620006e462000644565b9050620006f28282620006a2565b919050565b600067ffffffffffffffff82111562000715576200071462000673565b5b620007208262000662565b9050602081019050919050565b60005b838110156200074d57808201518184015260208101905062000730565b838111156200075d576000848401525b50505050565b60006200077a6200077484620006f7565b620006d8565b9050828152602081018484840111156200079957620007986200065d565b5b620007a68482856200072d565b509392505050565b600082601f830112620007c657620007c562000658565b5b8151620007d884826020860162000763565b91505092915050565b6000819050919050565b620007f681620007e1565b81146200080257600080fd5b50565b6000815190506200081681620007eb565b92915050565b6000819050919050565b62000831816200081c565b81146200083d57600080fd5b50565b600081519050620008518162000826565b92915050565b60008060008060008060c087890312156200087757620008766200064e565b5b600087015167ffffffffffffffff81111562000898576200089762000653565b5b620008a689828a01620007ae565b965050602087015167ffffffffffffffff811115620008ca57620008c962000653565b5b620008d889828a01620007ae565b9550506040620008eb89828a0162000805565b9450506060620008fe89828a0162000805565b935050608087015167ffffffffffffffff81111562000922576200092162000653565b5b6200093089828a01620007ae565b92505060a06200094389828a0162000840565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200098c82620007e1565b91506200099983620007e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620009d557620009d462000950565b5b828202905092915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000a4f602a83620009e0565b915062000a5c82620009f1565b604082019050919050565b6000602082019050818103600083015262000a828162000a40565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000ac1601983620009e0565b915062000ace8262000a89565b602082019050919050565b6000602082019050818103600083015262000af48162000ab2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b4357607f821691505b6020821081141562000b5a5762000b5962000afb565b5b50919050565b615ff18062000b706000396000f3fe60806040526004361061020e5760003560e01c80638da5cb5b11610118578063d547741f116100a0578063eccc32f21161006f578063eccc32f2146107cc578063f242432a146107f7578063f2fde38b14610820578063f5298aca14610849578063fd1fc4a0146108725761020e565b8063d547741f146106f9578063d5abeb0114610722578063e985e9c51461074d578063ea0d5dcd1461078a5761020e565b8063a0712d68116100e7578063a0712d6814610623578063a217fddf1461063f578063a22cb4651461066a578063acec338a14610693578063bd85b039146106bc5761020e565b80638da5cb5b1461056757806391d148541461059257806395d89b41146105cf5780639dc29fac146105fa5761020e565b80632eb4a7ab1161019b5780634f558e791161016a5780634f558e791461049857806351cff8d9146104d55780636b20c454146104fe578063715018a6146105275780637d4052231461053e5761020e565b80632eb4a7ab146103de5780632f2ff15d1461040957806336568abe146104325780634e1273f41461045b5761020e565b8063248a9ca3116101e2578063248a9ca3146102f5578063278ecde1146103325780632a55205a1461035b5780632b5f3dbe146103995780632eb2c2d6146103b55761020e565b8062fdd58e1461021357806301ffc9a71461025057806306fdde031461028d5780630e89341c146102b8575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190613e2c565b61089b565b6040516102479190613e7b565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613eee565b610964565b6040516102849190613f36565b60405180910390f35b34801561029957600080fd5b506102a2610976565b6040516102af9190613fea565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da919061400c565b610a08565b6040516102ec9190613fea565b60405180910390f35b34801561030157600080fd5b5061031c6004803603810190610317919061406f565b610a9c565b60405161032991906140ab565b60405180910390f35b34801561033e57600080fd5b506103596004803603810190610354919061400c565b610abc565b005b34801561036757600080fd5b50610382600480360381019061037d91906140c6565b610de7565b604051610390929190614115565b60405180910390f35b6103b360048036038101906103ae9190614286565b610fd2565b005b3480156103c157600080fd5b506103dc60048036038101906103d7919061445a565b6111db565b005b3480156103ea57600080fd5b506103f361127c565b60405161040091906140ab565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190614529565b611286565b005b34801561043e57600080fd5b5061045960048036038101906104549190614529565b6112af565b005b34801561046757600080fd5b50610482600480360381019061047d9190614569565b611332565b60405161048f919061469f565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba919061400c565b61144b565b6040516104cc9190613f36565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f791906146c1565b61145f565b005b34801561050a57600080fd5b50610525600480360381019061052091906146ee565b611525565b005b34801561053357600080fd5b5061053c6115c2565b005b34801561054a57600080fd5b506105656004803603810190610560919061481a565b61164a565b005b34801561057357600080fd5b5061057c61169e565b60405161058991906148b1565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190614529565b6116c8565b6040516105c69190613f36565b60405180910390f35b3480156105db57600080fd5b506105e4611733565b6040516105f19190613fea565b60405180910390f35b34801561060657600080fd5b50610621600480360381019061061c9190613e2c565b6117c5565b005b61063d6004803603810190610638919061400c565b61186c565b005b34801561064b57600080fd5b50610654611b95565b60405161066191906140ab565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c91906148f8565b611b9c565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190614938565b611bb2565b005b3480156106c857600080fd5b506106e360048036038101906106de919061400c565b611be5565b6040516106f09190613e7b565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190614529565b611c02565b005b34801561072e57600080fd5b50610737611c2b565b6040516107449190613e7b565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190614965565b611c31565b6040516107819190613f36565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac91906146c1565b611cc5565b6040516107c3969594939291906149a5565b60405180910390f35b3480156107d857600080fd5b506107e1611d93565b6040516107ee9190613e7b565b60405180910390f35b34801561080357600080fd5b5061081e60048036038101906108199190614a06565b611d98565b005b34801561082c57600080fd5b50610847600480360381019061084291906146c1565b611e39565b005b34801561085557600080fd5b50610870600480360381019061086b9190614a9d565b611f31565b005b34801561087e57600080fd5b5061089960048036038101906108949190614af0565b611fce565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090390614bbe565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061096f82612109565b9050919050565b60606009805461098590614c0d565b80601f01602080910402602001604051908101604052809291908181526020018280546109b190614c0d565b80156109fe5780601f106109d3576101008083540402835291602001916109fe565b820191906000526020600020905b8154815290600101906020018083116109e157829003601f168201915b5050505050905090565b606060028054610a1790614c0d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4390614c0d565b8015610a905780601f10610a6557610100808354040283529160200191610a90565b820191906000526020600020905b815481529060010190602001808311610a7357829003601f168201915b50505050509050919050565b600060046000838152602001908152602001600020600101549050919050565b600e6000610ac8612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154811115610b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3f90614c8b565b60405180910390fd5b610b5a610b53612183565b600061089b565b600e6000610b66612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc90614c8b565b60405180910390fd5b62093a80600e6000610bf5612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154610c3d9190614cda565b4210610c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7590614d7c565b60405180910390fd5b80600e6000610c8b612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403600e6000610cd6612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555060006040518060400160405280600681526020017f726566756e6400000000000000000000000000000000000000000000000000008152509050610d88610d5c612183565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008585611d98565b610d90612183565b73ffffffffffffffffffffffffffffffffffffffff166108fc600c5484610db79190614d9c565b9081150290604051600060405180830381858888f19350505050158015610de2573d6000803e3d6000fd5b505050565b6000806000600660008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610f7d5760056040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610f8761218b565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610fb39190614d9c565b610fbd9190614e25565b90508160000151819350935050509250929050565b60085482610fe06000611be5565b610fea9190614cda565b111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290614ea2565b60405180910390fd5b6001821461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590614f0e565b60405180910390fd5b600f600061107a612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f990614f7a565b60405180910390fd5b61111681600b54611111612183565b612195565b611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c90614fe6565b60405180910390fd5b6001600f6000611163612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506111d76111bf612183565b60008460405180602001604052806000815250612253565b5050565b6111e3612183565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611229575061122885611223612183565b611c31565b5b611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90615078565b60405180910390fd5b61127585858585856123e9565b5050505050565b6000600b54905090565b61128f82610a9c565b6112a08161129b612183565b6126fd565b6112aa838361279a565b505050565b6112b7612183565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b9061510a565b60405180910390fd5b61132e828261287b565b5050565b60608151835114611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f9061519c565b60405180910390fd5b6000835167ffffffffffffffff81111561139557611394614143565b5b6040519080825280602002602001820160405280156113c35781602001602082028036833780820191505090505b50905060005b8451811015611440576114108582815181106113e8576113e76151bc565b5b6020026020010151858381518110611403576114026151bc565b5b602002602001015161089b565b828281518110611423576114226151bc565b5b60200260200101818152505080611439906151eb565b90506113c9565b508091505092915050565b60008061145783611be5565b119050919050565b611467612183565b73ffffffffffffffffffffffffffffffffffffffff1661148561169e565b73ffffffffffffffffffffffffffffffffffffffff16146114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290615280565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611521573d6000803e3d6000fd5b5050565b61152d612183565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061157357506115728361156d612183565b611c31565b5b6115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990615312565b60405180910390fd5b6115bd83838361295d565b505050565b6115ca612183565b73ffffffffffffffffffffffffffffffffffffffff166115e861169e565b73ffffffffffffffffffffffffffffffffffffffff161461163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590615280565b60405180910390fd5b6116486000612c0e565b565b6000801b61165f8161165a612183565b6126fd565b66038d7ea4c68000866116729190614d9c565b600c81905550836008819055508260108190555081600b8190555061169685612cd4565b505050505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600a805461174290614c0d565b80601f016020809104026020016040519081016040528092919081815260200182805461176e90614c0d565b80156117bb5780601f10611790576101008083540402835291602001916117bb565b820191906000526020600020905b81548152906001019060200180831161179e57829003601f168201915b5050505050905090565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611806612183565b73ffffffffffffffffffffffffffffffffffffffff161461185c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118539061537e565b60405180910390fd5b61186882600083612cee565b5050565b600d60009054906101000a900460ff166118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b2906153ea565b60405180910390fd5b600854816118c96000611be5565b6118d39190614cda565b1115611914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190b90614ea2565b60405180910390fd5b601054816119226000611be5565b61192c9190614cda565b1115801561193a5750600181145b15611a3757600f600061194b612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156119d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ca90615456565b60405180910390fd5b6001600f60006119e1612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b6f565b3481600c54611a469190614d9c565b1115611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e906154c2565b60405180910390fd5b80600e6000611a94612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015401600e6000611adf612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555042600e6000611b2d612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b611b92611b7a612183565b60008360405180602001604052806000815250612253565b50565b6000801b81565b611bae611ba7612183565b8383612f0b565b5050565b6000801b611bc781611bc2612183565b6126fd565b81600d60006101000a81548160ff0219169083151502179055505050565b600060036000838152602001908152602001600020549050919050565b611c0b82610a9c565b611c1c81611c17612183565b6126fd565b611c26838361287b565b505050565b60085481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600080600080600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600c54600d60009054906101000a900460ff16601054611d3b6000611be5565b600e60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015495509550955095509550955091939550919395565b600081565b611da0612183565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611de65750611de585611de0612183565b611c31565b5b611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90615312565b60405180910390fd5b611e328585858585613078565b5050505050565b611e41612183565b73ffffffffffffffffffffffffffffffffffffffff16611e5f61169e565b73ffffffffffffffffffffffffffffffffffffffff1614611eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eac90615280565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c90615554565b60405180910390fd5b611f2e81612c0e565b50565b611f39612183565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611f7f5750611f7e83611f79612183565b611c31565b5b611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb590615312565b60405180910390fd5b611fc9838383612cee565b505050565b611fd6612183565b73ffffffffffffffffffffffffffffffffffffffff16611ff461169e565b73ffffffffffffffffffffffffffffffffffffffff161461204a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204190615280565b60405180910390fd5b60085481835161205a9190614d9c565b6120646000611be5565b61206e9190614cda565b11156120af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a690614ea2565b60405180910390fd5b60005b8251811015612104576120f18382815181106120d1576120d06151bc565b5b602002602001015160008460405180602001604052806000815250612253565b80806120fc906151eb565b9150506120b2565b505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061217c575061217b826132fa565b5b9050919050565b600033905090565b6000612710905090565b6000806000905060005b8551811015612212578373ffffffffffffffffffffffffffffffffffffffff168682815181106121d2576121d16151bc565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156121ff5760019150612212565b808061220a906151eb565b91505061219f565b508061221f576000612249565b8385604051602001612231919061562c565b60405160208183030381529060405280519060200120145b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ba906156b5565b60405180910390fd5b60006122cd612183565b90506122ee816000876122df88613374565b6122e888613374565b876133ee565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461234d9190614cda565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516123cb9291906156d5565b60405180910390a46123e281600087878787613404565b5050505050565b815183511461242d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242490615770565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561249d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249490615802565b60405180910390fd5b60006124a7612183565b90506124b78187878787876133ee565b60005b84518110156126685760008582815181106124d8576124d76151bc565b5b6020026020010151905060008583815181106124f7576124f66151bc565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258f90615894565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461264d9190614cda565b9250508190555050505080612661906151eb565b90506124ba565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126df9291906158b4565b60405180910390a46126f58187878787876135dc565b505050505050565b61270782826116c8565b6127965761272c8173ffffffffffffffffffffffffffffffffffffffff1660146137b4565b61273a8360001c60206137b4565b60405160200161274b9291906159bf565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d9190613fea565b60405180910390fd5b5050565b6127a482826116c8565b6128775760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061281c612183565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61288582826116c8565b156129595760006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506128fe612183565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c490615a6b565b60405180910390fd5b8051825114612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890615770565b60405180910390fd5b6000612a1b612183565b9050612a3b818560008686604051806020016040528060008152506133ee565b60005b8351811015612b88576000848281518110612a5c57612a5b6151bc565b5b602002602001015190506000848381518110612a7b57612a7a6151bc565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390615afd565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080612b80906151eb565b915050612a3e565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612c009291906158b4565b60405180910390a450505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060029080519060200190612cea929190613ce1565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5590615a6b565b60405180910390fd5b6000612d68612183565b9050612d9881856000612d7a87613374565b612d8387613374565b604051806020016040528060008152506133ee565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2690615afd565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612efc9291906156d5565b60405180910390a45050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7190615b8f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161306b9190613f36565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156130e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130df90615802565b60405180910390fd5b60006130f2612183565b905061311281878761310388613374565b61310c88613374565b876133ee565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156131a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a090615894565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461325e9190614cda565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516132db9291906156d5565b60405180910390a46132f1828888888888613404565b50505050505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061336d575061336c826139f0565b5b9050919050565b60606000600167ffffffffffffffff81111561339357613392614143565b5b6040519080825280602002602001820160405280156133c15781602001602082028036833780820191505090505b50905082816000815181106133d9576133d86151bc565b5b60200260200101818152505080915050919050565b6133fc868686868686613ad2565b505050505050565b6134238473ffffffffffffffffffffffffffffffffffffffff16613c4c565b156135d4578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613469959493929190615c04565b6020604051808303816000875af19250505080156134a557506040513d601f19601f820116820180604052508101906134a29190615c73565b60015b61354b576134b1615cad565b806308c379a0141561350e57506134c6615ccf565b806134d15750613510565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135059190613fea565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354290615dd7565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c990615e69565b60405180910390fd5b505b505050505050565b6135fb8473ffffffffffffffffffffffffffffffffffffffff16613c4c565b156137ac578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613641959493929190615e89565b6020604051808303816000875af192505050801561367d57506040513d601f19601f8201168201806040525081019061367a9190615c73565b60015b61372357613689615cad565b806308c379a014156136e6575061369e615ccf565b806136a957506136e8565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136dd9190613fea565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371a90615dd7565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146137aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a190615e69565b60405180910390fd5b505b505050505050565b6060600060028360026137c79190614d9c565b6137d19190614cda565b67ffffffffffffffff8111156137ea576137e9614143565b5b6040519080825280601f01601f19166020018201604052801561381c5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613854576138536151bc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106138b8576138b76151bc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026138f89190614d9c565b6139029190614cda565b90505b60018111156139a2577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613944576139436151bc565b5b1a60f81b82828151811061395b5761395a6151bc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061399b90615ef1565b9050613905565b50600084146139e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139dd90615f67565b60405180910390fd5b8091505092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613abb57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613acb5750613aca82613c6f565b5b9050919050565b613ae0868686868686613cd9565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613b925760005b8351811015613b9057828181518110613b3457613b336151bc565b5b602002602001015160036000868481518110613b5357613b526151bc565b5b602002602001015181526020019081526020016000206000828254613b789190614cda565b9250508190555080613b89906151eb565b9050613b18565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613c445760005b8351811015613c4257828181518110613be657613be56151bc565b5b602002602001015160036000868481518110613c0557613c046151bc565b5b602002602001015181526020019081526020016000206000828254613c2a9190615f87565b9250508190555080613c3b906151eb565b9050613bca565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050505050565b828054613ced90614c0d565b90600052602060002090601f016020900481019282613d0f5760008555613d56565b82601f10613d2857805160ff1916838001178555613d56565b82800160010185558215613d56579182015b82811115613d55578251825591602001919060010190613d3a565b5b509050613d639190613d67565b5090565b5b80821115613d80576000816000905550600101613d68565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613dc382613d98565b9050919050565b613dd381613db8565b8114613dde57600080fd5b50565b600081359050613df081613dca565b92915050565b6000819050919050565b613e0981613df6565b8114613e1457600080fd5b50565b600081359050613e2681613e00565b92915050565b60008060408385031215613e4357613e42613d8e565b5b6000613e5185828601613de1565b9250506020613e6285828601613e17565b9150509250929050565b613e7581613df6565b82525050565b6000602082019050613e906000830184613e6c565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ecb81613e96565b8114613ed657600080fd5b50565b600081359050613ee881613ec2565b92915050565b600060208284031215613f0457613f03613d8e565b5b6000613f1284828501613ed9565b91505092915050565b60008115159050919050565b613f3081613f1b565b82525050565b6000602082019050613f4b6000830184613f27565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f8b578082015181840152602081019050613f70565b83811115613f9a576000848401525b50505050565b6000601f19601f8301169050919050565b6000613fbc82613f51565b613fc68185613f5c565b9350613fd6818560208601613f6d565b613fdf81613fa0565b840191505092915050565b600060208201905081810360008301526140048184613fb1565b905092915050565b60006020828403121561402257614021613d8e565b5b600061403084828501613e17565b91505092915050565b6000819050919050565b61404c81614039565b811461405757600080fd5b50565b60008135905061406981614043565b92915050565b60006020828403121561408557614084613d8e565b5b60006140938482850161405a565b91505092915050565b6140a581614039565b82525050565b60006020820190506140c0600083018461409c565b92915050565b600080604083850312156140dd576140dc613d8e565b5b60006140eb85828601613e17565b92505060206140fc85828601613e17565b9150509250929050565b61410f81613db8565b82525050565b600060408201905061412a6000830185614106565b6141376020830184613e6c565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61417b82613fa0565b810181811067ffffffffffffffff8211171561419a57614199614143565b5b80604052505050565b60006141ad613d84565b90506141b98282614172565b919050565b600067ffffffffffffffff8211156141d9576141d8614143565b5b602082029050602081019050919050565b600080fd5b60006142026141fd846141be565b6141a3565b90508083825260208201905060208402830185811115614225576142246141ea565b5b835b8181101561424e578061423a8882613de1565b845260208401935050602081019050614227565b5050509392505050565b600082601f83011261426d5761426c61413e565b5b813561427d8482602086016141ef565b91505092915050565b6000806040838503121561429d5761429c613d8e565b5b60006142ab85828601613e17565b925050602083013567ffffffffffffffff8111156142cc576142cb613d93565b5b6142d885828601614258565b9150509250929050565b600067ffffffffffffffff8211156142fd576142fc614143565b5b602082029050602081019050919050565b600061432161431c846142e2565b6141a3565b90508083825260208201905060208402830185811115614344576143436141ea565b5b835b8181101561436d57806143598882613e17565b845260208401935050602081019050614346565b5050509392505050565b600082601f83011261438c5761438b61413e565b5b813561439c84826020860161430e565b91505092915050565b600080fd5b600067ffffffffffffffff8211156143c5576143c4614143565b5b6143ce82613fa0565b9050602081019050919050565b82818337600083830152505050565b60006143fd6143f8846143aa565b6141a3565b905082815260208101848484011115614419576144186143a5565b5b6144248482856143db565b509392505050565b600082601f8301126144415761444061413e565b5b81356144518482602086016143ea565b91505092915050565b600080600080600060a0868803121561447657614475613d8e565b5b600061448488828901613de1565b955050602061449588828901613de1565b945050604086013567ffffffffffffffff8111156144b6576144b5613d93565b5b6144c288828901614377565b935050606086013567ffffffffffffffff8111156144e3576144e2613d93565b5b6144ef88828901614377565b925050608086013567ffffffffffffffff8111156145105761450f613d93565b5b61451c8882890161442c565b9150509295509295909350565b600080604083850312156145405761453f613d8e565b5b600061454e8582860161405a565b925050602061455f85828601613de1565b9150509250929050565b600080604083850312156145805761457f613d8e565b5b600083013567ffffffffffffffff81111561459e5761459d613d93565b5b6145aa85828601614258565b925050602083013567ffffffffffffffff8111156145cb576145ca613d93565b5b6145d785828601614377565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61461681613df6565b82525050565b6000614628838361460d565b60208301905092915050565b6000602082019050919050565b600061464c826145e1565b61465681856145ec565b9350614661836145fd565b8060005b83811015614692578151614679888261461c565b975061468483614634565b925050600181019050614665565b5085935050505092915050565b600060208201905081810360008301526146b98184614641565b905092915050565b6000602082840312156146d7576146d6613d8e565b5b60006146e584828501613de1565b91505092915050565b60008060006060848603121561470757614706613d8e565b5b600061471586828701613de1565b935050602084013567ffffffffffffffff81111561473657614735613d93565b5b61474286828701614377565b925050604084013567ffffffffffffffff81111561476357614762613d93565b5b61476f86828701614377565b9150509250925092565b600067ffffffffffffffff82111561479457614793614143565b5b61479d82613fa0565b9050602081019050919050565b60006147bd6147b884614779565b6141a3565b9050828152602081018484840111156147d9576147d86143a5565b5b6147e48482856143db565b509392505050565b600082601f8301126148015761480061413e565b5b81356148118482602086016147aa565b91505092915050565b600080600080600060a0868803121561483657614835613d8e565b5b600061484488828901613e17565b955050602086013567ffffffffffffffff81111561486557614864613d93565b5b614871888289016147ec565b945050604061488288828901613e17565b935050606061489388828901613e17565b92505060806148a48882890161405a565b9150509295509295909350565b60006020820190506148c66000830184614106565b92915050565b6148d581613f1b565b81146148e057600080fd5b50565b6000813590506148f2816148cc565b92915050565b6000806040838503121561490f5761490e613d8e565b5b600061491d85828601613de1565b925050602061492e858286016148e3565b9150509250929050565b60006020828403121561494e5761494d613d8e565b5b600061495c848285016148e3565b91505092915050565b6000806040838503121561497c5761497b613d8e565b5b600061498a85828601613de1565b925050602061499b85828601613de1565b9150509250929050565b600060c0820190506149ba6000830189613f27565b6149c76020830188613e6c565b6149d46040830187613f27565b6149e16060830186613e6c565b6149ee6080830185613e6c565b6149fb60a0830184613e6c565b979650505050505050565b600080600080600060a08688031215614a2257614a21613d8e565b5b6000614a3088828901613de1565b9550506020614a4188828901613de1565b9450506040614a5288828901613e17565b9350506060614a6388828901613e17565b925050608086013567ffffffffffffffff811115614a8457614a83613d93565b5b614a908882890161442c565b9150509295509295909350565b600080600060608486031215614ab657614ab5613d8e565b5b6000614ac486828701613de1565b9350506020614ad586828701613e17565b9250506040614ae686828701613e17565b9150509250925092565b60008060408385031215614b0757614b06613d8e565b5b600083013567ffffffffffffffff811115614b2557614b24613d93565b5b614b3185828601614258565b9250506020614b4285828601613e17565b9150509250929050565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614ba8602b83613f5c565b9150614bb382614b4c565b604082019050919050565b60006020820190508181036000830152614bd781614b9b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614c2557607f821691505b60208210811415614c3957614c38614bde565b5b50919050565b7f616d6f756e7420696e636f727265637400000000000000000000000000000000600082015250565b6000614c75601083613f5c565b9150614c8082614c3f565b602082019050919050565b60006020820190508181036000830152614ca481614c68565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ce582613df6565b9150614cf083613df6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d2557614d24614cab565b5b828201905092915050565b7f6f76657274696d65000000000000000000000000000000000000000000000000600082015250565b6000614d66600883613f5c565b9150614d7182614d30565b602082019050919050565b60006020820190508181036000830152614d9581614d59565b9050919050565b6000614da782613df6565b9150614db283613df6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614deb57614dea614cab565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e3082613df6565b9150614e3b83613df6565b925082614e4b57614e4a614df6565b5b828204905092915050565b7f4578636565646564206d617820737570706c7900000000000000000000000000600082015250565b6000614e8c601383613f5c565b9150614e9782614e56565b602082019050919050565b60006020820190508181036000830152614ebb81614e7f565b9050919050565b7f4578636565646564206d61780000000000000000000000000000000000000000600082015250565b6000614ef8600c83613f5c565b9150614f0382614ec2565b602082019050919050565b60006020820190508181036000830152614f2781614eeb565b9050919050565b7f6d696e7465640000000000000000000000000000000000000000000000000000600082015250565b6000614f64600683613f5c565b9150614f6f82614f2e565b602082019050919050565b60006020820190508181036000830152614f9381614f57565b9050919050565b7f4e6f742070617274206f66206c69737400000000000000000000000000000000600082015250565b6000614fd0601083613f5c565b9150614fdb82614f9a565b602082019050919050565b60006020820190508181036000830152614fff81614fc3565b9050919050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615062603283613f5c565b915061506d82615006565b604082019050919050565b6000602082019050818103600083015261509181615055565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006150f4602f83613f5c565b91506150ff82615098565b604082019050919050565b60006020820190508181036000830152615123816150e7565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000615186602983613f5c565b91506151918261512a565b604082019050919050565b600060208201905081810360008301526151b581615179565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006151f682613df6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561522957615228614cab565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061526a602083613f5c565b915061527582615234565b602082019050919050565b600060208201905081810360008301526152998161525d565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b60006152fc602983613f5c565b9150615307826152a0565b604082019050919050565b6000602082019050818103600083015261532b816152ef565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000615368600f83613f5c565b915061537382615332565b602082019050919050565b600060208201905081810360008301526153978161535b565b9050919050565b7f4e6f742079657420737461727465640000000000000000000000000000000000600082015250565b60006153d4600f83613f5c565b91506153df8261539e565b602082019050919050565b60006020820190508181036000830152615403816153c7565b9050919050565b7f6572726f72000000000000000000000000000000000000000000000000000000600082015250565b6000615440600583613f5c565b915061544b8261540a565b602082019050919050565b6000602082019050818103600083015261546f81615433565b9050919050565b7f56616c756520696e636f72726563740000000000000000000000000000000000600082015250565b60006154ac600f83613f5c565b91506154b782615476565b602082019050919050565b600060208201905081810360008301526154db8161549f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061553e602683613f5c565b9150615549826154e2565b604082019050919050565b6000602082019050818103600083015261556d81615531565b9050919050565b600081519050919050565b600081905092915050565b6000819050602082019050919050565b6155a381613db8565b82525050565b60006155b5838361559a565b60208301905092915050565b6000602082019050919050565b60006155d982615574565b6155e3818561557f565b93506155ee8361558a565b8060005b8381101561561f57815161560688826155a9565b9750615611836155c1565b9250506001810190506155f2565b5085935050505092915050565b600061563882846155ce565b915081905092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061569f602183613f5c565b91506156aa82615643565b604082019050919050565b600060208201905081810360008301526156ce81615692565b9050919050565b60006040820190506156ea6000830185613e6c565b6156f76020830184613e6c565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b600061575a602883613f5c565b9150615765826156fe565b604082019050919050565b600060208201905081810360008301526157898161574d565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006157ec602583613f5c565b91506157f782615790565b604082019050919050565b6000602082019050818103600083015261581b816157df565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b600061587e602a83613f5c565b915061588982615822565b604082019050919050565b600060208201905081810360008301526158ad81615871565b9050919050565b600060408201905081810360008301526158ce8185614641565b905081810360208301526158e28184614641565b90509392505050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061592c6017836158eb565b9150615937826158f6565b601782019050919050565b600061594d82613f51565b61595781856158eb565b9350615967818560208601613f6d565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006159a96011836158eb565b91506159b482615973565b601182019050919050565b60006159ca8261591f565b91506159d68285615942565b91506159e18261599c565b91506159ed8284615942565b91508190509392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615a55602383613f5c565b9150615a60826159f9565b604082019050919050565b60006020820190508181036000830152615a8481615a48565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000615ae7602483613f5c565b9150615af282615a8b565b604082019050919050565b60006020820190508181036000830152615b1681615ada565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615b79602983613f5c565b9150615b8482615b1d565b604082019050919050565b60006020820190508181036000830152615ba881615b6c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615bd682615baf565b615be08185615bba565b9350615bf0818560208601613f6d565b615bf981613fa0565b840191505092915050565b600060a082019050615c196000830188614106565b615c266020830187614106565b615c336040830186613e6c565b615c406060830185613e6c565b8181036080830152615c528184615bcb565b90509695505050505050565b600081519050615c6d81613ec2565b92915050565b600060208284031215615c8957615c88613d8e565b5b6000615c9784828501615c5e565b91505092915050565b60008160e01c9050919050565b600060033d1115615ccc5760046000803e615cc9600051615ca0565b90505b90565b600060443d1015615cdf57615d62565b615ce7613d84565b60043d036004823e80513d602482011167ffffffffffffffff82111715615d0f575050615d62565b808201805167ffffffffffffffff811115615d2d5750505050615d62565b80602083010160043d038501811115615d4a575050505050615d62565b615d5982602001850186614172565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615dc1603483613f5c565b9150615dcc82615d65565b604082019050919050565b60006020820190508181036000830152615df081615db4565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615e53602883613f5c565b9150615e5e82615df7565b604082019050919050565b60006020820190508181036000830152615e8281615e46565b9050919050565b600060a082019050615e9e6000830188614106565b615eab6020830187614106565b8181036040830152615ebd8186614641565b90508181036060830152615ed18185614641565b90508181036080830152615ee58184615bcb565b90509695505050505050565b6000615efc82613df6565b91506000821415615f1057615f0f614cab565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615f51602083613f5c565b9150615f5c82615f1b565b602082019050919050565b60006020820190508181036000830152615f8081615f44565b9050919050565b6000615f9282613df6565b9150615f9d83613df6565b925082821015615fb057615faf614cab565b5b82820390509291505056fea2646970667358221220d1b951ca761a9f0ab0bc028227d42a3eae0545fa0b03e22d40d55859d306134c64736f6c634300080c003300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008ae00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000140c047723840d43f9fbb1ca8399c2dd480b1c1c9b60d9c4aa8271795f0daff1367000000000000000000000000000000000000000000000000000000000000000744414e2044414f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000744414e2044414f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f676364642e6d7970696e6174612e636c6f75642f697066732f516d586e504837516e31706d794a37786f753841513632627769696e6b71336e79586233436f685a374b356754432f302e6a736f6e00000000000000000000
Deployed Bytecode
0x60806040526004361061020e5760003560e01c80638da5cb5b11610118578063d547741f116100a0578063eccc32f21161006f578063eccc32f2146107cc578063f242432a146107f7578063f2fde38b14610820578063f5298aca14610849578063fd1fc4a0146108725761020e565b8063d547741f146106f9578063d5abeb0114610722578063e985e9c51461074d578063ea0d5dcd1461078a5761020e565b8063a0712d68116100e7578063a0712d6814610623578063a217fddf1461063f578063a22cb4651461066a578063acec338a14610693578063bd85b039146106bc5761020e565b80638da5cb5b1461056757806391d148541461059257806395d89b41146105cf5780639dc29fac146105fa5761020e565b80632eb4a7ab1161019b5780634f558e791161016a5780634f558e791461049857806351cff8d9146104d55780636b20c454146104fe578063715018a6146105275780637d4052231461053e5761020e565b80632eb4a7ab146103de5780632f2ff15d1461040957806336568abe146104325780634e1273f41461045b5761020e565b8063248a9ca3116101e2578063248a9ca3146102f5578063278ecde1146103325780632a55205a1461035b5780632b5f3dbe146103995780632eb2c2d6146103b55761020e565b8062fdd58e1461021357806301ffc9a71461025057806306fdde031461028d5780630e89341c146102b8575b600080fd5b34801561021f57600080fd5b5061023a60048036038101906102359190613e2c565b61089b565b6040516102479190613e7b565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613eee565b610964565b6040516102849190613f36565b60405180910390f35b34801561029957600080fd5b506102a2610976565b6040516102af9190613fea565b60405180910390f35b3480156102c457600080fd5b506102df60048036038101906102da919061400c565b610a08565b6040516102ec9190613fea565b60405180910390f35b34801561030157600080fd5b5061031c6004803603810190610317919061406f565b610a9c565b60405161032991906140ab565b60405180910390f35b34801561033e57600080fd5b506103596004803603810190610354919061400c565b610abc565b005b34801561036757600080fd5b50610382600480360381019061037d91906140c6565b610de7565b604051610390929190614115565b60405180910390f35b6103b360048036038101906103ae9190614286565b610fd2565b005b3480156103c157600080fd5b506103dc60048036038101906103d7919061445a565b6111db565b005b3480156103ea57600080fd5b506103f361127c565b60405161040091906140ab565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190614529565b611286565b005b34801561043e57600080fd5b5061045960048036038101906104549190614529565b6112af565b005b34801561046757600080fd5b50610482600480360381019061047d9190614569565b611332565b60405161048f919061469f565b60405180910390f35b3480156104a457600080fd5b506104bf60048036038101906104ba919061400c565b61144b565b6040516104cc9190613f36565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f791906146c1565b61145f565b005b34801561050a57600080fd5b50610525600480360381019061052091906146ee565b611525565b005b34801561053357600080fd5b5061053c6115c2565b005b34801561054a57600080fd5b506105656004803603810190610560919061481a565b61164a565b005b34801561057357600080fd5b5061057c61169e565b60405161058991906148b1565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190614529565b6116c8565b6040516105c69190613f36565b60405180910390f35b3480156105db57600080fd5b506105e4611733565b6040516105f19190613fea565b60405180910390f35b34801561060657600080fd5b50610621600480360381019061061c9190613e2c565b6117c5565b005b61063d6004803603810190610638919061400c565b61186c565b005b34801561064b57600080fd5b50610654611b95565b60405161066191906140ab565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c91906148f8565b611b9c565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190614938565b611bb2565b005b3480156106c857600080fd5b506106e360048036038101906106de919061400c565b611be5565b6040516106f09190613e7b565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190614529565b611c02565b005b34801561072e57600080fd5b50610737611c2b565b6040516107449190613e7b565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190614965565b611c31565b6040516107819190613f36565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac91906146c1565b611cc5565b6040516107c3969594939291906149a5565b60405180910390f35b3480156107d857600080fd5b506107e1611d93565b6040516107ee9190613e7b565b60405180910390f35b34801561080357600080fd5b5061081e60048036038101906108199190614a06565b611d98565b005b34801561082c57600080fd5b50610847600480360381019061084291906146c1565b611e39565b005b34801561085557600080fd5b50610870600480360381019061086b9190614a9d565b611f31565b005b34801561087e57600080fd5b5061089960048036038101906108949190614af0565b611fce565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561090c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090390614bbe565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600061096f82612109565b9050919050565b60606009805461098590614c0d565b80601f01602080910402602001604051908101604052809291908181526020018280546109b190614c0d565b80156109fe5780601f106109d3576101008083540402835291602001916109fe565b820191906000526020600020905b8154815290600101906020018083116109e157829003601f168201915b5050505050905090565b606060028054610a1790614c0d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4390614c0d565b8015610a905780601f10610a6557610100808354040283529160200191610a90565b820191906000526020600020905b815481529060010190602001808311610a7357829003601f168201915b50505050509050919050565b600060046000838152602001908152602001600020600101549050919050565b600e6000610ac8612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154811115610b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3f90614c8b565b60405180910390fd5b610b5a610b53612183565b600061089b565b600e6000610b66612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc90614c8b565b60405180910390fd5b62093a80600e6000610bf5612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154610c3d9190614cda565b4210610c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7590614d7c565b60405180910390fd5b80600e6000610c8b612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015403600e6000610cd6612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555060006040518060400160405280600681526020017f726566756e6400000000000000000000000000000000000000000000000000008152509050610d88610d5c612183565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660008585611d98565b610d90612183565b73ffffffffffffffffffffffffffffffffffffffff166108fc600c5484610db79190614d9c565b9081150290604051600060405180830381858888f19350505050158015610de2573d6000803e3d6000fd5b505050565b6000806000600660008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610f7d5760056040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610f8761218b565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610fb39190614d9c565b610fbd9190614e25565b90508160000151819350935050509250929050565b60085482610fe06000611be5565b610fea9190614cda565b111561102b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102290614ea2565b60405180910390fd5b6001821461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590614f0e565b60405180910390fd5b600f600061107a612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611102576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f990614f7a565b60405180910390fd5b61111681600b54611111612183565b612195565b611155576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114c90614fe6565b60405180910390fd5b6001600f6000611163612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506111d76111bf612183565b60008460405180602001604052806000815250612253565b5050565b6111e3612183565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611229575061122885611223612183565b611c31565b5b611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90615078565b60405180910390fd5b61127585858585856123e9565b5050505050565b6000600b54905090565b61128f82610a9c565b6112a08161129b612183565b6126fd565b6112aa838361279a565b505050565b6112b7612183565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b9061510a565b60405180910390fd5b61132e828261287b565b5050565b60608151835114611378576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136f9061519c565b60405180910390fd5b6000835167ffffffffffffffff81111561139557611394614143565b5b6040519080825280602002602001820160405280156113c35781602001602082028036833780820191505090505b50905060005b8451811015611440576114108582815181106113e8576113e76151bc565b5b6020026020010151858381518110611403576114026151bc565b5b602002602001015161089b565b828281518110611423576114226151bc565b5b60200260200101818152505080611439906151eb565b90506113c9565b508091505092915050565b60008061145783611be5565b119050919050565b611467612183565b73ffffffffffffffffffffffffffffffffffffffff1661148561169e565b73ffffffffffffffffffffffffffffffffffffffff16146114db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d290615280565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611521573d6000803e3d6000fd5b5050565b61152d612183565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061157357506115728361156d612183565b611c31565b5b6115b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a990615312565b60405180910390fd5b6115bd83838361295d565b505050565b6115ca612183565b73ffffffffffffffffffffffffffffffffffffffff166115e861169e565b73ffffffffffffffffffffffffffffffffffffffff161461163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590615280565b60405180910390fd5b6116486000612c0e565b565b6000801b61165f8161165a612183565b6126fd565b66038d7ea4c68000866116729190614d9c565b600c81905550836008819055508260108190555081600b8190555061169685612cd4565b505050505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600a805461174290614c0d565b80601f016020809104026020016040519081016040528092919081815260200182805461176e90614c0d565b80156117bb5780601f10611790576101008083540402835291602001916117bb565b820191906000526020600020905b81548152906001019060200180831161179e57829003601f168201915b5050505050905090565b600d60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611806612183565b73ffffffffffffffffffffffffffffffffffffffff161461185c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118539061537e565b60405180910390fd5b61186882600083612cee565b5050565b600d60009054906101000a900460ff166118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b2906153ea565b60405180910390fd5b600854816118c96000611be5565b6118d39190614cda565b1115611914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190b90614ea2565b60405180910390fd5b601054816119226000611be5565b61192c9190614cda565b1115801561193a5750600181145b15611a3757600f600061194b612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156119d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ca90615456565b60405180910390fd5b6001600f60006119e1612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611b6f565b3481600c54611a469190614d9c565b1115611a87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7e906154c2565b60405180910390fd5b80600e6000611a94612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015401600e6000611adf612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555042600e6000611b2d612183565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055505b611b92611b7a612183565b60008360405180602001604052806000815250612253565b50565b6000801b81565b611bae611ba7612183565b8383612f0b565b5050565b6000801b611bc781611bc2612183565b6126fd565b81600d60006101000a81548160ff0219169083151502179055505050565b600060036000838152602001908152602001600020549050919050565b611c0b82610a9c565b611c1c81611c17612183565b6126fd565b611c26838361287b565b505050565b60085481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600080600080600080600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16600c54600d60009054906101000a900460ff16601054611d3b6000611be5565b600e60008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015495509550955095509550955091939550919395565b600081565b611da0612183565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611de65750611de585611de0612183565b611c31565b5b611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90615312565b60405180910390fd5b611e328585858585613078565b5050505050565b611e41612183565b73ffffffffffffffffffffffffffffffffffffffff16611e5f61169e565b73ffffffffffffffffffffffffffffffffffffffff1614611eb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eac90615280565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c90615554565b60405180910390fd5b611f2e81612c0e565b50565b611f39612183565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611f7f5750611f7e83611f79612183565b611c31565b5b611fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb590615312565b60405180910390fd5b611fc9838383612cee565b505050565b611fd6612183565b73ffffffffffffffffffffffffffffffffffffffff16611ff461169e565b73ffffffffffffffffffffffffffffffffffffffff161461204a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204190615280565b60405180910390fd5b60085481835161205a9190614d9c565b6120646000611be5565b61206e9190614cda565b11156120af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a690614ea2565b60405180910390fd5b60005b8251811015612104576120f18382815181106120d1576120d06151bc565b5b602002602001015160008460405180602001604052806000815250612253565b80806120fc906151eb565b9150506120b2565b505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061217c575061217b826132fa565b5b9050919050565b600033905090565b6000612710905090565b6000806000905060005b8551811015612212578373ffffffffffffffffffffffffffffffffffffffff168682815181106121d2576121d16151bc565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156121ff5760019150612212565b808061220a906151eb565b91505061219f565b508061221f576000612249565b8385604051602001612231919061562c565b60405160208183030381529060405280519060200120145b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ba906156b5565b60405180910390fd5b60006122cd612183565b90506122ee816000876122df88613374565b6122e888613374565b876133ee565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461234d9190614cda565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516123cb9291906156d5565b60405180910390a46123e281600087878787613404565b5050505050565b815183511461242d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242490615770565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561249d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249490615802565b60405180910390fd5b60006124a7612183565b90506124b78187878787876133ee565b60005b84518110156126685760008582815181106124d8576124d76151bc565b5b6020026020010151905060008583815181106124f7576124f66151bc565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612598576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258f90615894565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461264d9190614cda565b9250508190555050505080612661906151eb565b90506124ba565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126df9291906158b4565b60405180910390a46126f58187878787876135dc565b505050505050565b61270782826116c8565b6127965761272c8173ffffffffffffffffffffffffffffffffffffffff1660146137b4565b61273a8360001c60206137b4565b60405160200161274b9291906159bf565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278d9190613fea565b60405180910390fd5b5050565b6127a482826116c8565b6128775760016004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061281c612183565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61288582826116c8565b156129595760006004600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506128fe612183565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c490615a6b565b60405180910390fd5b8051825114612a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0890615770565b60405180910390fd5b6000612a1b612183565b9050612a3b818560008686604051806020016040528060008152506133ee565b60005b8351811015612b88576000848281518110612a5c57612a5b6151bc565b5b602002602001015190506000848381518110612a7b57612a7a6151bc565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612b1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1390615afd565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080612b80906151eb565b915050612a3e565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612c009291906158b4565b60405180910390a450505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8060029080519060200190612cea929190613ce1565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5590615a6b565b60405180910390fd5b6000612d68612183565b9050612d9881856000612d7a87613374565b612d8387613374565b604051806020016040528060008152506133ee565b600080600085815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015612e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2690615afd565b60405180910390fd5b82810360008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051612efc9291906156d5565b60405180910390a45050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7190615b8f565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161306b9190613f36565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156130e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130df90615802565b60405180910390fd5b60006130f2612183565b905061311281878761310388613374565b61310c88613374565b876133ee565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156131a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a090615894565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461325e9190614cda565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6288886040516132db9291906156d5565b60405180910390a46132f1828888888888613404565b50505050505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061336d575061336c826139f0565b5b9050919050565b60606000600167ffffffffffffffff81111561339357613392614143565b5b6040519080825280602002602001820160405280156133c15781602001602082028036833780820191505090505b50905082816000815181106133d9576133d86151bc565b5b60200260200101818152505080915050919050565b6133fc868686868686613ad2565b505050505050565b6134238473ffffffffffffffffffffffffffffffffffffffff16613c4c565b156135d4578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401613469959493929190615c04565b6020604051808303816000875af19250505080156134a557506040513d601f19601f820116820180604052508101906134a29190615c73565b60015b61354b576134b1615cad565b806308c379a0141561350e57506134c6615ccf565b806134d15750613510565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135059190613fea565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161354290615dd7565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146135d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135c990615e69565b60405180910390fd5b505b505050505050565b6135fb8473ffffffffffffffffffffffffffffffffffffffff16613c4c565b156137ac578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613641959493929190615e89565b6020604051808303816000875af192505050801561367d57506040513d601f19601f8201168201806040525081019061367a9190615c73565b60015b61372357613689615cad565b806308c379a014156136e6575061369e615ccf565b806136a957506136e8565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136dd9190613fea565b60405180910390fd5b505b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371a90615dd7565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146137aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137a190615e69565b60405180910390fd5b505b505050505050565b6060600060028360026137c79190614d9c565b6137d19190614cda565b67ffffffffffffffff8111156137ea576137e9614143565b5b6040519080825280601f01601f19166020018201604052801561381c5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110613854576138536151bc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106138b8576138b76151bc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026138f89190614d9c565b6139029190614cda565b90505b60018111156139a2577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110613944576139436151bc565b5b1a60f81b82828151811061395b5761395a6151bc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061399b90615ef1565b9050613905565b50600084146139e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139dd90615f67565b60405180910390fd5b8091505092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613abb57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613acb5750613aca82613c6f565b5b9050919050565b613ae0868686868686613cd9565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613b925760005b8351811015613b9057828181518110613b3457613b336151bc565b5b602002602001015160036000868481518110613b5357613b526151bc565b5b602002602001015181526020019081526020016000206000828254613b789190614cda565b9250508190555080613b89906151eb565b9050613b18565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613c445760005b8351811015613c4257828181518110613be657613be56151bc565b5b602002602001015160036000868481518110613c0557613c046151bc565b5b602002602001015181526020019081526020016000206000828254613c2a9190615f87565b9250508190555080613c3b906151eb565b9050613bca565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050505050565b828054613ced90614c0d565b90600052602060002090601f016020900481019282613d0f5760008555613d56565b82601f10613d2857805160ff1916838001178555613d56565b82800160010185558215613d56579182015b82811115613d55578251825591602001919060010190613d3a565b5b509050613d639190613d67565b5090565b5b80821115613d80576000816000905550600101613d68565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613dc382613d98565b9050919050565b613dd381613db8565b8114613dde57600080fd5b50565b600081359050613df081613dca565b92915050565b6000819050919050565b613e0981613df6565b8114613e1457600080fd5b50565b600081359050613e2681613e00565b92915050565b60008060408385031215613e4357613e42613d8e565b5b6000613e5185828601613de1565b9250506020613e6285828601613e17565b9150509250929050565b613e7581613df6565b82525050565b6000602082019050613e906000830184613e6c565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ecb81613e96565b8114613ed657600080fd5b50565b600081359050613ee881613ec2565b92915050565b600060208284031215613f0457613f03613d8e565b5b6000613f1284828501613ed9565b91505092915050565b60008115159050919050565b613f3081613f1b565b82525050565b6000602082019050613f4b6000830184613f27565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f8b578082015181840152602081019050613f70565b83811115613f9a576000848401525b50505050565b6000601f19601f8301169050919050565b6000613fbc82613f51565b613fc68185613f5c565b9350613fd6818560208601613f6d565b613fdf81613fa0565b840191505092915050565b600060208201905081810360008301526140048184613fb1565b905092915050565b60006020828403121561402257614021613d8e565b5b600061403084828501613e17565b91505092915050565b6000819050919050565b61404c81614039565b811461405757600080fd5b50565b60008135905061406981614043565b92915050565b60006020828403121561408557614084613d8e565b5b60006140938482850161405a565b91505092915050565b6140a581614039565b82525050565b60006020820190506140c0600083018461409c565b92915050565b600080604083850312156140dd576140dc613d8e565b5b60006140eb85828601613e17565b92505060206140fc85828601613e17565b9150509250929050565b61410f81613db8565b82525050565b600060408201905061412a6000830185614106565b6141376020830184613e6c565b9392505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61417b82613fa0565b810181811067ffffffffffffffff8211171561419a57614199614143565b5b80604052505050565b60006141ad613d84565b90506141b98282614172565b919050565b600067ffffffffffffffff8211156141d9576141d8614143565b5b602082029050602081019050919050565b600080fd5b60006142026141fd846141be565b6141a3565b90508083825260208201905060208402830185811115614225576142246141ea565b5b835b8181101561424e578061423a8882613de1565b845260208401935050602081019050614227565b5050509392505050565b600082601f83011261426d5761426c61413e565b5b813561427d8482602086016141ef565b91505092915050565b6000806040838503121561429d5761429c613d8e565b5b60006142ab85828601613e17565b925050602083013567ffffffffffffffff8111156142cc576142cb613d93565b5b6142d885828601614258565b9150509250929050565b600067ffffffffffffffff8211156142fd576142fc614143565b5b602082029050602081019050919050565b600061432161431c846142e2565b6141a3565b90508083825260208201905060208402830185811115614344576143436141ea565b5b835b8181101561436d57806143598882613e17565b845260208401935050602081019050614346565b5050509392505050565b600082601f83011261438c5761438b61413e565b5b813561439c84826020860161430e565b91505092915050565b600080fd5b600067ffffffffffffffff8211156143c5576143c4614143565b5b6143ce82613fa0565b9050602081019050919050565b82818337600083830152505050565b60006143fd6143f8846143aa565b6141a3565b905082815260208101848484011115614419576144186143a5565b5b6144248482856143db565b509392505050565b600082601f8301126144415761444061413e565b5b81356144518482602086016143ea565b91505092915050565b600080600080600060a0868803121561447657614475613d8e565b5b600061448488828901613de1565b955050602061449588828901613de1565b945050604086013567ffffffffffffffff8111156144b6576144b5613d93565b5b6144c288828901614377565b935050606086013567ffffffffffffffff8111156144e3576144e2613d93565b5b6144ef88828901614377565b925050608086013567ffffffffffffffff8111156145105761450f613d93565b5b61451c8882890161442c565b9150509295509295909350565b600080604083850312156145405761453f613d8e565b5b600061454e8582860161405a565b925050602061455f85828601613de1565b9150509250929050565b600080604083850312156145805761457f613d8e565b5b600083013567ffffffffffffffff81111561459e5761459d613d93565b5b6145aa85828601614258565b925050602083013567ffffffffffffffff8111156145cb576145ca613d93565b5b6145d785828601614377565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61461681613df6565b82525050565b6000614628838361460d565b60208301905092915050565b6000602082019050919050565b600061464c826145e1565b61465681856145ec565b9350614661836145fd565b8060005b83811015614692578151614679888261461c565b975061468483614634565b925050600181019050614665565b5085935050505092915050565b600060208201905081810360008301526146b98184614641565b905092915050565b6000602082840312156146d7576146d6613d8e565b5b60006146e584828501613de1565b91505092915050565b60008060006060848603121561470757614706613d8e565b5b600061471586828701613de1565b935050602084013567ffffffffffffffff81111561473657614735613d93565b5b61474286828701614377565b925050604084013567ffffffffffffffff81111561476357614762613d93565b5b61476f86828701614377565b9150509250925092565b600067ffffffffffffffff82111561479457614793614143565b5b61479d82613fa0565b9050602081019050919050565b60006147bd6147b884614779565b6141a3565b9050828152602081018484840111156147d9576147d86143a5565b5b6147e48482856143db565b509392505050565b600082601f8301126148015761480061413e565b5b81356148118482602086016147aa565b91505092915050565b600080600080600060a0868803121561483657614835613d8e565b5b600061484488828901613e17565b955050602086013567ffffffffffffffff81111561486557614864613d93565b5b614871888289016147ec565b945050604061488288828901613e17565b935050606061489388828901613e17565b92505060806148a48882890161405a565b9150509295509295909350565b60006020820190506148c66000830184614106565b92915050565b6148d581613f1b565b81146148e057600080fd5b50565b6000813590506148f2816148cc565b92915050565b6000806040838503121561490f5761490e613d8e565b5b600061491d85828601613de1565b925050602061492e858286016148e3565b9150509250929050565b60006020828403121561494e5761494d613d8e565b5b600061495c848285016148e3565b91505092915050565b6000806040838503121561497c5761497b613d8e565b5b600061498a85828601613de1565b925050602061499b85828601613de1565b9150509250929050565b600060c0820190506149ba6000830189613f27565b6149c76020830188613e6c565b6149d46040830187613f27565b6149e16060830186613e6c565b6149ee6080830185613e6c565b6149fb60a0830184613e6c565b979650505050505050565b600080600080600060a08688031215614a2257614a21613d8e565b5b6000614a3088828901613de1565b9550506020614a4188828901613de1565b9450506040614a5288828901613e17565b9350506060614a6388828901613e17565b925050608086013567ffffffffffffffff811115614a8457614a83613d93565b5b614a908882890161442c565b9150509295509295909350565b600080600060608486031215614ab657614ab5613d8e565b5b6000614ac486828701613de1565b9350506020614ad586828701613e17565b9250506040614ae686828701613e17565b9150509250925092565b60008060408385031215614b0757614b06613d8e565b5b600083013567ffffffffffffffff811115614b2557614b24613d93565b5b614b3185828601614258565b9250506020614b4285828601613e17565b9150509250929050565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614ba8602b83613f5c565b9150614bb382614b4c565b604082019050919050565b60006020820190508181036000830152614bd781614b9b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614c2557607f821691505b60208210811415614c3957614c38614bde565b5b50919050565b7f616d6f756e7420696e636f727265637400000000000000000000000000000000600082015250565b6000614c75601083613f5c565b9150614c8082614c3f565b602082019050919050565b60006020820190508181036000830152614ca481614c68565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ce582613df6565b9150614cf083613df6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d2557614d24614cab565b5b828201905092915050565b7f6f76657274696d65000000000000000000000000000000000000000000000000600082015250565b6000614d66600883613f5c565b9150614d7182614d30565b602082019050919050565b60006020820190508181036000830152614d9581614d59565b9050919050565b6000614da782613df6565b9150614db283613df6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614deb57614dea614cab565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e3082613df6565b9150614e3b83613df6565b925082614e4b57614e4a614df6565b5b828204905092915050565b7f4578636565646564206d617820737570706c7900000000000000000000000000600082015250565b6000614e8c601383613f5c565b9150614e9782614e56565b602082019050919050565b60006020820190508181036000830152614ebb81614e7f565b9050919050565b7f4578636565646564206d61780000000000000000000000000000000000000000600082015250565b6000614ef8600c83613f5c565b9150614f0382614ec2565b602082019050919050565b60006020820190508181036000830152614f2781614eeb565b9050919050565b7f6d696e7465640000000000000000000000000000000000000000000000000000600082015250565b6000614f64600683613f5c565b9150614f6f82614f2e565b602082019050919050565b60006020820190508181036000830152614f9381614f57565b9050919050565b7f4e6f742070617274206f66206c69737400000000000000000000000000000000600082015250565b6000614fd0601083613f5c565b9150614fdb82614f9a565b602082019050919050565b60006020820190508181036000830152614fff81614fc3565b9050919050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615062603283613f5c565b915061506d82615006565b604082019050919050565b6000602082019050818103600083015261509181615055565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006150f4602f83613f5c565b91506150ff82615098565b604082019050919050565b60006020820190508181036000830152615123816150e7565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000615186602983613f5c565b91506151918261512a565b604082019050919050565b600060208201905081810360008301526151b581615179565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006151f682613df6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561522957615228614cab565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061526a602083613f5c565b915061527582615234565b602082019050919050565b600060208201905081810360008301526152998161525d565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b60006152fc602983613f5c565b9150615307826152a0565b604082019050919050565b6000602082019050818103600083015261532b816152ef565b9050919050565b7f496e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000615368600f83613f5c565b915061537382615332565b602082019050919050565b600060208201905081810360008301526153978161535b565b9050919050565b7f4e6f742079657420737461727465640000000000000000000000000000000000600082015250565b60006153d4600f83613f5c565b91506153df8261539e565b602082019050919050565b60006020820190508181036000830152615403816153c7565b9050919050565b7f6572726f72000000000000000000000000000000000000000000000000000000600082015250565b6000615440600583613f5c565b915061544b8261540a565b602082019050919050565b6000602082019050818103600083015261546f81615433565b9050919050565b7f56616c756520696e636f72726563740000000000000000000000000000000000600082015250565b60006154ac600f83613f5c565b91506154b782615476565b602082019050919050565b600060208201905081810360008301526154db8161549f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061553e602683613f5c565b9150615549826154e2565b604082019050919050565b6000602082019050818103600083015261556d81615531565b9050919050565b600081519050919050565b600081905092915050565b6000819050602082019050919050565b6155a381613db8565b82525050565b60006155b5838361559a565b60208301905092915050565b6000602082019050919050565b60006155d982615574565b6155e3818561557f565b93506155ee8361558a565b8060005b8381101561561f57815161560688826155a9565b9750615611836155c1565b9250506001810190506155f2565b5085935050505092915050565b600061563882846155ce565b915081905092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061569f602183613f5c565b91506156aa82615643565b604082019050919050565b600060208201905081810360008301526156ce81615692565b9050919050565b60006040820190506156ea6000830185613e6c565b6156f76020830184613e6c565b9392505050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b600061575a602883613f5c565b9150615765826156fe565b604082019050919050565b600060208201905081810360008301526157898161574d565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006157ec602583613f5c565b91506157f782615790565b604082019050919050565b6000602082019050818103600083015261581b816157df565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b600061587e602a83613f5c565b915061588982615822565b604082019050919050565b600060208201905081810360008301526158ad81615871565b9050919050565b600060408201905081810360008301526158ce8185614641565b905081810360208301526158e28184614641565b90509392505050565b600081905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061592c6017836158eb565b9150615937826158f6565b601782019050919050565b600061594d82613f51565b61595781856158eb565b9350615967818560208601613f6d565b80840191505092915050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006159a96011836158eb565b91506159b482615973565b601182019050919050565b60006159ca8261591f565b91506159d68285615942565b91506159e18261599c565b91506159ed8284615942565b91508190509392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000615a55602383613f5c565b9150615a60826159f9565b604082019050919050565b60006020820190508181036000830152615a8481615a48565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000615ae7602483613f5c565b9150615af282615a8b565b604082019050919050565b60006020820190508181036000830152615b1681615ada565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000615b79602983613f5c565b9150615b8482615b1d565b604082019050919050565b60006020820190508181036000830152615ba881615b6c565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000615bd682615baf565b615be08185615bba565b9350615bf0818560208601613f6d565b615bf981613fa0565b840191505092915050565b600060a082019050615c196000830188614106565b615c266020830187614106565b615c336040830186613e6c565b615c406060830185613e6c565b8181036080830152615c528184615bcb565b90509695505050505050565b600081519050615c6d81613ec2565b92915050565b600060208284031215615c8957615c88613d8e565b5b6000615c9784828501615c5e565b91505092915050565b60008160e01c9050919050565b600060033d1115615ccc5760046000803e615cc9600051615ca0565b90505b90565b600060443d1015615cdf57615d62565b615ce7613d84565b60043d036004823e80513d602482011167ffffffffffffffff82111715615d0f575050615d62565b808201805167ffffffffffffffff811115615d2d5750505050615d62565b80602083010160043d038501811115615d4a575050505050615d62565b615d5982602001850186614172565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000615dc1603483613f5c565b9150615dcc82615d65565b604082019050919050565b60006020820190508181036000830152615df081615db4565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000615e53602883613f5c565b9150615e5e82615df7565b604082019050919050565b60006020820190508181036000830152615e8281615e46565b9050919050565b600060a082019050615e9e6000830188614106565b615eab6020830187614106565b8181036040830152615ebd8186614641565b90508181036060830152615ed18185614641565b90508181036080830152615ee58184615bcb565b90509695505050505050565b6000615efc82613df6565b91506000821415615f1057615f0f614cab565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000615f51602083613f5c565b9150615f5c82615f1b565b602082019050919050565b60006020820190508181036000830152615f8081615f44565b9050919050565b6000615f9282613df6565b9150615f9d83613df6565b925082821015615fb057615faf614cab565b5b82820390509291505056fea2646970667358221220d1b951ca761a9f0ab0bc028227d42a3eae0545fa0b03e22d40d55859d306134c64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008ae00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000140c047723840d43f9fbb1ca8399c2dd480b1c1c9b60d9c4aa8271795f0daff1367000000000000000000000000000000000000000000000000000000000000000744414e2044414f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000744414e2044414f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005668747470733a2f2f676364642e6d7970696e6174612e636c6f75642f697066732f516d586e504837516e31706d794a37786f753841513632627769696e6b71336e79586233436f685a374b356754432f302e6a736f6e00000000000000000000
-----Decoded View---------------
Arg [0] : name_ (string): DAN DAO
Arg [1] : symbol_ (string): DAN DAO
Arg [2] : maxSupply_ (uint256): 2222
Arg [3] : publicPrice_ (uint256): 20
Arg [4] : uri_ (string): https://gcdd.mypinata.cloud/ipfs/QmXnPH7Qn1pmyJ7xou8AQ62bwiinkq3nyXb3CohZ7K5gTC/0.json
Arg [5] : merkleRoot_ (bytes32): 0xc047723840d43f9fbb1ca8399c2dd480b1c1c9b60d9c4aa8271795f0daff1367
-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 00000000000000000000000000000000000000000000000000000000000008ae
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [5] : c047723840d43f9fbb1ca8399c2dd480b1c1c9b60d9c4aa8271795f0daff1367
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [7] : 44414e2044414f00000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [9] : 44414e2044414f00000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000056
Arg [11] : 68747470733a2f2f676364642e6d7970696e6174612e636c6f75642f69706673
Arg [12] : 2f516d586e504837516e31706d794a37786f753841513632627769696e6b7133
Arg [13] : 6e79586233436f685a374b356754432f302e6a736f6e00000000000000000000
Deployed Bytecode Sourcemap
351:5850:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2184:231:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5979:219:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5289:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1928:105:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4088:131:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3436:801:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1674:494:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1753:546:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4123:442:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5475:91:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4481:147:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5529:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2581:524:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;913:122:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1630:115:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;735:353:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1714:103:16;;;;;;;;;;;;;:::i;:::-;;4245:350:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1063:87:16;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2957:147:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5380:87:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5115:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2307:763;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2048:49:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3178:155:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4603:140:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;702:113:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4873:149:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;675:24:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3405:168:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4751:356:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;636:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3645:401:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1972:201:16;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;406:321:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3078:350:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2184:231:4;2270:7;2317:1;2298:21;;:7;:21;;;;2290:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;2385:9;:13;2395:2;2385:13;;;;;;;;;;;:22;2399:7;2385:22;;;;;;;;;;;;;;;;2378:29;;2184:231;;;;:::o;5979:219:3:-;6125:4;6154:36;6178:11;6154:23;:36::i;:::-;6147:43;;5979:219;;;:::o;5289:83::-;5326:13;5359:5;5352:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5289:83;:::o;1928:105:4:-;1988:13;2021:4;2014:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1928:105;;;:::o;4088:131:0:-;4162:7;4189:6;:12;4196:4;4189:12;;;;;;;;;;;:22;;;4182:29;;4088:131;;;:::o;3436:801:3:-;3506:10;:24;3517:12;:10;:12::i;:::-;3506:24;;;;;;;;;;;;;;;:30;;;3496:6;:40;;3488:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3624:27;3634:12;:10;:12::i;:::-;665:1;3624:9;:27::i;:::-;3590:10;:24;3601:12;:10;:12::i;:::-;3590:24;;;;;;;;;;;;;;;:30;;;:61;;3568:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;3784:6;3746:10;:24;3757:12;:10;:12::i;:::-;3746:24;;;;;;;;;;;;;;;:35;;;:44;;;;:::i;:::-;3728:15;:62;3706:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;3962:6;3912:10;:24;3923:12;:10;:12::i;:::-;3912:24;;;;;;;;;;;;;;;:30;;;:56;3862:10;:24;3873:12;:10;:12::i;:::-;3862:24;;;;;;;;;;;;;;;:30;;:106;;;;3990:17;:28;;;;;;;;;;;;;;;;;;;4029:136;4060:12;:10;:12::i;:::-;4087:10;;;;;;;;;;;665:1;4129:6;4150:4;4029:16;:136::i;:::-;4184:12;:10;:12::i;:::-;4176:30;;:53;4216:12;;4207:6;:21;;;;:::i;:::-;4176:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3477:760;3436:801;:::o;1674:494:8:-;1818:7;1827;1852:26;1881:17;:27;1899:8;1881:27;;;;;;;;;;;1852:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1953:1;1925:30;;:7;:16;;;:30;;;1921:92;;;1982:19;1972:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1921:92;2025:21;2090:17;:15;:17::i;:::-;2049:58;;2063:7;:23;;;2050:36;;:10;:36;;;;:::i;:::-;2049:58;;;;:::i;:::-;2025:82;;2128:7;:16;;;2146:13;2120:40;;;;;;1674:494;;;;;:::o;1753:546:3:-;1899:9;;1889:6;1871:15;665:1;1871:11;:15::i;:::-;:24;;;;:::i;:::-;:37;;1863:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1961:1;1951:6;:11;1943:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;1999:12;:26;2012:12;:10;:12::i;:::-;1999:26;;;;;;;;;;;;;;;;;;;;;;;;;1998:27;1990:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2069:52;2088:5;2095:11;;2108:12;:10;:12::i;:::-;2069:18;:52::i;:::-;2047:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;2230:4;2201:12;:26;2214:12;:10;:12::i;:::-;2201:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;2256:35;2262:12;:10;:12::i;:::-;665:1;2280:6;2256:35;;;;;;;;;;;;:5;:35::i;:::-;1753:546;;:::o;4123:442:4:-;4364:12;:10;:12::i;:::-;4356:20;;:4;:20;;;:60;;;;4380:36;4397:4;4403:12;:10;:12::i;:::-;4380:16;:36::i;:::-;4356:60;4334:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;4505:52;4528:4;4534:2;4538:3;4543:7;4552:4;4505:22;:52::i;:::-;4123:442;;;;;:::o;5475:91:3:-;5520:7;5547:11;;5540:18;;5475:91;:::o;4481:147:0:-;4564:18;4577:4;4564:12;:18::i;:::-;2539:30;2550:4;2556:12;:10;:12::i;:::-;2539:10;:30::i;:::-;4595:25:::1;4606:4;4612:7;4595:10;:25::i;:::-;4481:147:::0;;;:::o;5529:218::-;5636:12;:10;:12::i;:::-;5625:23;;:7;:23;;;5617:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;5713:26;5725:4;5731:7;5713:11;:26::i;:::-;5529:218;;:::o;2581:524:4:-;2737:16;2798:3;:10;2779:8;:15;:29;2771:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;2867:30;2914:8;:15;2900:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2867:63;;2948:9;2943:122;2967:8;:15;2963:1;:19;2943:122;;;3023:30;3033:8;3042:1;3033:11;;;;;;;;:::i;:::-;;;;;;;;3046:3;3050:1;3046:6;;;;;;;;:::i;:::-;;;;;;;;3023:9;:30::i;:::-;3004:13;3018:1;3004:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;2984:3;;;;:::i;:::-;;;2943:122;;;;3084:13;3077:20;;;2581:524;;;;:::o;913:122:6:-;970:4;1026:1;994:29;1020:2;994:25;:29::i;:::-;:33;987:40;;913:122;;;:::o;1630:115:3:-;1294:12:16;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1700:4:3::1;1692:22;;:45;1715:21;1692:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1630:115:::0;:::o;735:353:5:-;911:12;:10;:12::i;:::-;900:23;;:7;:23;;;:66;;;;927:39;944:7;953:12;:10;:12::i;:::-;927:16;:39::i;:::-;900:66;878:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;1048:32;1059:7;1068:3;1073:6;1048:10;:32::i;:::-;735:353;;;:::o;1714:103:16:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;4245:350:3:-;2093:4:0;4395:18:3;;2539:30:0;2550:4;2556:12;:10;:12::i;:::-;2539:10;:30::i;:::-;4451:6:3::1;4440:8;:17;;;;:::i;:::-;4425:12;:32;;;;4480:12;4468:9;:24;;;;4517:12;4503:11;:26;;;;4554:7;4540:11;:21;;;;4572:15;4580:6;4572:7;:15::i;:::-;4245:350:::0;;;;;;:::o;1063:87:16:-;1109:7;1136:6;;;;;;;;;;;1129:13;;1063:87;:::o;2957:147:0:-;3043:4;3067:6;:12;3074:4;3067:12;;;;;;;;;;;:20;;:29;3088:7;3067:29;;;;;;;;;;;;;;;;;;;;;;;;;3060:36;;2957:147;;;;:::o;5380:87:3:-;5419:13;5452:7;5445:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5380:87;:::o;5115:166::-;5206:10;;;;;;;;;;;5190:26;;:12;:10;:12::i;:::-;:26;;;5182:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;5247:26;5253:7;665:1;5266:6;5247:5;:26::i;:::-;5115:166;;:::o;2307:763::-;2373:13;;;;;;;;;;;2365:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2453:9;;2443:6;2425:15;665:1;2425:11;:15::i;:::-;:24;;;;:::i;:::-;:37;;2417:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;2529:11;;2519:6;2501:15;665:1;2501:11;:15::i;:::-;:24;;;;:::i;:::-;:39;;:54;;;;;2554:1;2544:6;:11;2501:54;2497:520;;;2581:12;:26;2594:12;:10;:12::i;:::-;2581:26;;;;;;;;;;;;;;;;;;;;;;;;;2580:27;2572:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;2661:4;2632:12;:26;2645:12;:10;:12::i;:::-;2632:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;2497:520;;;2731:9;2721:6;2706:12;;:21;;;;:::i;:::-;:34;;2698:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2912:6;2858:10;:24;2869:12;:10;:12::i;:::-;2858:24;;;;;;;;;;;;;;;:30;;;:60;2804:10;:24;2815:12;:10;:12::i;:::-;2804:24;;;;;;;;;;;;;;;:30;;:114;;;;2975:15;2937:10;:24;2948:12;:10;:12::i;:::-;2937:24;;;;;;;;;;;;;;;:35;;:53;;;;2497:520;3027:35;3033:12;:10;:12::i;:::-;665:1;3051:6;3027:35;;;;;;;;;;;;:5;:35::i;:::-;2307:763;:::o;2048:49:0:-;2093:4;2048:49;;;:::o;3178:155:4:-;3273:52;3292:12;:10;:12::i;:::-;3306:8;3316;3273:18;:52::i;:::-;3178:155;;:::o;4603:140:3:-;2093:4:0;4674:18:3;;2539:30:0;2550:4;2556:12;:10;:12::i;:::-;2539:10;:30::i;:::-;4726:9:3::1;4710:13;;:25;;;;;;;;;;;;;;;;;;4603:140:::0;;:::o;702:113:6:-;764:7;791:12;:16;804:2;791:16;;;;;;;;;;;;784:23;;702:113;;;:::o;4873:149:0:-;4957:18;4970:4;4957:12;:18::i;:::-;2539:30;2550:4;2556:12;:10;:12::i;:::-;2539:10;:30::i;:::-;4988:26:::1;5000:4;5006:7;4988:11;:26::i;:::-;4873:149:::0;;;:::o;675:24:3:-;;;;:::o;3405:168:4:-;3504:4;3528:18;:27;3547:7;3528:27;;;;;;;;;;;;;;;:37;3556:8;3528:37;;;;;;;;;;;;;;;;;;;;;;;;;3521:44;;3405:168;;;;:::o;4751:356:3:-;4850:4;4869:7;4891:4;4910:7;4932;4954;4997:12;:18;5010:4;4997:18;;;;;;;;;;;;;;;;;;;;;;;;;5017:12;;5031:13;;;;;;;;;;;5046:11;;5059:15;665:1;5059:11;:15::i;:::-;5076:10;:16;5087:4;5076:16;;;;;;;;;;;;;;;:22;;;4989:110;;;;;;;;;;;;4751:356;;;;;;;:::o;636:30::-;665:1;636:30;:::o;3645:401:4:-;3861:12;:10;:12::i;:::-;3853:20;;:4;:20;;;:60;;;;3877:36;3894:4;3900:12;:10;:12::i;:::-;3877:16;:36::i;:::-;3853:60;3831:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;3993:45;4011:4;4017:2;4021;4025:6;4033:4;3993:17;:45::i;:::-;3645:401;;;;;:::o;1972:201:16:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:1:::1;2061:22;;:8;:22;;;;2053:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;406:321:5:-;557:12;:10;:12::i;:::-;546:23;;:7;:23;;;:66;;;;573:39;590:7;599:12;:10;:12::i;:::-;573:16;:39::i;:::-;546:66;524:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;694:25;700:7;709:2;713:5;694;:25::i;:::-;406:321;;;:::o;3078:350:3:-;1294:12:16;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3253:9:3::1;;3243:6;3228:5;:12;:21;;;;:::i;:::-;3210:15;665:1;3210:11;:15::i;:::-;:39;;;;:::i;:::-;:52;;3188:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;3325:9;3320:101;3344:5;:12;3340:1;:16;3320:101;;;3378:31;3384:5;3390:1;3384:8;;;;;;;;:::i;:::-;;;;;;;;665:1;3398:6;3378:31;;;;;;;;;;;::::0;:5:::1;:31::i;:::-;3358:3;;;;;:::i;:::-;;;;3320:101;;;;3078:350:::0;;:::o;1404:215:8:-;1506:4;1545:26;1530:41;;;:11;:41;;;;:81;;;;1575:36;1599:11;1575:23;:36::i;:::-;1530:81;1523:88;;1404:215;;;:::o;656:98:2:-;709:7;736:10;729:17;;656:98;:::o;2450:97:8:-;2508:6;2534:5;2527:12;;2450:97;:::o;883:417:15:-;1010:4;1027:9;1039:5;1027:17;;1060:9;1055:163;1079:5;:12;1075:1;:16;1055:163;;;1129:6;1117:18;;:5;1123:1;1117:8;;;;;;;;:::i;:::-;;;;;;;;:18;;;1113:94;;;1163:4;1156:11;;1186:5;;1113:94;1093:3;;;;;:::i;:::-;;;;1055:163;;;;1235:4;:57;;1287:5;1235:57;;;1280:4;1269:5;1252:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;1242:34;;;;;;:42;1235:57;1228:64;;;883:417;;;;;:::o;8599:569:4:-;8766:1;8752:16;;:2;:16;;;;8744:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;8819:16;8838:12;:10;:12::i;:::-;8819:31;;8863:102;8884:8;8902:1;8906:2;8910:21;8928:2;8910:17;:21::i;:::-;8933:25;8951:6;8933:17;:25::i;:::-;8960:4;8863:20;:102::i;:::-;8999:6;8978:9;:13;8988:2;8978:13;;;;;;;;;;;:17;8992:2;8978:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;9058:2;9021:52;;9054:1;9021:52;;9036:8;9021:52;;;9062:2;9066:6;9021:52;;;;;;;:::i;:::-;;;;;;;;9086:74;9117:8;9135:1;9139:2;9143;9147:6;9155:4;9086:30;:74::i;:::-;8733:435;8599:569;;;;:::o;6207:1074::-;6434:7;:14;6420:3;:10;:28;6412:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6526:1;6512:16;;:2;:16;;;;6504:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6583:16;6602:12;:10;:12::i;:::-;6583:31;;6627:60;6648:8;6658:4;6664:2;6668:3;6673:7;6682:4;6627:20;:60::i;:::-;6705:9;6700:421;6724:3;:10;6720:1;:14;6700:421;;;6756:10;6769:3;6773:1;6769:6;;;;;;;;:::i;:::-;;;;;;;;6756:19;;6790:14;6807:7;6815:1;6807:10;;;;;;;;:::i;:::-;;;;;;;;6790:27;;6834:19;6856:9;:13;6866:2;6856:13;;;;;;;;;;;:19;6870:4;6856:19;;;;;;;;;;;;;;;;6834:41;;6913:6;6898:11;:21;;6890:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;7046:6;7032:11;:20;7010:9;:13;7020:2;7010:13;;;;;;;;;;;:19;7024:4;7010:19;;;;;;;;;;;;;;;:42;;;;7103:6;7082:9;:13;7092:2;7082:13;;;;;;;;;;;:17;7096:2;7082:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;6741:380;;;6736:3;;;;:::i;:::-;;;6700:421;;;;7168:2;7138:47;;7162:4;7138:47;;7152:8;7138:47;;;7172:3;7177:7;7138:47;;;;;;;:::i;:::-;;;;;;;;7198:75;7234:8;7244:4;7250:2;7254:3;7259:7;7268:4;7198:35;:75::i;:::-;6401:880;6207:1074;;;;;:::o;3394:505:0:-;3483:22;3491:4;3497:7;3483;:22::i;:::-;3478:414;;3671:41;3699:7;3671:41;;3709:2;3671:19;:41::i;:::-;3785:38;3813:4;3805:13;;3820:2;3785:19;:38::i;:::-;3576:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3522:358;;;;;;;;;;;:::i;:::-;;;;;;;;3478:414;3394:505;;:::o;7030:238::-;7114:22;7122:4;7128:7;7114;:22::i;:::-;7109:152;;7185:4;7153:6;:12;7160:4;7153:12;;;;;;;;;;;:20;;:29;7174:7;7153:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;7236:12;:10;:12::i;:::-;7209:40;;7227:7;7209:40;;7221:4;7209:40;;;;;;;;;;7109:152;7030:238;;:::o;7400:239::-;7484:22;7492:4;7498:7;7484;:22::i;:::-;7480:152;;;7555:5;7523:6;:12;7530:4;7523:12;;;;;;;;;;;:20;;:29;7544:7;7523:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;7607:12;:10;:12::i;:::-;7580:40;;7598:7;7580:40;;7592:4;7580:40;;;;;;;;;;7480:152;7400:239;;:::o;11360:891:4:-;11528:1;11512:18;;:4;:18;;;;11504:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;11603:7;:14;11589:3;:10;:28;11581:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11675:16;11694:12;:10;:12::i;:::-;11675:31;;11719:66;11740:8;11750:4;11764:1;11768:3;11773:7;11719:66;;;;;;;;;;;;:20;:66::i;:::-;11803:9;11798:373;11822:3;:10;11818:1;:14;11798:373;;;11854:10;11867:3;11871:1;11867:6;;;;;;;;:::i;:::-;;;;;;;;11854:19;;11888:14;11905:7;11913:1;11905:10;;;;;;;;:::i;:::-;;;;;;;;11888:27;;11932:19;11954:9;:13;11964:2;11954:13;;;;;;;;;;;:19;11968:4;11954:19;;;;;;;;;;;;;;;;11932:41;;12011:6;11996:11;:21;;11988:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12138:6;12124:11;:20;12102:9;:13;12112:2;12102:13;;;;;;;;;;;:19;12116:4;12102:19;;;;;;;;;;;;;;;:42;;;;11839:332;;;11834:3;;;;;:::i;:::-;;;;11798:373;;;;12226:1;12188:55;;12212:4;12188:55;;12202:8;12188:55;;;12230:3;12235:7;12188:55;;;;;;;:::i;:::-;;;;;;;;11493:758;11360:891;;;:::o;2333:191:16:-;2407:16;2426:6;;;;;;;;;;;2407:25;;2452:8;2443:6;;:17;;;;;;;;;;;;;;;;;;2507:8;2476:40;;2497:8;2476:40;;;;;;;;;;;;2396:128;2333:191;:::o;8125:88:4:-;8199:6;8192:4;:13;;;;;;;;;;;;:::i;:::-;;8125:88;:::o;10509:648::-;10652:1;10636:18;;:4;:18;;;;10628:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;10707:16;10726:12;:10;:12::i;:::-;10707:31;;10751:102;10772:8;10782:4;10796:1;10800:21;10818:2;10800:17;:21::i;:::-;10823:25;10841:6;10823:17;:25::i;:::-;10751:102;;;;;;;;;;;;:20;:102::i;:::-;10866:19;10888:9;:13;10898:2;10888:13;;;;;;;;;;;:19;10902:4;10888:19;;;;;;;;;;;;;;;;10866:41;;10941:6;10926:11;:21;;10918:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11060:6;11046:11;:20;11024:9;:13;11034:2;11024:13;;;;;;;;;;;:19;11038:4;11024:19;;;;;;;;;;;;;;;:42;;;;11134:1;11095:54;;11120:4;11095:54;;11110:8;11095:54;;;11138:2;11142:6;11095:54;;;;;;;:::i;:::-;;;;;;;;10617:540;;10509:648;;;:::o;12393:331::-;12548:8;12539:17;;:5;:17;;;;12531:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12651:8;12613:18;:25;12632:5;12613:25;;;;;;;;;;;;;;;:35;12639:8;12613:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;12697:8;12675:41;;12690:5;12675:41;;;12707:8;12675:41;;;;;;:::i;:::-;;;;;;;;12393:331;;;:::o;5029:820::-;5231:1;5217:16;;:2;:16;;;;5209:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5288:16;5307:12;:10;:12::i;:::-;5288:31;;5332:96;5353:8;5363:4;5369:2;5373:21;5391:2;5373:17;:21::i;:::-;5396:25;5414:6;5396:17;:25::i;:::-;5423:4;5332:20;:96::i;:::-;5441:19;5463:9;:13;5473:2;5463:13;;;;;;;;;;;:19;5477:4;5463:19;;;;;;;;;;;;;;;;5441:41;;5516:6;5501:11;:21;;5493:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5641:6;5627:11;:20;5605:9;:13;5615:2;5605:13;;;;;;;;;;;:19;5619:4;5605:19;;;;;;;;;;;;;;;:42;;;;5690:6;5669:9;:13;5679:2;5669:13;;;;;;;;;;;:17;5683:2;5669:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;5745:2;5714:46;;5739:4;5714:46;;5729:8;5714:46;;;5749:2;5753:6;5714:46;;;;;;;:::i;:::-;;;;;;;;5773:68;5804:8;5814:4;5820:2;5824;5828:6;5836:4;5773:30;:68::i;:::-;5198:651;;5029:820;;;;;:::o;2661:204:0:-;2746:4;2785:32;2770:47;;;:11;:47;;;;:87;;;;2821:36;2845:11;2821:23;:36::i;:::-;2770:87;2763:94;;2661:204;;;:::o;15482:198:4:-;15548:16;15577:22;15616:1;15602:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15577:41;;15640:7;15629:5;15635:1;15629:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;15667:5;15660:12;;;15482:198;;;:::o;5642:329:3:-;5897:66;5924:8;5934:4;5940:2;5944:3;5949:7;5958:4;5897:26;:66::i;:::-;5642:329;;;;;;:::o;13909:744:4:-;14124:15;:2;:13;;;:15::i;:::-;14120:526;;;14177:2;14160:38;;;14199:8;14209:4;14215:2;14219:6;14227:4;14160:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14156:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;14508:6;14501:14;;;;;;;;;;;:::i;:::-;;;;;;;;14156:479;;;14557:62;;;;;;;;;;:::i;:::-;;;;;;;;14156:479;14294:43;;;14282:55;;;:8;:55;;;;14278:154;;14362:50;;;;;;;;;;:::i;:::-;;;;;;;;14278:154;14233:214;14120:526;13909:744;;;;;;:::o;14661:813::-;14901:15;:2;:13;;;:15::i;:::-;14897:570;;;14954:2;14937:43;;;14981:8;14991:4;14997:3;15002:7;15011:4;14937:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14933:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;15329:6;15322:14;;;;;;;;;;;:::i;:::-;;;;;;;;14933:523;;;15378:62;;;;;;;;;;:::i;:::-;;;;;;;;14933:523;15110:48;;;15098:60;;;:8;:60;;;;15094:159;;15183:50;;;;;;;;;;:::i;:::-;;;;;;;;15094:159;15017:251;14897:570;14661:813;;;;;;:::o;1643:451:17:-;1718:13;1744:19;1789:1;1780:6;1776:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1766:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1744:47;;1802:15;:6;1809:1;1802:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1828;:6;1835:1;1828:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1859:9;1884:1;1875:6;1871:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1859:26;;1854:135;1891:1;1887;:5;1854:135;;;1926:12;1947:3;1939:5;:11;1926:25;;;;;;;:::i;:::-;;;;;1914:6;1921:1;1914:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1976:1;1966:11;;;;;1894:3;;;;:::i;:::-;;;1854:135;;;;2016:1;2007:5;:10;1999:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2079:6;2065:21;;;1643:451;;;;:::o;1207:310:4:-;1309:4;1361:26;1346:41;;;:11;:41;;;;:110;;;;1419:37;1404:52;;;:11;:52;;;;1346:110;:163;;;;1473:36;1497:11;1473:23;:36::i;:::-;1346:163;1326:183;;1207:310;;;:::o;1110:655:6:-;1349:66;1376:8;1386:4;1392:2;1396:3;1401:7;1410:4;1349:26;:66::i;:::-;1448:1;1432:18;;:4;:18;;;1428:160;;;1472:9;1467:110;1491:3;:10;1487:1;:14;1467:110;;;1551:7;1559:1;1551:10;;;;;;;;:::i;:::-;;;;;;;;1527:12;:20;1540:3;1544:1;1540:6;;;;;;;;:::i;:::-;;;;;;;;1527:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;1503:3;;;;:::i;:::-;;;1467:110;;;;1428:160;1618:1;1604:16;;:2;:16;;;1600:158;;;1642:9;1637:110;1661:3;:10;1657:1;:14;1637:110;;;1721:7;1729:1;1721:10;;;;;;;;:::i;:::-;;;;;;;;1697:12;:20;1710:3;1714:1;1710:6;;;;;;;;:::i;:::-;;;;;;;;1697:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;1673:3;;;;:::i;:::-;;;1637:110;;;;1600:158;1110:655;;;;;;:::o;1210:326:1:-;1270:4;1527:1;1505:7;:19;;;:23;1498:30;;1210:326;;;:::o;854:157:7:-;939:4;978:25;963:40;;;:11;:40;;;;956:47;;854:157;;;:::o;13680:221:4:-;;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:18:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:99::-;3265:6;3299:5;3293:12;3283:22;;3213:99;;;:::o;3318:169::-;3402:11;3436:6;3431:3;3424:19;3476:4;3471:3;3467:14;3452:29;;3318:169;;;;:::o;3493:307::-;3561:1;3571:113;3585:6;3582:1;3579:13;3571:113;;;3670:1;3665:3;3661:11;3655:18;3651:1;3646:3;3642:11;3635:39;3607:2;3604:1;3600:10;3595:15;;3571:113;;;3702:6;3699:1;3696:13;3693:101;;;3782:1;3773:6;3768:3;3764:16;3757:27;3693:101;3542:258;3493:307;;;:::o;3806:102::-;3847:6;3898:2;3894:7;3889:2;3882:5;3878:14;3874:28;3864:38;;3806:102;;;:::o;3914:364::-;4002:3;4030:39;4063:5;4030:39;:::i;:::-;4085:71;4149:6;4144:3;4085:71;:::i;:::-;4078:78;;4165:52;4210:6;4205:3;4198:4;4191:5;4187:16;4165:52;:::i;:::-;4242:29;4264:6;4242:29;:::i;:::-;4237:3;4233:39;4226:46;;4006:272;3914:364;;;;:::o;4284:313::-;4397:4;4435:2;4424:9;4420:18;4412:26;;4484:9;4478:4;4474:20;4470:1;4459:9;4455:17;4448:47;4512:78;4585:4;4576:6;4512:78;:::i;:::-;4504:86;;4284:313;;;;:::o;4603:329::-;4662:6;4711:2;4699:9;4690:7;4686:23;4682:32;4679:119;;;4717:79;;:::i;:::-;4679:119;4837:1;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4808:117;4603:329;;;;:::o;4938:77::-;4975:7;5004:5;4993:16;;4938:77;;;:::o;5021:122::-;5094:24;5112:5;5094:24;:::i;:::-;5087:5;5084:35;5074:63;;5133:1;5130;5123:12;5074:63;5021:122;:::o;5149:139::-;5195:5;5233:6;5220:20;5211:29;;5249:33;5276:5;5249:33;:::i;:::-;5149:139;;;;:::o;5294:329::-;5353:6;5402:2;5390:9;5381:7;5377:23;5373:32;5370:119;;;5408:79;;:::i;:::-;5370:119;5528:1;5553:53;5598:7;5589:6;5578:9;5574:22;5553:53;:::i;:::-;5543:63;;5499:117;5294:329;;;;:::o;5629:118::-;5716:24;5734:5;5716:24;:::i;:::-;5711:3;5704:37;5629:118;;:::o;5753:222::-;5846:4;5884:2;5873:9;5869:18;5861:26;;5897:71;5965:1;5954:9;5950:17;5941:6;5897:71;:::i;:::-;5753:222;;;;:::o;5981:474::-;6049:6;6057;6106:2;6094:9;6085:7;6081:23;6077:32;6074:119;;;6112:79;;:::i;:::-;6074:119;6232:1;6257:53;6302:7;6293:6;6282:9;6278:22;6257:53;:::i;:::-;6247:63;;6203:117;6359:2;6385:53;6430:7;6421:6;6410:9;6406:22;6385:53;:::i;:::-;6375:63;;6330:118;5981:474;;;;;:::o;6461:118::-;6548:24;6566:5;6548:24;:::i;:::-;6543:3;6536:37;6461:118;;:::o;6585:332::-;6706:4;6744:2;6733:9;6729:18;6721:26;;6757:71;6825:1;6814:9;6810:17;6801:6;6757:71;:::i;:::-;6838:72;6906:2;6895:9;6891:18;6882:6;6838:72;:::i;:::-;6585:332;;;;;:::o;6923:117::-;7032:1;7029;7022:12;7046:180;7094:77;7091:1;7084:88;7191:4;7188:1;7181:15;7215:4;7212:1;7205:15;7232:281;7315:27;7337:4;7315:27;:::i;:::-;7307:6;7303:40;7445:6;7433:10;7430:22;7409:18;7397:10;7394:34;7391:62;7388:88;;;7456:18;;:::i;:::-;7388:88;7496:10;7492:2;7485:22;7275:238;7232:281;;:::o;7519:129::-;7553:6;7580:20;;:::i;:::-;7570:30;;7609:33;7637:4;7629:6;7609:33;:::i;:::-;7519:129;;;:::o;7654:311::-;7731:4;7821:18;7813:6;7810:30;7807:56;;;7843:18;;:::i;:::-;7807:56;7893:4;7885:6;7881:17;7873:25;;7953:4;7947;7943:15;7935:23;;7654:311;;;:::o;7971:117::-;8080:1;8077;8070:12;8111:710;8207:5;8232:81;8248:64;8305:6;8248:64;:::i;:::-;8232:81;:::i;:::-;8223:90;;8333:5;8362:6;8355:5;8348:21;8396:4;8389:5;8385:16;8378:23;;8449:4;8441:6;8437:17;8429:6;8425:30;8478:3;8470:6;8467:15;8464:122;;;8497:79;;:::i;:::-;8464:122;8612:6;8595:220;8629:6;8624:3;8621:15;8595:220;;;8704:3;8733:37;8766:3;8754:10;8733:37;:::i;:::-;8728:3;8721:50;8800:4;8795:3;8791:14;8784:21;;8671:144;8655:4;8650:3;8646:14;8639:21;;8595:220;;;8599:21;8213:608;;8111:710;;;;;:::o;8844:370::-;8915:5;8964:3;8957:4;8949:6;8945:17;8941:27;8931:122;;8972:79;;:::i;:::-;8931:122;9089:6;9076:20;9114:94;9204:3;9196:6;9189:4;9181:6;9177:17;9114:94;:::i;:::-;9105:103;;8921:293;8844:370;;;;:::o;9220:684::-;9313:6;9321;9370:2;9358:9;9349:7;9345:23;9341:32;9338:119;;;9376:79;;:::i;:::-;9338:119;9496:1;9521:53;9566:7;9557:6;9546:9;9542:22;9521:53;:::i;:::-;9511:63;;9467:117;9651:2;9640:9;9636:18;9623:32;9682:18;9674:6;9671:30;9668:117;;;9704:79;;:::i;:::-;9668:117;9809:78;9879:7;9870:6;9859:9;9855:22;9809:78;:::i;:::-;9799:88;;9594:303;9220:684;;;;;:::o;9910:311::-;9987:4;10077:18;10069:6;10066:30;10063:56;;;10099:18;;:::i;:::-;10063:56;10149:4;10141:6;10137:17;10129:25;;10209:4;10203;10199:15;10191:23;;9910:311;;;:::o;10244:710::-;10340:5;10365:81;10381:64;10438:6;10381:64;:::i;:::-;10365:81;:::i;:::-;10356:90;;10466:5;10495:6;10488:5;10481:21;10529:4;10522:5;10518:16;10511:23;;10582:4;10574:6;10570:17;10562:6;10558:30;10611:3;10603:6;10600:15;10597:122;;;10630:79;;:::i;:::-;10597:122;10745:6;10728:220;10762:6;10757:3;10754:15;10728:220;;;10837:3;10866:37;10899:3;10887:10;10866:37;:::i;:::-;10861:3;10854:50;10933:4;10928:3;10924:14;10917:21;;10804:144;10788:4;10783:3;10779:14;10772:21;;10728:220;;;10732:21;10346:608;;10244:710;;;;;:::o;10977:370::-;11048:5;11097:3;11090:4;11082:6;11078:17;11074:27;11064:122;;11105:79;;:::i;:::-;11064:122;11222:6;11209:20;11247:94;11337:3;11329:6;11322:4;11314:6;11310:17;11247:94;:::i;:::-;11238:103;;11054:293;10977:370;;;;:::o;11353:117::-;11462:1;11459;11452:12;11476:307;11537:4;11627:18;11619:6;11616:30;11613:56;;;11649:18;;:::i;:::-;11613:56;11687:29;11709:6;11687:29;:::i;:::-;11679:37;;11771:4;11765;11761:15;11753:23;;11476:307;;;:::o;11789:154::-;11873:6;11868:3;11863;11850:30;11935:1;11926:6;11921:3;11917:16;11910:27;11789:154;;;:::o;11949:410::-;12026:5;12051:65;12067:48;12108:6;12067:48;:::i;:::-;12051:65;:::i;:::-;12042:74;;12139:6;12132:5;12125:21;12177:4;12170:5;12166:16;12215:3;12206:6;12201:3;12197:16;12194:25;12191:112;;;12222:79;;:::i;:::-;12191:112;12312:41;12346:6;12341:3;12336;12312:41;:::i;:::-;12032:327;11949:410;;;;;:::o;12378:338::-;12433:5;12482:3;12475:4;12467:6;12463:17;12459:27;12449:122;;12490:79;;:::i;:::-;12449:122;12607:6;12594:20;12632:78;12706:3;12698:6;12691:4;12683:6;12679:17;12632:78;:::i;:::-;12623:87;;12439:277;12378:338;;;;:::o;12722:1509::-;12876:6;12884;12892;12900;12908;12957:3;12945:9;12936:7;12932:23;12928:33;12925:120;;;12964:79;;:::i;:::-;12925:120;13084:1;13109:53;13154:7;13145:6;13134:9;13130:22;13109:53;:::i;:::-;13099:63;;13055:117;13211:2;13237:53;13282:7;13273:6;13262:9;13258:22;13237:53;:::i;:::-;13227:63;;13182:118;13367:2;13356:9;13352:18;13339:32;13398:18;13390:6;13387:30;13384:117;;;13420:79;;:::i;:::-;13384:117;13525:78;13595:7;13586:6;13575:9;13571:22;13525:78;:::i;:::-;13515:88;;13310:303;13680:2;13669:9;13665:18;13652:32;13711:18;13703:6;13700:30;13697:117;;;13733:79;;:::i;:::-;13697:117;13838:78;13908:7;13899:6;13888:9;13884:22;13838:78;:::i;:::-;13828:88;;13623:303;13993:3;13982:9;13978:19;13965:33;14025:18;14017:6;14014:30;14011:117;;;14047:79;;:::i;:::-;14011:117;14152:62;14206:7;14197:6;14186:9;14182:22;14152:62;:::i;:::-;14142:72;;13936:288;12722:1509;;;;;;;;:::o;14237:474::-;14305:6;14313;14362:2;14350:9;14341:7;14337:23;14333:32;14330:119;;;14368:79;;:::i;:::-;14330:119;14488:1;14513:53;14558:7;14549:6;14538:9;14534:22;14513:53;:::i;:::-;14503:63;;14459:117;14615:2;14641:53;14686:7;14677:6;14666:9;14662:22;14641:53;:::i;:::-;14631:63;;14586:118;14237:474;;;;;:::o;14717:894::-;14835:6;14843;14892:2;14880:9;14871:7;14867:23;14863:32;14860:119;;;14898:79;;:::i;:::-;14860:119;15046:1;15035:9;15031:17;15018:31;15076:18;15068:6;15065:30;15062:117;;;15098:79;;:::i;:::-;15062:117;15203:78;15273:7;15264:6;15253:9;15249:22;15203:78;:::i;:::-;15193:88;;14989:302;15358:2;15347:9;15343:18;15330:32;15389:18;15381:6;15378:30;15375:117;;;15411:79;;:::i;:::-;15375:117;15516:78;15586:7;15577:6;15566:9;15562:22;15516:78;:::i;:::-;15506:88;;15301:303;14717:894;;;;;:::o;15617:114::-;15684:6;15718:5;15712:12;15702:22;;15617:114;;;:::o;15737:184::-;15836:11;15870:6;15865:3;15858:19;15910:4;15905:3;15901:14;15886:29;;15737:184;;;;:::o;15927:132::-;15994:4;16017:3;16009:11;;16047:4;16042:3;16038:14;16030:22;;15927:132;;;:::o;16065:108::-;16142:24;16160:5;16142:24;:::i;:::-;16137:3;16130:37;16065:108;;:::o;16179:179::-;16248:10;16269:46;16311:3;16303:6;16269:46;:::i;:::-;16347:4;16342:3;16338:14;16324:28;;16179:179;;;;:::o;16364:113::-;16434:4;16466;16461:3;16457:14;16449:22;;16364:113;;;:::o;16513:732::-;16632:3;16661:54;16709:5;16661:54;:::i;:::-;16731:86;16810:6;16805:3;16731:86;:::i;:::-;16724:93;;16841:56;16891:5;16841:56;:::i;:::-;16920:7;16951:1;16936:284;16961:6;16958:1;16955:13;16936:284;;;17037:6;17031:13;17064:63;17123:3;17108:13;17064:63;:::i;:::-;17057:70;;17150:60;17203:6;17150:60;:::i;:::-;17140:70;;16996:224;16983:1;16980;16976:9;16971:14;;16936:284;;;16940:14;17236:3;17229:10;;16637:608;;;16513:732;;;;:::o;17251:373::-;17394:4;17432:2;17421:9;17417:18;17409:26;;17481:9;17475:4;17471:20;17467:1;17456:9;17452:17;17445:47;17509:108;17612:4;17603:6;17509:108;:::i;:::-;17501:116;;17251:373;;;;:::o;17630:329::-;17689:6;17738:2;17726:9;17717:7;17713:23;17709:32;17706:119;;;17744:79;;:::i;:::-;17706:119;17864:1;17889:53;17934:7;17925:6;17914:9;17910:22;17889:53;:::i;:::-;17879:63;;17835:117;17630:329;;;;:::o;17965:1039::-;18092:6;18100;18108;18157:2;18145:9;18136:7;18132:23;18128:32;18125:119;;;18163:79;;:::i;:::-;18125:119;18283:1;18308:53;18353:7;18344:6;18333:9;18329:22;18308:53;:::i;:::-;18298:63;;18254:117;18438:2;18427:9;18423:18;18410:32;18469:18;18461:6;18458:30;18455:117;;;18491:79;;:::i;:::-;18455:117;18596:78;18666:7;18657:6;18646:9;18642:22;18596:78;:::i;:::-;18586:88;;18381:303;18751:2;18740:9;18736:18;18723:32;18782:18;18774:6;18771:30;18768:117;;;18804:79;;:::i;:::-;18768:117;18909:78;18979:7;18970:6;18959:9;18955:22;18909:78;:::i;:::-;18899:88;;18694:303;17965:1039;;;;;:::o;19010:308::-;19072:4;19162:18;19154:6;19151:30;19148:56;;;19184:18;;:::i;:::-;19148:56;19222:29;19244:6;19222:29;:::i;:::-;19214:37;;19306:4;19300;19296:15;19288:23;;19010:308;;;:::o;19324:412::-;19402:5;19427:66;19443:49;19485:6;19443:49;:::i;:::-;19427:66;:::i;:::-;19418:75;;19516:6;19509:5;19502:21;19554:4;19547:5;19543:16;19592:3;19583:6;19578:3;19574:16;19571:25;19568:112;;;19599:79;;:::i;:::-;19568:112;19689:41;19723:6;19718:3;19713;19689:41;:::i;:::-;19408:328;19324:412;;;;;:::o;19756:340::-;19812:5;19861:3;19854:4;19846:6;19842:17;19838:27;19828:122;;19869:79;;:::i;:::-;19828:122;19986:6;19973:20;20011:79;20086:3;20078:6;20071:4;20063:6;20059:17;20011:79;:::i;:::-;20002:88;;19818:278;19756:340;;;;:::o;20102:1091::-;20207:6;20215;20223;20231;20239;20288:3;20276:9;20267:7;20263:23;20259:33;20256:120;;;20295:79;;:::i;:::-;20256:120;20415:1;20440:53;20485:7;20476:6;20465:9;20461:22;20440:53;:::i;:::-;20430:63;;20386:117;20570:2;20559:9;20555:18;20542:32;20601:18;20593:6;20590:30;20587:117;;;20623:79;;:::i;:::-;20587:117;20728:63;20783:7;20774:6;20763:9;20759:22;20728:63;:::i;:::-;20718:73;;20513:288;20840:2;20866:53;20911:7;20902:6;20891:9;20887:22;20866:53;:::i;:::-;20856:63;;20811:118;20968:2;20994:53;21039:7;21030:6;21019:9;21015:22;20994:53;:::i;:::-;20984:63;;20939:118;21096:3;21123:53;21168:7;21159:6;21148:9;21144:22;21123:53;:::i;:::-;21113:63;;21067:119;20102:1091;;;;;;;;:::o;21199:222::-;21292:4;21330:2;21319:9;21315:18;21307:26;;21343:71;21411:1;21400:9;21396:17;21387:6;21343:71;:::i;:::-;21199:222;;;;:::o;21427:116::-;21497:21;21512:5;21497:21;:::i;:::-;21490:5;21487:32;21477:60;;21533:1;21530;21523:12;21477:60;21427:116;:::o;21549:133::-;21592:5;21630:6;21617:20;21608:29;;21646:30;21670:5;21646:30;:::i;:::-;21549:133;;;;:::o;21688:468::-;21753:6;21761;21810:2;21798:9;21789:7;21785:23;21781:32;21778:119;;;21816:79;;:::i;:::-;21778:119;21936:1;21961:53;22006:7;21997:6;21986:9;21982:22;21961:53;:::i;:::-;21951:63;;21907:117;22063:2;22089:50;22131:7;22122:6;22111:9;22107:22;22089:50;:::i;:::-;22079:60;;22034:115;21688:468;;;;;:::o;22162:323::-;22218:6;22267:2;22255:9;22246:7;22242:23;22238:32;22235:119;;;22273:79;;:::i;:::-;22235:119;22393:1;22418:50;22460:7;22451:6;22440:9;22436:22;22418:50;:::i;:::-;22408:60;;22364:114;22162:323;;;;:::o;22491:474::-;22559:6;22567;22616:2;22604:9;22595:7;22591:23;22587:32;22584:119;;;22622:79;;:::i;:::-;22584:119;22742:1;22767:53;22812:7;22803:6;22792:9;22788:22;22767:53;:::i;:::-;22757:63;;22713:117;22869:2;22895:53;22940:7;22931:6;22920:9;22916:22;22895:53;:::i;:::-;22885:63;;22840:118;22491:474;;;;;:::o;22971:751::-;23192:4;23230:3;23219:9;23215:19;23207:27;;23244:65;23306:1;23295:9;23291:17;23282:6;23244:65;:::i;:::-;23319:72;23387:2;23376:9;23372:18;23363:6;23319:72;:::i;:::-;23401:66;23463:2;23452:9;23448:18;23439:6;23401:66;:::i;:::-;23477:72;23545:2;23534:9;23530:18;23521:6;23477:72;:::i;:::-;23559:73;23627:3;23616:9;23612:19;23603:6;23559:73;:::i;:::-;23642;23710:3;23699:9;23695:19;23686:6;23642:73;:::i;:::-;22971:751;;;;;;;;;:::o;23728:1089::-;23832:6;23840;23848;23856;23864;23913:3;23901:9;23892:7;23888:23;23884:33;23881:120;;;23920:79;;:::i;:::-;23881:120;24040:1;24065:53;24110:7;24101:6;24090:9;24086:22;24065:53;:::i;:::-;24055:63;;24011:117;24167:2;24193:53;24238:7;24229:6;24218:9;24214:22;24193:53;:::i;:::-;24183:63;;24138:118;24295:2;24321:53;24366:7;24357:6;24346:9;24342:22;24321:53;:::i;:::-;24311:63;;24266:118;24423:2;24449:53;24494:7;24485:6;24474:9;24470:22;24449:53;:::i;:::-;24439:63;;24394:118;24579:3;24568:9;24564:19;24551:33;24611:18;24603:6;24600:30;24597:117;;;24633:79;;:::i;:::-;24597:117;24738:62;24792:7;24783:6;24772:9;24768:22;24738:62;:::i;:::-;24728:72;;24522:288;23728:1089;;;;;;;;:::o;24823:619::-;24900:6;24908;24916;24965:2;24953:9;24944:7;24940:23;24936:32;24933:119;;;24971:79;;:::i;:::-;24933:119;25091:1;25116:53;25161:7;25152:6;25141:9;25137:22;25116:53;:::i;:::-;25106:63;;25062:117;25218:2;25244:53;25289:7;25280:6;25269:9;25265:22;25244:53;:::i;:::-;25234:63;;25189:118;25346:2;25372:53;25417:7;25408:6;25397:9;25393:22;25372:53;:::i;:::-;25362:63;;25317:118;24823:619;;;;;:::o;25448:684::-;25541:6;25549;25598:2;25586:9;25577:7;25573:23;25569:32;25566:119;;;25604:79;;:::i;:::-;25566:119;25752:1;25741:9;25737:17;25724:31;25782:18;25774:6;25771:30;25768:117;;;25804:79;;:::i;:::-;25768:117;25909:78;25979:7;25970:6;25959:9;25955:22;25909:78;:::i;:::-;25899:88;;25695:302;26036:2;26062:53;26107:7;26098:6;26087:9;26083:22;26062:53;:::i;:::-;26052:63;;26007:118;25448:684;;;;;:::o;26138:230::-;26278:34;26274:1;26266:6;26262:14;26255:58;26347:13;26342:2;26334:6;26330:15;26323:38;26138:230;:::o;26374:366::-;26516:3;26537:67;26601:2;26596:3;26537:67;:::i;:::-;26530:74;;26613:93;26702:3;26613:93;:::i;:::-;26731:2;26726:3;26722:12;26715:19;;26374:366;;;:::o;26746:419::-;26912:4;26950:2;26939:9;26935:18;26927:26;;26999:9;26993:4;26989:20;26985:1;26974:9;26970:17;26963:47;27027:131;27153:4;27027:131;:::i;:::-;27019:139;;26746:419;;;:::o;27171:180::-;27219:77;27216:1;27209:88;27316:4;27313:1;27306:15;27340:4;27337:1;27330:15;27357:320;27401:6;27438:1;27432:4;27428:12;27418:22;;27485:1;27479:4;27475:12;27506:18;27496:81;;27562:4;27554:6;27550:17;27540:27;;27496:81;27624:2;27616:6;27613:14;27593:18;27590:38;27587:84;;;27643:18;;:::i;:::-;27587:84;27408:269;27357:320;;;:::o;27683:166::-;27823:18;27819:1;27811:6;27807:14;27800:42;27683:166;:::o;27855:366::-;27997:3;28018:67;28082:2;28077:3;28018:67;:::i;:::-;28011:74;;28094:93;28183:3;28094:93;:::i;:::-;28212:2;28207:3;28203:12;28196:19;;27855:366;;;:::o;28227:419::-;28393:4;28431:2;28420:9;28416:18;28408:26;;28480:9;28474:4;28470:20;28466:1;28455:9;28451:17;28444:47;28508:131;28634:4;28508:131;:::i;:::-;28500:139;;28227:419;;;:::o;28652:180::-;28700:77;28697:1;28690:88;28797:4;28794:1;28787:15;28821:4;28818:1;28811:15;28838:305;28878:3;28897:20;28915:1;28897:20;:::i;:::-;28892:25;;28931:20;28949:1;28931:20;:::i;:::-;28926:25;;29085:1;29017:66;29013:74;29010:1;29007:81;29004:107;;;29091:18;;:::i;:::-;29004:107;29135:1;29132;29128:9;29121:16;;28838:305;;;;:::o;29149:158::-;29289:10;29285:1;29277:6;29273:14;29266:34;29149:158;:::o;29313:365::-;29455:3;29476:66;29540:1;29535:3;29476:66;:::i;:::-;29469:73;;29551:93;29640:3;29551:93;:::i;:::-;29669:2;29664:3;29660:12;29653:19;;29313:365;;;:::o;29684:419::-;29850:4;29888:2;29877:9;29873:18;29865:26;;29937:9;29931:4;29927:20;29923:1;29912:9;29908:17;29901:47;29965:131;30091:4;29965:131;:::i;:::-;29957:139;;29684:419;;;:::o;30109:348::-;30149:7;30172:20;30190:1;30172:20;:::i;:::-;30167:25;;30206:20;30224:1;30206:20;:::i;:::-;30201:25;;30394:1;30326:66;30322:74;30319:1;30316:81;30311:1;30304:9;30297:17;30293:105;30290:131;;;30401:18;;:::i;:::-;30290:131;30449:1;30446;30442:9;30431:20;;30109:348;;;;:::o;30463:180::-;30511:77;30508:1;30501:88;30608:4;30605:1;30598:15;30632:4;30629:1;30622:15;30649:185;30689:1;30706:20;30724:1;30706:20;:::i;:::-;30701:25;;30740:20;30758:1;30740:20;:::i;:::-;30735:25;;30779:1;30769:35;;30784:18;;:::i;:::-;30769:35;30826:1;30823;30819:9;30814:14;;30649:185;;;;:::o;30840:169::-;30980:21;30976:1;30968:6;30964:14;30957:45;30840:169;:::o;31015:366::-;31157:3;31178:67;31242:2;31237:3;31178:67;:::i;:::-;31171:74;;31254:93;31343:3;31254:93;:::i;:::-;31372:2;31367:3;31363:12;31356:19;;31015:366;;;:::o;31387:419::-;31553:4;31591:2;31580:9;31576:18;31568:26;;31640:9;31634:4;31630:20;31626:1;31615:9;31611:17;31604:47;31668:131;31794:4;31668:131;:::i;:::-;31660:139;;31387:419;;;:::o;31812:162::-;31952:14;31948:1;31940:6;31936:14;31929:38;31812:162;:::o;31980:366::-;32122:3;32143:67;32207:2;32202:3;32143:67;:::i;:::-;32136:74;;32219:93;32308:3;32219:93;:::i;:::-;32337:2;32332:3;32328:12;32321:19;;31980:366;;;:::o;32352:419::-;32518:4;32556:2;32545:9;32541:18;32533:26;;32605:9;32599:4;32595:20;32591:1;32580:9;32576:17;32569:47;32633:131;32759:4;32633:131;:::i;:::-;32625:139;;32352:419;;;:::o;32777:156::-;32917:8;32913:1;32905:6;32901:14;32894:32;32777:156;:::o;32939:365::-;33081:3;33102:66;33166:1;33161:3;33102:66;:::i;:::-;33095:73;;33177:93;33266:3;33177:93;:::i;:::-;33295:2;33290:3;33286:12;33279:19;;32939:365;;;:::o;33310:419::-;33476:4;33514:2;33503:9;33499:18;33491:26;;33563:9;33557:4;33553:20;33549:1;33538:9;33534:17;33527:47;33591:131;33717:4;33591:131;:::i;:::-;33583:139;;33310:419;;;:::o;33735:166::-;33875:18;33871:1;33863:6;33859:14;33852:42;33735:166;:::o;33907:366::-;34049:3;34070:67;34134:2;34129:3;34070:67;:::i;:::-;34063:74;;34146:93;34235:3;34146:93;:::i;:::-;34264:2;34259:3;34255:12;34248:19;;33907:366;;;:::o;34279:419::-;34445:4;34483:2;34472:9;34468:18;34460:26;;34532:9;34526:4;34522:20;34518:1;34507:9;34503:17;34496:47;34560:131;34686:4;34560:131;:::i;:::-;34552:139;;34279:419;;;:::o;34704:237::-;34844:34;34840:1;34832:6;34828:14;34821:58;34913:20;34908:2;34900:6;34896:15;34889:45;34704:237;:::o;34947:366::-;35089:3;35110:67;35174:2;35169:3;35110:67;:::i;:::-;35103:74;;35186:93;35275:3;35186:93;:::i;:::-;35304:2;35299:3;35295:12;35288:19;;34947:366;;;:::o;35319:419::-;35485:4;35523:2;35512:9;35508:18;35500:26;;35572:9;35566:4;35562:20;35558:1;35547:9;35543:17;35536:47;35600:131;35726:4;35600:131;:::i;:::-;35592:139;;35319:419;;;:::o;35744:234::-;35884:34;35880:1;35872:6;35868:14;35861:58;35953:17;35948:2;35940:6;35936:15;35929:42;35744:234;:::o;35984:366::-;36126:3;36147:67;36211:2;36206:3;36147:67;:::i;:::-;36140:74;;36223:93;36312:3;36223:93;:::i;:::-;36341:2;36336:3;36332:12;36325:19;;35984:366;;;:::o;36356:419::-;36522:4;36560:2;36549:9;36545:18;36537:26;;36609:9;36603:4;36599:20;36595:1;36584:9;36580:17;36573:47;36637:131;36763:4;36637:131;:::i;:::-;36629:139;;36356:419;;;:::o;36781:228::-;36921:34;36917:1;36909:6;36905:14;36898:58;36990:11;36985:2;36977:6;36973:15;36966:36;36781:228;:::o;37015:366::-;37157:3;37178:67;37242:2;37237:3;37178:67;:::i;:::-;37171:74;;37254:93;37343:3;37254:93;:::i;:::-;37372:2;37367:3;37363:12;37356:19;;37015:366;;;:::o;37387:419::-;37553:4;37591:2;37580:9;37576:18;37568:26;;37640:9;37634:4;37630:20;37626:1;37615:9;37611:17;37604:47;37668:131;37794:4;37668:131;:::i;:::-;37660:139;;37387:419;;;:::o;37812:180::-;37860:77;37857:1;37850:88;37957:4;37954:1;37947:15;37981:4;37978:1;37971:15;37998:233;38037:3;38060:24;38078:5;38060:24;:::i;:::-;38051:33;;38106:66;38099:5;38096:77;38093:103;;;38176:18;;:::i;:::-;38093:103;38223:1;38216:5;38212:13;38205:20;;37998:233;;;:::o;38237:182::-;38377:34;38373:1;38365:6;38361:14;38354:58;38237:182;:::o;38425:366::-;38567:3;38588:67;38652:2;38647:3;38588:67;:::i;:::-;38581:74;;38664:93;38753:3;38664:93;:::i;:::-;38782:2;38777:3;38773:12;38766:19;;38425:366;;;:::o;38797:419::-;38963:4;39001:2;38990:9;38986:18;38978:26;;39050:9;39044:4;39040:20;39036:1;39025:9;39021:17;39014:47;39078:131;39204:4;39078:131;:::i;:::-;39070:139;;38797:419;;;:::o;39222:228::-;39362:34;39358:1;39350:6;39346:14;39339:58;39431:11;39426:2;39418:6;39414:15;39407:36;39222:228;:::o;39456:366::-;39598:3;39619:67;39683:2;39678:3;39619:67;:::i;:::-;39612:74;;39695:93;39784:3;39695:93;:::i;:::-;39813:2;39808:3;39804:12;39797:19;;39456:366;;;:::o;39828:419::-;39994:4;40032:2;40021:9;40017:18;40009:26;;40081:9;40075:4;40071:20;40067:1;40056:9;40052:17;40045:47;40109:131;40235:4;40109:131;:::i;:::-;40101:139;;39828:419;;;:::o;40253:165::-;40393:17;40389:1;40381:6;40377:14;40370:41;40253:165;:::o;40424:366::-;40566:3;40587:67;40651:2;40646:3;40587:67;:::i;:::-;40580:74;;40663:93;40752:3;40663:93;:::i;:::-;40781:2;40776:3;40772:12;40765:19;;40424:366;;;:::o;40796:419::-;40962:4;41000:2;40989:9;40985:18;40977:26;;41049:9;41043:4;41039:20;41035:1;41024:9;41020:17;41013:47;41077:131;41203:4;41077:131;:::i;:::-;41069:139;;40796:419;;;:::o;41221:165::-;41361:17;41357:1;41349:6;41345:14;41338:41;41221:165;:::o;41392:366::-;41534:3;41555:67;41619:2;41614:3;41555:67;:::i;:::-;41548:74;;41631:93;41720:3;41631:93;:::i;:::-;41749:2;41744:3;41740:12;41733:19;;41392:366;;;:::o;41764:419::-;41930:4;41968:2;41957:9;41953:18;41945:26;;42017:9;42011:4;42007:20;42003:1;41992:9;41988:17;41981:47;42045:131;42171:4;42045:131;:::i;:::-;42037:139;;41764:419;;;:::o;42189:155::-;42329:7;42325:1;42317:6;42313:14;42306:31;42189:155;:::o;42350:365::-;42492:3;42513:66;42577:1;42572:3;42513:66;:::i;:::-;42506:73;;42588:93;42677:3;42588:93;:::i;:::-;42706:2;42701:3;42697:12;42690:19;;42350:365;;;:::o;42721:419::-;42887:4;42925:2;42914:9;42910:18;42902:26;;42974:9;42968:4;42964:20;42960:1;42949:9;42945:17;42938:47;43002:131;43128:4;43002:131;:::i;:::-;42994:139;;42721:419;;;:::o;43146:165::-;43286:17;43282:1;43274:6;43270:14;43263:41;43146:165;:::o;43317:366::-;43459:3;43480:67;43544:2;43539:3;43480:67;:::i;:::-;43473:74;;43556:93;43645:3;43556:93;:::i;:::-;43674:2;43669:3;43665:12;43658:19;;43317:366;;;:::o;43689:419::-;43855:4;43893:2;43882:9;43878:18;43870:26;;43942:9;43936:4;43932:20;43928:1;43917:9;43913:17;43906:47;43970:131;44096:4;43970:131;:::i;:::-;43962:139;;43689:419;;;:::o;44114:225::-;44254:34;44250:1;44242:6;44238:14;44231:58;44323:8;44318:2;44310:6;44306:15;44299:33;44114:225;:::o;44345:366::-;44487:3;44508:67;44572:2;44567:3;44508:67;:::i;:::-;44501:74;;44584:93;44673:3;44584:93;:::i;:::-;44702:2;44697:3;44693:12;44686:19;;44345:366;;;:::o;44717:419::-;44883:4;44921:2;44910:9;44906:18;44898:26;;44970:9;44964:4;44960:20;44956:1;44945:9;44941:17;44934:47;44998:131;45124:4;44998:131;:::i;:::-;44990:139;;44717:419;;;:::o;45142:114::-;45209:6;45243:5;45237:12;45227:22;;45142:114;;;:::o;45262:163::-;45379:11;45416:3;45401:18;;45262:163;;;;:::o;45431:132::-;45498:4;45521:3;45513:11;;45551:4;45546:3;45542:14;45534:22;;45431:132;;;:::o;45569:116::-;45654:24;45672:5;45654:24;:::i;:::-;45649:3;45642:37;45569:116;;:::o;45691:195::-;45768:10;45789:54;45839:3;45831:6;45789:54;:::i;:::-;45875:4;45870:3;45866:14;45852:28;;45691:195;;;;:::o;45892:113::-;45962:4;45994;45989:3;45985:14;45977:22;;45892:113;;;:::o;46041:776::-;46178:3;46207:54;46255:5;46207:54;:::i;:::-;46277:104;46374:6;46369:3;46277:104;:::i;:::-;46270:111;;46405:56;46455:5;46405:56;:::i;:::-;46484:7;46515:1;46500:292;46525:6;46522:1;46519:13;46500:292;;;46601:6;46595:13;46628:71;46695:3;46680:13;46628:71;:::i;:::-;46621:78;;46722:60;46775:6;46722:60;:::i;:::-;46712:70;;46560:232;46547:1;46544;46540:9;46535:14;;46500:292;;;46504:14;46808:3;46801:10;;46183:634;;;46041:776;;;;:::o;46823:335::-;46985:3;47007:125;47128:3;47119:6;47007:125;:::i;:::-;47000:132;;47149:3;47142:10;;46823:335;;;;:::o;47164:220::-;47304:34;47300:1;47292:6;47288:14;47281:58;47373:3;47368:2;47360:6;47356:15;47349:28;47164:220;:::o;47390:366::-;47532:3;47553:67;47617:2;47612:3;47553:67;:::i;:::-;47546:74;;47629:93;47718:3;47629:93;:::i;:::-;47747:2;47742:3;47738:12;47731:19;;47390:366;;;:::o;47762:419::-;47928:4;47966:2;47955:9;47951:18;47943:26;;48015:9;48009:4;48005:20;48001:1;47990:9;47986:17;47979:47;48043:131;48169:4;48043:131;:::i;:::-;48035:139;;47762:419;;;:::o;48187:332::-;48308:4;48346:2;48335:9;48331:18;48323:26;;48359:71;48427:1;48416:9;48412:17;48403:6;48359:71;:::i;:::-;48440:72;48508:2;48497:9;48493:18;48484:6;48440:72;:::i;:::-;48187:332;;;;;:::o;48525:227::-;48665:34;48661:1;48653:6;48649:14;48642:58;48734:10;48729:2;48721:6;48717:15;48710:35;48525:227;:::o;48758:366::-;48900:3;48921:67;48985:2;48980:3;48921:67;:::i;:::-;48914:74;;48997:93;49086:3;48997:93;:::i;:::-;49115:2;49110:3;49106:12;49099:19;;48758:366;;;:::o;49130:419::-;49296:4;49334:2;49323:9;49319:18;49311:26;;49383:9;49377:4;49373:20;49369:1;49358:9;49354:17;49347:47;49411:131;49537:4;49411:131;:::i;:::-;49403:139;;49130:419;;;:::o;49555:224::-;49695:34;49691:1;49683:6;49679:14;49672:58;49764:7;49759:2;49751:6;49747:15;49740:32;49555:224;:::o;49785:366::-;49927:3;49948:67;50012:2;50007:3;49948:67;:::i;:::-;49941:74;;50024:93;50113:3;50024:93;:::i;:::-;50142:2;50137:3;50133:12;50126:19;;49785:366;;;:::o;50157:419::-;50323:4;50361:2;50350:9;50346:18;50338:26;;50410:9;50404:4;50400:20;50396:1;50385:9;50381:17;50374:47;50438:131;50564:4;50438:131;:::i;:::-;50430:139;;50157:419;;;:::o;50582:229::-;50722:34;50718:1;50710:6;50706:14;50699:58;50791:12;50786:2;50778:6;50774:15;50767:37;50582:229;:::o;50817:366::-;50959:3;50980:67;51044:2;51039:3;50980:67;:::i;:::-;50973:74;;51056:93;51145:3;51056:93;:::i;:::-;51174:2;51169:3;51165:12;51158:19;;50817:366;;;:::o;51189:419::-;51355:4;51393:2;51382:9;51378:18;51370:26;;51442:9;51436:4;51432:20;51428:1;51417:9;51413:17;51406:47;51470:131;51596:4;51470:131;:::i;:::-;51462:139;;51189:419;;;:::o;51614:634::-;51835:4;51873:2;51862:9;51858:18;51850:26;;51922:9;51916:4;51912:20;51908:1;51897:9;51893:17;51886:47;51950:108;52053:4;52044:6;51950:108;:::i;:::-;51942:116;;52105:9;52099:4;52095:20;52090:2;52079:9;52075:18;52068:48;52133:108;52236:4;52227:6;52133:108;:::i;:::-;52125:116;;51614:634;;;;;:::o;52254:148::-;52356:11;52393:3;52378:18;;52254:148;;;;:::o;52408:173::-;52548:25;52544:1;52536:6;52532:14;52525:49;52408:173;:::o;52587:402::-;52747:3;52768:85;52850:2;52845:3;52768:85;:::i;:::-;52761:92;;52862:93;52951:3;52862:93;:::i;:::-;52980:2;52975:3;52971:12;52964:19;;52587:402;;;:::o;52995:377::-;53101:3;53129:39;53162:5;53129:39;:::i;:::-;53184:89;53266:6;53261:3;53184:89;:::i;:::-;53177:96;;53282:52;53327:6;53322:3;53315:4;53308:5;53304:16;53282:52;:::i;:::-;53359:6;53354:3;53350:16;53343:23;;53105:267;52995:377;;;;:::o;53378:167::-;53518:19;53514:1;53506:6;53502:14;53495:43;53378:167;:::o;53551:402::-;53711:3;53732:85;53814:2;53809:3;53732:85;:::i;:::-;53725:92;;53826:93;53915:3;53826:93;:::i;:::-;53944:2;53939:3;53935:12;53928:19;;53551:402;;;:::o;53959:967::-;54341:3;54363:148;54507:3;54363:148;:::i;:::-;54356:155;;54528:95;54619:3;54610:6;54528:95;:::i;:::-;54521:102;;54640:148;54784:3;54640:148;:::i;:::-;54633:155;;54805:95;54896:3;54887:6;54805:95;:::i;:::-;54798:102;;54917:3;54910:10;;53959:967;;;;;:::o;54932:222::-;55072:34;55068:1;55060:6;55056:14;55049:58;55141:5;55136:2;55128:6;55124:15;55117:30;54932:222;:::o;55160:366::-;55302:3;55323:67;55387:2;55382:3;55323:67;:::i;:::-;55316:74;;55399:93;55488:3;55399:93;:::i;:::-;55517:2;55512:3;55508:12;55501:19;;55160:366;;;:::o;55532:419::-;55698:4;55736:2;55725:9;55721:18;55713:26;;55785:9;55779:4;55775:20;55771:1;55760:9;55756:17;55749:47;55813:131;55939:4;55813:131;:::i;:::-;55805:139;;55532:419;;;:::o;55957:223::-;56097:34;56093:1;56085:6;56081:14;56074:58;56166:6;56161:2;56153:6;56149:15;56142:31;55957:223;:::o;56186:366::-;56328:3;56349:67;56413:2;56408:3;56349:67;:::i;:::-;56342:74;;56425:93;56514:3;56425:93;:::i;:::-;56543:2;56538:3;56534:12;56527:19;;56186:366;;;:::o;56558:419::-;56724:4;56762:2;56751:9;56747:18;56739:26;;56811:9;56805:4;56801:20;56797:1;56786:9;56782:17;56775:47;56839:131;56965:4;56839:131;:::i;:::-;56831:139;;56558:419;;;:::o;56983:228::-;57123:34;57119:1;57111:6;57107:14;57100:58;57192:11;57187:2;57179:6;57175:15;57168:36;56983:228;:::o;57217:366::-;57359:3;57380:67;57444:2;57439:3;57380:67;:::i;:::-;57373:74;;57456:93;57545:3;57456:93;:::i;:::-;57574:2;57569:3;57565:12;57558:19;;57217:366;;;:::o;57589:419::-;57755:4;57793:2;57782:9;57778:18;57770:26;;57842:9;57836:4;57832:20;57828:1;57817:9;57813:17;57806:47;57870:131;57996:4;57870:131;:::i;:::-;57862:139;;57589:419;;;:::o;58014:98::-;58065:6;58099:5;58093:12;58083:22;;58014:98;;;:::o;58118:168::-;58201:11;58235:6;58230:3;58223:19;58275:4;58270:3;58266:14;58251:29;;58118:168;;;;:::o;58292:360::-;58378:3;58406:38;58438:5;58406:38;:::i;:::-;58460:70;58523:6;58518:3;58460:70;:::i;:::-;58453:77;;58539:52;58584:6;58579:3;58572:4;58565:5;58561:16;58539:52;:::i;:::-;58616:29;58638:6;58616:29;:::i;:::-;58611:3;58607:39;58600:46;;58382:270;58292:360;;;;:::o;58658:751::-;58881:4;58919:3;58908:9;58904:19;58896:27;;58933:71;59001:1;58990:9;58986:17;58977:6;58933:71;:::i;:::-;59014:72;59082:2;59071:9;59067:18;59058:6;59014:72;:::i;:::-;59096;59164:2;59153:9;59149:18;59140:6;59096:72;:::i;:::-;59178;59246:2;59235:9;59231:18;59222:6;59178:72;:::i;:::-;59298:9;59292:4;59288:20;59282:3;59271:9;59267:19;59260:49;59326:76;59397:4;59388:6;59326:76;:::i;:::-;59318:84;;58658:751;;;;;;;;:::o;59415:141::-;59471:5;59502:6;59496:13;59487:22;;59518:32;59544:5;59518:32;:::i;:::-;59415:141;;;;:::o;59562:349::-;59631:6;59680:2;59668:9;59659:7;59655:23;59651:32;59648:119;;;59686:79;;:::i;:::-;59648:119;59806:1;59831:63;59886:7;59877:6;59866:9;59862:22;59831:63;:::i;:::-;59821:73;;59777:127;59562:349;;;;:::o;59917:106::-;59961:8;60010:5;60005:3;60001:15;59980:36;;59917:106;;;:::o;60029:183::-;60064:3;60102:1;60084:16;60081:23;60078:128;;;60140:1;60137;60134;60119:23;60162:34;60193:1;60187:8;60162:34;:::i;:::-;60155:41;;60078:128;60029:183;:::o;60218:711::-;60257:3;60295:4;60277:16;60274:26;60271:39;;;60303:5;;60271:39;60332:20;;:::i;:::-;60407:1;60389:16;60385:24;60382:1;60376:4;60361:49;60440:4;60434:11;60539:16;60532:4;60524:6;60520:17;60517:39;60484:18;60476:6;60473:30;60457:113;60454:146;;;60585:5;;;;60454:146;60631:6;60625:4;60621:17;60667:3;60661:10;60694:18;60686:6;60683:30;60680:43;;;60716:5;;;;;;60680:43;60764:6;60757:4;60752:3;60748:14;60744:27;60823:1;60805:16;60801:24;60795:4;60791:35;60786:3;60783:44;60780:57;;;60830:5;;;;;;;60780:57;60847;60895:6;60889:4;60885:17;60877:6;60873:30;60867:4;60847:57;:::i;:::-;60920:3;60913:10;;60261:668;;;;;60218:711;;:::o;60935:239::-;61075:34;61071:1;61063:6;61059:14;61052:58;61144:22;61139:2;61131:6;61127:15;61120:47;60935:239;:::o;61180:366::-;61322:3;61343:67;61407:2;61402:3;61343:67;:::i;:::-;61336:74;;61419:93;61508:3;61419:93;:::i;:::-;61537:2;61532:3;61528:12;61521:19;;61180:366;;;:::o;61552:419::-;61718:4;61756:2;61745:9;61741:18;61733:26;;61805:9;61799:4;61795:20;61791:1;61780:9;61776:17;61769:47;61833:131;61959:4;61833:131;:::i;:::-;61825:139;;61552:419;;;:::o;61977:227::-;62117:34;62113:1;62105:6;62101:14;62094:58;62186:10;62181:2;62173:6;62169:15;62162:35;61977:227;:::o;62210:366::-;62352:3;62373:67;62437:2;62432:3;62373:67;:::i;:::-;62366:74;;62449:93;62538:3;62449:93;:::i;:::-;62567:2;62562:3;62558:12;62551:19;;62210:366;;;:::o;62582:419::-;62748:4;62786:2;62775:9;62771:18;62763:26;;62835:9;62829:4;62825:20;62821:1;62810:9;62806:17;62799:47;62863:131;62989:4;62863:131;:::i;:::-;62855:139;;62582:419;;;:::o;63007:1053::-;63330:4;63368:3;63357:9;63353:19;63345:27;;63382:71;63450:1;63439:9;63435:17;63426:6;63382:71;:::i;:::-;63463:72;63531:2;63520:9;63516:18;63507:6;63463:72;:::i;:::-;63582:9;63576:4;63572:20;63567:2;63556:9;63552:18;63545:48;63610:108;63713:4;63704:6;63610:108;:::i;:::-;63602:116;;63765:9;63759:4;63755:20;63750:2;63739:9;63735:18;63728:48;63793:108;63896:4;63887:6;63793:108;:::i;:::-;63785:116;;63949:9;63943:4;63939:20;63933:3;63922:9;63918:19;63911:49;63977:76;64048:4;64039:6;63977:76;:::i;:::-;63969:84;;63007:1053;;;;;;;;:::o;64066:171::-;64105:3;64128:24;64146:5;64128:24;:::i;:::-;64119:33;;64174:4;64167:5;64164:15;64161:41;;;64182:18;;:::i;:::-;64161:41;64229:1;64222:5;64218:13;64211:20;;64066:171;;;:::o;64243:182::-;64383:34;64379:1;64371:6;64367:14;64360:58;64243:182;:::o;64431:366::-;64573:3;64594:67;64658:2;64653:3;64594:67;:::i;:::-;64587:74;;64670:93;64759:3;64670:93;:::i;:::-;64788:2;64783:3;64779:12;64772:19;;64431:366;;;:::o;64803:419::-;64969:4;65007:2;64996:9;64992:18;64984:26;;65056:9;65050:4;65046:20;65042:1;65031:9;65027:17;65020:47;65084:131;65210:4;65084:131;:::i;:::-;65076:139;;64803:419;;;:::o;65228:191::-;65268:4;65288:20;65306:1;65288:20;:::i;:::-;65283:25;;65322:20;65340:1;65322:20;:::i;:::-;65317:25;;65361:1;65358;65355:8;65352:34;;;65366:18;;:::i;:::-;65352:34;65411:1;65408;65404:9;65396:17;;65228:191;;;;:::o
Swarm Source
ipfs://d1b951ca761a9f0ab0bc028227d42a3eae0545fa0b03e22d40d55859d306134c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.