Overview
ETH Balance
12.701705 ETH
Eth Value
$34,014.85 (@ $2,677.98/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 7,902 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Sale | 20843850 | 24 hrs ago | IN | 0 ETH | 0.00084548 | ||||
Create Sale | 20843813 | 24 hrs ago | IN | 0 ETH | 0.0008746 | ||||
Purchase OBO | 20836577 | 2 days ago | IN | 0 ETH | 0.00320201 | ||||
Create Sale | 20836381 | 2 days ago | IN | 0 ETH | 0.0024782 | ||||
Create Sale | 20836371 | 2 days ago | IN | 0 ETH | 0.00263965 | ||||
Create Sale | 20836367 | 2 days ago | IN | 0 ETH | 0.00258419 | ||||
Create Sale | 20836362 | 2 days ago | IN | 0 ETH | 0.00250735 | ||||
Create Sale | 20836355 | 2 days ago | IN | 0 ETH | 0.00249355 | ||||
Create Sale | 20836214 | 2 days ago | IN | 0 ETH | 0.00271898 | ||||
Create Sale | 20836203 | 2 days ago | IN | 0 ETH | 0.00297343 | ||||
Create Sale | 20836163 | 2 days ago | IN | 0 ETH | 0.00354682 | ||||
Create Sale | 20832171 | 2 days ago | IN | 0 ETH | 0.00130499 | ||||
Create Sale | 20832163 | 2 days ago | IN | 0 ETH | 0.00137999 | ||||
Accept Bid | 20831446 | 2 days ago | IN | 0 ETH | 0.00154117 | ||||
Purchase OBO | 20830385 | 2 days ago | IN | 0 ETH | 0.00213618 | ||||
Purchase OBO | 20830383 | 2 days ago | IN | 0 ETH | 0.00198288 | ||||
Purchase OBO | 20830383 | 2 days ago | IN | 0 ETH | 0.00198305 | ||||
Accept Bid | 20829589 | 3 days ago | IN | 0 ETH | 0.0034064 | ||||
Bid On Token | 20824265 | 3 days ago | IN | 0.069 ETH | 0.00183247 | ||||
Accept Bids OBO | 20823336 | 3 days ago | IN | 0 ETH | 0.00206 | ||||
Create Sale | 20821860 | 4 days ago | IN | 0 ETH | 0.00348381 | ||||
Create Sale | 20818019 | 4 days ago | IN | 0 ETH | 0.00196309 | ||||
Create Sale | 20817943 | 4 days ago | IN | 0 ETH | 0.00157615 | ||||
Create Sale | 20817870 | 4 days ago | IN | 0 ETH | 0.00171896 | ||||
Purchase | 20814244 | 5 days ago | IN | 0.05 ETH | 0.00287341 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20831446 | 2 days ago | 0.05865 ETH | ||||
20829589 | 3 days ago | 0.063 ETH | ||||
20814244 | 5 days ago | 0.0425 ETH | ||||
20813931 | 5 days ago | 0.0875 ETH | ||||
20792488 | 8 days ago | 0.1615 ETH | ||||
20792477 | 8 days ago | 0.1615 ETH | ||||
20792459 | 8 days ago | 0.153 ETH | ||||
20778273 | 10 days ago | 0.55 ETH | ||||
20778269 | 10 days ago | 0.55 ETH | ||||
20738258 | 15 days ago | 0.05 ETH | ||||
20737014 | 15 days ago | 0.05 ETH | ||||
20715183 | 18 days ago | 0.1615 ETH | ||||
20685607 | 23 days ago | 0.1615 ETH | ||||
20685598 | 23 days ago | 0.1615 ETH | ||||
20685593 | 23 days ago | 0.1615 ETH | ||||
20685584 | 23 days ago | 0.1615 ETH | ||||
20685571 | 23 days ago | 0.1615 ETH | ||||
20685564 | 23 days ago | 0.1615 ETH | ||||
20685555 | 23 days ago | 0.1615 ETH | ||||
20678604 | 24 days ago | 0.14625 ETH | ||||
20649913 | 28 days ago | 1.198 ETH | ||||
20642337 | 29 days ago | 1.7 ETH | ||||
20641528 | 29 days ago | 0.062 ETH | ||||
20641524 | 29 days ago | 0.062 ETH | ||||
20636819 | 29 days ago | 0.15725 ETH |
Loading...
Loading
Contract Name:
DigitalMediaSaleCore
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-11-19 */ // File: SafeBoxInterface.sol pragma solidity 0.8.16; abstract contract SafeBoxInterface { function VERSION() public pure virtual returns (uint8); function typeOfContract() public pure virtual returns (bytes32); function singleTransfer( address _tokenContract, uint256 _tokenId, address _to ) external virtual; } // File: VaultCoreInterface.sol pragma solidity 0.8.16; abstract contract VaultCoreInterface { function VERSION() public pure virtual returns (uint8); function typeOfContract() public pure virtual returns (bytes32); function approveToken(uint256 _tokenId, address _tokenContractAddress) external virtual; } // File: RoyaltyRegistryInterface.sol pragma solidity 0.8.16; /** * Interface to the RoyaltyRegistry responsible for looking payout addresses */ abstract contract RoyaltyRegistryInterface { function getAddress(address custodial) external view virtual returns (address); function getMediaCustomPercentage(uint256 mediaId, address tokenAddress) external view virtual returns (uint16); function getExternalTokenPercentage(uint256 tokenId, address tokenAddress) external view virtual returns (uint16, uint16); function typeOfContract() public pure virtual returns (string calldata); function VERSION() public pure virtual returns (uint8); } // File: PaymentsBufferInterface.sol pragma solidity 0.8.16; /** * Interface to move funds to PaymentsBuffer for owner to claim it later. */ abstract contract PaymentsBufferInterface { function typeOfContract() public pure virtual returns (bytes32); function add(address _to) external payable virtual; function withdraw() external payable virtual; } // File: DigitalMediaBurnInterfaceV3.sol pragma solidity 0.8.16; /** * Interface to the DigitalMediaCore responsible for burning tokens */ abstract contract DigitalMediaBurnInterfaceV3 { struct PayoutInfo { address user; uint256 amount; } function burn(uint256 _tokenId) external virtual; function burnDigitalMedia(uint256 _digitalMedia) external virtual; function getDigitalMediaForSale(uint256 _digitalMediaId) external view virtual returns ( address, bool, uint16 ); function getDigitalMediaRelease(uint256 _tokenId) external view virtual returns (uint32, uint256); function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view virtual returns (PayoutInfo[] memory); function saleInfo(uint256 _tokenId, uint256 _salePrice) external view virtual returns (PayoutInfo[] memory); } // File: DigitalMediaBurnInterfaceV2.sol pragma solidity 0.8.16; /** * Interface to the DigitalMediaCore responsible for burning tokens */ abstract contract DigitalMediaBurnInterfaceV2 { function burn(uint256 _tokenId) external virtual; function burnToken(uint256 _tokenId) external virtual; function burnDigitalMedia(uint256 _digitalMedia) external virtual; function getDigitalMedia(uint256 _digitalMediaId) external view virtual returns ( uint256, uint32, uint32, uint256, address, string calldata ); function getDigitalMediaRelease(uint256 _tokenId) external view virtual returns ( uint256, uint32, uint256 ); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: WithdrawFundsControl.sol pragma solidity 0.8.16; contract WithdrawFundsControl is Ownable, Pausable { // List of approved on withdraw addresses mapping(address => uint256) public approvedWithdrawAddresses; bool public isInitialWithdrawAddressAdded = false; // Full week wait period before an approved withdraw address becomes active uint256 public constant withdrawApprovalWaitPeriod = 1 days; event WithdrawAddressAdded(address withdrawAddress); event WithdrawAddressRemoved(address widthdrawAddress); /** * Add a new approved on behalf of user address. */ function addApprovedWithdrawAddress(address _withdrawAddress) external onlyOwner { approvedWithdrawAddresses[_withdrawAddress] = block.timestamp; emit WithdrawAddressAdded(_withdrawAddress); } /* * Add new withdrawAddress for immediate use. This is an internal only Fn that is called * only when the contract is deployed. */ function addApprovedWithdrawAddressImmediately(address _withdrawAddress) internal onlyOwner { if (_withdrawAddress != address(0)) { // set the date to one in past so that address is active immediately. approvedWithdrawAddresses[_withdrawAddress] = block.timestamp - withdrawApprovalWaitPeriod - 1; emit WithdrawAddressAdded(_withdrawAddress); } } /** * Removes an approved on bhealf of user address. */ function removeApprovedWithdrawAddress(address _withdrawAddress) external onlyOwner { delete approvedWithdrawAddresses[_withdrawAddress]; emit WithdrawAddressRemoved(_withdrawAddress); } function addApprovedWithdrawAddressAfterDeploy(address _withdrawAddress) external onlyOwner { require( isInitialWithdrawAddressAdded == false, "Initial withdraw address already added" ); addApprovedWithdrawAddressImmediately(_withdrawAddress); isInitialWithdrawAddressAdded = true; } /** * Checks that a given withdraw address ia approved and is past it's required * wait time. */ function isApprovedWithdrawAddress(address _withdrawAddress) internal view returns (bool) { uint256 approvalTime = approvedWithdrawAddresses[_withdrawAddress]; require(approvalTime > 0, "withdraw address is not registered"); return block.timestamp - approvalTime > withdrawApprovalWaitPeriod; } } // File: OBOControl.sol pragma solidity 0.8.16; contract OBOControl is Ownable { address public oboAdmin; uint256 public constant newAddressWaitPeriod = 1 days; bool public canAddOBOImmediately = true; // List of approved on behalf of users. mapping(address => uint256) public approvedOBOs; event NewOBOAddressEvent(address OBOAddress, bool action); event NewOBOAdminAddressEvent(address oboAdminAddress); modifier onlyOBOAdmin() { require( owner() == _msgSender() || oboAdmin == _msgSender(), "not oboAdmin" ); _; } function setOBOAdmin(address _oboAdmin) external onlyOwner { oboAdmin = _oboAdmin; emit NewOBOAdminAddressEvent(_oboAdmin); } /** * Add a new approvedOBO address. The address can be used after wait period. */ function addApprovedOBO(address _oboAddress) external onlyOBOAdmin { require(_oboAddress != address(0), "cant set to 0x"); require(approvedOBOs[_oboAddress] == 0, "already added"); approvedOBOs[_oboAddress] = block.timestamp; emit NewOBOAddressEvent(_oboAddress, true); } /** * Removes an approvedOBO immediately. */ function removeApprovedOBO(address _oboAddress) external onlyOBOAdmin { delete approvedOBOs[_oboAddress]; emit NewOBOAddressEvent(_oboAddress, false); } /* * Add OBOAddress for immediate use. This is an internal only Fn that is called * only when the contract is deployed. */ function addApprovedOBOImmediately(address _oboAddress) internal { require(_oboAddress != address(0), "addr(0)"); // set the date to one in past so that address is active immediately. approvedOBOs[_oboAddress] = block.timestamp - newAddressWaitPeriod - 1; emit NewOBOAddressEvent(_oboAddress, true); } function addApprovedOBOAfterDeploy(address _oboAddress) external onlyOBOAdmin { require(canAddOBOImmediately == true, "disabled"); addApprovedOBOImmediately(_oboAddress); } function blockImmediateOBO() external onlyOBOAdmin { canAddOBOImmediately = false; } /* * Helper function to verify is a given address is a valid approvedOBO address. */ function isValidApprovedOBO(address _oboAddress) public view returns (bool) { uint256 createdAt = approvedOBOs[_oboAddress]; if (createdAt == 0) { return false; } return block.timestamp - createdAt > newAddressWaitPeriod; } /** * @dev Modifier to make the obo calls only callable by approved addressess */ modifier isApprovedOBO() { require(isValidApprovedOBO(msg.sender), "unauthorized OBO user"); _; } } // File: DigitalMediaSaleBase.sol pragma solidity 0.8.16; contract DigitalMediaSaleBase is OBOControl, Pausable { uint16 public royaltyPercentage = 1000; // reserving 0 with BadContract so that we can verify membership of a mapping. enum ContractType { BadContract, MakersPlaceV2, MakersPlaceV3 } // Mapping of token contract address to bool indicated approval. mapping(address => ContractType) public approvedTokenContracts; error InvalidTokenAddress(address tokenAddress); /** * Adds a new token contract address to be approved to be called. */ function addApprovedTokenContract( address _tokenContractAddress, ContractType _contractType ) external onlyOwner { approvedTokenContracts[_tokenContractAddress] = _contractType; } /** * Remove an approved token contract address from the list of approved addresses. */ function removeApprovedTokenContract(address _tokenContractAddress) external onlyOwner { delete approvedTokenContracts[_tokenContractAddress]; } /** * Checks that a particular token contract address is a valid MP token contract. */ function _isValidTokenContract(address _tokenContractAddress) internal view returns (bool) { return approvedTokenContracts[_tokenContractAddress] != ContractType.BadContract; } /** * Returns an ERC721 instance of a token contract address. Throws otherwise. * Only valid and approved token contracts are allowed to be interacted with. */ function _getTokenContract(address _tokenContractAddress) internal pure returns (IERC721) { // require(_isValidTokenContract(_tokenContractAddress), "Invalid tcontract"); return IERC721(_tokenContractAddress); } /** * Checks with the ERC-721 token contract the owner of the a token */ function _ownerOf(uint256 _tokenId, address _tokenContractAddress) internal view returns (address) { IERC721 tokenContract = _getTokenContract(_tokenContractAddress); return tokenContract.ownerOf(_tokenId); } /** * Checks to ensure that the token owner has approved the escrow contract, * or escrowAddress owns the token. */ function _approvedForEscrow( address _seller, uint256 _tokenId, address _tokenContractAddress, address _escrowAddress ) internal view returns (bool) { IERC721 tokenContract = _getTokenContract(_tokenContractAddress); // seller is the owner of the token, so checking that first return (_seller == _escrowAddress || tokenContract.isApprovedForAll(_seller, _escrowAddress) || tokenContract.getApproved(_tokenId) == _escrowAddress); } /** * Transfer an ERC-721 token from seller to the buyer. This is to be called after a purchase is * completed. */ function _transferFromTo( address _seller, address _receiver, uint256 _tokenId, address _tokenContractAddress ) internal { IERC721 tokenContract = _getTokenContract(_tokenContractAddress); tokenContract.safeTransferFrom(_seller, _receiver, _tokenId); } function getDigitalMedia(uint256 _digitalMediaId, address _tokenAddress) internal view returns ( address creator, bool collaborated, uint16 royalty ) { ContractType cType = approvedTokenContracts[_tokenAddress]; if (cType == ContractType.MakersPlaceV2) { DigitalMediaBurnInterfaceV2 tokenContract = DigitalMediaBurnInterfaceV2( _tokenAddress ); (, , , , creator, ) = tokenContract.getDigitalMedia( _digitalMediaId ); collaborated = false; royalty = royaltyPercentage; } else if (cType == ContractType.MakersPlaceV3) { DigitalMediaBurnInterfaceV3 tokenContract = DigitalMediaBurnInterfaceV3( _tokenAddress ); (creator, collaborated, royalty) = tokenContract .getDigitalMediaForSale(_digitalMediaId); } else { revert InvalidTokenAddress({tokenAddress: _tokenAddress}); } } function getReleaseMedia(uint256 _tokenId, address _tokenAddress) internal view returns (uint256 mediaId) { ContractType cType = approvedTokenContracts[_tokenAddress]; if (cType == ContractType.MakersPlaceV2) { DigitalMediaBurnInterfaceV2 tokenContract = DigitalMediaBurnInterfaceV2( _tokenAddress ); (, , mediaId) = tokenContract.getDigitalMediaRelease(_tokenId); } else if (cType == ContractType.MakersPlaceV3) { DigitalMediaBurnInterfaceV3 tokenContract = DigitalMediaBurnInterfaceV3( _tokenAddress ); (, mediaId) = tokenContract.getDigitalMediaRelease(_tokenId); } else { revert InvalidTokenAddress({tokenAddress: _tokenAddress}); } } } // File: CommissionControl.sol pragma solidity 0.8.16; contract CommissionControl is OBOControl, Pausable { enum CommissionType { InvalidType, saleType, reSaleType, externalType } event CommissionPercentageChanged( CommissionType commissionType, uint16 percentage, bool committed ); // 3 days wait period before new percentage is in effect uint256 public constant commissionAddressWaitPeriod = 3 days; struct CommissionStruct { uint16 percentage; uint16 intermediatePercentage; uint256 createdAt; } CommissionStruct public saleCommission = CommissionStruct(1500, 0, 0); CommissionStruct public reSaleCommission = CommissionStruct(250, 0, 0); CommissionStruct public externalSaleCommission = CommissionStruct(0, 0, 0); uint256 internal constant HUNDREDPERCENT = 10000; function _getCommisssionStruct(CommissionType _cType) internal view returns (CommissionStruct storage) { CommissionStruct storage x; if (_cType == CommissionType.saleType) { x = saleCommission; } else if (_cType == CommissionType.reSaleType) { x = reSaleCommission; } else { x = externalSaleCommission; } return x; } /* * Change commission percentage for contract. Usually in the range of 80-90%. * This change is stored in mapping untill committed. You can only commit * after the wait period. */ function changeCommissionPercentage( uint16 _percentage, CommissionType _cType ) external whenNotPaused onlyOwner { require( _percentage > 0 && _percentage <= HUNDREDPERCENT, "Invalid percentage" ); CommissionStruct storage commission = _getCommisssionStruct(_cType); require( commission.intermediatePercentage == 0, "commissionChange exists" ); commission.intermediatePercentage = _percentage; commission.createdAt = block.timestamp; emit CommissionPercentageChanged({ commissionType: _cType, percentage: _percentage, committed: false }); } function deleteCommissionChange(CommissionType _cType) external whenNotPaused onlyOwner { CommissionStruct storage commission = _getCommisssionStruct(_cType); commission.intermediatePercentage = 0; commission.createdAt = 0; } /* * Commit a commission percentage change that has already been submitted for change. */ function commitCommissionChange(CommissionType _cType) external whenNotPaused onlyOwner { CommissionStruct storage commission = _getCommisssionStruct(_cType); require( commission.intermediatePercentage > 0, "commissionChange exists" ); require( block.timestamp - commission.createdAt > commissionAddressWaitPeriod, "under wait period" ); commission.percentage = commission.intermediatePercentage; commission.intermediatePercentage = 0; commission.createdAt = 0; emit CommissionPercentageChanged({ commissionType: _cType, percentage: commission.percentage, committed: true }); } /* * Calculates payout for a given sale / bid price by doing the percentage math. */ function _computePayoutForPrice( uint256 salePrice, uint256 thisCommissionPercentage ) internal pure returns (uint256) { return (salePrice * ((HUNDREDPERCENT - thisCommissionPercentage))) / (HUNDREDPERCENT); } } // File: DigitalMediaFixedSale.sol pragma solidity 0.8.16; contract DigitalMediaFixedSale is DigitalMediaSaleBase, CommissionControl, WithdrawFundsControl { // constants (no storage used) uint256 internal constant changeContractWaitPeriod = 2 days; // storage bool public canRoyaltyRegistryChange = true; address internal newSafeBoxAddress; uint256 internal newSafeBoxCreatedAt; address internal newVaultAddress; uint256 internal newVaultCreatedAt; // Keep track of all the bids so that we dont withdraw current bids from this contract. // When a bid is accepted we can subtract the bid value from this totalBidAmount. // Initializaing variable to zero costs extra gas. by default its zero. uint256 public totalBidAmount; /** EVENTS **/ event SaleCreatedEvent( uint256 tokenId, address tokenContractAddress, bool acceptFiat, uint256 priceInWei ); event SaleSuccessfulEvent( uint256 tokenId, address tokenContractAddress, address buyer, address payoutAddress, uint256 payoutAmount, uint256 priceInWei ); event OBOSaleEvent( uint256 tokenId, address tokenContractAddress, address buyer, uint256 priceInWei ); event SaleCanceledEvent(uint256 tokenId, address tokenContractAddress); event NewSafeBoxRegistered(address newSafeBoxAddress); event NewVaultRegistered(address newVaultAddress); event NewVaultInEffect(address newVaultAddress); event NewSafeBoxInEffect(address newSafeBoxAddress); struct DigitalMediaSale { bool acceptFiat; address seller; uint256 priceInWei; // if commissionPercentage is set its a non-custodial sale. // createSaleOBO will set commissionPercentage to zero. uint256 commissionPercentage; } // Mapping of token contract address to ID to Digital Media Sale object. mapping(address => mapping(uint256 => DigitalMediaSale)) public tokenToSale; PaymentsBufferInterface public paymentInterface; RoyaltyRegistryInterface public royaltyStore; SafeBoxInterface public safebox; VaultCoreInterface public vaultInterface; constructor( address _royaltyRegistryAddress, address _safebox, address _vaultAddress ) { setRoyaltyRegistryStore(_royaltyRegistryAddress); safebox = _validateSafeBoxAddress(_safebox); vaultInterface = _validateVaultAddress(_vaultAddress); } function _validateVaultAddress(address _vaultAddress) internal pure returns (VaultCoreInterface) { require(_vaultAddress != address(0), "vault can't be 0x"); bytes32 vault_type = 0x6d707661756c7400000000000000000000000000000000000000000000000000; VaultCoreInterface vault = VaultCoreInterface(_vaultAddress); require(vault.typeOfContract() == vault_type, "not vault"); return vault; } function _validateSafeBoxAddress(address _safebox) internal pure returns (SafeBoxInterface) { // bytes32 safebox_type = bytes32(bytes("safebox")); bytes32 safebox_type = 0x73616665426f7800000000000000000000000000000000000000000000000000; SafeBoxInterface sb = SafeBoxInterface(_safebox); require(sb.typeOfContract() == safebox_type, "not safebox"); return sb; } /* * Need to register the new vault address first. Then call setVaultAddress after * wait period to set it for good. */ function registerNewVaultAddress(address _vaultAddress) external onlyOwner { _validateVaultAddress(_vaultAddress); newVaultAddress = _vaultAddress; newVaultCreatedAt = block.timestamp; emit NewVaultRegistered(_vaultAddress); } /* * Need to register the new safebox address first. Then call setSafeboxddress after * wait period to set it for good. */ function registerNewSafeBoxAddress(address _safebox) external whenNotPaused onlyOwner { newSafeBoxAddress = address(_validateSafeBoxAddress(_safebox)); newSafeBoxCreatedAt = block.timestamp; emit NewSafeBoxRegistered(_safebox); } /* set the vault for this sale contract. All custodial token owners grant approveAll * permission to the vault. The sale contract get approve permission for each token * from the vault and transfers it to the final destination in case of sale / bid accept. */ function setVaultAddress(address _vaultAddress) external onlyOwner { VaultCoreInterface vault = _validateVaultAddress(_vaultAddress); // If we are changing vault address make sure it passes the conditions if (address(vaultInterface) != address(0)) { // store vault address require(_vaultAddress == newVaultAddress, "_vault != newVault"); require( block.timestamp - newVaultCreatedAt > changeContractWaitPeriod, "wait" ); } vaultInterface = vault; emit NewVaultInEffect(_vaultAddress); } function setSafeboxAddress(address _safebox) external whenNotPaused onlyOwner { require(_safebox == newSafeBoxAddress, "_safebox != newSafebox"); require( block.timestamp - newSafeBoxCreatedAt > changeContractWaitPeriod, "wait" ); safebox = _validateSafeBoxAddress(_safebox); emit NewSafeBoxInEffect(_safebox); } function setRoyaltyPercentage(uint16 _newPercentage) external whenNotPaused onlyOwner { // Royalty can be 30% max require( _newPercentage >= 0 && _newPercentage <= 3000, "Invalid Royalty" ); royaltyPercentage = _newPercentage; } function setRoyaltyRegistryStore(address _royaltyStore) public whenNotPaused onlyOBOAdmin { require(canRoyaltyRegistryChange == true, "no"); RoyaltyRegistryInterface candidateRoyaltyStore = RoyaltyRegistryInterface( _royaltyStore ); require(candidateRoyaltyStore.VERSION() == 1, "roylty v!= 1"); bytes32 contractType = keccak256( abi.encodePacked(candidateRoyaltyStore.typeOfContract()) ); // keccak256(abi.encodePacked("royaltyRegistry")) = 0xb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed323 require( contractType == 0xb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed323, "not royalty" ); royaltyStore = candidateRoyaltyStore; } function setRoyaltyRegistryForever() external whenNotPaused onlyOwner { canRoyaltyRegistryChange = false; } /** * Removes the sale object and emits SaleCanceledEvent. */ function _cancelSale(uint256 _tokenId, address _tokenContractAddress) internal { _removeSale(_tokenId, _tokenContractAddress); emit SaleCanceledEvent(_tokenId, _tokenContractAddress); } /** * Removes a token from storage. */ function _removeSale(uint256 _tokenId, address _tokenContractAddress) internal { delete tokenToSale[_tokenContractAddress][_tokenId]; } /** * Returns true whether a particular DigitalMediaSale instance is on sale. */ function _isOnSale(DigitalMediaSale storage _sale) internal view returns (bool) { return (_sale.priceInWei > 0); } /** * Cancel sale if sale exists for a token. Safe to call even if sale does not exist. */ function _cancelSaleIfSaleExists( uint256 _tokenId, address _tokenContractAddress ) internal { DigitalMediaSale storage sale = tokenToSale[_tokenContractAddress][ _tokenId ]; if (_isOnSale(sale)) { _cancelSale(_tokenId, _tokenContractAddress); } } /** * Handles the purchase logic of a token. Checks that only tokens on sale are actually * purchaseable, ensures that right amount of ether is sent and also sends back any * excess payment to the buyer. * * This function only handles the purchase capability not the actual transfer * of the token itself or emitting event related to purchase. * * The proceeds remains on the smart contract until ready for withdrawl from the CFO account. */ function _purchase( uint256 _tokenId, address _tokenContractAddress, DigitalMediaSale storage sale, uint256 _paymentAmount ) internal returns (uint256) { // Check that the bid is greater than or equal to the current price uint256 price = sale.priceInWei; require(_paymentAmount >= price, "< price"); // Remove the token from being on sale before transferring funds to avoid replay _removeSale(_tokenId, _tokenContractAddress); uint256 excessPayment = _paymentAmount - price; if (excessPayment > 0) { payable(msg.sender).call{value: excessPayment, gas: 5000}; } return price; } /* Set PaymentsBuffer interface */ function registerPaymentsBufferAddress(address _bufferAddress) external onlyOwner { require(address(paymentInterface) == address(0), "already set"); PaymentsBufferInterface paymentsBuffer = PaymentsBufferInterface( _bufferAddress ); require( paymentsBuffer.typeOfContract() == 0x6d707061796d656e747362756666657200000000000000000000000000000000, "not buffer" ); paymentInterface = paymentsBuffer; } /* * Transfer money to an address. If the transfer fails move the funds to * PaymentsBuffer contract where the owner of the funds can come and claim it. */ function transferFunds(address _toAddress, uint256 amount) internal { (bool sent, ) = _toAddress.call{value: amount, gas: 5000}(""); if (!sent) { require( address(paymentInterface) != address(0), "paymentInterface should be set" ); paymentInterface.add{value: amount}(_toAddress); } } /** * Withdraws all the funds to a specified non-zero address. */ function withdrawFunds(address payable _withdrawAddress) external isApprovedOBO { require( isApprovedWithdrawAddress(_withdrawAddress), "unapproved withdrawAddress" ); uint256 contractBalance = address(this).balance; // We can withdraw all successful sale related funds but not pending bids uint256 deductibleBalance = contractBalance - totalBidAmount; _withdrawAddress.transfer(deductibleBalance); } /** * Validate tokenId, tokenAddress and escrow permission for msg.sender */ function validateTokenForEscrow( uint256 _tokenId, address _tokenContractAddress ) internal view returns (address) { address seller = _ownerOf(_tokenId, _tokenContractAddress); require(msg.sender == seller, "msg.sender != seller"); require( _approvedForEscrow( msg.sender, _tokenId, _tokenContractAddress, address(this) ), "approve/All missing" ); return seller; } } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: DigitalMediaSaleCore.sol pragma solidity 0.8.16; contract DigitalMediaSaleCore is DigitalMediaFixedSale, ReentrancyGuard { using Counters for Counters.Counter; // consts uint8 public constant VERSION = 3; bytes32 private constant safeboxType = 0x73616665426f7800000000000000000000000000000000000000000000000000; // storage slots Counters.Counter private _bidCounter; // tokenIdToBidId[tokenAddress[token_id]] = 2; mapping(address => mapping(uint256 => uint256)) tokenIdToBidId; mapping(uint256 => TokenBid) bidIdToTokenBid; struct SaleRequest { uint256 tokenId; uint256 amount; bool acceptFiat; address tokenAddress; } event TokenBidCreatedEvent( uint256 tokenId, address tokenAddress, uint256 bidId, uint256 bidPrice, address bidder ); event TokenBidRemovedEvent( uint256 tokenId, address tokenAddress, uint256 bidId, bool isBidder ); event TokenBidAccepted( uint256 tokenId, address tokenAddress, uint256 bidId, uint256 bidPrice, address bidder, address payoutAddress, address seller, uint256 payoutAmount ); struct TokenBid { address bidder; uint256 price; } struct OBOAcceptBidStruct { address tokenAddress; uint256 tokenId; uint256 bidId; bool useSafebox; } constructor( address _royaltyRegistryAddress, address _safebox, address _vault ) DigitalMediaFixedSale(_royaltyRegistryAddress, _safebox, _vault) {} /* * Compute commission percentage for a given token. Checks if token creator is seller * to determine if its a sale or a resale. */ function getCommissionPercentageForToken( address _seller, uint256 _tokenId, address _tokenContractAddress ) internal view returns (uint256) { // if the tokenContractAddress is of external type return external sale commission if (_isValidTokenContract(_tokenContractAddress) == false) { (uint16 customCommission, uint16 customRoyalty) = royaltyStore .getExternalTokenPercentage(_tokenId, _tokenContractAddress); return customCommission + customRoyalty > 0 ? customCommission + customRoyalty : externalSaleCommission.percentage; } uint256 digitalMediaId = getReleaseMedia( _tokenId, _tokenContractAddress ); (address creator, bool collaborated, uint16 royalty) = getDigitalMedia( digitalMediaId, _tokenContractAddress ); uint256 commissionPercentage; if (creator == _seller) { // if this media is a collaborated piece dont do payout on chain if (collaborated == true) { commissionPercentage = 0; } else { uint16 customPercentage = royaltyStore.getMediaCustomPercentage( digitalMediaId, _tokenContractAddress ); commissionPercentage = customPercentage > 0 ? customPercentage : saleCommission.percentage; } } else { // for secondary sales charge commission + royalty commissionPercentage = reSaleCommission.percentage + royalty; } return commissionPercentage; } /** * Creates a sale. This end point is used by non-custodial accounts. We create * a record of sale. The token will stay with the owner but this contract has * approve / approveAll to move the token during purchase. */ function createSale( uint256 _tokenId, address _tokenContractAddress, uint256 _priceInWei, bool _acceptFiat ) external whenNotPaused { address seller = validateTokenForEscrow( _tokenId, _tokenContractAddress ); require(_priceInWei > 0, "price > 0"); // We charge commission for this sale since the token owner / approve uint256 commissionPercentage = getCommissionPercentageForToken( seller, _tokenId, _tokenContractAddress ); // is calling this function. DigitalMediaSale memory sale = DigitalMediaSale( _acceptFiat, seller, _priceInWei, commissionPercentage ); tokenToSale[_tokenContractAddress][_tokenId] = sale; emit SaleCreatedEvent( _tokenId, _tokenContractAddress, _acceptFiat, _priceInWei ); } /** * Onchain purchase an NFT. * Non custodial seller only. Custodial seller is done in DepositFund flow */ function purchase(uint256 _tokenId, address _tokenContractAddress) external payable whenNotPaused nonReentrant { require(msg.value > 0, "msg.value"); DigitalMediaSale storage sale = tokenToSale[_tokenContractAddress][ _tokenId ]; require(_isOnSale(sale), "no sale"); address seller = sale.seller; uint256 price = sale.priceInWei; uint256 thisCommissionPercentage = sale.commissionPercentage; address tokenOwner = _ownerOf(_tokenId, _tokenContractAddress); require(seller == tokenOwner, "seller != tokOwner"); require( _approvedForEscrow( seller, _tokenId, _tokenContractAddress, address(this) ), "salecontract not approved" ); _purchase(_tokenId, _tokenContractAddress, sale, msg.value); _transferFromTo(seller, msg.sender, _tokenId, _tokenContractAddress); uint256 payoutAmount = 0; // if token belongs to MP and has commissionPercentage compute payout if (_isValidTokenContract(_tokenContractAddress) == true) { if (thisCommissionPercentage > 0) { payoutAmount = _computePayoutForPrice( price, thisCommissionPercentage ); } } else { payoutAmount = _computePayoutForPrice( price, thisCommissionPercentage ); } if (payoutAmount > 0) { transferFunds(seller, payoutAmount); } emit SaleSuccessfulEvent( _tokenId, _tokenContractAddress, msg.sender, seller, payoutAmount, price ); } /** * Custodial purchase. NFT moves to safebox * While in safebox, it will be locked up in a wait period */ function purchaseOBO(uint256 _tokenId, address _tokenContractAddress) external whenNotPaused isApprovedOBO nonReentrant { address seller = _ownerOf(_tokenId, _tokenContractAddress); DigitalMediaSale storage sale = tokenToSale[_tokenContractAddress][ _tokenId ]; require( _isOnSale(sale) && seller == sale.seller && sale.acceptFiat == true, "sale not valid" ); require( _approvedForEscrow( seller, _tokenId, _tokenContractAddress, address(this) ), "sale not approved" ); uint256 priceInWei = sale.priceInWei; _removeSale(_tokenId, _tokenContractAddress); _transferFromTo( seller, address(safebox), _tokenId, _tokenContractAddress ); emit OBOSaleEvent( _tokenId, _tokenContractAddress, address(safebox), priceInWei ); } /** * Cancels a token sale and delete the record of sale. Only token owner * can call this Fn. */ function cancelSale(uint256 _tokenId, address _tokenContractAddress) external { DigitalMediaSale storage sale = tokenToSale[_tokenContractAddress][ _tokenId ]; require(_isOnSale(sale), "no sale"); require(msg.sender == sale.seller, "caller is not token owner"); _cancelSale(_tokenId, _tokenContractAddress); } /** * Looks up a token that's on sale. */ function getSale(uint256 _tokenId, address _tokenContractAddress) external view returns (DigitalMediaSale memory) { DigitalMediaSale storage sale = tokenToSale[_tokenContractAddress][ _tokenId ]; require(_isOnSale(sale), "no sale"); return sale; } /* Cancel many sales at once. Only ApprovedOBO can call this */ function cancelSalesOBO(SaleRequest[] memory requests) external isApprovedOBO { for (uint32 i = 0; i < requests.length; i++) { SaleRequest memory request = requests[i]; DigitalMediaSale storage sale = tokenToSale[request.tokenAddress][ request.tokenId ]; if (_isOnSale(sale) == true) { _cancelSale(request.tokenId, request.tokenAddress); } } } /********************** * BIDDING * **********************/ /** * Function to put a bid on an approved ERC721 contract token. This function * stores only the current bid and the bid value in the contract. Any one can * bid on any token. Make sure you are bidding over the current bid price. */ function bidOnToken(uint256 _tokenId, address _tokenContractAddress) external payable whenNotPaused nonReentrant { uint256 bidPrice = msg.value; require(bidPrice > 0, "send msg.value"); IERC721 tokenContract = _getTokenContract(_tokenContractAddress); require(tokenContract.ownerOf(_tokenId) != address(0), "inv tokenId"); // Check if the current bid id exists for tokenId uint256 currentBidId = tokenIdToBidId[_tokenContractAddress][_tokenId]; if (currentBidId != 0) { TokenBid storage currentBid = bidIdToTokenBid[currentBidId]; require(bidPrice > currentBid.price, "< current bid"); address oldBidder = currentBid.bidder; uint256 oldBidPrice = currentBid.price; // After backing up the old bid delete them to save gas. delete tokenIdToBidId[_tokenContractAddress][_tokenId]; delete bidIdToTokenBid[currentBidId]; totalBidAmount = totalBidAmount - oldBidPrice; // Return the old bid to the old bidder or to buffer transferFunds(oldBidder, oldBidPrice); } uint256 bidId = _getNextBidId(); bidIdToTokenBid[bidId] = TokenBid({ bidder: msg.sender, price: bidPrice }); tokenIdToBidId[_tokenContractAddress][_tokenId] = bidId; totalBidAmount = totalBidAmount + bidPrice; // msg.value is automatically transferred to the contract. // No need to explicity move the money // https://programtheblockchain.com/posts/2017/12/15/writing-a-contract-that-handles-ether/ emit TokenBidCreatedEvent( _tokenId, _tokenContractAddress, bidId, bidPrice, msg.sender ); } /** * For a given approved ERC721 token, get the current bid */ function getCurrentBidForToken( uint256 _tokenId, address _tokenContractAddress ) external view returns ( uint256 bidId, address bidder, uint256 price ) { uint256 currentBidId = tokenIdToBidId[_tokenContractAddress][_tokenId]; if (currentBidId == 0) { return (0, address(0), 0); } else { TokenBid storage currentBid = bidIdToTokenBid[currentBidId]; return (currentBidId, currentBid.bidder, currentBid.price); } } /** * Cancel the current bid for an approved ERC721 token. Only the current bidder * or the approvedOBO can call this function. Cancelling the bid will move the * funds back to the bidder. A token can be on sale which means the owner will be * the sale contract. So we decided to make this approvedOBO call. */ function cancelBid( uint256 _tokenId, address _tokenContractAddress, uint256 _bidId ) external nonReentrant { uint256 currentBidId = tokenIdToBidId[_tokenContractAddress][_tokenId]; require(currentBidId != 0, "No bid"); require(currentBidId == _bidId, "bidId not current"); TokenBid storage currentBid = bidIdToTokenBid[currentBidId]; require( currentBid.bidder == msg.sender || isValidApprovedOBO(msg.sender) || msg.sender == _ownerOf(_tokenId, _tokenContractAddress), "msg.sender not authorized" ); bool isBidder = (currentBid.bidder == msg.sender); uint256 price = currentBid.price; address bidderAddress = currentBid.bidder; delete tokenIdToBidId[_tokenContractAddress][_tokenId]; delete bidIdToTokenBid[currentBidId]; totalBidAmount = totalBidAmount - price; transferFunds(bidderAddress, price); emit TokenBidRemovedEvent( _tokenId, _tokenContractAddress, currentBidId, isBidder ); } function _getAndDeleteCurrentBid( uint256 _tokenId, address _tokenContractAddress, uint256 _bidId ) internal returns (address bidder, uint256 bidPrice) { uint256 currentBidId = tokenIdToBidId[_tokenContractAddress][_tokenId]; require(currentBidId != 0, "No bid"); require(currentBidId == _bidId, "bidId not current"); TokenBid storage currentBid = bidIdToTokenBid[currentBidId]; bidder = currentBid.bidder; bidPrice = currentBid.price; // Delete the bid to avoid re-entrancy attack delete tokenIdToBidId[_tokenContractAddress][_tokenId]; delete bidIdToTokenBid[currentBidId]; totalBidAmount = totalBidAmount - bidPrice; _cancelSaleIfSaleExists(_tokenId, _tokenContractAddress); return (bidder, bidPrice); } /** * Accept the current Bid on a approved ERC721 token. Only the token owner can call * this function. The token is immediately transferred to the buyer and payout is * performed. */ function acceptBid( uint256 _tokenId, address _tokenContractAddress, uint256 _bidId ) external whenNotPaused nonReentrant { address seller = _ownerOf(_tokenId, _tokenContractAddress); require(msg.sender == seller, "msg.sender != seller"); require( _approvedForEscrow( msg.sender, _tokenId, _tokenContractAddress, address(this) ), "approve/All missing" ); (address currentBidder, uint256 bidPrice) = _getAndDeleteCurrentBid( _tokenId, _tokenContractAddress, _bidId ); _transferFromTo(seller, currentBidder, _tokenId, _tokenContractAddress); uint256 thisCommissionPercentage = getCommissionPercentageForToken( seller, _tokenId, _tokenContractAddress ); // Perform payout since seller is not a custodial account and can accept payment // This endpoint is called only by the tokenOwner. We decided if the token owner // took the pain to call this endpoint we will charge a commission based // on if its sold by creator or other. uint256 payoutAmount = 0; if (_isValidTokenContract(_tokenContractAddress) == true) { if (thisCommissionPercentage > 0) { payoutAmount = _computePayoutForPrice( bidPrice, thisCommissionPercentage ); } } else { payoutAmount = _computePayoutForPrice( bidPrice, thisCommissionPercentage ); } if (payoutAmount > 0) { transferFunds(seller, payoutAmount); } emit TokenBidAccepted({ tokenId: _tokenId, tokenAddress: _tokenContractAddress, bidId: _bidId, bidPrice: bidPrice, bidder: currentBidder, payoutAddress: seller, seller: seller, payoutAmount: payoutAmount }); } /** * Accept the current Bid on a approved ERC721 token. Only the master accounts with * isApprovedOBO permission can call this function. Pulls the NFT from SafeBox * and transfers to the bidder. No payout is performed in this contract. Its all offline. * Goes to safebox for a lockup period, until credit card is resolved. * Flow: alice safebox nft -> bob bids onchain -> alice accepts bid -> nights watch calls SaleCore.acceptBidOBO -> pulls it from SafeBox -> NFT to Bob */ function acceptBidsOBO(OBOAcceptBidStruct[] memory _requests) external whenNotPaused isApprovedOBO nonReentrant { for (uint256 i = 0; i < _requests.length; i++) { address tokenAddress = _requests[i].tokenAddress; uint256 tokenId = _requests[i].tokenId; uint256 bidId = _requests[i].bidId; bool useSafebox = _requests[i].useSafebox; address seller = _ownerOf(tokenId, tokenAddress); (address currentBidder, uint256 bidPrice) = _getAndDeleteCurrentBid( tokenId, tokenAddress, bidId ); if (useSafebox) { safebox.singleTransfer(tokenAddress, tokenId, currentBidder); } else { vaultInterface.approveToken(tokenId, tokenAddress); _transferFromTo(seller, currentBidder, tokenId, tokenAddress); } emit TokenBidAccepted({ tokenId: tokenId, tokenAddress: tokenAddress, bidId: bidId, bidPrice: bidPrice, bidder: currentBidder, payoutAddress: address(0), seller: seller, payoutAmount: 0 }); } } /* * An internal function to maintain a sequential identifier for bids */ function _getNextBidId() private returns (uint256) { _bidCounter.increment(); return _bidCounter.current(); } // pause (idempotent) function pause() external onlyOwner { if (!paused()) { _pause(); } } // unpause (idempotent) function unpause() external onlyOwner { if (paused()) { _unpause(); } } function renounceOwnership() public view override onlyOwner { revert("no"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_royaltyRegistryAddress","type":"address"},{"internalType":"address","name":"_safebox","type":"address"},{"internalType":"address","name":"_vault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"InvalidTokenAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum CommissionControl.CommissionType","name":"commissionType","type":"uint8"},{"indexed":false,"internalType":"uint16","name":"percentage","type":"uint16"},{"indexed":false,"internalType":"bool","name":"committed","type":"bool"}],"name":"CommissionPercentageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"OBOAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"action","type":"bool"}],"name":"NewOBOAddressEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oboAdminAddress","type":"address"}],"name":"NewOBOAdminAddressEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSafeBoxAddress","type":"address"}],"name":"NewSafeBoxInEffect","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSafeBoxAddress","type":"address"}],"name":"NewSafeBoxRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newVaultAddress","type":"address"}],"name":"NewVaultInEffect","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newVaultAddress","type":"address"}],"name":"NewVaultRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"priceInWei","type":"uint256"}],"name":"OBOSaleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"}],"name":"SaleCanceledEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"acceptFiat","type":"bool"},{"indexed":false,"internalType":"uint256","name":"priceInWei","type":"uint256"}],"name":"SaleCreatedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenContractAddress","type":"address"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"address","name":"payoutAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"payoutAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceInWei","type":"uint256"}],"name":"SaleSuccessfulEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidPrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"address","name":"payoutAddress","type":"address"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"payoutAmount","type":"uint256"}],"name":"TokenBidAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidPrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"}],"name":"TokenBidCreatedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"bidId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isBidder","type":"bool"}],"name":"TokenBidRemovedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"withdrawAddress","type":"address"}],"name":"WithdrawAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"widthdrawAddress","type":"address"}],"name":"WithdrawAddressRemoved","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"uint256","name":"_bidId","type":"uint256"}],"name":"acceptBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"bidId","type":"uint256"},{"internalType":"bool","name":"useSafebox","type":"bool"}],"internalType":"struct DigitalMediaSaleCore.OBOAcceptBidStruct[]","name":"_requests","type":"tuple[]"}],"name":"acceptBidsOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"addApprovedOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"addApprovedOBOAfterDeploy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"enum DigitalMediaSaleBase.ContractType","name":"_contractType","type":"uint8"}],"name":"addApprovedTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawAddress","type":"address"}],"name":"addApprovedWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawAddress","type":"address"}],"name":"addApprovedWithdrawAddressAfterDeploy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedOBOs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedTokenContracts","outputs":[{"internalType":"enum DigitalMediaSaleBase.ContractType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedWithdrawAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"bidOnToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"blockImmediateOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canAddOBOImmediately","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canRoyaltyRegistryChange","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"uint256","name":"_bidId","type":"uint256"}],"name":"cancelBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"cancelSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"acceptFiat","type":"bool"},{"internalType":"address","name":"tokenAddress","type":"address"}],"internalType":"struct DigitalMediaSaleCore.SaleRequest[]","name":"requests","type":"tuple[]"}],"name":"cancelSalesOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_percentage","type":"uint16"},{"internalType":"enum CommissionControl.CommissionType","name":"_cType","type":"uint8"}],"name":"changeCommissionPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"commissionAddressWaitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum CommissionControl.CommissionType","name":"_cType","type":"uint8"}],"name":"commitCommissionChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"},{"internalType":"uint256","name":"_priceInWei","type":"uint256"},{"internalType":"bool","name":"_acceptFiat","type":"bool"}],"name":"createSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum CommissionControl.CommissionType","name":"_cType","type":"uint8"}],"name":"deleteCommissionChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"externalSaleCommission","outputs":[{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint16","name":"intermediatePercentage","type":"uint16"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"getCurrentBidForToken","outputs":[{"internalType":"uint256","name":"bidId","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"getSale","outputs":[{"components":[{"internalType":"bool","name":"acceptFiat","type":"bool"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"priceInWei","type":"uint256"},{"internalType":"uint256","name":"commissionPercentage","type":"uint256"}],"internalType":"struct DigitalMediaFixedSale.DigitalMediaSale","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialWithdrawAddressAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"isValidApprovedOBO","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newAddressWaitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oboAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentInterface","outputs":[{"internalType":"contract PaymentsBufferInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"purchaseOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reSaleCommission","outputs":[{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint16","name":"intermediatePercentage","type":"uint16"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_safebox","type":"address"}],"name":"registerNewSafeBoxAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultAddress","type":"address"}],"name":"registerNewVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bufferAddress","type":"address"}],"name":"registerPaymentsBufferAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAddress","type":"address"}],"name":"removeApprovedOBO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContractAddress","type":"address"}],"name":"removeApprovedTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_withdrawAddress","type":"address"}],"name":"removeApprovedWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyPercentage","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyStore","outputs":[{"internalType":"contract RoyaltyRegistryInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"safebox","outputs":[{"internalType":"contract SafeBoxInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleCommission","outputs":[{"internalType":"uint16","name":"percentage","type":"uint16"},{"internalType":"uint16","name":"intermediatePercentage","type":"uint16"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oboAdmin","type":"address"}],"name":"setOBOAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newPercentage","type":"uint16"}],"name":"setRoyaltyPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRoyaltyRegistryForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyStore","type":"address"}],"name":"setRoyaltyRegistryStore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_safebox","type":"address"}],"name":"setSafeboxAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultAddress","type":"address"}],"name":"setVaultAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenToSale","outputs":[{"internalType":"bool","name":"acceptFiat","type":"bool"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint256","name":"priceInWei","type":"uint256"},{"internalType":"uint256","name":"commissionPercentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBidAmount","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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultInterface","outputs":[{"internalType":"contract VaultCoreInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawApprovalWaitPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_withdrawAddress","type":"address"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6001805460ff60a01b1916600160a01b179055600380546203e80062ffff00199091161790556105dc6080819052600060a081905260c08190526005805463ffffffff199081169093179055600681905560fa60e081905261010082815261012083905260078054851690921790915560088290556101a060405261014082905261016082905261018082905260098054909316909255600a55600c805461ffff19169091179055348015620000b457600080fd5b5060405162004eeb38038062004eeb833981016040819052620000d7916200065c565b828282620000e53362000162565b6003805460ff19169055620000fa83620001b2565b62000105826200042d565b601480546001600160a01b0319166001600160a01b03929092169190911790556200013081620004ef565b601580546001600160a01b0319166001600160a01b03929092169190911790555050600160165550620007f792505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620001bc620005f5565b6000546001600160a01b0316331480620001e057506001546001600160a01b031633145b620002215760405162461bcd60e51b815260206004820152600c60248201526b3737ba1037b137a0b236b4b760a11b60448201526064015b60405180910390fd5b600c5460ff610100909104161515600114620002655760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b604482015260640162000218565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002a9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002cf9190620006a6565b60ff16600114620003125760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b604482015260640162000218565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000353573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200037d919081019062000707565b6040516020016200038f9190620007bf565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b14620004095760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b604482015260640162000218565b50601380546001600160a01b0319166001600160a01b039290921691909117905550565b600080660e6c2ccca84def60cb1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000485573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004ab9190620007dd565b14620004e85760405162461bcd60e51b815260206004820152600b60248201526a0dcdee840e6c2cccac4def60ab1b604482015260640162000218565b9392505050565b60006001600160a01b0382166200053d5760405162461bcd60e51b81526020600482015260116024820152700ecc2ead8e840c6c2dc4ee840c4ca4060f607b1b604482015260640162000218565b6000661b5c1d985d5b1d60ca1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000594573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ba9190620007dd565b14620004e85760405162461bcd60e51b81526020600482015260096024820152681b9bdd081d985d5b1d60ba1b604482015260640162000218565b60035460ff16156200063d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000218565b565b80516001600160a01b03811681146200065757600080fd5b919050565b6000806000606084860312156200067257600080fd5b6200067d846200063f565b92506200068d602085016200063f565b91506200069d604085016200063f565b90509250925092565b600060208284031215620006b957600080fd5b815160ff81168114620004e857600080fd5b634e487b7160e01b600052604160045260246000fd5b60005b83811015620006fe578181015183820152602001620006e4565b50506000910152565b6000602082840312156200071a57600080fd5b81516001600160401b03808211156200073257600080fd5b818401915084601f8301126200074757600080fd5b8151818111156200075c576200075c620006cb565b604051601f8201601f19908116603f01168101908382118183101715620007875762000787620006cb565b81604052828152876020848701011115620007a157600080fd5b620007b4836020830160208801620006e1565b979650505050505050565b60008251620007d3818460208701620006e1565b9190910192915050565b600060208284031215620007f057600080fd5b5051919050565b6146e480620008076000396000f3fe6080604052600436106103a25760003560e01c80638da5cb5b116101e7578063c95ab4621161010d578063e6ccc9bd116100a0578063f5e00d761161006f578063f5e00d7614610bc2578063f9d83bb514610be2578063fb12a87614610bf5578063ffa1ad7414610c1557600080fd5b8063e6ccc9bd14610b2f578063ee7a116314610b4f578063f0346c4714610b65578063f2fde38b14610ba257600080fd5b8063d059e0a3116100dc578063d059e0a314610ad7578063d077fa5c14610aee578063d29b93a4146103a7578063d5edf45b14610b0e57600080fd5b8063c95ab46214610a4a578063ca3c80db14610a6a578063cd161d2e14610a8a578063ce2d29ac14610aaa57600080fd5b8063ab05868a11610185578063ae77c23711610154578063ae77c237146109cd578063af8ee37f146109e0578063b4cad1a714610a00578063be8380e014610a2a57600080fd5b8063ab05868a146108ef578063ab23e6fd14610973578063aba48a9314610993578063ae26c1b2146109b357600080fd5b8063a47a2e77116101c1578063a47a2e771461087a578063a4e644681461089a578063a790c0e2146108ba578063a968bf26146108cf57600080fd5b80638da5cb5b1461081257806396ac3649146108305780639f67dd091461085a57600080fd5b80635c975abb116102cc578063788e05431161026a5780638456cb59116102395780638456cb591461078a57806385535cc51461079f5780638a71bb2d146107bf5780638ce87646146107f257600080fd5b8063788e0543146106cc5780637ecb8b44146106ec5780637ff9f6141461074a578063813d2ad81461076a57600080fd5b80636684e9a0116102a65780636684e9a01461065757806368742da614610677578063715018a61461069757806371f4d38c146106ac57600080fd5b80635c975abb146105ff5780635e7785a6146106175780635ea829341461063757600080fd5b806322a2b1ed1161034457806342f176c71161031357806342f176c71461054d5780634564eb381461056d5780634f4385521461058d57806352ce28cf146105bc57600080fd5b806322a2b1ed146104955780633f4ba83a146104e05780633f8a7865146104f557806340bbee521461051557600080fd5b80631ad32562116103805780631ad32562146104135780631b0e3fab146104405780631bc8637e146104605780631fc097171461048057600080fd5b80630c999929146103a7578063188a840f146103d15780631a32de49146103f3575b600080fd5b3480156103b357600080fd5b506103be6201518081565b6040519081526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004613db5565b610c3c565b005b3480156103ff57600080fd5b506103f161040e366004613db5565b610cc4565b34801561041f57600080fd5b506103be61042e366004613db5565b60026020526000908152604090205481565b34801561044c57600080fd5b506103f161045b366004613db5565b610d1f565b34801561046c57600080fd5b506103f161047b366004613de2565b610d91565b34801561048c57600080fd5b506103f1610e07565b3480156104a157600080fd5b50600954600a546104bf9161ffff8082169262010000909204169083565b6040805161ffff9485168152939092166020840152908201526060016103c8565b3480156104ec57600080fd5b506103f1610e24565b34801561050157600080fd5b506103f1610510366004613db5565b610e41565b34801561052157600080fd5b50601254610535906001600160a01b031681565b6040516001600160a01b0390911681526020016103c8565b34801561055957600080fd5b506103f1610568366004613dff565b610f4c565b34801561057957600080fd5b506103f1610588366004613ed1565b611104565b34801561059957600080fd5b50600c546105ac90610100900460ff1681565b60405190151581526020016103c8565b3480156105c857600080fd5b506105dc6105d7366004613dff565b611347565b604080519384526001600160a01b039092166020840152908201526060016103c8565b34801561060b57600080fd5b5060035460ff166105ac565b34801561062357600080fd5b506103f1610632366004613db5565b6113bb565b34801561064357600080fd5b50601554610535906001600160a01b031681565b34801561066357600080fd5b50601454610535906001600160a01b031681565b34801561068357600080fd5b506103f1610692366004613db5565b611600565b3480156106a357600080fd5b506103f16116cb565b3480156106b857600080fd5b506103f16106c7366004613fb3565b611700565b3480156106d857600080fd5b50601354610535906001600160a01b031681565b3480156106f857600080fd5b5061070c610707366004613dff565b61191a565b6040516103c891908151151581526020808301516001600160a01b031690820152604080830151908201526060918201519181019190915260800190565b34801561075657600080fd5b506103f1610765366004613db5565b6119c2565b34801561077657600080fd5b506103f1610785366004613dff565b611a53565b34801561079657600080fd5b506103f1611aff565b3480156107ab57600080fd5b506103f16107ba366004613db5565b611b19565b3480156107cb57600080fd5b506003546107df90610100900461ffff1681565b60405161ffff90911681526020016103c8565b3480156107fe57600080fd5b506103f161080d366004613db5565b611c34565b34801561081e57600080fd5b506000546001600160a01b0316610535565b34801561083c57600080fd5b506005546006546104bf9161ffff8082169262010000909204169083565b34801561086657600080fd5b506103f1610875366004613feb565b611c8a565b34801561088657600080fd5b506103f1610895366004613db5565b611d4e565b3480156108a657600080fd5b506103f16108b53660046140d1565b611dde565b3480156108c657600080fd5b506103f1611e10565b3480156108db57600080fd5b506103f16108ea3660046140ec565b611e5e565b3480156108fb57600080fd5b5061094961090a366004614121565b601160209081526000928352604080842090915290825290208054600182015460029092015460ff8216926101009092046001600160a01b0316919084565b6040805194151585526001600160a01b0390931660208501529183015260608201526080016103c8565b34801561097f57600080fd5b506103f161098e36600461414d565b611f88565b34801561099f57600080fd5b506103f16109ae366004614197565b6120dd565b3480156109bf57600080fd5b50600c546105ac9060ff1681565b6103f16109db366004613dff565b612123565b3480156109ec57600080fd5b506103f16109fb366004613fb3565b61235a565b348015610a0c57600080fd5b506007546008546104bf9161ffff8082169262010000909204169083565b348015610a3657600080fd5b506103f1610a453660046140d1565b6124c8565b348015610a5657600080fd5b50600154610535906001600160a01b031681565b348015610a7657600080fd5b506103f1610a85366004613db5565b6125e1565b348015610a9657600080fd5b506103f1610aa5366004613db5565b612645565b348015610ab657600080fd5b506103be610ac5366004613db5565b600b6020526000908152604090205481565b348015610ae357600080fd5b506103be6203f48081565b348015610afa57600080fd5b506103f1610b09366004613db5565b612773565b348015610b1a57600080fd5b506001546105ac90600160a01b900460ff1681565b348015610b3b57600080fd5b506103f1610b4a366004613db5565b61279c565b348015610b5b57600080fd5b506103be60105481565b348015610b7157600080fd5b50610b95610b80366004613db5565b60046020526000908152604090205460ff1681565b6040516103c891906141df565b348015610bae57600080fd5b506103f1610bbd366004613db5565b6127f0565b348015610bce57600080fd5b506103f1610bdd366004613db5565b612866565b6103f1610bf0366004613dff565b61298d565b348015610c0157600080fd5b506105ac610c10366004613db5565b612c5d565b348015610c2157600080fd5b50610c2a600381565b60405160ff90911681526020016103c8565b610c44612c9c565b600c5460ff1615610cab5760405162461bcd60e51b815260206004820152602660248201527f496e697469616c207769746864726177206164647265737320616c726561647960448201526508185919195960d21b60648201526084015b60405180910390fd5b610cb481612cf6565b50600c805460ff19166001179055565b610ccc612c9c565b6001600160a01b0381166000818152600b602090815260409182902042905590519182527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da8991015b60405180910390a150565b610d27612d72565b610d2f612c9c565b610d3881612db8565b600c805462010000600160b01b031916620100006001600160a01b039384160217905542600d5560405190821681527f492248daa73d7944dee204e5f0b712242e10c4e48e492e94f627767fb27bec9390602001610d14565b610d99612d72565b610da1612c9c565b610bb88161ffff161115610de95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420526f79616c747960881b6044820152606401610ca2565b6003805461ffff9092166101000262ffff0019909216919091179055565b610e0f612d72565b610e17612c9c565b600c805461ff0019169055565b610e2c612c9c565b60035460ff1615610e3f57610e3f612e75565b565b610e49612d72565b610e51612c9c565b600c546001600160a01b03828116620100009092041614610ead5760405162461bcd60e51b81526020600482015260166024820152750bee6c2cccac4def040427a40dccaeea6c2cccac4def60531b6044820152606401610ca2565b6202a300600d5442610ebf919061420f565b11610ef55760405162461bcd60e51b8152600401610ca2906020808252600490820152631dd85a5d60e21b604082015260600190565b610efe81612db8565b601480546001600160a01b0319166001600160a01b0392831617905560405190821681527f091f872b99a289ff2eb82d5c9d093e605a598fc74f7973277917f8d99842e97d90602001610d14565b610f54612d72565b610f5d33612c5d565b610f795760405162461bcd60e51b8152600401610ca290614222565b610f81612ec7565b6000610f8d8383612f20565b6001600160a01b03831660009081526011602090815260408083208784529091529020909150610fc08160010154151590565b8015610fdd575080546001600160a01b0383811661010090920416145b8015610fef5750805460ff1615156001145b61102c5760405162461bcd60e51b815260206004820152600e60248201526d1cd85b19481b9bdd081d985b1a5960921b6044820152606401610ca2565b61103882858530612f98565b6110785760405162461bcd60e51b81526020600482015260116024820152701cd85b19481b9bdd08185c1c1c9bdd9959607a1b6044820152606401610ca2565b600181015461108785856130ab565b6014546110a09084906001600160a01b031687876130e9565b601454604080518781526001600160a01b0387811660208301529092168282015260608201839052517f7657ffe1f72297f8773cec737634d73ad5d98a421b9f15dc99f3b792278d13969181900360800190a15050506111006001601655565b5050565b61110c612d72565b61111533612c5d565b6111315760405162461bcd60e51b8152600401610ca290614222565b611139612ec7565b60005b815181101561133957600082828151811061115957611159614251565b6020026020010151600001519050600083838151811061117b5761117b614251565b6020026020010151602001519050600084848151811061119d5761119d614251565b602002602001015160400151905060008585815181106111bf576111bf614251565b602002602001015160600151905060006111d98486612f20565b90506000806111e9868887613161565b91509150831561126657601454604051630608be6d60e11b81526001600160a01b03898116600483015260248201899052848116604483015290911690630c117cda90606401600060405180830381600087803b15801561124957600080fd5b505af115801561125d573d6000803e3d6000fd5b505050506112d8565b60155460405163d2180e6160e01b8152600481018890526001600160a01b0389811660248301529091169063d2180e6190604401600060405180830381600087803b1580156112b457600080fd5b505af11580156112c8573d6000803e3d6000fd5b505050506112d88383888a6130e9565b7f1f742344121ee39367760387f62d61b3b3490773d72cd37a18fc135d27babfda86888784866000896000604051611317989796959493929190614267565b60405180910390a1505050505050508080611331906142ad565b91505061113c565b506113446001601655565b50565b6001600160a01b038116600090815260186020908152604080832085845290915281205481908190808203611387576000806000935093509350506113b4565b600081815260196020526040902080546001909101549194506001600160a01b0316925090506113b4565b505b9250925092565b6113c3612d72565b6000546001600160a01b03163314806113e657506001546001600160a01b031633145b6114025760405162461bcd60e51b8152600401610ca2906142c6565b600c5460ff6101009091041615156001146114445760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ca2565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b8152600401602060405180830381865afa158015611487573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ab91906142ec565b60ff166001146114ec5760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b6044820152606401610ca2565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401600060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115549190810190614397565b60405160200161156491906143cc565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b146115dc5760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b6044820152606401610ca2565b50601380546001600160a01b0319166001600160a01b039290921691909117905550565b61160933612c5d565b6116255760405162461bcd60e51b8152600401610ca290614222565b61162e81613280565b61167a5760405162461bcd60e51b815260206004820152601a60248201527f756e617070726f766564207769746864726177416464726573730000000000006044820152606401610ca2565b601054479060009061168c908361420f565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f193505050501580156116c5573d6000803e3d6000fd5b50505050565b6116d3612c9c565b60405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ca2565b611708612ec7565b6001600160a01b0382166000908152601860209081526040808320868452909152812054908190036117655760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610ca2565b8181146117a85760405162461bcd60e51b8152602060048201526011602482015270189a591259081b9bdd0818dd5c9c995b9d607a1b6044820152606401610ca2565b600081815260196020526040902080546001600160a01b03163314806117d257506117d233612c5d565b806117f757506117e28585612f20565b6001600160a01b0316336001600160a01b0316145b6118435760405162461bcd60e51b815260206004820152601960248201527f6d73672e73656e646572206e6f7420617574686f72697a6564000000000000006044820152606401610ca2565b80546001808301546001600160a01b0387811660009081526018602090815260408083208c845282528083208390558883526019909152812080546001600160a01b03191681559093019290925560105492909116338114926118a790839061420f565b6010556118b481836132f1565b604080518981526001600160a01b038916602082015290810186905283151560608201527ff6b89ca1bccc679695ae3b928ee8c9335ecdfd739853cfe9e209a13e40cfacc0906080015b60405180910390a150505050506119156001601655565b505050565b6040805160808101825260008082526020808301829052828401829052606083018290526001600160a01b038516825260118152838220868352905291909120600181015461197b5760405162461bcd60e51b8152600401610ca2906143e8565b60408051608081018252825460ff81161515825261010090046001600160a01b03166020820152600183015491810191909152600290910154606082015290505b92915050565b6000546001600160a01b03163314806119e557506001546001600160a01b031633145b611a015760405162461bcd60e51b8152600401610ca2906142c6565b6001600160a01b03811660008181526002602090815260408083208390558051938452908301919091527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b6001600160a01b038116600090815260116020908152604080832085845290915290206001810154611a975760405162461bcd60e51b8152600401610ca2906143e8565b805461010090046001600160a01b03163314611af55760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f7420746f6b656e206f776e6572000000000000006044820152606401610ca2565b611915838361340f565b611b07612c9c565b60035460ff16610e3f57610e3f613457565b611b21612c9c565b6000611b2c82613494565b6015549091506001600160a01b031615611bda57600e546001600160a01b03838116911614611b925760405162461bcd60e51b815260206004820152601260248201527117dd985d5b1d08084f481b995dd5985d5b1d60721b6044820152606401610ca2565b6202a300600f5442611ba4919061420f565b11611bda5760405162461bcd60e51b8152600401610ca2906020808252600490820152631dd85a5d60e21b604082015260600190565b601580546001600160a01b0319166001600160a01b038381169190911790915560405190831681527f55c500d9f010bcb210d8664f602eb160ce8aee716a68ea710302305830e45233906020015b60405180910390a15050565b611c3c612c9c565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527ffbd1c2e6a1f767e08b9689ca3ce8ca1e7b60fbb71734bfc34f39f5bcb846cf3090602001610d14565b611c9333612c5d565b611caf5760405162461bcd60e51b8152600401610ca290614222565b60005b81518163ffffffff161015611100576000828263ffffffff1681518110611cdb57611cdb614251565b60209081029190910181015160608101516001600160a01b031660009081526011835260408082208351835290935291909120909150611d1e8160010154151590565b1515600103611d3957611d398260000151836060015161340f565b50508080611d4690614409565b915050611cb2565b6000546001600160a01b0316331480611d7157506001546001600160a01b031633145b611d8d5760405162461bcd60e51b8152600401610ca2906142c6565b60018054600160a01b900460ff16151514611dd55760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b6044820152606401610ca2565b61134481613593565b611de6612d72565b611dee612c9c565b6000611df982613642565b805463ffff00001916815560006001909101555050565b6000546001600160a01b0316331480611e3357506001546001600160a01b031633145b611e4f5760405162461bcd60e51b8152600401610ca2906142c6565b6001805460ff60a01b19169055565b611e66612d72565b611e6e612c9c565b60008261ffff16118015611e8857506127108261ffff1611155b611ec95760405162461bcd60e51b8152602060048201526012602482015271496e76616c69642070657263656e7461676560701b6044820152606401610ca2565b6000611ed482613642565b805490915062010000900461ffff1615611f2a5760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610ca2565b805463ffff000019166201000061ffff8516021781554260018201556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe590611f7b908490869060009061442c565b60405180910390a1505050565b611f90612d72565b6000611f9c8585613690565b905060008311611fda5760405162461bcd60e51b815260206004820152600960248201526807072696365203e20360bc1b6044820152606401610ca2565b6000611fe782878761373c565b6040805160808101825285151581526001600160a01b0380861660208084019182528385018a8152606085018781528c85166000908152601184528781208f82529093529186902085518154945190951661010002610100600160a81b0319951515959095166001600160a81b0319909416939093179390931782559151600182015590516002909101559051919250907f6852391c228e56409f2046f8f5b68af9ab60392697a47efa0910cf05cfbcae42906120cc908990899088908a909384526001600160a01b0392909216602084015215156040830152606082015260800190565b60405180910390a150505050505050565b6120e5612c9c565b6001600160a01b0382166000908152600460205260409020805482919060ff1916600183600281111561211a5761211a6141c9565b02179055505050565b61212b612d72565b612133612ec7565b6000341161216f5760405162461bcd60e51b81526020600482015260096024820152686d73672e76616c756560b81b6044820152606401610ca2565b6001600160a01b0381166000908152601160209081526040808320858452909152902060018101546121b35760405162461bcd60e51b8152600401610ca2906143e8565b8054600182015460028301546101009092046001600160a01b03169160006121db8787612f20565b9050806001600160a01b0316846001600160a01b0316146122335760405162461bcd60e51b815260206004820152601260248201527139b2b63632b910109e903a37b5a7bbb732b960711b6044820152606401610ca2565b61223f84888830612f98565b61228b5760405162461bcd60e51b815260206004820152601960248201527f73616c65636f6e7472616374206e6f7420617070726f766564000000000000006044820152606401610ca2565b61229787878734613918565b506122a4843389896130e9565b60006122af8761397c565b15156001036122d05782156122cb576122c884846139b4565b90505b6122dd565b6122da84846139b4565b90505b80156122ed576122ed85826132f1565b604080518981526001600160a01b0389811660208301523382840152871660608201526080810183905260a0810186905290517f60364304ae1fda694c3be5cac0f507f6fcd2144b5d26870e8a26f7ac17df83bf9181900360c00190a15050505050506111006001601655565b612362612d72565b61236a612ec7565b60006123768484612f20565b9050336001600160a01b038216146123c75760405162461bcd60e51b815260206004820152601460248201527336b9b39739b2b73232b910109e9039b2b63632b960611b6044820152606401610ca2565b6123d333858530612f98565b6124155760405162461bcd60e51b8152602060048201526013602482015272617070726f76652f416c6c206d697373696e6760681b6044820152606401610ca2565b600080612423868686613161565b91509150612433838388886130e9565b600061244084888861373c565b9050600061244d8761397c565b151560010361246e5781156124695761246683836139b4565b90505b61247b565b61247883836139b4565b90505b801561248b5761248b85826132f1565b7f1f742344121ee39367760387f62d61b3b3490773d72cd37a18fc135d27babfda88888886888a8b886040516118fe989796959493929190614267565b6124d0612d72565b6124d8612c9c565b60006124e382613642565b805490915062010000900461ffff166125385760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610ca2565b6203f48081600101544261254c919061420f565b1161258d5760405162461bcd60e51b81526020600482015260116024820152701d5b99195c881dd85a5d081c195c9a5bd9607a1b6044820152606401610ca2565b805462010000810461ffff1663ffffffff199091168117825560006001808401919091556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe592611c2892869261442c565b6125e9612c9c565b6125f281613494565b50600e80546001600160a01b0319166001600160a01b03831690811790915542600f556040519081527f66ea39118110b77bdc70c8b8c6c494af2a13414c01a51c05678c67e53c70418990602001610d14565b6000546001600160a01b031633148061266857506001546001600160a01b031633145b6126845760405162461bcd60e51b8152600401610ca2906142c6565b6001600160a01b0381166126cb5760405162461bcd60e51b815260206004820152600e60248201526d0c6c2dce840e6cae840e8de4060f60931b6044820152606401610ca2565b6001600160a01b038116600090815260026020526040902054156127215760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481859191959609a1b6044820152606401610ca2565b6001600160a01b03811660008181526002602090815260409182902042905581519283526001908301527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b61277b612c9c565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6127a4612c9c565b6001600160a01b0381166000818152600b602090815260408083209290925590519182527fffdbac6a703f8c063588b1b434bac15231b40f4c20b16f797a989d47a56ae8b29101610d14565b6127f8612c9c565b6001600160a01b03811661285d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ca2565b611344816139d7565b61286e612c9c565b6012546001600160a01b0316156128b55760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610ca2565b6000819050806001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291c919061445a565b6f36b83830bcb6b2b73a39b13ab33332b960811b1461296a5760405162461bcd60e51b815260206004820152600a6024820152693737ba10313ab33332b960b11b6044820152606401610ca2565b601280546001600160a01b0319166001600160a01b039290921691909117905550565b612995612d72565b61299d612ec7565b34806129dc5760405162461bcd60e51b815260206004820152600e60248201526d73656e64206d73672e76616c756560901b6044820152606401610ca2565b6000826040516331a9108f60e11b8152600481018690529091506000906001600160a01b03831690636352211e90602401602060405180830381865afa158015612a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4e9190614473565b6001600160a01b031603612a925760405162461bcd60e51b815260206004820152600b60248201526a1a5b9d881d1bdad95b925960aa1b6044820152606401610ca2565b6001600160a01b03831660009081526018602090815260408083208784529091529020548015612b8057600081815260196020526040902060018101548411612b0d5760405162461bcd60e51b815260206004820152600d60248201526c0f0818dd5c9c995b9d08189a59609a1b6044820152606401610ca2565b80546001808301546001600160a01b0388811660009081526018602090815260408083208d845282528083208390558883526019909152812080546001600160a01b031916815590930192909255601054919092169190612b6f90829061420f565b601055612b7c82826132f1565b5050505b6000612b8a613a27565b6040805180820182523381526020808201888152600085815260198352848120935184546001600160a01b0319166001600160a01b03918216178555915160019094019390935589168252601881528282208a8352905220819055601054909150612bf6908590614490565b601055604080518781526001600160a01b0387166020820152908101829052606081018590523360808201527f9525a453a215f02f1c5afee7ab8628c140dfa606cd034605e34b8850f2f6ef209060a00160405180910390a1505050506111006001601655565b6001600160a01b038116600090815260026020526040812054808203612c865750600092915050565b62015180612c94824261420f565b119392505050565b6000546001600160a01b03163314610e3f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b612cfe612c9c565b6001600160a01b03811615611344576001612d1c620151804261420f565b612d26919061420f565b6001600160a01b0382166000818152600b602090815260409182902093909355519081527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da899101610d14565b60035460ff1615610e3f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ca2565b600080660e6c2ccca84def60cb1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e33919061445a565b14612e6e5760405162461bcd60e51b815260206004820152600b60248201526a0dcdee840e6c2cccac4def60ab1b6044820152606401610ca2565b9392505050565b612e7d613a3e565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260165403612f195760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca2565b6002601655565b600080826040516331a9108f60e11b8152600481018690529091506001600160a01b03821690636352211e90602401602060405180830381865afa158015612f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f909190614473565b949350505050565b6000826001600160a01b038681169084161480613022575060405163e985e9c560e01b81526001600160a01b038781166004830152848116602483015282169063e985e9c590604401602060405180830381865afa158015612ffe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302291906144a3565b806130a1575060405163020604bf60e21b8152600481018690526001600160a01b03808516919083169063081812fc90602401602060405180830381865afa158015613072573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130969190614473565b6001600160a01b0316145b9695505050505050565b6001600160a01b0316600090815260116020908152604080832093835292905290812080546001600160a81b03191681556001810182905560020155565b600081604051632142170760e11b81526001600160a01b038781166004830152868116602483015260448201869052919250908216906342842e0e90606401600060405180830381600087803b15801561314257600080fd5b505af1158015613156573d6000803e3d6000fd5b505050505050505050565b6001600160a01b038216600090815260186020908152604080832086845290915281205481908082036131bf5760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610ca2565b8381146132025760405162461bcd60e51b8152602060048201526011602482015270189a591259081b9bdd0818dd5c9c995b9d607a1b6044820152606401610ca2565b600081815260196020818152604080842080546001820180546001600160a01b038d81168952601887528589208f8a5287529488208890558888529590945281546001600160a01b031916825594909255601054931695509093509061326990849061420f565b6010556132768787613a87565b5050935093915050565b6001600160a01b0381166000908152600b602052604081205480612c865760405162461bcd60e51b815260206004820152602260248201527f77697468647261772061646472657373206973206e6f74207265676973746572604482015261195960f21b6064820152608401610ca2565b6000826001600160a01b03168261138890604051600060405180830381858888f193505050503d8060008114613343576040519150601f19603f3d011682016040523d82523d6000602084013e613348565b606091505b5050905080611915576012546001600160a01b03166133a95760405162461bcd60e51b815260206004820152601e60248201527f7061796d656e74496e746572666163652073686f756c642062652073657400006044820152606401610ca2565b601254604051630a3b0a4f60e01b81526001600160a01b03858116600483015290911690630a3b0a4f9084906024016000604051808303818588803b1580156133f157600080fd5b505af1158015613405573d6000803e3d6000fd5b5050505050505050565b61341982826130ab565b604080518381526001600160a01b03831660208201527fa50b2d6faf84e88de164f615bc8daa8477ab67f677d72aef3a3122d26c6eae289101611c28565b61345f612d72565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612eaa3390565b60006001600160a01b0382166134e05760405162461bcd60e51b81526020600482015260116024820152700ecc2ead8e840c6c2dc4ee840c4ca4060f607b1b6044820152606401610ca2565b6000661b5c1d985d5b1d60ca1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015613536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355a919061445a565b14612e6e5760405162461bcd60e51b81526020600482015260096024820152681b9bdd081d985d5b1d60ba1b6044820152606401610ca2565b6001600160a01b0381166135d35760405162461bcd60e51b81526020600482015260076024820152666164647228302960c81b6044820152606401610ca2565b60016135e2620151804261420f565b6135ec919061420f565b6001600160a01b0382166000818152600260209081526040918290209390935580519182526001928201929092527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b6000806001836003811115613659576136596141c9565b03613666575060056119bc565b600283600381111561367a5761367a6141c9565b03613687575060076119bc565b50600992915050565b60008061369d8484612f20565b9050336001600160a01b038216146136ee5760405162461bcd60e51b815260206004820152601460248201527336b9b39739b2b73232b910109e9039b2b63632b960611b6044820152606401610ca2565b6136fa33858530612f98565b612e6e5760405162461bcd60e51b8152602060048201526013602482015272617070726f76652f416c6c206d697373696e6760681b6044820152606401610ca2565b60006137478261397c565b1515600003613805576013546040516305fa22e960e11b8152600481018590526001600160a01b0384811660248301526000928392911690630bf445d2906044016040805180830381865afa1580156137a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c891906144c0565b909250905060006137d982846144ef565b61ffff16116137ee5760095461ffff166137f8565b6137f881836144ef565b61ffff1692505050612e6e565b60006138118484613abe565b905060008060006138228487613c21565b9250925092506000886001600160a01b0316846001600160a01b0316036138f3578215156001036138555750600061390c565b6013546040516310cae44560e31b8152600481018790526001600160a01b0389811660248301526000921690638657222890604401602060405180830381865afa1580156138a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cb919061450a565b905060008161ffff16116138e55760055461ffff166138e7565b805b61ffff1691505061390c565b60075461390590839061ffff166144ef565b61ffff1690505b98975050505050505050565b60018201546000908083101561395a5760405162461bcd60e51b81526020600482015260076024820152663c20707269636560c81b6044820152606401610ca2565b61396486866130ab565b6000613970828561420f565b90505095945050505050565b6000806001600160a01b03831660009081526004602052604090205460ff1660028111156139ac576139ac6141c9565b141592915050565b60006127106139c3838261420f565b6139cd9085614527565b612e6e9190614546565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000613a37601780546001019055565b5060175490565b60035460ff16610e3f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ca2565b6001600160a01b0381166000908152601160209081526040808320858452909152902060018101541561191557611915838361340f565b6001600160a01b03811660009081526004602052604081205460ff166001816002811115613aee57613aee6141c9565b03613b6957604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf90602401606060405180830381865afa158015613b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b5e919061457c565b9450613c1a92505050565b6002816002811115613b7d57613b7d6141c9565b03613bf657604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf906024016040805180830381865afa158015613bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bec91906145b1565b9350613c1a915050565b604051637330680360e01b81526001600160a01b0384166004820152602401610ca2565b5092915050565b6001600160a01b0381166000908152600460205260408120548190819060ff166001816002811115613c5557613c556141c9565b03613cea576040516355df427560e01b81526004810187905285906001600160a01b038216906355df427590602401600060405180830381865afa158015613ca1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613cc991908101906145dd565b5060035490995060009850610100900461ffff1696506113b2945050505050565b6002816002811115613cfe57613cfe6141c9565b03613d7c57604051631e330caf60e21b81526004810187905285906001600160a01b038216906378cc32bc90602401606060405180830381865afa158015613d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6e9190614661565b919650945092506113b29050565b604051637330680360e01b81526001600160a01b0386166004820152602401610ca2565b6001600160a01b038116811461134457600080fd5b600060208284031215613dc757600080fd5b8135612e6e81613da0565b61ffff8116811461134457600080fd5b600060208284031215613df457600080fd5b8135612e6e81613dd2565b60008060408385031215613e1257600080fd5b823591506020830135613e2481613da0565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613e6857613e68613e2f565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613e9757613e97613e2f565b604052919050565b600067ffffffffffffffff821115613eb957613eb9613e2f565b5060051b60200190565b801515811461134457600080fd5b60006020808385031215613ee457600080fd5b823567ffffffffffffffff811115613efb57600080fd5b8301601f81018513613f0c57600080fd5b8035613f1f613f1a82613e9f565b613e6e565b81815260079190911b82018301908381019087831115613f3e57600080fd5b928401925b82841015613fa85760808489031215613f5c5760008081fd5b613f64613e45565b8435613f6f81613da0565b8152848601358682015260408086013590820152606080860135613f9281613ec3565b9082015282526080939093019290840190613f43565b979650505050505050565b600080600060608486031215613fc857600080fd5b833592506020840135613fda81613da0565b929592945050506040919091013590565b60006020808385031215613ffe57600080fd5b823567ffffffffffffffff81111561401557600080fd5b8301601f8101851361402657600080fd5b8035614034613f1a82613e9f565b81815260079190911b8201830190838101908783111561405357600080fd5b928401925b82841015613fa857608084890312156140715760008081fd5b614079613e45565b84358152858501358682015260408086013561409481613ec3565b908201526060858101356140a781613da0565b9082015282526080939093019290840190614058565b8035600481106140cc57600080fd5b919050565b6000602082840312156140e357600080fd5b612e6e826140bd565b600080604083850312156140ff57600080fd5b823561410a81613dd2565b9150614118602084016140bd565b90509250929050565b6000806040838503121561413457600080fd5b823561413f81613da0565b946020939093013593505050565b6000806000806080858703121561416357600080fd5b84359350602085013561417581613da0565b925060408501359150606085013561418c81613ec3565b939692955090935050565b600080604083850312156141aa57600080fd5b82356141b581613da0565b9150602083013560038110613e2457600080fd5b634e487b7160e01b600052602160045260246000fd5b60208101600383106141f3576141f36141c9565b91905290565b634e487b7160e01b600052601160045260246000fd5b818103818111156119bc576119bc6141f9565b6020808252601590820152743ab730baba3437b934bd32b21027a127903ab9b2b960591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b9788526001600160a01b039687166020890152604088019590955260608701939093529084166080860152831660a085015290911660c083015260e08201526101000190565b6000600182016142bf576142bf6141f9565b5060010190565b6020808252600c908201526b3737ba1037b137a0b236b4b760a11b604082015260600190565b6000602082840312156142fe57600080fd5b815160ff81168114612e6e57600080fd5b60005b8381101561432a578181015183820152602001614312565b50506000910152565b600082601f83011261434457600080fd5b815167ffffffffffffffff81111561435e5761435e613e2f565b614371601f8201601f1916602001613e6e565b81815284602083860101111561438657600080fd5b612f9082602083016020870161430f565b6000602082840312156143a957600080fd5b815167ffffffffffffffff8111156143c057600080fd5b612f9084828501614333565b600082516143de81846020870161430f565b9190910192915050565b6020808252600790820152666e6f2073616c6560c81b604082015260600190565b600063ffffffff808316818103614422576144226141f9565b6001019392505050565b6060810160048510614440576144406141c9565b93815261ffff929092166020830152151560409091015290565b60006020828403121561446c57600080fd5b5051919050565b60006020828403121561448557600080fd5b8151612e6e81613da0565b808201808211156119bc576119bc6141f9565b6000602082840312156144b557600080fd5b8151612e6e81613ec3565b600080604083850312156144d357600080fd5b82516144de81613dd2565b6020840151909250613e2481613dd2565b61ffff818116838216019080821115613c1a57613c1a6141f9565b60006020828403121561451c57600080fd5b8151612e6e81613dd2565b6000816000190483118215151615614541576145416141f9565b500290565b60008261456357634e487b7160e01b600052601260045260246000fd5b500490565b805163ffffffff811681146140cc57600080fd5b60008060006060848603121561459157600080fd5b835192506145a160208501614568565b9150604084015190509250925092565b600080604083850312156145c457600080fd5b6145cd83614568565b9150602083015190509250929050565b60008060008060008060c087890312156145f657600080fd5b8651955061460660208801614568565b945061461460408801614568565b935060608701519250608087015161462b81613da0565b60a088015190925067ffffffffffffffff81111561464857600080fd5b61465489828a01614333565b9150509295509295509295565b60008060006060848603121561467657600080fd5b835161468181613da0565b602085015190935061469281613ec3565b60408501519092506146a381613dd2565b80915050925092509256fea2646970667358221220d7c38cbad5ad17b49ea6948f1562d9edb92c34b863a5a6774ff9592c3b4a106664736f6c63430008100033000000000000000000000000913add08c2791fa3fff4b95e94bf9054d3ee4052000000000000000000000000035da52e7aa085f7e71764c0c8a1ce6690e3dfef000000000000000000000000b7bc86cb0183af5853274ae4e20d36de387c4a64
Deployed Bytecode
0x6080604052600436106103a25760003560e01c80638da5cb5b116101e7578063c95ab4621161010d578063e6ccc9bd116100a0578063f5e00d761161006f578063f5e00d7614610bc2578063f9d83bb514610be2578063fb12a87614610bf5578063ffa1ad7414610c1557600080fd5b8063e6ccc9bd14610b2f578063ee7a116314610b4f578063f0346c4714610b65578063f2fde38b14610ba257600080fd5b8063d059e0a3116100dc578063d059e0a314610ad7578063d077fa5c14610aee578063d29b93a4146103a7578063d5edf45b14610b0e57600080fd5b8063c95ab46214610a4a578063ca3c80db14610a6a578063cd161d2e14610a8a578063ce2d29ac14610aaa57600080fd5b8063ab05868a11610185578063ae77c23711610154578063ae77c237146109cd578063af8ee37f146109e0578063b4cad1a714610a00578063be8380e014610a2a57600080fd5b8063ab05868a146108ef578063ab23e6fd14610973578063aba48a9314610993578063ae26c1b2146109b357600080fd5b8063a47a2e77116101c1578063a47a2e771461087a578063a4e644681461089a578063a790c0e2146108ba578063a968bf26146108cf57600080fd5b80638da5cb5b1461081257806396ac3649146108305780639f67dd091461085a57600080fd5b80635c975abb116102cc578063788e05431161026a5780638456cb59116102395780638456cb591461078a57806385535cc51461079f5780638a71bb2d146107bf5780638ce87646146107f257600080fd5b8063788e0543146106cc5780637ecb8b44146106ec5780637ff9f6141461074a578063813d2ad81461076a57600080fd5b80636684e9a0116102a65780636684e9a01461065757806368742da614610677578063715018a61461069757806371f4d38c146106ac57600080fd5b80635c975abb146105ff5780635e7785a6146106175780635ea829341461063757600080fd5b806322a2b1ed1161034457806342f176c71161031357806342f176c71461054d5780634564eb381461056d5780634f4385521461058d57806352ce28cf146105bc57600080fd5b806322a2b1ed146104955780633f4ba83a146104e05780633f8a7865146104f557806340bbee521461051557600080fd5b80631ad32562116103805780631ad32562146104135780631b0e3fab146104405780631bc8637e146104605780631fc097171461048057600080fd5b80630c999929146103a7578063188a840f146103d15780631a32de49146103f3575b600080fd5b3480156103b357600080fd5b506103be6201518081565b6040519081526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004613db5565b610c3c565b005b3480156103ff57600080fd5b506103f161040e366004613db5565b610cc4565b34801561041f57600080fd5b506103be61042e366004613db5565b60026020526000908152604090205481565b34801561044c57600080fd5b506103f161045b366004613db5565b610d1f565b34801561046c57600080fd5b506103f161047b366004613de2565b610d91565b34801561048c57600080fd5b506103f1610e07565b3480156104a157600080fd5b50600954600a546104bf9161ffff8082169262010000909204169083565b6040805161ffff9485168152939092166020840152908201526060016103c8565b3480156104ec57600080fd5b506103f1610e24565b34801561050157600080fd5b506103f1610510366004613db5565b610e41565b34801561052157600080fd5b50601254610535906001600160a01b031681565b6040516001600160a01b0390911681526020016103c8565b34801561055957600080fd5b506103f1610568366004613dff565b610f4c565b34801561057957600080fd5b506103f1610588366004613ed1565b611104565b34801561059957600080fd5b50600c546105ac90610100900460ff1681565b60405190151581526020016103c8565b3480156105c857600080fd5b506105dc6105d7366004613dff565b611347565b604080519384526001600160a01b039092166020840152908201526060016103c8565b34801561060b57600080fd5b5060035460ff166105ac565b34801561062357600080fd5b506103f1610632366004613db5565b6113bb565b34801561064357600080fd5b50601554610535906001600160a01b031681565b34801561066357600080fd5b50601454610535906001600160a01b031681565b34801561068357600080fd5b506103f1610692366004613db5565b611600565b3480156106a357600080fd5b506103f16116cb565b3480156106b857600080fd5b506103f16106c7366004613fb3565b611700565b3480156106d857600080fd5b50601354610535906001600160a01b031681565b3480156106f857600080fd5b5061070c610707366004613dff565b61191a565b6040516103c891908151151581526020808301516001600160a01b031690820152604080830151908201526060918201519181019190915260800190565b34801561075657600080fd5b506103f1610765366004613db5565b6119c2565b34801561077657600080fd5b506103f1610785366004613dff565b611a53565b34801561079657600080fd5b506103f1611aff565b3480156107ab57600080fd5b506103f16107ba366004613db5565b611b19565b3480156107cb57600080fd5b506003546107df90610100900461ffff1681565b60405161ffff90911681526020016103c8565b3480156107fe57600080fd5b506103f161080d366004613db5565b611c34565b34801561081e57600080fd5b506000546001600160a01b0316610535565b34801561083c57600080fd5b506005546006546104bf9161ffff8082169262010000909204169083565b34801561086657600080fd5b506103f1610875366004613feb565b611c8a565b34801561088657600080fd5b506103f1610895366004613db5565b611d4e565b3480156108a657600080fd5b506103f16108b53660046140d1565b611dde565b3480156108c657600080fd5b506103f1611e10565b3480156108db57600080fd5b506103f16108ea3660046140ec565b611e5e565b3480156108fb57600080fd5b5061094961090a366004614121565b601160209081526000928352604080842090915290825290208054600182015460029092015460ff8216926101009092046001600160a01b0316919084565b6040805194151585526001600160a01b0390931660208501529183015260608201526080016103c8565b34801561097f57600080fd5b506103f161098e36600461414d565b611f88565b34801561099f57600080fd5b506103f16109ae366004614197565b6120dd565b3480156109bf57600080fd5b50600c546105ac9060ff1681565b6103f16109db366004613dff565b612123565b3480156109ec57600080fd5b506103f16109fb366004613fb3565b61235a565b348015610a0c57600080fd5b506007546008546104bf9161ffff8082169262010000909204169083565b348015610a3657600080fd5b506103f1610a453660046140d1565b6124c8565b348015610a5657600080fd5b50600154610535906001600160a01b031681565b348015610a7657600080fd5b506103f1610a85366004613db5565b6125e1565b348015610a9657600080fd5b506103f1610aa5366004613db5565b612645565b348015610ab657600080fd5b506103be610ac5366004613db5565b600b6020526000908152604090205481565b348015610ae357600080fd5b506103be6203f48081565b348015610afa57600080fd5b506103f1610b09366004613db5565b612773565b348015610b1a57600080fd5b506001546105ac90600160a01b900460ff1681565b348015610b3b57600080fd5b506103f1610b4a366004613db5565b61279c565b348015610b5b57600080fd5b506103be60105481565b348015610b7157600080fd5b50610b95610b80366004613db5565b60046020526000908152604090205460ff1681565b6040516103c891906141df565b348015610bae57600080fd5b506103f1610bbd366004613db5565b6127f0565b348015610bce57600080fd5b506103f1610bdd366004613db5565b612866565b6103f1610bf0366004613dff565b61298d565b348015610c0157600080fd5b506105ac610c10366004613db5565b612c5d565b348015610c2157600080fd5b50610c2a600381565b60405160ff90911681526020016103c8565b610c44612c9c565b600c5460ff1615610cab5760405162461bcd60e51b815260206004820152602660248201527f496e697469616c207769746864726177206164647265737320616c726561647960448201526508185919195960d21b60648201526084015b60405180910390fd5b610cb481612cf6565b50600c805460ff19166001179055565b610ccc612c9c565b6001600160a01b0381166000818152600b602090815260409182902042905590519182527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da8991015b60405180910390a150565b610d27612d72565b610d2f612c9c565b610d3881612db8565b600c805462010000600160b01b031916620100006001600160a01b039384160217905542600d5560405190821681527f492248daa73d7944dee204e5f0b712242e10c4e48e492e94f627767fb27bec9390602001610d14565b610d99612d72565b610da1612c9c565b610bb88161ffff161115610de95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420526f79616c747960881b6044820152606401610ca2565b6003805461ffff9092166101000262ffff0019909216919091179055565b610e0f612d72565b610e17612c9c565b600c805461ff0019169055565b610e2c612c9c565b60035460ff1615610e3f57610e3f612e75565b565b610e49612d72565b610e51612c9c565b600c546001600160a01b03828116620100009092041614610ead5760405162461bcd60e51b81526020600482015260166024820152750bee6c2cccac4def040427a40dccaeea6c2cccac4def60531b6044820152606401610ca2565b6202a300600d5442610ebf919061420f565b11610ef55760405162461bcd60e51b8152600401610ca2906020808252600490820152631dd85a5d60e21b604082015260600190565b610efe81612db8565b601480546001600160a01b0319166001600160a01b0392831617905560405190821681527f091f872b99a289ff2eb82d5c9d093e605a598fc74f7973277917f8d99842e97d90602001610d14565b610f54612d72565b610f5d33612c5d565b610f795760405162461bcd60e51b8152600401610ca290614222565b610f81612ec7565b6000610f8d8383612f20565b6001600160a01b03831660009081526011602090815260408083208784529091529020909150610fc08160010154151590565b8015610fdd575080546001600160a01b0383811661010090920416145b8015610fef5750805460ff1615156001145b61102c5760405162461bcd60e51b815260206004820152600e60248201526d1cd85b19481b9bdd081d985b1a5960921b6044820152606401610ca2565b61103882858530612f98565b6110785760405162461bcd60e51b81526020600482015260116024820152701cd85b19481b9bdd08185c1c1c9bdd9959607a1b6044820152606401610ca2565b600181015461108785856130ab565b6014546110a09084906001600160a01b031687876130e9565b601454604080518781526001600160a01b0387811660208301529092168282015260608201839052517f7657ffe1f72297f8773cec737634d73ad5d98a421b9f15dc99f3b792278d13969181900360800190a15050506111006001601655565b5050565b61110c612d72565b61111533612c5d565b6111315760405162461bcd60e51b8152600401610ca290614222565b611139612ec7565b60005b815181101561133957600082828151811061115957611159614251565b6020026020010151600001519050600083838151811061117b5761117b614251565b6020026020010151602001519050600084848151811061119d5761119d614251565b602002602001015160400151905060008585815181106111bf576111bf614251565b602002602001015160600151905060006111d98486612f20565b90506000806111e9868887613161565b91509150831561126657601454604051630608be6d60e11b81526001600160a01b03898116600483015260248201899052848116604483015290911690630c117cda90606401600060405180830381600087803b15801561124957600080fd5b505af115801561125d573d6000803e3d6000fd5b505050506112d8565b60155460405163d2180e6160e01b8152600481018890526001600160a01b0389811660248301529091169063d2180e6190604401600060405180830381600087803b1580156112b457600080fd5b505af11580156112c8573d6000803e3d6000fd5b505050506112d88383888a6130e9565b7f1f742344121ee39367760387f62d61b3b3490773d72cd37a18fc135d27babfda86888784866000896000604051611317989796959493929190614267565b60405180910390a1505050505050508080611331906142ad565b91505061113c565b506113446001601655565b50565b6001600160a01b038116600090815260186020908152604080832085845290915281205481908190808203611387576000806000935093509350506113b4565b600081815260196020526040902080546001909101549194506001600160a01b0316925090506113b4565b505b9250925092565b6113c3612d72565b6000546001600160a01b03163314806113e657506001546001600160a01b031633145b6114025760405162461bcd60e51b8152600401610ca2906142c6565b600c5460ff6101009091041615156001146114445760405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ca2565b6000819050806001600160a01b031663ffa1ad746040518163ffffffff1660e01b8152600401602060405180830381865afa158015611487573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ab91906142ec565b60ff166001146114ec5760405162461bcd60e51b815260206004820152600c60248201526b726f796c74792076213d203160a01b6044820152606401610ca2565b6000816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401600060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115549190810190614397565b60405160200161156491906143cc565b604051602081830303815290604052805190602001209050807fb590ff355bf2d720a7e957392d3b76fd1adda1832940640bf5d5a7c387fed32360001b146115dc5760405162461bcd60e51b815260206004820152600b60248201526a6e6f7420726f79616c747960a81b6044820152606401610ca2565b50601380546001600160a01b0319166001600160a01b039290921691909117905550565b61160933612c5d565b6116255760405162461bcd60e51b8152600401610ca290614222565b61162e81613280565b61167a5760405162461bcd60e51b815260206004820152601a60248201527f756e617070726f766564207769746864726177416464726573730000000000006044820152606401610ca2565b601054479060009061168c908361420f565b6040519091506001600160a01b0384169082156108fc029083906000818181858888f193505050501580156116c5573d6000803e3d6000fd5b50505050565b6116d3612c9c565b60405162461bcd60e51b81526020600482015260026024820152616e6f60f01b6044820152606401610ca2565b611708612ec7565b6001600160a01b0382166000908152601860209081526040808320868452909152812054908190036117655760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610ca2565b8181146117a85760405162461bcd60e51b8152602060048201526011602482015270189a591259081b9bdd0818dd5c9c995b9d607a1b6044820152606401610ca2565b600081815260196020526040902080546001600160a01b03163314806117d257506117d233612c5d565b806117f757506117e28585612f20565b6001600160a01b0316336001600160a01b0316145b6118435760405162461bcd60e51b815260206004820152601960248201527f6d73672e73656e646572206e6f7420617574686f72697a6564000000000000006044820152606401610ca2565b80546001808301546001600160a01b0387811660009081526018602090815260408083208c845282528083208390558883526019909152812080546001600160a01b03191681559093019290925560105492909116338114926118a790839061420f565b6010556118b481836132f1565b604080518981526001600160a01b038916602082015290810186905283151560608201527ff6b89ca1bccc679695ae3b928ee8c9335ecdfd739853cfe9e209a13e40cfacc0906080015b60405180910390a150505050506119156001601655565b505050565b6040805160808101825260008082526020808301829052828401829052606083018290526001600160a01b038516825260118152838220868352905291909120600181015461197b5760405162461bcd60e51b8152600401610ca2906143e8565b60408051608081018252825460ff81161515825261010090046001600160a01b03166020820152600183015491810191909152600290910154606082015290505b92915050565b6000546001600160a01b03163314806119e557506001546001600160a01b031633145b611a015760405162461bcd60e51b8152600401610ca2906142c6565b6001600160a01b03811660008181526002602090815260408083208390558051938452908301919091527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b6001600160a01b038116600090815260116020908152604080832085845290915290206001810154611a975760405162461bcd60e51b8152600401610ca2906143e8565b805461010090046001600160a01b03163314611af55760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206973206e6f7420746f6b656e206f776e6572000000000000006044820152606401610ca2565b611915838361340f565b611b07612c9c565b60035460ff16610e3f57610e3f613457565b611b21612c9c565b6000611b2c82613494565b6015549091506001600160a01b031615611bda57600e546001600160a01b03838116911614611b925760405162461bcd60e51b815260206004820152601260248201527117dd985d5b1d08084f481b995dd5985d5b1d60721b6044820152606401610ca2565b6202a300600f5442611ba4919061420f565b11611bda5760405162461bcd60e51b8152600401610ca2906020808252600490820152631dd85a5d60e21b604082015260600190565b601580546001600160a01b0319166001600160a01b038381169190911790915560405190831681527f55c500d9f010bcb210d8664f602eb160ce8aee716a68ea710302305830e45233906020015b60405180910390a15050565b611c3c612c9c565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527ffbd1c2e6a1f767e08b9689ca3ce8ca1e7b60fbb71734bfc34f39f5bcb846cf3090602001610d14565b611c9333612c5d565b611caf5760405162461bcd60e51b8152600401610ca290614222565b60005b81518163ffffffff161015611100576000828263ffffffff1681518110611cdb57611cdb614251565b60209081029190910181015160608101516001600160a01b031660009081526011835260408082208351835290935291909120909150611d1e8160010154151590565b1515600103611d3957611d398260000151836060015161340f565b50508080611d4690614409565b915050611cb2565b6000546001600160a01b0316331480611d7157506001546001600160a01b031633145b611d8d5760405162461bcd60e51b8152600401610ca2906142c6565b60018054600160a01b900460ff16151514611dd55760405162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b6044820152606401610ca2565b61134481613593565b611de6612d72565b611dee612c9c565b6000611df982613642565b805463ffff00001916815560006001909101555050565b6000546001600160a01b0316331480611e3357506001546001600160a01b031633145b611e4f5760405162461bcd60e51b8152600401610ca2906142c6565b6001805460ff60a01b19169055565b611e66612d72565b611e6e612c9c565b60008261ffff16118015611e8857506127108261ffff1611155b611ec95760405162461bcd60e51b8152602060048201526012602482015271496e76616c69642070657263656e7461676560701b6044820152606401610ca2565b6000611ed482613642565b805490915062010000900461ffff1615611f2a5760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610ca2565b805463ffff000019166201000061ffff8516021781554260018201556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe590611f7b908490869060009061442c565b60405180910390a1505050565b611f90612d72565b6000611f9c8585613690565b905060008311611fda5760405162461bcd60e51b815260206004820152600960248201526807072696365203e20360bc1b6044820152606401610ca2565b6000611fe782878761373c565b6040805160808101825285151581526001600160a01b0380861660208084019182528385018a8152606085018781528c85166000908152601184528781208f82529093529186902085518154945190951661010002610100600160a81b0319951515959095166001600160a81b0319909416939093179390931782559151600182015590516002909101559051919250907f6852391c228e56409f2046f8f5b68af9ab60392697a47efa0910cf05cfbcae42906120cc908990899088908a909384526001600160a01b0392909216602084015215156040830152606082015260800190565b60405180910390a150505050505050565b6120e5612c9c565b6001600160a01b0382166000908152600460205260409020805482919060ff1916600183600281111561211a5761211a6141c9565b02179055505050565b61212b612d72565b612133612ec7565b6000341161216f5760405162461bcd60e51b81526020600482015260096024820152686d73672e76616c756560b81b6044820152606401610ca2565b6001600160a01b0381166000908152601160209081526040808320858452909152902060018101546121b35760405162461bcd60e51b8152600401610ca2906143e8565b8054600182015460028301546101009092046001600160a01b03169160006121db8787612f20565b9050806001600160a01b0316846001600160a01b0316146122335760405162461bcd60e51b815260206004820152601260248201527139b2b63632b910109e903a37b5a7bbb732b960711b6044820152606401610ca2565b61223f84888830612f98565b61228b5760405162461bcd60e51b815260206004820152601960248201527f73616c65636f6e7472616374206e6f7420617070726f766564000000000000006044820152606401610ca2565b61229787878734613918565b506122a4843389896130e9565b60006122af8761397c565b15156001036122d05782156122cb576122c884846139b4565b90505b6122dd565b6122da84846139b4565b90505b80156122ed576122ed85826132f1565b604080518981526001600160a01b0389811660208301523382840152871660608201526080810183905260a0810186905290517f60364304ae1fda694c3be5cac0f507f6fcd2144b5d26870e8a26f7ac17df83bf9181900360c00190a15050505050506111006001601655565b612362612d72565b61236a612ec7565b60006123768484612f20565b9050336001600160a01b038216146123c75760405162461bcd60e51b815260206004820152601460248201527336b9b39739b2b73232b910109e9039b2b63632b960611b6044820152606401610ca2565b6123d333858530612f98565b6124155760405162461bcd60e51b8152602060048201526013602482015272617070726f76652f416c6c206d697373696e6760681b6044820152606401610ca2565b600080612423868686613161565b91509150612433838388886130e9565b600061244084888861373c565b9050600061244d8761397c565b151560010361246e5781156124695761246683836139b4565b90505b61247b565b61247883836139b4565b90505b801561248b5761248b85826132f1565b7f1f742344121ee39367760387f62d61b3b3490773d72cd37a18fc135d27babfda88888886888a8b886040516118fe989796959493929190614267565b6124d0612d72565b6124d8612c9c565b60006124e382613642565b805490915062010000900461ffff166125385760405162461bcd60e51b8152602060048201526017602482015276636f6d6d697373696f6e4368616e67652065786973747360481b6044820152606401610ca2565b6203f48081600101544261254c919061420f565b1161258d5760405162461bcd60e51b81526020600482015260116024820152701d5b99195c881dd85a5d081c195c9a5bd9607a1b6044820152606401610ca2565b805462010000810461ffff1663ffffffff199091168117825560006001808401919091556040517fca6183ddd99b1b82a45b16675dd3cb66678aa6ea3a7926c9668d04ebc867cbe592611c2892869261442c565b6125e9612c9c565b6125f281613494565b50600e80546001600160a01b0319166001600160a01b03831690811790915542600f556040519081527f66ea39118110b77bdc70c8b8c6c494af2a13414c01a51c05678c67e53c70418990602001610d14565b6000546001600160a01b031633148061266857506001546001600160a01b031633145b6126845760405162461bcd60e51b8152600401610ca2906142c6565b6001600160a01b0381166126cb5760405162461bcd60e51b815260206004820152600e60248201526d0c6c2dce840e6cae840e8de4060f60931b6044820152606401610ca2565b6001600160a01b038116600090815260026020526040902054156127215760405162461bcd60e51b815260206004820152600d60248201526c185b1c9958591e481859191959609a1b6044820152606401610ca2565b6001600160a01b03811660008181526002602090815260409182902042905581519283526001908301527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b61277b612c9c565b6001600160a01b03166000908152600460205260409020805460ff19169055565b6127a4612c9c565b6001600160a01b0381166000818152600b602090815260408083209290925590519182527fffdbac6a703f8c063588b1b434bac15231b40f4c20b16f797a989d47a56ae8b29101610d14565b6127f8612c9c565b6001600160a01b03811661285d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ca2565b611344816139d7565b61286e612c9c565b6012546001600160a01b0316156128b55760405162461bcd60e51b815260206004820152600b60248201526a185b1c9958591e481cd95d60aa1b6044820152606401610ca2565b6000819050806001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291c919061445a565b6f36b83830bcb6b2b73a39b13ab33332b960811b1461296a5760405162461bcd60e51b815260206004820152600a6024820152693737ba10313ab33332b960b11b6044820152606401610ca2565b601280546001600160a01b0319166001600160a01b039290921691909117905550565b612995612d72565b61299d612ec7565b34806129dc5760405162461bcd60e51b815260206004820152600e60248201526d73656e64206d73672e76616c756560901b6044820152606401610ca2565b6000826040516331a9108f60e11b8152600481018690529091506000906001600160a01b03831690636352211e90602401602060405180830381865afa158015612a2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a4e9190614473565b6001600160a01b031603612a925760405162461bcd60e51b815260206004820152600b60248201526a1a5b9d881d1bdad95b925960aa1b6044820152606401610ca2565b6001600160a01b03831660009081526018602090815260408083208784529091529020548015612b8057600081815260196020526040902060018101548411612b0d5760405162461bcd60e51b815260206004820152600d60248201526c0f0818dd5c9c995b9d08189a59609a1b6044820152606401610ca2565b80546001808301546001600160a01b0388811660009081526018602090815260408083208d845282528083208390558883526019909152812080546001600160a01b031916815590930192909255601054919092169190612b6f90829061420f565b601055612b7c82826132f1565b5050505b6000612b8a613a27565b6040805180820182523381526020808201888152600085815260198352848120935184546001600160a01b0319166001600160a01b03918216178555915160019094019390935589168252601881528282208a8352905220819055601054909150612bf6908590614490565b601055604080518781526001600160a01b0387166020820152908101829052606081018590523360808201527f9525a453a215f02f1c5afee7ab8628c140dfa606cd034605e34b8850f2f6ef209060a00160405180910390a1505050506111006001601655565b6001600160a01b038116600090815260026020526040812054808203612c865750600092915050565b62015180612c94824261420f565b119392505050565b6000546001600160a01b03163314610e3f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ca2565b612cfe612c9c565b6001600160a01b03811615611344576001612d1c620151804261420f565b612d26919061420f565b6001600160a01b0382166000818152600b602090815260409182902093909355519081527fd3d6d317b22983ab294dbfe93460137c732b9644d637bfbb3258735daf17da899101610d14565b60035460ff1615610e3f5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610ca2565b600080660e6c2ccca84def60cb1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e33919061445a565b14612e6e5760405162461bcd60e51b815260206004820152600b60248201526a0dcdee840e6c2cccac4def60ab1b6044820152606401610ca2565b9392505050565b612e7d613a3e565b6003805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260165403612f195760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ca2565b6002601655565b600080826040516331a9108f60e11b8152600481018690529091506001600160a01b03821690636352211e90602401602060405180830381865afa158015612f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f909190614473565b949350505050565b6000826001600160a01b038681169084161480613022575060405163e985e9c560e01b81526001600160a01b038781166004830152848116602483015282169063e985e9c590604401602060405180830381865afa158015612ffe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061302291906144a3565b806130a1575060405163020604bf60e21b8152600481018690526001600160a01b03808516919083169063081812fc90602401602060405180830381865afa158015613072573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130969190614473565b6001600160a01b0316145b9695505050505050565b6001600160a01b0316600090815260116020908152604080832093835292905290812080546001600160a81b03191681556001810182905560020155565b600081604051632142170760e11b81526001600160a01b038781166004830152868116602483015260448201869052919250908216906342842e0e90606401600060405180830381600087803b15801561314257600080fd5b505af1158015613156573d6000803e3d6000fd5b505050505050505050565b6001600160a01b038216600090815260186020908152604080832086845290915281205481908082036131bf5760405162461bcd60e51b8152602060048201526006602482015265139bc8189a5960d21b6044820152606401610ca2565b8381146132025760405162461bcd60e51b8152602060048201526011602482015270189a591259081b9bdd0818dd5c9c995b9d607a1b6044820152606401610ca2565b600081815260196020818152604080842080546001820180546001600160a01b038d81168952601887528589208f8a5287529488208890558888529590945281546001600160a01b031916825594909255601054931695509093509061326990849061420f565b6010556132768787613a87565b5050935093915050565b6001600160a01b0381166000908152600b602052604081205480612c865760405162461bcd60e51b815260206004820152602260248201527f77697468647261772061646472657373206973206e6f74207265676973746572604482015261195960f21b6064820152608401610ca2565b6000826001600160a01b03168261138890604051600060405180830381858888f193505050503d8060008114613343576040519150601f19603f3d011682016040523d82523d6000602084013e613348565b606091505b5050905080611915576012546001600160a01b03166133a95760405162461bcd60e51b815260206004820152601e60248201527f7061796d656e74496e746572666163652073686f756c642062652073657400006044820152606401610ca2565b601254604051630a3b0a4f60e01b81526001600160a01b03858116600483015290911690630a3b0a4f9084906024016000604051808303818588803b1580156133f157600080fd5b505af1158015613405573d6000803e3d6000fd5b5050505050505050565b61341982826130ab565b604080518381526001600160a01b03831660208201527fa50b2d6faf84e88de164f615bc8daa8477ab67f677d72aef3a3122d26c6eae289101611c28565b61345f612d72565b6003805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612eaa3390565b60006001600160a01b0382166134e05760405162461bcd60e51b81526020600482015260116024820152700ecc2ead8e840c6c2dc4ee840c4ca4060f607b1b6044820152606401610ca2565b6000661b5c1d985d5b1d60ca1b60001b9050600083905081816001600160a01b031663c20a03826040518163ffffffff1660e01b8152600401602060405180830381865afa158015613536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355a919061445a565b14612e6e5760405162461bcd60e51b81526020600482015260096024820152681b9bdd081d985d5b1d60ba1b6044820152606401610ca2565b6001600160a01b0381166135d35760405162461bcd60e51b81526020600482015260076024820152666164647228302960c81b6044820152606401610ca2565b60016135e2620151804261420f565b6135ec919061420f565b6001600160a01b0382166000818152600260209081526040918290209390935580519182526001928201929092527fe2e2dad866561a9926816384b10b4073c5e0e101b6c911e4936d22438bd63e9b9101610d14565b6000806001836003811115613659576136596141c9565b03613666575060056119bc565b600283600381111561367a5761367a6141c9565b03613687575060076119bc565b50600992915050565b60008061369d8484612f20565b9050336001600160a01b038216146136ee5760405162461bcd60e51b815260206004820152601460248201527336b9b39739b2b73232b910109e9039b2b63632b960611b6044820152606401610ca2565b6136fa33858530612f98565b612e6e5760405162461bcd60e51b8152602060048201526013602482015272617070726f76652f416c6c206d697373696e6760681b6044820152606401610ca2565b60006137478261397c565b1515600003613805576013546040516305fa22e960e11b8152600481018590526001600160a01b0384811660248301526000928392911690630bf445d2906044016040805180830381865afa1580156137a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137c891906144c0565b909250905060006137d982846144ef565b61ffff16116137ee5760095461ffff166137f8565b6137f881836144ef565b61ffff1692505050612e6e565b60006138118484613abe565b905060008060006138228487613c21565b9250925092506000886001600160a01b0316846001600160a01b0316036138f3578215156001036138555750600061390c565b6013546040516310cae44560e31b8152600481018790526001600160a01b0389811660248301526000921690638657222890604401602060405180830381865afa1580156138a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138cb919061450a565b905060008161ffff16116138e55760055461ffff166138e7565b805b61ffff1691505061390c565b60075461390590839061ffff166144ef565b61ffff1690505b98975050505050505050565b60018201546000908083101561395a5760405162461bcd60e51b81526020600482015260076024820152663c20707269636560c81b6044820152606401610ca2565b61396486866130ab565b6000613970828561420f565b90505095945050505050565b6000806001600160a01b03831660009081526004602052604090205460ff1660028111156139ac576139ac6141c9565b141592915050565b60006127106139c3838261420f565b6139cd9085614527565b612e6e9190614546565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000613a37601780546001019055565b5060175490565b60035460ff16610e3f5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610ca2565b6001600160a01b0381166000908152601160209081526040808320858452909152902060018101541561191557611915838361340f565b6001600160a01b03811660009081526004602052604081205460ff166001816002811115613aee57613aee6141c9565b03613b6957604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf90602401606060405180830381865afa158015613b3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b5e919061457c565b9450613c1a92505050565b6002816002811115613b7d57613b7d6141c9565b03613bf657604051638a603bdf60e01b81526004810185905283906001600160a01b03821690638a603bdf906024016040805180830381865afa158015613bc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bec91906145b1565b9350613c1a915050565b604051637330680360e01b81526001600160a01b0384166004820152602401610ca2565b5092915050565b6001600160a01b0381166000908152600460205260408120548190819060ff166001816002811115613c5557613c556141c9565b03613cea576040516355df427560e01b81526004810187905285906001600160a01b038216906355df427590602401600060405180830381865afa158015613ca1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613cc991908101906145dd565b5060035490995060009850610100900461ffff1696506113b2945050505050565b6002816002811115613cfe57613cfe6141c9565b03613d7c57604051631e330caf60e21b81526004810187905285906001600160a01b038216906378cc32bc90602401606060405180830381865afa158015613d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6e9190614661565b919650945092506113b29050565b604051637330680360e01b81526001600160a01b0386166004820152602401610ca2565b6001600160a01b038116811461134457600080fd5b600060208284031215613dc757600080fd5b8135612e6e81613da0565b61ffff8116811461134457600080fd5b600060208284031215613df457600080fd5b8135612e6e81613dd2565b60008060408385031215613e1257600080fd5b823591506020830135613e2481613da0565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff81118282101715613e6857613e68613e2f565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715613e9757613e97613e2f565b604052919050565b600067ffffffffffffffff821115613eb957613eb9613e2f565b5060051b60200190565b801515811461134457600080fd5b60006020808385031215613ee457600080fd5b823567ffffffffffffffff811115613efb57600080fd5b8301601f81018513613f0c57600080fd5b8035613f1f613f1a82613e9f565b613e6e565b81815260079190911b82018301908381019087831115613f3e57600080fd5b928401925b82841015613fa85760808489031215613f5c5760008081fd5b613f64613e45565b8435613f6f81613da0565b8152848601358682015260408086013590820152606080860135613f9281613ec3565b9082015282526080939093019290840190613f43565b979650505050505050565b600080600060608486031215613fc857600080fd5b833592506020840135613fda81613da0565b929592945050506040919091013590565b60006020808385031215613ffe57600080fd5b823567ffffffffffffffff81111561401557600080fd5b8301601f8101851361402657600080fd5b8035614034613f1a82613e9f565b81815260079190911b8201830190838101908783111561405357600080fd5b928401925b82841015613fa857608084890312156140715760008081fd5b614079613e45565b84358152858501358682015260408086013561409481613ec3565b908201526060858101356140a781613da0565b9082015282526080939093019290840190614058565b8035600481106140cc57600080fd5b919050565b6000602082840312156140e357600080fd5b612e6e826140bd565b600080604083850312156140ff57600080fd5b823561410a81613dd2565b9150614118602084016140bd565b90509250929050565b6000806040838503121561413457600080fd5b823561413f81613da0565b946020939093013593505050565b6000806000806080858703121561416357600080fd5b84359350602085013561417581613da0565b925060408501359150606085013561418c81613ec3565b939692955090935050565b600080604083850312156141aa57600080fd5b82356141b581613da0565b9150602083013560038110613e2457600080fd5b634e487b7160e01b600052602160045260246000fd5b60208101600383106141f3576141f36141c9565b91905290565b634e487b7160e01b600052601160045260246000fd5b818103818111156119bc576119bc6141f9565b6020808252601590820152743ab730baba3437b934bd32b21027a127903ab9b2b960591b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b9788526001600160a01b039687166020890152604088019590955260608701939093529084166080860152831660a085015290911660c083015260e08201526101000190565b6000600182016142bf576142bf6141f9565b5060010190565b6020808252600c908201526b3737ba1037b137a0b236b4b760a11b604082015260600190565b6000602082840312156142fe57600080fd5b815160ff81168114612e6e57600080fd5b60005b8381101561432a578181015183820152602001614312565b50506000910152565b600082601f83011261434457600080fd5b815167ffffffffffffffff81111561435e5761435e613e2f565b614371601f8201601f1916602001613e6e565b81815284602083860101111561438657600080fd5b612f9082602083016020870161430f565b6000602082840312156143a957600080fd5b815167ffffffffffffffff8111156143c057600080fd5b612f9084828501614333565b600082516143de81846020870161430f565b9190910192915050565b6020808252600790820152666e6f2073616c6560c81b604082015260600190565b600063ffffffff808316818103614422576144226141f9565b6001019392505050565b6060810160048510614440576144406141c9565b93815261ffff929092166020830152151560409091015290565b60006020828403121561446c57600080fd5b5051919050565b60006020828403121561448557600080fd5b8151612e6e81613da0565b808201808211156119bc576119bc6141f9565b6000602082840312156144b557600080fd5b8151612e6e81613ec3565b600080604083850312156144d357600080fd5b82516144de81613dd2565b6020840151909250613e2481613dd2565b61ffff818116838216019080821115613c1a57613c1a6141f9565b60006020828403121561451c57600080fd5b8151612e6e81613dd2565b6000816000190483118215151615614541576145416141f9565b500290565b60008261456357634e487b7160e01b600052601260045260246000fd5b500490565b805163ffffffff811681146140cc57600080fd5b60008060006060848603121561459157600080fd5b835192506145a160208501614568565b9150604084015190509250925092565b600080604083850312156145c457600080fd5b6145cd83614568565b9150602083015190509250929050565b60008060008060008060c087890312156145f657600080fd5b8651955061460660208801614568565b945061461460408801614568565b935060608701519250608087015161462b81613da0565b60a088015190925067ffffffffffffffff81111561464857600080fd5b61465489828a01614333565b9150509295509295509295565b60008060006060848603121561467657600080fd5b835161468181613da0565b602085015190935061469281613ec3565b60408501519092506146a381613dd2565b80915050925092509256fea2646970667358221220d7c38cbad5ad17b49ea6948f1562d9edb92c34b863a5a6774ff9592c3b4a106664736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000913add08c2791fa3fff4b95e94bf9054d3ee4052000000000000000000000000035da52e7aa085f7e71764c0c8a1ce6690e3dfef000000000000000000000000b7bc86cb0183af5853274ae4e20d36de387c4a64
-----Decoded View---------------
Arg [0] : _royaltyRegistryAddress (address): 0x913adD08c2791fa3FFf4b95E94bF9054D3ee4052
Arg [1] : _safebox (address): 0x035da52E7Aa085F7E71764C0c8a1Ce6690e3Dfef
Arg [2] : _vault (address): 0xB7bC86cB0183Af5853274ae4E20D36DE387c4A64
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000913add08c2791fa3fff4b95e94bf9054d3ee4052
Arg [1] : 000000000000000000000000035da52e7aa085f7e71764c0c8a1ce6690e3dfef
Arg [2] : 000000000000000000000000b7bc86cb0183af5853274ae4e20d36de387c4a64
Deployed Bytecode Sourcemap
47733:19894:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18979:53;;;;;;;;;;;;19026:6;18979:53;;;;;160:25:1;;;148:2;133:18;18979:53:0;;;;;;;;17985:373;;;;;;;;;;-1:-1:-1;17985:373:0;;;;;:::i;:::-;;:::i;:::-;;16781:238;;;;;;;;;;-1:-1:-1;16781:238:0;;;;;:::i;:::-;;:::i;19132:47::-;;;;;;;;;;-1:-1:-1;19132:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;35377:293;;;;;;;;;;-1:-1:-1;35377:293:0;;;;;:::i;:::-;;:::i;37028:327::-;;;;;;;;;;-1:-1:-1;37028:327:0;;;;;:::i;:::-;;:::i;38233:121::-;;;;;;;;;;;;;:::i;28074:74::-;;;;;;;;;;-1:-1:-1;28074:74:0;;;;;;;;;;;;;;;;;;;;;;;1164:6:1;1197:15;;;1179:34;;1249:15;;;;1244:2;1229:18;;1222:43;1281:18;;;1274:34;1142:2;1127:18;28074:74:0;956:358:1;67418:107:0;;;;;;;;;;;;;:::i;36600:420::-;;;;;;;;;;-1:-1:-1;36600:420:0;;;;;:::i;:::-;;:::i;33379:47::-;;;;;;;;;;-1:-1:-1;33379:47:0;;;;-1:-1:-1;;;;;33379:47:0;;;;;;-1:-1:-1;;;;;1513:32:1;;;1495:51;;1483:2;1468:18;33379:47:0;1319:233:1;54812:1130:0;;;;;;;;;;-1:-1:-1;54812:1130:0;;;;;:::i;:::-;;:::i;65665:1346::-;;;;;;;;;;-1:-1:-1;65665:1346:0;;;;;:::i;:::-;;:::i;31552:43::-;;;;;;;;;;-1:-1:-1;31552:43:0;;;;;;;;;;;;;;4603:14:1;;4596:22;4578:41;;4566:2;4551:18;31552:43:0;4438:187:1;59757:595:0;;;;;;;;;;-1:-1:-1;59757:595:0;;;;;:::i;:::-;;:::i;:::-;;;;4832:25:1;;;-1:-1:-1;;;;;4893:32:1;;;4888:2;4873:18;;4866:60;4942:18;;;4935:34;4820:2;4805:18;59757:595:0;4630:345:1;12455:86:0;;;;;;;;;;-1:-1:-1;12526:7:0;;;;12455:86;;37363:862;;;;;;;;;;-1:-1:-1;37363:862:0;;;;;:::i;:::-;;:::i;33522:40::-;;;;;;;;;;-1:-1:-1;33522:40:0;;;;-1:-1:-1;;;;;33522:40:0;;;33484:31;;;;;;;;;;-1:-1:-1;33484:31:0;;;;-1:-1:-1;;;;;33484:31:0;;;42087:508;;;;;;;;;;-1:-1:-1;42087:508:0;;;;;:::i;:::-;;:::i;67533:91::-;;;;;;;;;;;;;:::i;60706:1172::-;;;;;;;;;;-1:-1:-1;60706:1172:0;;;;;:::i;:::-;;:::i;33433:44::-;;;;;;;;;;-1:-1:-1;33433:44:0;;;;-1:-1:-1;;;;;33433:44:0;;;56524:333;;;;;;;;;;-1:-1:-1;56524:333:0;;;;;:::i;:::-;;:::i;:::-;;;;;;6578:13:1;;6571:21;6564:29;6546:48;;6654:4;6642:17;;;6636:24;-1:-1:-1;;;;;6632:50:1;6610:20;;;6603:80;6739:4;6727:17;;;6721:24;6699:20;;;6692:54;6802:4;6790:17;;;6784:24;6762:20;;;6755:54;;;;6533:3;6518:19;;6331:484;20131:175:0;;;;;;;;;;-1:-1:-1;20131:175:0;;;;;:::i;:::-;;:::i;56071:386::-;;;;;;;;;;-1:-1:-1;56071:386:0;;;;;:::i;:::-;;:::i;67277:104::-;;;;;;;;;;;;;:::i;35961:631::-;;;;;;;;;;-1:-1:-1;35961:631:0;;;;;:::i;:::-;;:::i;21926:38::-;;;;;;;;;;-1:-1:-1;21926:38:0;;;;;;;;;;;;;;6994:6:1;6982:19;;;6964:38;;6952:2;6937:18;21926:38:0;6820:188:1;19493:148:0;;;;;;;;;;-1:-1:-1;19493:148:0;;;;;:::i;:::-;;:::i;14672:87::-;;;;;;;;;;-1:-1:-1;14718:7:0;14745:6;-1:-1:-1;;;;;14745:6:0;14672:87;;27921:69;;;;;;;;;;-1:-1:-1;27921:69:0;;;;;;;;;;;;;;;;;;;56940:488;;;;;;;;;;-1:-1:-1;56940:488:0;;;;;:::i;:::-;;:::i;20810:218::-;;;;;;;;;;-1:-1:-1;20810:218:0;;;;;:::i;:::-;;:::i;29625:289::-;;;;;;;;;;-1:-1:-1;29625:289:0;;;;;:::i;:::-;;:::i;21036:98::-;;;;;;;;;;;;;:::i;28876:741::-;;;;;;;;;;-1:-1:-1;28876:741:0;;;;;:::i;:::-;;:::i;33297:75::-;;;;;;;;;;-1:-1:-1;33297:75:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33297:75:0;;;;;;;;;10083:14:1;;10076:22;10058:41;;-1:-1:-1;;;;;10135:32:1;;;10130:2;10115:18;;10108:60;10184:18;;;10177:34;10242:2;10227:18;;10220:34;10045:3;10030:19;33297:75:0;9833:427:1;51616:1024:0;;;;;;;;;;-1:-1:-1;51616:1024:0;;;;;:::i;:::-;;:::i;22440:217::-;;;;;;;;;;-1:-1:-1;22440:217:0;;;;;:::i;:::-;;:::i;16381:49::-;;;;;;;;;;-1:-1:-1;16381:49:0;;;;;;;;52779:1894;;;;;;:::i;:::-;;:::i;62962:2176::-;;;;;;;;;;-1:-1:-1;62962:2176:0;;;;;:::i;:::-;;:::i;27997:70::-;;;;;;;;;;-1:-1:-1;27997:70:0;;;;;;;;;;;;;;;;;;;30029:812;;;;;;;;;;-1:-1:-1;30029:812:0;;;;;:::i;:::-;;:::i;18949:23::-;;;;;;;;;;-1:-1:-1;18949:23:0;;;;-1:-1:-1;;;;;18949:23:0;;;34956:267;;;;;;;;;;-1:-1:-1;34956:267:0;;;;;:::i;:::-;;:::i;19749:312::-;;;;;;;;;;-1:-1:-1;19749:312:0;;;;;:::i;:::-;;:::i;16314:60::-;;;;;;;;;;-1:-1:-1;16314:60:0;;;;;:::i;:::-;;;;;;;;;;;;;;27716;;;;;;;;;;;;27770:6;27716:60;;22770:181;;;;;;;;;;-1:-1:-1;22770:181:0;;;;;:::i;:::-;;:::i;19039:39::-;;;;;;;;;;-1:-1:-1;19039:39:0;;;;-1:-1:-1;;;19039:39:0;;;;;;17745:232;;;;;;;;;;-1:-1:-1;17745:232:0;;;;;:::i;:::-;;:::i;32027:29::-;;;;;;;;;;;;;;;;22226:62;;;;;;;;;;-1:-1:-1;22226:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;15578:201::-;;;;;;;;;;-1:-1:-1;15578:201:0;;;;;:::i;:::-;;:::i;40885:535::-;;;;;;;;;;-1:-1:-1;40885:535:0;;;;;:::i;:::-;;:::i;57790:1878::-;;;;;;:::i;:::-;;:::i;21244:309::-;;;;;;;;;;-1:-1:-1;21244:309:0;;;;;:::i;:::-;;:::i;47871:33::-;;;;;;;;;;;;47903:1;47871:33;;;;;11763:4:1;11751:17;;;11733:36;;11721:2;11706:18;47871:33:0;11591:184:1;17985:373:0;14558:13;:11;:13::i;:::-;18133:29:::1;::::0;::::1;;:38;18111:126;;;::::0;-1:-1:-1;;;18111:126:0;;11982:2:1;18111:126:0::1;::::0;::::1;11964:21:1::0;12021:2;12001:18;;;11994:30;12060:34;12040:18;;;12033:62;-1:-1:-1;;;12111:18:1;;;12104:36;12157:19;;18111:126:0::1;;;;;;;;;18248:55;18286:16;18248:37;:55::i;:::-;-1:-1:-1::0;18314:29:0::1;:36:::0;;-1:-1:-1;;18314:36:0::1;18346:4;18314:36;::::0;;17985:373::o;16781:238::-;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;16896:43:0;::::1;;::::0;;;:25:::1;:43;::::0;;;;;;;;16942:15:::1;16896:61:::0;;16973:38;;1495:51:1;;;16973:38:0::1;::::0;1468:18:1;16973:38:0::1;;;;;;;;16781:238:::0;:::o;35377:293::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;35534:33:::2;35558:8;35534:23;:33::i;:::-;35506:17;:62:::0;;-1:-1:-1;;;;;;35506:62:0::2;::::0;-1:-1:-1;;;;;35506:62:0;;::::2;;;::::0;;35601:15:::2;35579:19;:37:::0;35632:30:::2;::::0;1513:32:1;;;1495:51;;35632:30:0::2;::::0;1483:2:1;1468:18;35632:30:0::2;1319:233:1::0;37028:327:0;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;37255:4:::2;37237:14;:22;;;;37192:110;;;::::0;-1:-1:-1;;;37192:110:0;;12389:2:1;37192:110:0::2;::::0;::::2;12371:21:1::0;12428:2;12408:18;;;12401:30;-1:-1:-1;;;12447:18:1;;;12440:45;12502:18;;37192:110:0::2;12187:339:1::0;37192:110:0::2;37313:17;:34:::0;;::::2;::::0;;::::2;;;-1:-1:-1::0;;37313:34:0;;::::2;::::0;;;::::2;::::0;;37028:327::o;38233:121::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;38314:24:::2;:32:::0;;-1:-1:-1;;38314:32:0::2;::::0;;38233:121::o;67418:107::-;14558:13;:11;:13::i;:::-;12526:7;;;;67467:51:::1;;;67496:10;:8;:10::i;:::-;67418:107::o:0;36600:420::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;36741:17:::2;::::0;-1:-1:-1;;;;;36729:29:0;;::::2;36741:17:::0;;;::::2;;36729:29;36721:64;;;::::0;-1:-1:-1;;;36721:64:0;;12733:2:1;36721:64:0::2;::::0;::::2;12715:21:1::0;12772:2;12752:18;;;12745:30;-1:-1:-1;;;12791:18:1;;;12784:52;12853:18;;36721:64:0::2;12531:346:1::0;36721:64:0::2;31521:6;36836:19;;36818:15;:37;;;;:::i;:::-;:64;36796:118;;;;-1:-1:-1::0;;;36796:118:0::2;;;;;;13349:2:1::0;13331:21;;;13388:1;13368:18;;;13361:29;-1:-1:-1;;;13421:2:1;13406:18;;13399:34;13465:2;13450:18;;13147:327;36796:118:0::2;36935:33;36959:8;36935:23;:33::i;:::-;36925:7;:43:::0;;-1:-1:-1;;;;;;36925:43:0::2;-1:-1:-1::0;;;;;36925:43:0;;::::2;;::::0;;36984:28:::2;::::0;1513:32:1;;;1495:51;;36984:28:0::2;::::0;1483:2:1;1468:18;36984:28:0::2;1319:233:1::0;54812:1130:0;12060:19;:17;:19::i;:::-;21704:30:::1;21723:10;21704:18;:30::i;:::-;21696:64;;;;-1:-1:-1::0;;;21696:64:0::1;;;;;;;:::i;:::-;45593:21:::2;:19;:21::i;:::-;54984:14:::3;55001:41;55010:8;55020:21;55001:8;:41::i;:::-;-1:-1:-1::0;;;;;55085:34:0;::::3;55053:29;55085:34:::0;;;:11:::3;:34;::::0;;;;;;;:68;;;;;;;;54984:58;;-1:-1:-1;55186:15:0::3;55085:68:::0;39127:16;;;:20;;;38996:160;55186:15:::3;:40;;;;-1:-1:-1::0;55215:11:0;;-1:-1:-1;;;;;55205:21:0;;::::3;55215:11;::::0;;::::3;;55205:21;55186:40;:67;;;;-1:-1:-1::0;55230:15:0;;::::3;;:23;;:15:::0;:23:::3;55186:67;55164:131;;;::::0;-1:-1:-1;;;55164:131:0;;14031:2:1;55164:131:0::3;::::0;::::3;14013:21:1::0;14070:2;14050:18;;;14043:30;-1:-1:-1;;;14089:18:1;;;14082:44;14143:18;;55164:131:0::3;13829:338:1::0;55164:131:0::3;55328:157;55365:6;55390:8;55417:21;55465:4;55328:18;:157::i;:::-;55306:224;;;::::0;-1:-1:-1;;;55306:224:0;;14374:2:1;55306:224:0::3;::::0;::::3;14356:21:1::0;14413:2;14393:18;;;14386:30;-1:-1:-1;;;14432:18:1;;;14425:47;14489:18;;55306:224:0::3;14172:341:1::0;55306:224:0::3;55562:15;::::0;::::3;::::0;55588:44:::3;55600:8:::0;55610:21;55588:11:::3;:44::i;:::-;55702:7;::::0;55643:137:::3;::::0;55673:6;;-1:-1:-1;;;;;55702:7:0::3;55725:8:::0;55748:21;55643:15:::3;:137::i;:::-;55890:7;::::0;55796:138:::3;::::0;;14749:25:1;;;-1:-1:-1;;;;;14848:15:1;;;14843:2;14828:18;;14821:43;55890:7:0;;::::3;14880:18:1::0;;;14873:43;14947:2;14932:18;;14925:34;;;55796:138:0;::::3;::::0;;;;14736:3:1;55796:138:0;;::::3;54973:969;;;45637:20:::2;45031:1:::0;46157:7;:22;45974:213;45637:20:::2;54812:1130:::0;;:::o;65665:1346::-;12060:19;:17;:19::i;:::-;21704:30:::1;21723:10;21704:18;:30::i;:::-;21696:64;;;;-1:-1:-1::0;;;21696:64:0::1;;;;;;;:::i;:::-;45593:21:::2;:19;:21::i;:::-;65834:9:::3;65829:1175;65853:9;:16;65849:1;:20;65829:1175;;;65891:20;65914:9;65924:1;65914:12;;;;;;;;:::i;:::-;;;;;;;:25;;;65891:48;;65954:15;65972:9;65982:1;65972:12;;;;;;;;:::i;:::-;;;;;;;:20;;;65954:38;;66007:13;66023:9;66033:1;66023:12;;;;;;;;:::i;:::-;;;;;;;:18;;;66007:34;;66056:15;66074:9;66084:1;66074:12;;;;;;;;:::i;:::-;;;;;;;:23;;;66056:41;;66112:14;66129:31;66138:7;66147:12;66129:8;:31::i;:::-;66112:48;;66178:21;66201:16:::0;66221:119:::3;66263:7;66289:12;66320:5;66221:23;:119::i;:::-;66177:163;;;;66361:10;66357:282;;;66392:7;::::0;:60:::3;::::0;-1:-1:-1;;;66392:60:0;;-1:-1:-1;;;;;15360:15:1;;;66392:60:0::3;::::0;::::3;15342:34:1::0;15392:18;;;15385:34;;;15455:15;;;15435:18;;;15428:43;66392:7:0;;::::3;::::0;:22:::3;::::0;15277:18:1;;66392:60:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;66357:282;;;66493:14;::::0;:50:::3;::::0;-1:-1:-1;;;66493:50:0;;::::3;::::0;::::3;15656:25:1::0;;;-1:-1:-1;;;;;15717:32:1;;;15697:18;;;15690:60;66493:14:0;;::::3;::::0;:27:::3;::::0;15629:18:1;;66493:50:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;66562:61;66578:6;66586:13;66601:7;66610:12;66562:15;:61::i;:::-;66660:332;66705:7;66745:12;66783:5;66817:8;66852:13;66907:1;66936:6;66975:1;66660:332;;;;;;;;;;;;;:::i;:::-;;;;;;;;65876:1128;;;;;;;65871:3;;;;;:::i;:::-;;;;65829:1175;;;;45637:20:::2;45031:1:::0;46157:7;:22;45974:213;45637:20:::2;65665:1346:::0;:::o;59757:595::-;-1:-1:-1;;;;;60047:37:0;;59926:13;60047:37;;;:14;:37;;;;;;;;:47;;;;;;;;;59926:13;;;;60109:17;;;60105:240;;60151:1;60162;60166;60143:25;;;;;;;;;60105:240;60201:27;60231:29;;;:15;:29;;;;;60297:17;;;60316:16;;;;60247:12;;-1:-1:-1;;;;;;60297:17:0;;-1:-1:-1;60316:16:0;-1:-1:-1;60275:58:0;;60105:240;60013:339;59757:595;;;;;;:::o;37363:862::-;12060:19;:17;:19::i;:::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23:::1;::::0;:51:::1;;-1:-1:-1::0;19401:8:0::1;::::0;-1:-1:-1;;;;;19401:8:0::1;10648:10:::0;19401:24:::1;19374:51;19352:113;;;;-1:-1:-1::0;;;19352:113:0::1;;;;;;;:::i;:::-;37504:24:::2;::::0;::::2;;::::0;;::::2;;:32;;:24;:32;37496:47;;;::::0;-1:-1:-1;;;37496:47:0;;17210:2:1;37496:47:0::2;::::0;::::2;17192:21:1::0;17249:1;17229:18;;;17222:29;-1:-1:-1;;;17267:18:1;;;17260:32;17309:18;;37496:47:0::2;17008:325:1::0;37496:47:0::2;37554:46;37646:13;37554:120;;37693:21;-1:-1:-1::0;;;;;37693:29:0::2;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;37728:1;37693:36;37685:61;;;::::0;-1:-1:-1;;;37685:61:0;;17818:2:1;37685:61:0::2;::::0;::::2;17800:21:1::0;17857:2;17837:18;;;17830:30;-1:-1:-1;;;17876:18:1;;;17869:42;17928:18;;37685:61:0::2;17616:336:1::0;37685:61:0::2;37757:20;37821:21;-1:-1:-1::0;;;;;37821:36:0::2;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;-1:-1:-1::0;;37821:38:0::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;37804:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;37780:91;;;;;;37757:114;;38032:12;38065:66;38032:99;;;38010:160;;;::::0;-1:-1:-1;;;38010:160:0;;19565:2:1;38010:160:0::2;::::0;::::2;19547:21:1::0;19604:2;19584:18;;;19577:30;-1:-1:-1;;;19623:18:1;;;19616:41;19674:18;;38010:160:0::2;19363:335:1::0;38010:160:0::2;-1:-1:-1::0;38181:12:0::2;:36:::0;;-1:-1:-1;;;;;;38181:36:0::2;-1:-1:-1::0;;;;;38181:36:0;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;37363:862:0:o;42087:508::-;21704:30;21723:10;21704:18;:30::i;:::-;21696:64;;;;-1:-1:-1;;;21696:64:0;;;;;;;:::i;:::-;42223:43:::1;42249:16;42223:25;:43::i;:::-;42201:119;;;::::0;-1:-1:-1;;;42201:119:0;;19905:2:1;42201:119:0::1;::::0;::::1;19887:21:1::0;19944:2;19924:18;;;19917:30;19983:28;19963:18;;;19956:56;20029:18;;42201:119:0::1;19703:350:1::0;42201:119:0::1;42518:14;::::0;42357:21:::1;::::0;42331:23:::1;::::0;42500:32:::1;::::0;42357:21;42500:32:::1;:::i;:::-;42543:44;::::0;42472:60;;-1:-1:-1;;;;;;42543:25:0;::::1;::::0;:44;::::1;;;::::0;42472:60;;42543:44:::1;::::0;;;42472:60;42543:25;:44;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;42190:405;;42087:508:::0;:::o;67533:91::-;14558:13;:11;:13::i;:::-;67604:12:::1;::::0;-1:-1:-1;;;67604:12:0;;17210:2:1;67604:12:0::1;::::0;::::1;17192:21:1::0;17249:1;17229:18;;;17222:29;-1:-1:-1;;;17267:18:1;;;17260:32;17309:18;;67604:12:0::1;17008:325:1::0;60706:1172:0;45593:21;:19;:21::i;:::-;-1:-1:-1;;;;;60880:37:0;::::1;60857:20;60880:37:::0;;;:14:::1;:37;::::0;;;;;;;:47;;;;;;;;;;60946:17;;;60938:36:::1;;;::::0;-1:-1:-1;;;60938:36:0;;20260:2:1;60938:36:0::1;::::0;::::1;20242:21:1::0;20299:1;20279:18;;;20272:29;-1:-1:-1;;;20317:18:1;;;20310:36;20363:18;;60938:36:0::1;20058:329:1::0;60938:36:0::1;61009:6;60993:12;:22;60985:52;;;::::0;-1:-1:-1;;;60985:52:0;;20594:2:1;60985:52:0::1;::::0;::::1;20576:21:1::0;20633:2;20613:18;;;20606:30;-1:-1:-1;;;20652:18:1;;;20645:47;20709:18;;60985:52:0::1;20392:341:1::0;60985:52:0::1;61048:27;61078:29:::0;;;:15:::1;:29;::::0;;;;61140:17;;-1:-1:-1;;;;;61140:17:0::1;61161:10;61140:31;::::0;:82:::1;;;61192:30;61211:10;61192:18;:30::i;:::-;61140:158;;;;61257:41;61266:8;61276:21;61257:8;:41::i;:::-;-1:-1:-1::0;;;;;61243:55:0::1;:10;-1:-1:-1::0;;;;;61243:55:0::1;;61140:158;61118:233;;;::::0;-1:-1:-1;;;61118:233:0;;20940:2:1;61118:233:0::1;::::0;::::1;20922:21:1::0;20979:2;20959:18;;;20952:30;21018:27;20998:18;;;20991:55;21063:18;;61118:233:0::1;20738:349:1::0;61118:233:0::1;61379:17:::0;;;61438:16;;::::1;::::0;-1:-1:-1;;;;;61524:37:0;;::::1;61362:13;61524:37:::0;;;:14:::1;:37;::::0;;;;;;;:47;;;;;;;;61517:54;;;61589:29;;;:15:::1;:29:::0;;;;;61582:36;;-1:-1:-1;;;;;;61582:36:0::1;::::0;;;;::::1;::::0;;;;61646:14:::1;::::0;61379:17;;;::::1;61400:10;61379:31:::0;::::1;::::0;61646:22:::1;::::0;61438:16;;61646:22:::1;:::i;:::-;61629:14;:39:::0;61679:35:::1;61693:13:::0;61708:5;61679:13:::1;:35::i;:::-;61730:140;::::0;;21317:25:1;;;-1:-1:-1;;;;;21378:32:1;;21373:2;21358:18;;21351:60;21427:18;;;21420:34;;;21497:14;;21490:22;21485:2;21470:18;;21463:50;61730:140:0::1;::::0;21304:3:1;21289:19;61730:140:0::1;;;;;;;;60846:1032;;;;;45637:20:::0;45031:1;46157:7;:22;45974:213;45637:20;60706:1172;;;:::o;56524:333::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56713:34:0;;;;:11;:34;;;;;:68;;;;;;;;;39127:16;;;;56792:35;;;;-1:-1:-1;;;56792:35:0;;;;;;;:::i;:::-;56838:11;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;56838:11:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56524:333:0;;;;;:::o;20131:175::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20219:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;20212:32;;;20260:38;;22027:51:1;;;22094:18;;;22087:50;;;;20260:38:0::1;::::0;22000:18:1;20260:38:0::1;21859:284:1::0;56071:386:0;-1:-1:-1;;;;;56206:34:0;;56174:29;56206:34;;;:11;:34;;;;;;;;:68;;;;;;;;39127:16;;;;56285:35;;;;-1:-1:-1;;;56285:35:0;;;;;;;:::i;:::-;56353:11;;;;;-1:-1:-1;;;;;56353:11:0;56339:10;:25;56331:63;;;;-1:-1:-1;;;56331:63:0;;22350:2:1;56331:63:0;;;22332:21:1;22389:2;22369:18;;;22362:30;22428:27;22408:18;;;22401:55;22473:18;;56331:63:0;22148:349:1;56331:63:0;56405:44;56417:8;56427:21;56405:11;:44::i;67277:104::-;14558:13;:11;:13::i;:::-;12526:7;;;;67324:50:::1;;67354:8;:6;:8::i;35961:631::-:0;14558:13;:11;:13::i;:::-;36039:24:::1;36066:36;36088:13;36066:21;:36::i;:::-;36205:14;::::0;36039:63;;-1:-1:-1;;;;;;36205:14:0::1;36197:37:::0;36193:312:::1;;36312:15;::::0;-1:-1:-1;;;;;36295:32:0;;::::1;36312:15:::0;::::1;36295:32;36287:63;;;::::0;-1:-1:-1;;;36287:63:0;;22704:2:1;36287:63:0::1;::::0;::::1;22686:21:1::0;22743:2;22723:18;;;22716:30;-1:-1:-1;;;22762:18:1;;;22755:48;22820:18;;36287:63:0::1;22502:342:1::0;36287:63:0::1;31521:6;36409:17;;36391:15;:35;;;;:::i;:::-;:62;36365:128;;;;-1:-1:-1::0;;;36365:128:0::1;;;;;;13349:2:1::0;13331:21;;;13388:1;13368:18;;;13361:29;-1:-1:-1;;;13421:2:1;13406:18;;13399:34;13465:2;13450:18;;13147:327;36365:128:0::1;36515:14;:22:::0;;-1:-1:-1;;;;;;36515:22:0::1;-1:-1:-1::0;;;;;36515:22:0;;::::1;::::0;;;::::1;::::0;;;36553:31:::1;::::0;1513:32:1;;;1495:51;;36553:31:0::1;::::0;1483:2:1;1468:18;36553:31:0::1;;;;;;;;36028:564;35961:631:::0;:::o;19493:148::-;14558:13;:11;:13::i;:::-;19563:8:::1;:20:::0;;-1:-1:-1;;;;;;19563:20:0::1;-1:-1:-1::0;;;;;19563:20:0;::::1;::::0;;::::1;::::0;;;19599:34:::1;::::0;1495:51:1;;;19599:34:0::1;::::0;1483:2:1;1468:18;19599:34:0::1;1319:233:1::0;56940:488:0;21704:30;21723:10;21704:18;:30::i;:::-;21696:64;;;;-1:-1:-1;;;21696:64:0;;;;;;;:::i;:::-;57057:8:::1;57052:369;57075:8;:15;57071:1;:19;;;57052:369;;;57112:26;57141:8;57150:1;57141:11;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;57211:20:::1;::::0;::::1;::::0;-1:-1:-1;;;;;57199:33:0::1;57167:29;57199:33:::0;;;:11:::1;:33:::0;;;;;;57251:15;;57199:82;;;;;;;;;57141:11;;-1:-1:-1;57300:15:0::1;57199:82:::0;39127:16;;;:20;;;38996:160;57300:15:::1;:23;;57319:4;57300:23:::0;57296:114:::1;;57344:50;57356:7;:15;;;57373:7;:20;;;57344:11;:50::i;:::-;57097:324;;57092:3;;;;;:::i;:::-;;;;57052:369;;20810:218:::0;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;20930:20:::1;::::0;;-1:-1:-1;;;20930:20:0;::::1;;;:28;;;20922:49;;;::::0;-1:-1:-1;;;20922:49:0;;23257:2:1;20922:49:0::1;::::0;::::1;23239:21:1::0;23296:1;23276:18;;;23269:29;-1:-1:-1;;;23314:18:1;;;23307:38;23362:18;;20922:49:0::1;23055:331:1::0;20922:49:0::1;20982:38;21008:11;20982:25;:38::i;29625:289::-:0;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;29756:35:::2;29794:29;29816:6;29794:21;:29::i;:::-;29834:37:::0;;-1:-1:-1;;29834:37:0::2;::::0;;29870:1:::2;-1:-1:-1::0;29882:20:0;;::::2;:24:::0;-1:-1:-1;;29625:289:0:o;21036:98::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;21098:20:::1;:28:::0;;-1:-1:-1;;;;21098:28:0::1;::::0;;21036:98::o;28876:741::-;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;29060:1:::2;29046:11;:15;;;:48;;;;;28198:5;29065:11;:29;;;;29046:48;29024:116;;;::::0;-1:-1:-1;;;29024:116:0;;23593:2:1;29024:116:0::2;::::0;::::2;23575:21:1::0;23632:2;23612:18;;;23605:30;-1:-1:-1;;;23651:18:1;;;23644:48;23709:18;;29024:116:0::2;23391:342:1::0;29024:116:0::2;29151:35;29189:29;29211:6;29189:21;:29::i;:::-;29251:33:::0;;;;-1:-1:-1;29251:33:0;;::::2;;;:38:::0;29229:111:::2;;;::::0;-1:-1:-1;;;29229:111:0;;23940:2:1;29229:111:0::2;::::0;::::2;23922:21:1::0;23979:2;23959:18;;;23952:30;-1:-1:-1;;;23998:18:1;;;23991:53;24061:18;;29229:111:0::2;23738:347:1::0;29229:111:0::2;29351:47:::0;;-1:-1:-1;;29351:47:0::2;::::0;::::2;::::0;::::2;;;::::0;;29432:15:::2;-1:-1:-1::0;29409:20:0;::::2;:38:::0;29463:146:::2;::::0;::::2;::::0;::::2;::::0;29522:6;;29351:47;;-1:-1:-1;;29463:146:0::2;:::i;:::-;;;;;;;;29013:604;28876:741:::0;;:::o;51616:1024::-;12060:19;:17;:19::i;:::-;51801:14:::1;51818:92;51855:8;51878:21;51818:22;:92::i;:::-;51801:109;;51943:1;51929:11;:15;51921:37;;;::::0;-1:-1:-1;;;51921:37:0;;24710:2:1;51921:37:0::1;::::0;::::1;24692:21:1::0;24749:1;24729:18;;;24722:29;-1:-1:-1;;;24767:18:1;;;24760:39;24816:18;;51921:37:0::1;24508:332:1::0;51921:37:0::1;52048:28;52079:122;52125:6;52146:8;52169:21;52079:31;:122::i;:::-;52281:135;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;;;;;52281:135:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;52427:34;;::::1;52250:28;52427:34:::0;;;:11:::1;:34:::0;;;;;:44;;;;;;;;;;:51;;;;;;;;::::1;;;-1:-1:-1::0;;;;;;52427:51:0;::::1;;::::0;;;;-1:-1:-1;;;;;;52427:51:0;;;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;52494:138;;52048:153;;-1:-1:-1;52281:135:0;52494:138:::1;::::0;::::1;::::0;52462:8;;52439:21;;52312:11;;52359;;25070:25:1;;;-1:-1:-1;;;;;25131:32:1;;;;25126:2;25111:18;;25104:60;25207:14;25200:22;25195:2;25180:18;;25173:50;25254:2;25239:18;;25232:34;25057:3;25042:19;;24845:427;52494:138:0::1;;;;;;;;51790:850;;;51616:1024:::0;;;;:::o;22440:217::-;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;22588:45:0;::::1;;::::0;;;:22:::1;:45;::::0;;;;:61;;22636:13;;22588:45;-1:-1:-1;;22588:61:0::1;::::0;22636:13;22588:61:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;22440:217:::0;;:::o;52779:1894::-;12060:19;:17;:19::i;:::-;45593:21:::1;:19;:21::i;:::-;52962:1:::2;52950:9;:13;52942:35;;;::::0;-1:-1:-1;;;52942:35:0;;25479:2:1;52942:35:0::2;::::0;::::2;25461:21:1::0;25518:1;25498:18;;;25491:29;-1:-1:-1;;;25536:18:1;;;25529:39;25585:18;;52942:35:0::2;25277:332:1::0;52942:35:0::2;-1:-1:-1::0;;;;;53020:34:0;::::2;52988:29;53020:34:::0;;;:11:::2;:34;::::0;;;;;;;:68;;;;;;;;39127:16;;;;53099:35:::2;;;;-1:-1:-1::0;;;53099:35:0::2;;;;;;;:::i;:::-;53162:11:::0;;::::2;53200:15:::0;::::2;::::0;53261:25:::2;::::0;::::2;::::0;53162:11:::2;::::0;;::::2;-1:-1:-1::0;;;;;53162:11:0::2;::::0;53145:14:::2;53318:41;53327:8:::0;53337:21;53318:8:::2;:41::i;:::-;53297:62;;53388:10;-1:-1:-1::0;;;;;53378:20:0::2;:6;-1:-1:-1::0;;;;;53378:20:0::2;;53370:51;;;::::0;-1:-1:-1;;;53370:51:0;;25816:2:1;53370:51:0::2;::::0;::::2;25798:21:1::0;25855:2;25835:18;;;25828:30;-1:-1:-1;;;25874:18:1;;;25867:48;25932:18;;53370:51:0::2;25614:342:1::0;53370:51:0::2;53454:157;53491:6;53516:8;53543:21;53591:4;53454:18;:157::i;:::-;53432:232;;;::::0;-1:-1:-1;;;53432:232:0;;26163:2:1;53432:232:0::2;::::0;::::2;26145:21:1::0;26202:2;26182:18;;;26175:30;26241:27;26221:18;;;26214:55;26286:18;;53432:232:0::2;25961:349:1::0;53432:232:0::2;53675:59;53685:8;53695:21;53718:4;53724:9;53675;:59::i;:::-;;53745:68;53761:6;53769:10;53781:8;53791:21;53745:15;:68::i;:::-;53824:20;53942:44;53964:21;53942;:44::i;:::-;:52;;53990:4;53942:52:::0;53938:436:::2;;54015:28:::0;;54011:200:::2;;54079:116;54124:5;54152:24;54079:22;:116::i;:::-;54064:131;;54011:200;53938:436;;;54258:104;54299:5;54323:24;54258:22;:104::i;:::-;54243:119;;53938:436;54388:16:::0;;54384:84:::2;;54421:35;54435:6;54443:12;54421:13;:35::i;:::-;54483:182;::::0;;26602:25:1;;;-1:-1:-1;;;;;26701:15:1;;;26696:2;26681:18;;26674:43;54576:10:0::2;26733:18:1::0;;;26726:43;26805:15;;26800:2;26785:18;;26778:43;26852:3;26837:19;;26830:35;;;26654:3;26881:19;;26874:35;;;54483:182:0;;::::2;::::0;;;;26589:3:1;54483:182:0;;::::2;52931:1742;;;;;;45637:20:::1;45031:1:::0;46157:7;:22;45974:213;62962:2176;12060:19;:17;:19::i;:::-;45593:21:::1;:19;:21::i;:::-;63127:14:::2;63144:41;63153:8;63163:21;63144:8;:41::i;:::-;63127:58:::0;-1:-1:-1;63204:10:0::2;-1:-1:-1::0;;;;;63204:20:0;::::2;;63196:53;;;::::0;-1:-1:-1;;;63196:53:0;;27122:2:1;63196:53:0::2;::::0;::::2;27104:21:1::0;27161:2;27141:18;;;27134:30;-1:-1:-1;;;27180:18:1;;;27173:50;27240:18;;63196:53:0::2;26920:344:1::0;63196:53:0::2;63282:161;63319:10;63348:8;63375:21;63423:4;63282:18;:161::i;:::-;63260:230;;;::::0;-1:-1:-1;;;63260:230:0;;27471:2:1;63260:230:0::2;::::0;::::2;27453:21:1::0;27510:2;27490:18;;;27483:30;-1:-1:-1;;;27529:18:1;;;27522:49;27588:18;;63260:230:0::2;27269:343:1::0;63260:230:0::2;63502:21;63525:16:::0;63545:114:::2;63583:8;63606:21;63642:6;63545:23;:114::i;:::-;63501:158;;;;63670:71;63686:6;63694:13;63709:8;63719:21;63670:15;:71::i;:::-;63752:32;63787:122;63833:6;63854:8;63877:21;63787:31;:122::i;:::-;63752:157;;64230:20;64269:44;64291:21;64269;:44::i;:::-;:52;;64317:4;64269:52:::0;64265:442:::2;;64342:28:::0;;64338:203:::2;;64406:119;64451:8;64482:24;64406:22;:119::i;:::-;64391:134;;64338:203;64265:442;;;64588:107;64629:8;64656:24;64588:22;:107::i;:::-;64573:122;;64265:442;64721:16:::0;;64717:84:::2;;64754:35;64768:6;64776:12;64754:13;:35::i;:::-;64816:314;64857:8;64894:21;64937:6;64968:8;64999:13;65042:6;65071;65106:12;64816:314;;;;;;;;;;;;;:::i;30029:812::-:0;12060:19;:17;:19::i;:::-;14558:13:::1;:11;:13::i;:::-;30160:35:::2;30198:29;30220:6;30198:21;:29::i;:::-;30260:33:::0;;;;-1:-1:-1;30260:33:0;;::::2;;;30238:110;;;::::0;-1:-1:-1;;;30238:110:0;;23940:2:1;30238:110:0::2;::::0;::::2;23922:21:1::0;23979:2;23959:18;;;23952:30;-1:-1:-1;;;23998:18:1;;;23991:53;24061:18;;30238:110:0::2;23738:347:1::0;30238:110:0::2;27770:6;30399:10;:20;;;30381:15;:38;;;;:::i;:::-;:85;30359:152;;;::::0;-1:-1:-1;;;30359:152:0;;28577:2:1;30359:152:0::2;::::0;::::2;28559:21:1::0;28616:2;28596:18;;;28589:30;-1:-1:-1;;;28635:18:1;;;28628:47;28692:18;;30359:152:0::2;28375:341:1::0;30359:152:0::2;30546:33:::0;;;;::::2;;;-1:-1:-1::0;;30590:37:0;;;;;;;-1:-1:-1;;30638:20:0;;::::2;:24:::0;;;;30678:155:::2;::::0;::::2;::::0;::::2;::::0;30737:6;;30678:155:::2;:::i;34956:267::-:0;14558:13;:11;:13::i;:::-;35042:36:::1;35064:13;35042:21;:36::i;:::-;-1:-1:-1::0;35089:15:0::1;:31:::0;;-1:-1:-1;;;;;;35089:31:0::1;-1:-1:-1::0;;;;;35089:31:0;::::1;::::0;;::::1;::::0;;;35151:15:::1;35131:17;:35:::0;35182:33:::1;::::0;1495:51:1;;;35182:33:0::1;::::0;1483:2:1;1468:18;35182:33:0::1;1319:233:1::0;19749:312:0;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;19374:23;;:51;;-1:-1:-1;19401:8:0;;-1:-1:-1;;;;;19401:8:0;10648:10;19401:24;19374:51;19352:113;;;;-1:-1:-1;;;19352:113:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19835:25:0;::::1;19827:52;;;::::0;-1:-1:-1;;;19827:52:0;;28923:2:1;19827:52:0::1;::::0;::::1;28905:21:1::0;28962:2;28942:18;;;28935:30;-1:-1:-1;;;28981:18:1;;;28974:44;29035:18;;19827:52:0::1;28721:338:1::0;19827:52:0::1;-1:-1:-1::0;;;;;19898:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;:30;19890:56:::1;;;::::0;-1:-1:-1;;;19890:56:0;;29266:2:1;19890:56:0::1;::::0;::::1;29248:21:1::0;29305:2;29285:18;;;29278:30;-1:-1:-1;;;29324:18:1;;;29317:43;29377:18;;19890:56:0::1;29064:337:1::0;19890:56:0::1;-1:-1:-1::0;;;;;19957:25:0;::::1;;::::0;;;:12:::1;:25;::::0;;;;;;;;19985:15:::1;19957:43:::0;;20016:37;;22027:51:1;;;20048:4:0::1;22094:18:1::0;;;22087:50;20016:37:0::1;::::0;22000:18:1;20016:37:0::1;21859:284:1::0;22770:181:0;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;22898:45:0::1;;::::0;;;:22:::1;:45;::::0;;;;22891:52;;-1:-1:-1;;22891:52:0::1;::::0;;22770:181::o;17745:232::-;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;17870:43:0;::::1;;::::0;;;:25:::1;:43;::::0;;;;;;;17863:50;;;;17929:40;;1495:51:1;;;17929:40:0::1;::::0;1468:18:1;17929:40:0::1;1319:233:1::0;15578:201:0;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;15667:22:0;::::1;15659:73;;;::::0;-1:-1:-1;;;15659:73:0;;29608:2:1;15659:73:0::1;::::0;::::1;29590:21:1::0;29647:2;29627:18;;;29620:30;29686:34;29666:18;;;29659:62;-1:-1:-1;;;29737:18:1;;;29730:36;29783:19;;15659:73:0::1;29406:402:1::0;15659:73:0::1;15743:28;15762:8;15743:18;:28::i;40885:535::-:0;14558:13;:11;:13::i;:::-;41017:16:::1;::::0;-1:-1:-1;;;;;41017:16:0::1;41009:39:::0;41001:63:::1;;;::::0;-1:-1:-1;;;41001:63:0;;30015:2:1;41001:63:0::1;::::0;::::1;29997:21:1::0;30054:2;30034:18;;;30027:30;-1:-1:-1;;;30073:18:1;;;30066:41;30124:18;;41001:63:0::1;29813:335:1::0;41001:63:0::1;41075:38;41154:14;41075:104;;41212:14;-1:-1:-1::0;;;;;41212:29:0::1;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;41212:118:0::1;41190:178;;;::::0;-1:-1:-1;;;41190:178:0;;30544:2:1;41190:178:0::1;::::0;::::1;30526:21:1::0;30583:2;30563:18;;;30556:30;-1:-1:-1;;;30602:18:1;;;30595:40;30652:18;;41190:178:0::1;30342:334:1::0;41190:178:0::1;41379:16;:33:::0;;-1:-1:-1;;;;;;41379:33:0::1;-1:-1:-1::0;;;;;41379:33:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;40885:535:0:o;57790:1878::-;12060:19;:17;:19::i;:::-;45593:21:::1;:19;:21::i;:::-;57974:9:::2;58002:12:::0;57994:39:::2;;;::::0;-1:-1:-1;;;57994:39:0;;30883:2:1;57994:39:0::2;::::0;::::2;30865:21:1::0;30922:2;30902:18;;;30895:30;-1:-1:-1;;;30941:18:1;;;30934:44;30995:18;;57994:39:0::2;30681:338:1::0;57994:39:0::2;58044:21;58086::::0;58127:31:::2;::::0;-1:-1:-1;;;58127:31:0;;::::2;::::0;::::2;160:25:1::0;;;58044:64:0;;-1:-1:-1;58170:1:0::2;::::0;-1:-1:-1;;;;;58127:21:0;::::2;::::0;::::2;::::0;133:18:1;;58127:31:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;58127:45:0::2;::::0;58119:69:::2;;;::::0;-1:-1:-1;;;58119:69:0;;31482:2:1;58119:69:0::2;::::0;::::2;31464:21:1::0;31521:2;31501:18;;;31494:30;-1:-1:-1;;;31540:18:1;;;31533:41;31591:18;;58119:69:0::2;31280:335:1::0;58119:69:0::2;-1:-1:-1::0;;;;;58281:37:0;::::2;58258:20;58281:37:::0;;;:14:::2;:37;::::0;;;;;;;:47;;;;;;;;;58343:17;;58339:650:::2;;58377:27;58407:29:::0;;;:15:::2;:29;::::0;;;;58470:16:::2;::::0;::::2;::::0;58459:27;::::2;58451:53;;;::::0;-1:-1:-1;;;58451:53:0;;31822:2:1;58451:53:0::2;::::0;::::2;31804:21:1::0;31861:2;31841:18;;;31834:30;-1:-1:-1;;;31880:18:1;;;31873:43;31933:18;;58451:53:0::2;31620:337:1::0;58451:53:0::2;58539:17:::0;;;58593:16;;::::2;::::0;-1:-1:-1;;;;;58701:37:0;;::::2;58519:17;58701:37:::0;;;:14:::2;:37;::::0;;;;;;;:47;;;;;;;;58694:54;;;58770:29;;;:15:::2;:29:::0;;;;;58763:36;;-1:-1:-1;;;;;;58763:36:0::2;::::0;;;;::::2;::::0;;;;58831:14:::2;::::0;58539:17;;;::::2;::::0;58593:16;58831:28:::2;::::0;58593:16;;58831:28:::2;:::i;:::-;58814:14;:45:::0;58940:37:::2;58954:9:::0;58965:11;58940:13:::2;:37::i;:::-;58362:627;;;58339:650;58999:13;59015:15;:13;:15::i;:::-;59066:84;::::0;;;;::::2;::::0;;59098:10:::2;59066:84:::0;;::::2;::::0;;::::2;::::0;;;-1:-1:-1;59041:22:0;;;:15:::2;:22:::0;;;;;:109;;;;-1:-1:-1;;;;;;59041:109:0::2;-1:-1:-1::0;;;;;59041:109:0;;::::2;;::::0;;;;-1:-1:-1;59041:109:0;;::::2;::::0;;;;59161:37;::::2;::::0;;:14:::2;:37:::0;;;;;:47;;;;;;:55;;;59244:14:::2;::::0;59041:22;;-1:-1:-1;59244:25:0::2;::::0;59066:84;;59244:25:::2;:::i;:::-;59227:14;:42:::0;59502:158:::2;::::0;;32351:25:1;;;-1:-1:-1;;;;;32450:15:1;;32445:2;32430:18;;32423:43;32482:18;;;32475:34;;;32540:2;32525:18;;32518:34;;;59639:10:0::2;32583:3:1::0;32568:19;;32561:44;59502:158:0::2;::::0;32338:3:1;32323:19;59502:158:0::2;;;;;;;57944:1724;;;;45637:20:::1;45031:1:::0;46157:7;:22;45974:213;21244:309;-1:-1:-1;;;;;21383:25:0;;21341:4;21383:25;;;:12;:25;;;;;;21423:14;;;21419:59;;-1:-1:-1;21461:5:0;;21244:309;-1:-1:-1;;21244:309:0:o;21419:59::-;19026:6;21495:27;21513:9;21495:15;:27;:::i;:::-;:50;;21244:309;-1:-1:-1;;;21244:309:0:o;14837:132::-;14718:7;14745:6;-1:-1:-1;;;;;14745:6:0;10648:10;14901:23;14893:68;;;;-1:-1:-1;;;14893:68:0;;32818:2:1;14893:68:0;;;32800:21:1;;;32837:18;;;32830:30;32896:34;32876:18;;;32869:62;32948:18;;14893:68:0;32616:356:1;17182:482:0;14558:13;:11;:13::i;:::-;-1:-1:-1;;;;;17312:30:0;::::1;::::0;17308:349:::1;;17586:1;17505:61;16573:6;17505:15;:61;:::i;:::-;:82;;;;:::i;:::-;-1:-1:-1::0;;;;;17442:43:0;::::1;;::::0;;;:25:::1;:43;::::0;;;;;;;;:145;;;;17607:38;1495:51:1;;;17607:38:0::1;::::0;1468:18:1;17607:38:0::1;1319:233:1::0;12614:108:0;12526:7;;;;12684:9;12676:38;;;;-1:-1:-1;;;12676:38:0;;33179:2:1;12676:38:0;;;33161:21:1;33218:2;33198:18;;;33191:30;-1:-1:-1;;;33237:18:1;;;33230:46;33293:18;;12676:38:0;32977:340:1;34360:445:0;34461:16;34557:20;-1:-1:-1;;;34557:89:0;;;;34659:19;34698:8;34659:48;;34749:12;34726:2;-1:-1:-1;;;;;34726:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;34718:59;;;;-1:-1:-1;;;34718:59:0;;33524:2:1;34718:59:0;;;33506:21:1;33563:2;33543:18;;;33536:30;-1:-1:-1;;;33582:18:1;;;33575:41;33633:18;;34718:59:0;33322:335:1;34718:59:0;34795:2;34360:445;-1:-1:-1;;;34360:445:0:o;13310:120::-;12319:16;:14;:16::i;:::-;13369:7:::1;:15:::0;;-1:-1:-1;;13369:15:0::1;::::0;;13400:22:::1;10648:10:::0;13409:12:::1;13400:22;::::0;-1:-1:-1;;;;;1513:32:1;;;1495:51;;1483:2;1468:18;13400:22:0::1;;;;;;;13310:120::o:0;45673:293::-;45075:1;45807:7;;:19;45799:63;;;;-1:-1:-1;;;45799:63:0;;33864:2:1;45799:63:0;;;33846:21:1;33903:2;33883:18;;;33876:30;33942:33;33922:18;;;33915:61;33993:18;;45799:63:0;33662:355:1;45799:63:0;45075:1;45940:7;:18;45673:293::o;23867:263::-;23984:7;;24051:21;24091:31;;-1:-1:-1;;;24091:31:0;;;;;160:25:1;;;24009:64:0;;-1:-1:-1;;;;;;24091:21:0;;;;;133:18:1;;24091:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24084:38;23867:263;-1:-1:-1;;;;23867:263:0:o;24277:529::-;24461:4;24520:21;-1:-1:-1;;;;;24630:25:0;;;;;;;;:97;;-1:-1:-1;24672:55:0;;-1:-1:-1;;;24672:55:0;;-1:-1:-1;;;;;34252:15:1;;;24672:55:0;;;34234:34:1;34304:15;;;34284:18;;;34277:43;24672:30:0;;;;;34169:18:1;;24672:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24630:167;;;-1:-1:-1;24744:35:0;;-1:-1:-1;;;24744:35:0;;;;;160:25:1;;;-1:-1:-1;;;;;24744:53:0;;;;:25;;;;;;133:18:1;;24744:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24744:53:0;;24630:167;24622:176;24277:529;-1:-1:-1;;;;;;24277:529:0:o;38727:163::-;-1:-1:-1;;;;;38838:34:0;;;;;:11;:34;;;;;;;;:44;;;;;;;;;38831:51;;-1:-1:-1;;;;;;38831:51:0;;;;;;;;;;;;38727:163::o;24953:316::-;25126:21;25168;25201:60;;-1:-1:-1;;;25201:60:0;;-1:-1:-1;;;;;34839:15:1;;;25201:60:0;;;34821:34:1;34891:15;;;34871:18;;;34864:43;34923:18;;;34916:34;;;25126:64:0;;-1:-1:-1;25201:30:0;;;;;;34756:18:1;;25201:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25115:154;24953:316;;;;:::o;61886:855::-;-1:-1:-1;;;;;62104:37:0;;62036:14;62104:37;;;:14;:37;;;;;;;;:47;;;;;;;;;62036:14;;62170:17;;;62162:36;;;;-1:-1:-1;;;62162:36:0;;20260:2:1;62162:36:0;;;20242:21:1;20299:1;20279:18;;;20272:29;-1:-1:-1;;;20317:18:1;;;20310:36;20363:18;;62162:36:0;20058:329:1;62162:36:0;62233:6;62217:12;:22;62209:52;;;;-1:-1:-1;;;62209:52:0;;20594:2:1;62209:52:0;;;20576:21:1;20633:2;20613:18;;;20606:30;-1:-1:-1;;;20652:18:1;;;20645:47;20709:18;;62209:52:0;20392:341:1;62209:52:0;62272:27;62302:29;;;:15;:29;;;;;;;;62351:17;;;62390:16;;;;-1:-1:-1;;;;;62481:37:0;;;;;:14;:37;;;;;:47;;;;;;;;62474:54;;;62546:29;;;;;;;62539:36;;-1:-1:-1;;;;;;62539:36:0;;;;;;;62603:14;;62351:17;;;-1:-1:-1;62390:16:0;;-1:-1:-1;62302:29:0;62603:25;;62390:16;;62603:25;:::i;:::-;62586:14;:42;62641:56;62665:8;62675:21;62641:23;:56::i;:::-;62708:25;;61886:855;;;;;;:::o;18486:358::-;-1:-1:-1;;;;;18642:43:0;;18597:4;18642:43;;;:25;:43;;;;;;18704:16;18696:63;;;;-1:-1:-1;;;18696:63:0;;35163:2:1;18696:63:0;;;35145:21:1;35202:2;35182:18;;;35175:30;35241:34;35221:18;;;35214:62;-1:-1:-1;;;35292:18:1;;;35285:32;35334:19;;18696:63:0;34961:398:1;41607:389:0;41687:9;41702:10;-1:-1:-1;;;;;41702:15:0;41725:6;41738:4;41702:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41686:61;;;41763:4;41758:231;;41818:16;;-1:-1:-1;;;;;41818:16:0;41784:131;;;;-1:-1:-1;;;41784:131:0;;35776:2:1;41784:131:0;;;35758:21:1;35815:2;35795:18;;;35788:30;35854:32;35834:18;;;35827:60;35904:18;;41784:131:0;35574:354:1;41784:131:0;41930:16;;:47;;-1:-1:-1;;;41930:47:0;;-1:-1:-1;;;;;1513:32:1;;;41930:47:0;;;1495:51:1;41930:16:0;;;;:20;;41958:6;;1468:18:1;;41930:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41675:321;41607:389;;:::o;38441:222::-;38545:44;38557:8;38567:21;38545:11;:44::i;:::-;38605:50;;;15656:25:1;;;-1:-1:-1;;;;;15717:32:1;;15712:2;15697:18;;15690:60;38605:50:0;;15629:18:1;38605:50:0;15482:274:1;13051:118:0;12060:19;:17;:19::i;:::-;13111:7:::1;:14:::0;;-1:-1:-1;;13111:14:0::1;13121:4;13111:14;::::0;;13141:20:::1;13148:12;10648:10:::0;;10568:98;33884:468;33988:18;-1:-1:-1;;;;;34032:27:0;;34024:57;;;;-1:-1:-1;;;34024:57:0;;36135:2:1;34024:57:0;;;36117:21:1;36174:2;36154:18;;;36147:30;-1:-1:-1;;;36193:18:1;;;36186:47;36250:18;;34024:57:0;35933:341:1;34024:57:0;34092:18;-1:-1:-1;;;34092:87:0;;;;34192:24;34238:13;34192:60;;34297:10;34271:5;-1:-1:-1;;;;;34271:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;34263:58;;;;-1:-1:-1;;;34263:58:0;;36481:2:1;34263:58:0;;;36463:21:1;36520:1;36500:18;;;36493:29;-1:-1:-1;;;36538:18:1;;;36531:39;36587:18;;34263:58:0;36279:332:1;20460:342:0;-1:-1:-1;;;;;20544:25:0;;20536:45;;;;-1:-1:-1;;;20536:45:0;;36818:2:1;20536:45:0;;;36800:21:1;36857:1;36837:18;;;36830:29;-1:-1:-1;;;36875:18:1;;;36868:37;36922:18;;20536:45:0;36616:330:1;20536:45:0;20740:1;20699:38;19026:6;20699:15;:38;:::i;:::-;:42;;;;:::i;:::-;-1:-1:-1;;;;;20671:25:0;;;;;;:12;:25;;;;;;;;;:70;;;;20757:37;;22027:51:1;;;20789:4:0;22094:18:1;;;22087:50;;;;20757:37:0;;22000:18:1;20757:37:0;21859:284:1;28212:446:0;28316:24;;28409:23;28399:6;:33;;;;;;;;:::i;:::-;;28395:237;;-1:-1:-1;28453:14:0;28395:237;;;28499:25;28489:6;:35;;;;;;;;:::i;:::-;;28485:147;;-1:-1:-1;28545:16:0;28485:147;;;-1:-1:-1;28598:22:0;28649:1;28212:446;-1:-1:-1;;28212:446:0:o;42697:544::-;42826:7;42846:14;42863:41;42872:8;42882:21;42863:8;:41::i;:::-;42846:58;-1:-1:-1;42923:10:0;-1:-1:-1;;;;;42923:20:0;;;42915:53;;;;-1:-1:-1;;;42915:53:0;;27122:2:1;42915:53:0;;;27104:21:1;27161:2;27141:18;;;27134:30;-1:-1:-1;;;27180:18:1;;;27173:50;27240:18;;42915:53:0;26920:344:1;42915:53:0;43001:161;43038:10;43067:8;43094:21;43142:4;43001:18;:161::i;:::-;42979:230;;;;-1:-1:-1;;;42979:230:0;;27471:2:1;42979:230:0;;;27453:21:1;27510:2;27490:18;;;27483:30;-1:-1:-1;;;27529:18:1;;;27522:49;27588:18;;42979:230:0;27269:343:1;49571:1787:0;49735:7;49851:44;49873:21;49851;:44::i;:::-;:53;;49899:5;49851:53;49847:414;;49971:12;;:90;;-1:-1:-1;;;49971:90:0;;;;;15656:25:1;;;-1:-1:-1;;;;;15717:32:1;;;15697:18;;;15690:60;49922:23:0;;;;49971:12;;;:57;;15629:18:1;;49971:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49921:140;;-1:-1:-1;49921:140:0;-1:-1:-1;50135:1:0;50100:32;49921:140;;50100:32;:::i;:::-;:36;;;:149;;50216:22;:33;;;50100:149;;;50160:32;50179:13;50160:16;:32;:::i;:::-;50076:173;;;;;;;;49847:414;50271:22;50296:85;50326:8;50349:21;50296:15;:85::i;:::-;50271:110;;50393:15;50410:17;50429:14;50447:91;50477:14;50506:21;50447:15;:91::i;:::-;50392:146;;;;;;50549:28;50603:7;-1:-1:-1;;;;;50592:18:0;:7;-1:-1:-1;;;;;50592:18:0;;50588:725;;50709:20;;;50725:4;50709:20;50705:440;;-1:-1:-1;50773:1:0;50588:725;;50705:440;50841:12;;:137;;-1:-1:-1;;;50841:137:0;;;;;15656:25:1;;;-1:-1:-1;;;;;15717:32:1;;;15697:18;;;15690:60;50815:23:0;;50841:12;;:37;;15629:18:1;;50841:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50815:163;;51039:1;51020:16;:20;;;:109;;51104:14;:25;;;51020:109;;;51064:16;51020:109;50997:132;;;;50796:349;50588:725;;;51264:16;:27;:37;;51294:7;;51264:27;;:37;:::i;:::-;51241:60;;;;50588:725;51330:20;49571:1787;-1:-1:-1;;;;;;;;49571:1787:0:o;40119:718::-;40416:15;;;;40303:7;;40450:23;;;;40442:43;;;;-1:-1:-1;;;40442:43:0;;37966:2:1;40442:43:0;;;37948:21:1;38005:1;37985:18;;;37978:29;-1:-1:-1;;;38023:18:1;;;38016:37;38070:18;;40442:43:0;37764:330:1;40442:43:0;40586:44;40598:8;40608:21;40586:11;:44::i;:::-;40641:21;40665:22;40682:5;40665:14;:22;:::i;:::-;40641:46;-1:-1:-1;;40824:5:0;40119:718;-1:-1:-1;;;;;40119:718:0:o;23063:248::-;23175:4;;-1:-1:-1;;;;;23217:45:0;;;;;;:22;:45;;;;;;;;:86;;;;;;;;:::i;:::-;;;;23063:248;-1:-1:-1;;23063:248:0:o;30951:272::-;31084:7;28198:5;31139:41;31156:24;28198:5;31139:41;:::i;:::-;31125:57;;:9;:57;:::i;:::-;31124:91;;;;:::i;15939:191::-;16013:16;16032:6;;-1:-1:-1;;;;;16049:17:0;;;-1:-1:-1;;;;;;16049:17:0;;;;;;16082:40;;16032:6;;;;;;;16082:40;;16013:16;16082:40;16002:128;15939:191;:::o;67110:132::-;67152:7;67172:23;:11;47277:19;;47295:1;47277:19;;;47188:127;67172:23;-1:-1:-1;67213:11:0;47158:14;;67110:132::o;12799:108::-;12526:7;;;;12858:41;;;;-1:-1:-1;;;12858:41:0;;38696:2:1;12858:41:0;;;38678:21:1;38735:2;38715:18;;;38708:30;-1:-1:-1;;;38754:18:1;;;38747:50;38814:18;;12858:41:0;38494:344:1;39272:337:0;-1:-1:-1;;;;;39431:34:0;;39399:29;39431:34;;;:11;:34;;;;;;;;:68;;;;;;;;39127:16;;;;:20;39510:92;;39546:44;39558:8;39568:21;39546:11;:44::i;26399:861::-;-1:-1:-1;;;;;26569:37:0;;26515:15;26569:37;;;:22;:37;;;;;;;;;26621:5;:35;;;;;;;;:::i;:::-;;26617:636;;26830:46;;-1:-1:-1;;;26830:46:0;;;;;160:25:1;;;26767:13:0;;-1:-1:-1;;;;;26830:36:0;;;;;133:18:1;;26830:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26814:62;-1:-1:-1;26617:636:0;;-1:-1:-1;;;26617:636:0;;26907:26;26898:5;:35;;;;;;;;:::i;:::-;;26894:359;;27105:46;;-1:-1:-1;;;27105:46:0;;;;;160:25:1;;;27044:13:0;;-1:-1:-1;;;;;27105:36:0;;;;;133:18:1;;27105:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27091:60;-1:-1:-1;26894:359:0;;-1:-1:-1;;26894:359:0;;27191:50;;-1:-1:-1;;;27191:50:0;;-1:-1:-1;;;;;1513:32:1;;27191:50:0;;;1495:51:1;1468:18;;27191:50:0;1319:233:1;26894:359:0;26537:723;26399:861;;;;:::o;25277:1114::-;-1:-1:-1;;;;;25539:37:0;;25414:15;25539:37;;;:22;:37;;;;;;25414:15;;;;25539:37;;;25591:5;:35;;;;;;;;:::i;:::-;;25587:797;;25806:78;;-1:-1:-1;;;25806:78:0;;;;;160:25:1;;;25737:13:0;;-1:-1:-1;;;;;25806:29:0;;;;;133:18:1;;25806:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25806:78:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25944:17:0;;25784:100;;-1:-1:-1;25914:5:0;;-1:-1:-1;25944:17:0;;;;;;-1:-1:-1;25587:797:0;;-1:-1:-1;;;;;25587:797:0;;25992:26;25983:5;:35;;;;;;;;:::i;:::-;;25979:405;;26211:71;;-1:-1:-1;;;26211:71:0;;;;;160:25:1;;;26129:13:0;;-1:-1:-1;;;;;26211:54:0;;;;;133:18:1;;26211:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26176:106;;-1:-1:-1;26176:106:0;-1:-1:-1;26176:106:0;-1:-1:-1;25979:405:0;;-1:-1:-1;25979:405:0;;26322:50;;-1:-1:-1;;;26322:50:0;;-1:-1:-1;;;;;1513:32:1;;26322:50:0;;;1495:51:1;1468:18;;26322:50:0;1319:233:1;196:131;-1:-1:-1;;;;;271:31:1;;261:42;;251:70;;317:1;314;307:12;332:247;391:6;444:2;432:9;423:7;419:23;415:32;412:52;;;460:1;457;450:12;412:52;499:9;486:23;518:31;543:5;518:31;:::i;584:117::-;669:6;662:5;658:18;651:5;648:29;638:57;;691:1;688;681:12;706:245;764:6;817:2;805:9;796:7;792:23;788:32;785:52;;;833:1;830;823:12;785:52;872:9;859:23;891:30;915:5;891:30;:::i;1557:315::-;1625:6;1633;1686:2;1674:9;1665:7;1661:23;1657:32;1654:52;;;1702:1;1699;1692:12;1654:52;1738:9;1725:23;1715:33;;1798:2;1787:9;1783:18;1770:32;1811:31;1836:5;1811:31;:::i;:::-;1861:5;1851:15;;;1557:315;;;;;:::o;1877:127::-;1938:10;1933:3;1929:20;1926:1;1919:31;1969:4;1966:1;1959:15;1993:4;1990:1;1983:15;2009:253;2081:2;2075:9;2123:4;2111:17;;2158:18;2143:34;;2179:22;;;2140:62;2137:88;;;2205:18;;:::i;:::-;2241:2;2234:22;2009:253;:::o;2267:275::-;2338:2;2332:9;2403:2;2384:13;;-1:-1:-1;;2380:27:1;2368:40;;2438:18;2423:34;;2459:22;;;2420:62;2417:88;;;2485:18;;:::i;:::-;2521:2;2514:22;2267:275;;-1:-1:-1;2267:275:1:o;2547:201::-;2625:4;2658:18;2650:6;2647:30;2644:56;;;2680:18;;:::i;:::-;-1:-1:-1;2725:1:1;2721:14;2737:4;2717:25;;2547:201::o;2753:118::-;2839:5;2832:13;2825:21;2818:5;2815:32;2805:60;;2861:1;2858;2851:12;2876:1557;2996:6;3027:2;3070;3058:9;3049:7;3045:23;3041:32;3038:52;;;3086:1;3083;3076:12;3038:52;3126:9;3113:23;3159:18;3151:6;3148:30;3145:50;;;3191:1;3188;3181:12;3145:50;3214:22;;3267:4;3259:13;;3255:27;-1:-1:-1;3245:55:1;;3296:1;3293;3286:12;3245:55;3332:2;3319:16;3355:78;3371:61;3429:2;3371:61;:::i;:::-;3355:78;:::i;:::-;3467:15;;;3549:1;3545:10;;;;3537:19;;3533:28;;;3498:12;;;;3573:19;;;3570:39;;;3605:1;3602;3595:12;3570:39;3629:11;;;;3649:754;3665:6;3660:3;3657:15;3649:754;;;3747:4;3741:3;3732:7;3728:17;3724:28;3721:118;;;3793:1;3822:2;3818;3811:14;3721:118;3865:22;;:::i;:::-;3928:3;3915:17;3945:33;3970:7;3945:33;:::i;:::-;3991:22;;4062:12;;;4049:26;4033:14;;;4026:50;4099:2;4150:12;;;4137:26;4121:14;;;4114:50;4187:2;4230:12;;;4217:26;4256:30;4217:26;4256:30;:::i;:::-;4306:14;;;4299:31;4343:18;;3691:4;3682:14;;;;;4381:12;;;;3649:754;;;4422:5;2876:1557;-1:-1:-1;;;;;;;2876:1557:1:o;5704:383::-;5781:6;5789;5797;5850:2;5838:9;5829:7;5825:23;5821:32;5818:52;;;5866:1;5863;5856:12;5818:52;5902:9;5889:23;5879:33;;5962:2;5951:9;5947:18;5934:32;5975:31;6000:5;5975:31;:::i;:::-;5704:383;;6025:5;;-1:-1:-1;;;6077:2:1;6062:18;;;;6049:32;;5704:383::o;7221:1550::-;7334:6;7365:2;7408;7396:9;7387:7;7383:23;7379:32;7376:52;;;7424:1;7421;7414:12;7376:52;7464:9;7451:23;7497:18;7489:6;7486:30;7483:50;;;7529:1;7526;7519:12;7483:50;7552:22;;7605:4;7597:13;;7593:27;-1:-1:-1;7583:55:1;;7634:1;7631;7624:12;7583:55;7670:2;7657:16;7693:78;7709:61;7767:2;7709:61;:::i;7693:78::-;7805:15;;;7887:1;7883:10;;;;7875:19;;7871:28;;;7836:12;;;;7911:19;;;7908:39;;;7943:1;7940;7933:12;7908:39;7967:11;;;;7987:754;8003:6;7998:3;7995:15;7987:754;;;8085:4;8079:3;8070:7;8066:17;8062:28;8059:118;;;8131:1;8160:2;8156;8149:14;8059:118;8203:22;;:::i;:::-;8265:3;8252:17;8245:5;8238:32;8328:2;8323:3;8319:12;8306:26;8301:2;8294:5;8290:14;8283:50;8356:2;8408;8403:3;8399:12;8386:26;8425:30;8447:7;8425:30;:::i;:::-;8475:14;;;8468:31;8522:2;8565:12;;;8552:26;8591:33;8552:26;8591:33;:::i;:::-;8644:14;;;8637:31;8681:18;;8029:4;8020:14;;;;;8719:12;;;;7987:754;;8776:155;8856:20;;8905:1;8895:12;;8885:40;;8921:1;8918;8911:12;8885:40;8776:155;;;:::o;8936:217::-;9014:6;9067:2;9055:9;9046:7;9042:23;9038:32;9035:52;;;9083:1;9080;9073:12;9035:52;9106:41;9137:9;9106:41;:::i;9158:350::-;9244:6;9252;9305:2;9293:9;9284:7;9280:23;9276:32;9273:52;;;9321:1;9318;9311:12;9273:52;9360:9;9347:23;9379:30;9403:5;9379:30;:::i;:::-;9428:5;-1:-1:-1;9452:50:1;9498:2;9483:18;;9452:50;:::i;:::-;9442:60;;9158:350;;;;;:::o;9513:315::-;9581:6;9589;9642:2;9630:9;9621:7;9617:23;9613:32;9610:52;;;9658:1;9655;9648:12;9610:52;9697:9;9684:23;9716:31;9741:5;9716:31;:::i;:::-;9766:5;9818:2;9803:18;;;;9790:32;;-1:-1:-1;;;9513:315:1:o;10265:519::-;10348:6;10356;10364;10372;10425:3;10413:9;10404:7;10400:23;10396:33;10393:53;;;10442:1;10439;10432:12;10393:53;10478:9;10465:23;10455:33;;10538:2;10527:9;10523:18;10510:32;10551:31;10576:5;10551:31;:::i;:::-;10601:5;-1:-1:-1;10653:2:1;10638:18;;10625:32;;-1:-1:-1;10709:2:1;10694:18;;10681:32;10722:30;10681:32;10722:30;:::i;:::-;10265:519;;;;-1:-1:-1;10265:519:1;;-1:-1:-1;;10265:519:1:o;10789:413::-;10873:6;10881;10934:2;10922:9;10913:7;10909:23;10905:32;10902:52;;;10950:1;10947;10940:12;10902:52;10989:9;10976:23;11008:31;11033:5;11008:31;:::i;:::-;11058:5;-1:-1:-1;11115:2:1;11100:18;;11087:32;11150:1;11138:14;;11128:42;;11166:1;11163;11156:12;11207:127;11268:10;11263:3;11259:20;11256:1;11249:31;11299:4;11296:1;11289:15;11323:4;11320:1;11313:15;11339:247;11487:2;11472:18;;11520:1;11509:13;;11499:47;;11526:18;;:::i;:::-;11555:25;;;11339:247;:::o;12882:127::-;12943:10;12938:3;12934:20;12931:1;12924:31;12974:4;12971:1;12964:15;12998:4;12995:1;12988:15;13014:128;13081:9;;;13102:11;;;13099:37;;;13116:18;;:::i;13479:345::-;13681:2;13663:21;;;13720:2;13700:18;;;13693:30;-1:-1:-1;;;13754:2:1;13739:18;;13732:51;13815:2;13800:18;;13479:345::o;14970:127::-;15031:10;15026:3;15022:20;15019:1;15012:31;15062:4;15059:1;15052:15;15086:4;15083:1;15076:15;15761:761;16112:25;;;-1:-1:-1;;;;;16211:15:1;;;16206:2;16191:18;;16184:43;16258:2;16243:18;;16236:34;;;;16301:2;16286:18;;16279:34;;;;16350:15;;;16344:3;16329:19;;16322:44;16403:15;;16164:3;16382:19;;16375:44;16456:15;;;16450:3;16435:19;;16428:44;16503:3;16488:19;;16481:35;16099:3;16084:19;;15761:761::o;16527:135::-;16566:3;16587:17;;;16584:43;;16607:18;;:::i;:::-;-1:-1:-1;16654:1:1;16643:13;;16527:135::o;16667:336::-;16869:2;16851:21;;;16908:2;16888:18;;;16881:30;-1:-1:-1;;;16942:2:1;16927:18;;16920:42;16994:2;16979:18;;16667:336::o;17338:273::-;17406:6;17459:2;17447:9;17438:7;17434:23;17430:32;17427:52;;;17475:1;17472;17465:12;17427:52;17507:9;17501:16;17557:4;17550:5;17546:16;17539:5;17536:27;17526:55;;17577:1;17574;17567:12;17957:250;18042:1;18052:113;18066:6;18063:1;18060:13;18052:113;;;18142:11;;;18136:18;18123:11;;;18116:39;18088:2;18081:10;18052:113;;;-1:-1:-1;;18199:1:1;18181:16;;18174:27;17957:250::o;18212:510::-;18266:5;18319:3;18312:4;18304:6;18300:17;18296:27;18286:55;;18337:1;18334;18327:12;18286:55;18366:6;18360:13;18392:18;18388:2;18385:26;18382:52;;;18414:18;;:::i;:::-;18458:55;18501:2;18482:13;;-1:-1:-1;;18478:27:1;18507:4;18474:38;18458:55;:::i;:::-;18538:2;18529:7;18522:19;18584:3;18577:4;18572:2;18564:6;18560:15;18556:26;18553:35;18550:55;;;18601:1;18598;18591:12;18550:55;18614:77;18688:2;18681:4;18672:7;18668:18;18661:4;18653:6;18649:17;18614:77;:::i;18727:337::-;18807:6;18860:2;18848:9;18839:7;18835:23;18831:32;18828:52;;;18876:1;18873;18866:12;18828:52;18909:9;18903:16;18942:18;18934:6;18931:30;18928:50;;;18974:1;18971;18964:12;18928:50;18997:61;19050:7;19041:6;19030:9;19026:22;18997:61;:::i;19069:289::-;19200:3;19238:6;19232:13;19254:66;19313:6;19308:3;19301:4;19293:6;19289:17;19254:66;:::i;:::-;19336:16;;;;;19069:289;-1:-1:-1;;19069:289:1:o;21524:330::-;21726:2;21708:21;;;21765:1;21745:18;;;21738:29;-1:-1:-1;;;21798:2:1;21783:18;;21776:37;21845:2;21830:18;;21524:330::o;22849:201::-;22887:3;22915:10;22960:2;22953:5;22949:14;22987:2;22978:7;22975:15;22972:41;;22993:18;;:::i;:::-;23042:1;23029:15;;22849:201;-1:-1:-1;;;22849:201:1:o;24090:413::-;24289:2;24274:18;;24322:1;24311:13;;24301:47;;24328:18;;:::i;:::-;24357:25;;;24430:6;24418:19;;;;24413:2;24398:18;;24391:47;24481:14;24474:22;24469:2;24454:18;;;24447:50;24090:413;:::o;30153:184::-;30223:6;30276:2;30264:9;30255:7;30251:23;30247:32;30244:52;;;30292:1;30289;30282:12;30244:52;-1:-1:-1;30315:16:1;;30153:184;-1:-1:-1;30153:184:1:o;31024:251::-;31094:6;31147:2;31135:9;31126:7;31122:23;31118:32;31115:52;;;31163:1;31160;31153:12;31115:52;31195:9;31189:16;31214:31;31239:5;31214:31;:::i;31962:125::-;32027:9;;;32048:10;;;32045:36;;;32061:18;;:::i;34331:245::-;34398:6;34451:2;34439:9;34430:7;34426:23;34422:32;34419:52;;;34467:1;34464;34457:12;34419:52;34499:9;34493:16;34518:28;34540:5;34518:28;:::i;36951:381::-;37028:6;37036;37089:2;37077:9;37068:7;37064:23;37060:32;37057:52;;;37105:1;37102;37095:12;37057:52;37137:9;37131:16;37156:30;37180:5;37156:30;:::i;:::-;37255:2;37240:18;;37234:25;37205:5;;-1:-1:-1;37268:32:1;37234:25;37268:32;:::i;37337:168::-;37404:6;37430:10;;;37442;;;37426:27;;37465:11;;;37462:37;;;37479:18;;:::i;37510:249::-;37579:6;37632:2;37620:9;37611:7;37607:23;37603:32;37600:52;;;37648:1;37645;37638:12;37600:52;37680:9;37674:16;37699:30;37723:5;37699:30;:::i;38099:168::-;38139:7;38205:1;38201;38197:6;38193:14;38190:1;38187:21;38182:1;38175:9;38168:17;38164:45;38161:71;;;38212:18;;:::i;:::-;-1:-1:-1;38252:9:1;;38099:168::o;38272:217::-;38312:1;38338;38328:132;;38382:10;38377:3;38373:20;38370:1;38363:31;38417:4;38414:1;38407:15;38445:4;38442:1;38435:15;38328:132;-1:-1:-1;38474:9:1;;38272:217::o;38843:167::-;38921:13;;38974:10;38963:22;;38953:33;;38943:61;;39000:1;38997;38990:12;39015:328;39102:6;39110;39118;39171:2;39159:9;39150:7;39146:23;39142:32;39139:52;;;39187:1;39184;39177:12;39139:52;39216:9;39210:16;39200:26;;39245:48;39289:2;39278:9;39274:18;39245:48;:::i;:::-;39235:58;;39333:2;39322:9;39318:18;39312:25;39302:35;;39015:328;;;;;:::o;39348:267::-;39426:6;39434;39487:2;39475:9;39466:7;39462:23;39458:32;39455:52;;;39503:1;39500;39493:12;39455:52;39526:39;39555:9;39526:39;:::i;:::-;39516:49;;39605:2;39594:9;39590:18;39584:25;39574:35;;39348:267;;;;;:::o;39620:756::-;39743:6;39751;39759;39767;39775;39783;39836:3;39824:9;39815:7;39811:23;39807:33;39804:53;;;39853:1;39850;39843:12;39804:53;39882:9;39876:16;39866:26;;39911:48;39955:2;39944:9;39940:18;39911:48;:::i;:::-;39901:58;;39978:48;40022:2;40011:9;40007:18;39978:48;:::i;:::-;39968:58;;40066:2;40055:9;40051:18;40045:25;40035:35;;40113:3;40102:9;40098:19;40092:26;40127:31;40152:5;40127:31;:::i;:::-;40226:3;40211:19;;40205:26;40177:5;;-1:-1:-1;40254:18:1;40243:30;;40240:50;;;40286:1;40283;40276:12;40240:50;40309:61;40362:7;40353:6;40342:9;40338:22;40309:61;:::i;:::-;40299:71;;;39620:756;;;;;;;;:::o;40381:511::-;40465:6;40473;40481;40534:2;40522:9;40513:7;40509:23;40505:32;40502:52;;;40550:1;40547;40540:12;40502:52;40582:9;40576:16;40601:31;40626:5;40601:31;:::i;:::-;40701:2;40686:18;;40680:25;40651:5;;-1:-1:-1;40714:30:1;40680:25;40714:30;:::i;:::-;40815:2;40800:18;;40794:25;40763:7;;-1:-1:-1;40828:32:1;40794:25;40828:32;:::i;:::-;40879:7;40869:17;;;40381:511;;;;;:::o
Swarm Source
ipfs://d7c38cbad5ad17b49ea6948f1562d9edb92c34b863a5a6774ff9592c3b4a1066
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $2,677.62 | 12.7017 | $34,010.31 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.