Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 63,622 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Pause | 21380438 | 46 days ago | IN | 0 ETH | 0.00100032 | ||||
Buy Next Step | 21325845 | 54 days ago | IN | 0.9 ETH | 0.00461965 | ||||
Buy Next Step | 21325843 | 54 days ago | IN | 0.8 ETH | 0.00467092 | ||||
Buy Next Step | 21325830 | 54 days ago | IN | 0.7 ETH | 0.00512406 | ||||
Admin Reject Edi... | 21071859 | 89 days ago | IN | 0 ETH | 0.00090806 | ||||
Admin Reject Edi... | 21071857 | 89 days ago | IN | 0 ETH | 0.00090759 | ||||
Admin Reject Edi... | 21071845 | 89 days ago | IN | 0 ETH | 0.00085281 | ||||
Admin Reject Edi... | 21071844 | 89 days ago | IN | 0 ETH | 0.00085811 | ||||
Admin Reject Edi... | 21071842 | 89 days ago | IN | 0 ETH | 0.00078133 | ||||
Admin Reject Edi... | 21071832 | 89 days ago | IN | 0 ETH | 0.00077952 | ||||
Admin Reject Edi... | 21071830 | 89 days ago | IN | 0 ETH | 0.00081227 | ||||
Admin Reject Edi... | 21071828 | 89 days ago | IN | 0 ETH | 0.00076095 | ||||
Admin Reject Edi... | 21071826 | 89 days ago | IN | 0 ETH | 0.00076199 | ||||
Admin Reject Edi... | 21071819 | 89 days ago | IN | 0 ETH | 0.00077062 | ||||
Result Reserve A... | 21064599 | 90 days ago | IN | 0 ETH | 0.00174297 | ||||
Result Reserve A... | 21064572 | 90 days ago | IN | 0 ETH | 0.00137787 | ||||
Result Reserve A... | 21064569 | 90 days ago | IN | 0 ETH | 0.00137648 | ||||
Result Reserve A... | 21064564 | 90 days ago | IN | 0 ETH | 0.00161439 | ||||
Result Reserve A... | 21064561 | 90 days ago | IN | 0 ETH | 0.00138721 | ||||
Result Reserve A... | 21064559 | 90 days ago | IN | 0 ETH | 0.00139815 | ||||
Result Reserve A... | 21064555 | 90 days ago | IN | 0 ETH | 0.00148347 | ||||
Result Reserve A... | 21064550 | 90 days ago | IN | 0 ETH | 0.00148914 | ||||
Result Reserve A... | 21064538 | 90 days ago | IN | 0 ETH | 0.00133674 | ||||
Result Reserve A... | 21064534 | 90 days ago | IN | 0 ETH | 0.0013551 | ||||
Result Reserve A... | 21064518 | 90 days ago | IN | 0 ETH | 0.00174136 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21325845 | 54 days ago | 0.055 ETH | ||||
21325845 | 54 days ago | 0.845 ETH | ||||
21325843 | 54 days ago | 0.045 ETH | ||||
21325843 | 54 days ago | 0.755 ETH | ||||
21325830 | 54 days ago | 0.035 ETH | ||||
21325830 | 54 days ago | 0.665 ETH | ||||
21071859 | 89 days ago | 0.027 ETH | ||||
21071857 | 89 days ago | 0.03 ETH | ||||
21071845 | 89 days ago | 0.05 ETH | ||||
21071844 | 89 days ago | 0.05 ETH | ||||
21071842 | 89 days ago | 0.1 ETH | ||||
21071832 | 89 days ago | 0.051 ETH | ||||
21071830 | 89 days ago | 0.077 ETH | ||||
21071828 | 89 days ago | 0.08 ETH | ||||
21071826 | 89 days ago | 0.1 ETH | ||||
21071819 | 89 days ago | 0.1 ETH | ||||
21064599 | 90 days ago | 0.05 ETH | ||||
21064572 | 90 days ago | 0.1 ETH | ||||
21064569 | 90 days ago | 0.1 ETH | ||||
21064564 | 90 days ago | 0.1 ETH | ||||
21064561 | 90 days ago | 0.11 ETH | ||||
21064559 | 90 days ago | 0.11 ETH | ||||
21064555 | 90 days ago | 0.111 ETH | ||||
21064550 | 90 days ago | 0.15 ETH | ||||
21064538 | 90 days ago | 0.15 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
KODAV3PrimaryMarketplace
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-25 */ // File: contracts/access/IKOAccessControlsLookup.sol // SPDX-License-Identifier: MIT pragma solidity 0.8.4; interface IKOAccessControlsLookup { function hasAdminRole(address _address) external view returns (bool); function isVerifiedArtist(uint256 _index, address _account, bytes32[] calldata _merkleProof) external view returns (bool); function isVerifiedArtistProxy(address _artist, address _proxy) external view returns (bool); function hasLegacyMinterRole(address _address) external view returns (bool); function hasContractRole(address _address) external view returns (bool); function hasContractOrAdminRole(address _address) external view returns (bool); } // File: @openzeppelin/contracts/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 pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: contracts/core/IERC2309.sol pragma solidity 0.8.4; /** @title ERC-2309: ERC-721 Batch Mint Extension @dev https://github.com/ethereum/EIPs/issues/2309 */ interface IERC2309 { /** @notice This event is emitted when ownership of a batch of tokens changes by any mechanism. This includes minting, transferring, and burning. @dev The address executing the transaction MUST own all the tokens within the range of fromTokenId and toTokenId, or MUST be an approved operator to act on the owners behalf. The fromTokenId and toTokenId MUST be a sequential range of tokens IDs. When minting/creating tokens, the `fromAddress` argument MUST be set to `0x0` (i.e. zero address). When burning/destroying tokens, the `toAddress` argument MUST be set to `0x0` (i.e. zero address). @param fromTokenId The token ID that begins the batch of tokens being transferred @param toTokenId The token ID that ends the batch of tokens being transferred @param fromAddress The address transferring ownership of the specified range of tokens @param toAddress The address receiving ownership of the specified range of tokens. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed fromAddress, address indexed toAddress); } // File: contracts/core/IERC2981.sol pragma solidity 0.8.4; /// @notice This is purely an extension for the KO platform /// @notice Royalties on KO are defined at an edition level for all tokens from the same edition interface IERC2981EditionExtension { /// @notice Does the edition have any royalties defined function hasRoyalties(uint256 _editionId) external view returns (bool); /// @notice Get the royalty receiver - all royalties should be sent to this account if not zero address function getRoyaltiesReceiver(uint256 _editionId) external view returns (address); } /** * ERC2981 standards interface for royalties */ interface IERC2981 is IERC165, IERC2981EditionExtension { /// ERC165 bytes to add to interface array - set in parent contract /// implementing this standard /// /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; /// _registerInterface(_INTERFACE_ID_ERC2981); /// @notice Called with the sale price to determine how much royalty // is owed and to whom. /// @param _tokenId - the NFT asset queried for royalty information /// @param _value - the sale price of the NFT asset specified by _tokenId /// @return _receiver - address of who should be sent the royalty payment /// @return _royaltyAmount - the royalty payment amount for _value sale price function royaltyInfo( uint256 _tokenId, uint256 _value ) external view returns ( address _receiver, uint256 _royaltyAmount ); } // File: contracts/core/IHasSecondarySaleFees.sol pragma solidity 0.8.4; /// @title Royalties formats required for use on the Rarible platform /// @dev https://docs.rarible.com/asset/royalties-schema interface IHasSecondarySaleFees is IERC165 { event SecondarySaleFees(uint256 tokenId, address[] recipients, uint[] bps); function getFeeRecipients(uint256 id) external returns (address payable[] memory); function getFeeBps(uint256 id) external returns (uint[] memory); } // File: contracts/core/IKODAV3.sol pragma solidity 0.8.4; /// @title Core KODA V3 functionality interface IKODAV3 is IERC165, // Contract introspection IERC721, // Core NFTs IERC2309, // Consecutive batch mint IERC2981, // Royalties IHasSecondarySaleFees // Rariable / Foundation royalties { // edition utils function getCreatorOfEdition(uint256 _editionId) external view returns (address _originalCreator); function getCreatorOfToken(uint256 _tokenId) external view returns (address _originalCreator); function getSizeOfEdition(uint256 _editionId) external view returns (uint256 _size); function getEditionSizeOfToken(uint256 _tokenId) external view returns (uint256 _size); function editionExists(uint256 _editionId) external view returns (bool); // Has the edition been disabled / soft burnt function isEditionSalesDisabled(uint256 _editionId) external view returns (bool); // Has the edition been disabled / soft burnt OR sold out function isSalesDisabledOrSoldOut(uint256 _editionId) external view returns (bool); // Work out the max token ID for an edition ID function maxTokenIdOfEdition(uint256 _editionId) external view returns (uint256 _tokenId); // Helper method for getting the next primary sale token from an edition starting low to high token IDs function getNextAvailablePrimarySaleToken(uint256 _editionId) external returns (uint256 _tokenId); // Helper method for getting the next primary sale token from an edition starting high to low token IDs function getReverseAvailablePrimarySaleToken(uint256 _editionId) external view returns (uint256 _tokenId); // Utility method to get all data needed for the next primary sale, low token ID to high function facilitateNextPrimarySale(uint256 _editionId) external returns (address _receiver, address _creator, uint256 _tokenId); // Utility method to get all data needed for the next primary sale, high token ID to low function facilitateReversePrimarySale(uint256 _editionId) external returns (address _receiver, address _creator, uint256 _tokenId); // Expanded royalty method for the edition, not token function royaltyAndCreatorInfo(uint256 _editionId, uint256 _value) external returns (address _receiver, address _creator, uint256 _amount); // Allows the creator to correct mistakes until the first token from an edition is sold function updateURIIfNoSaleMade(uint256 _editionId, string calldata _newURI) external; // Has any primary transfer happened from an edition function hasMadePrimarySale(uint256 _editionId) external view returns (bool); // Has the edition sold out function isEditionSoldOut(uint256 _editionId) external view returns (bool); // Toggle on/off the edition from being able to make sales function toggleEditionSalesDisabled(uint256 _editionId) external; // token utils function exists(uint256 _tokenId) external view returns (bool); function getEditionIdOfToken(uint256 _tokenId) external pure returns (uint256 _editionId); function getEditionDetails(uint256 _tokenId) external view returns (address _originalCreator, address _owner, uint16 _size, uint256 _editionId, string memory _uri); function hadPrimarySaleOfToken(uint256 _tokenId) external view returns (bool); } // File: contracts/marketplace/IKODAV3Marketplace.sol pragma solidity 0.8.4; interface IBuyNowMarketplace { event ListedForBuyNow(uint256 indexed _id, uint256 _price, address _currentOwner, uint256 _startDate); event BuyNowPriceChanged(uint256 indexed _id, uint256 _price); event BuyNowDeListed(uint256 indexed _id); event BuyNowPurchased(uint256 indexed _tokenId, address _buyer, address _currentOwner, uint256 _price); function listForBuyNow(address _creator, uint256 _id, uint128 _listingPrice, uint128 _startDate) external; function buyEditionToken(uint256 _id) external payable; function buyEditionTokenFor(uint256 _id, address _recipient) external payable; function setBuyNowPriceListing(uint256 _editionId, uint128 _listingPrice) external; } interface IEditionOffersMarketplace { event EditionAcceptingOffer(uint256 indexed _editionId, uint128 _startDate); event EditionBidPlaced(uint256 indexed _editionId, address _bidder, uint256 _amount); event EditionBidWithdrawn(uint256 indexed _editionId, address _bidder); event EditionBidAccepted(uint256 indexed _editionId, uint256 indexed _tokenId, address _bidder, uint256 _amount); event EditionBidRejected(uint256 indexed _editionId, address _bidder, uint256 _amount); event EditionConvertedFromOffersToBuyItNow(uint256 _editionId, uint128 _price, uint128 _startDate); function enableEditionOffers(uint256 _editionId, uint128 _startDate) external; function placeEditionBid(uint256 _editionId) external payable; function placeEditionBidFor(uint256 _editionId, address _bidder) external payable; function withdrawEditionBid(uint256 _editionId) external; function rejectEditionBid(uint256 _editionId) external; function acceptEditionBid(uint256 _editionId, uint256 _offerPrice) external; function convertOffersToBuyItNow(uint256 _editionId, uint128 _listingPrice, uint128 _startDate) external; } interface IEditionSteppedMarketplace { event EditionSteppedSaleListed(uint256 indexed _editionId, uint128 _basePrice, uint128 _stepPrice, uint128 _startDate); event EditionSteppedSaleBuy(uint256 indexed _editionId, uint256 indexed _tokenId, address _buyer, uint256 _price, uint16 _currentStep); event EditionSteppedAuctionUpdated(uint256 indexed _editionId, uint128 _basePrice, uint128 _stepPrice); function listSteppedEditionAuction(address _creator, uint256 _editionId, uint128 _basePrice, uint128 _stepPrice, uint128 _startDate) external; function buyNextStep(uint256 _editionId) external payable; function buyNextStepFor(uint256 _editionId, address _buyer) external payable; function convertSteppedAuctionToListing(uint256 _editionId, uint128 _listingPrice, uint128 _startDate) external; function convertSteppedAuctionToOffers(uint256 _editionId, uint128 _startDate) external; function updateSteppedAuction(uint256 _editionId, uint128 _basePrice, uint128 _stepPrice) external; } interface IReserveAuctionMarketplace { event ListedForReserveAuction(uint256 indexed _id, uint256 _reservePrice, uint128 _startDate); event BidPlacedOnReserveAuction(uint256 indexed _id, address _currentOwner, address _bidder, uint256 _amount, uint256 _originalBiddingEnd, uint256 _currentBiddingEnd); event ReserveAuctionResulted(uint256 indexed _id, uint256 _finalPrice, address _currentOwner, address _winner, address _resulter); event BidWithdrawnFromReserveAuction(uint256 _id, address _bidder, uint128 _bid); event ReservePriceUpdated(uint256 indexed _id, uint256 _reservePrice); event ReserveAuctionConvertedToBuyItNow(uint256 indexed _id, uint128 _listingPrice, uint128 _startDate); event EmergencyBidWithdrawFromReserveAuction(uint256 indexed _id, address _bidder, uint128 _bid); function placeBidOnReserveAuction(uint256 _id) external payable; function placeBidOnReserveAuctionFor(uint256 _id, address _bidder) external payable; function listForReserveAuction(address _creator, uint256 _id, uint128 _reservePrice, uint128 _startDate) external; function resultReserveAuction(uint256 _id) external; function withdrawBidFromReserveAuction(uint256 _id) external; function updateReservePriceForReserveAuction(uint256 _id, uint128 _reservePrice) external; function emergencyExitBidFromReserveAuction(uint256 _id) external; } interface IKODAV3PrimarySaleMarketplace is IEditionSteppedMarketplace, IEditionOffersMarketplace, IBuyNowMarketplace, IReserveAuctionMarketplace { function convertReserveAuctionToBuyItNow(uint256 _editionId, uint128 _listingPrice, uint128 _startDate) external; function convertReserveAuctionToOffers(uint256 _editionId, uint128 _startDate) external; } interface ITokenBuyNowMarketplace { event TokenDeListed(uint256 indexed _tokenId); function delistToken(uint256 _tokenId) external; } interface ITokenOffersMarketplace { event TokenBidPlaced(uint256 indexed _tokenId, address _currentOwner, address _bidder, uint256 _amount); event TokenBidAccepted(uint256 indexed _tokenId, address _currentOwner, address _bidder, uint256 _amount); event TokenBidRejected(uint256 indexed _tokenId, address _currentOwner, address _bidder, uint256 _amount); event TokenBidWithdrawn(uint256 indexed _tokenId, address _bidder); function acceptTokenBid(uint256 _tokenId, uint256 _offerPrice) external; function rejectTokenBid(uint256 _tokenId) external; function withdrawTokenBid(uint256 _tokenId) external; function placeTokenBid(uint256 _tokenId) external payable; function placeTokenBidFor(uint256 _tokenId, address _bidder) external payable; } interface IBuyNowSecondaryMarketplace { function listTokenForBuyNow(uint256 _tokenId, uint128 _listingPrice, uint128 _startDate) external; } interface IEditionOffersSecondaryMarketplace { event EditionBidPlaced(uint256 indexed _editionId, address indexed _bidder, uint256 _bid); event EditionBidWithdrawn(uint256 indexed _editionId, address _bidder); event EditionBidAccepted(uint256 indexed _tokenId, address _currentOwner, address _bidder, uint256 _amount); function placeEditionBid(uint256 _editionId) external payable; function placeEditionBidFor(uint256 _editionId, address _bidder) external payable; function withdrawEditionBid(uint256 _editionId) external; function acceptEditionBid(uint256 _tokenId, uint256 _offerPrice) external; } interface IKODAV3SecondarySaleMarketplace is ITokenBuyNowMarketplace, ITokenOffersMarketplace, IEditionOffersSecondaryMarketplace, IBuyNowSecondaryMarketplace { function convertReserveAuctionToBuyItNow(uint256 _tokenId, uint128 _listingPrice, uint128 _startDate) external; function convertReserveAuctionToOffers(uint256 _tokenId) external; } // File: @openzeppelin/contracts/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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/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 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 Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { 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/token/ERC20/IERC20.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: contracts/marketplace/BaseMarketplace.sol pragma solidity 0.8.4; /// @notice Core logic and state shared between both marketplaces abstract contract BaseMarketplace is ReentrancyGuard, Pausable { event AdminUpdateModulo(uint256 _modulo); event AdminUpdateMinBidAmount(uint256 _minBidAmount); event AdminUpdateAccessControls(IKOAccessControlsLookup indexed _oldAddress, IKOAccessControlsLookup indexed _newAddress); event AdminUpdatePlatformPrimarySaleCommission(uint256 _platformPrimarySaleCommission); event AdminUpdateBidLockupPeriod(uint256 _bidLockupPeriod); event AdminUpdatePlatformAccount(address indexed _oldAddress, address indexed _newAddress); event AdminRecoverERC20(IERC20 indexed _token, address indexed _recipient, uint256 _amount); event AdminRecoverETH(address payable indexed _recipient, uint256 _amount); event BidderRefunded(uint256 indexed _id, address _bidder, uint256 _bid, address _newBidder, uint256 _newOffer); event BidderRefundedFailed(uint256 indexed _id, address _bidder, uint256 _bid, address _newBidder, uint256 _newOffer); // Only a whitelisted smart contract in the access controls contract modifier onlyContract() { _onlyContract(); _; } function _onlyContract() private view { require(accessControls.hasContractRole(_msgSender()), "Caller not contract"); } // Only admin defined in the access controls contract modifier onlyAdmin() { _onlyAdmin(); _; } function _onlyAdmin() private view { require(accessControls.hasAdminRole(_msgSender()), "Caller not admin"); } /// @notice Address of the access control contract IKOAccessControlsLookup public accessControls; /// @notice KODA V3 token IKODAV3 public koda; /// @notice platform funds collector address public platformAccount; /// @notice precision 100.00000% uint256 public modulo = 100_00000; /// @notice Minimum bid / minimum list amount uint256 public minBidAmount = 0.01 ether; /// @notice Bid lockup period uint256 public bidLockupPeriod = 6 hours; constructor(IKOAccessControlsLookup _accessControls, IKODAV3 _koda, address _platformAccount) { koda = _koda; accessControls = _accessControls; platformAccount = _platformAccount; } function recoverERC20(IERC20 _token, address _recipient, uint256 _amount) public onlyAdmin { _token.transfer(_recipient, _amount); emit AdminRecoverERC20(_token, _recipient, _amount); } function recoverStuckETH(address payable _recipient, uint256 _amount) public onlyAdmin { (bool success,) = _recipient.call{value : _amount}(""); require(success, "Unable to send recipient ETH"); emit AdminRecoverETH(_recipient, _amount); } function updateAccessControls(IKOAccessControlsLookup _accessControls) public onlyAdmin { require(_accessControls.hasAdminRole(_msgSender()), "Sender must have admin role in new contract"); emit AdminUpdateAccessControls(accessControls, _accessControls); accessControls = _accessControls; } function updateModulo(uint256 _modulo) public onlyAdmin { require(_modulo > 0, "Modulo point cannot be zero"); modulo = _modulo; emit AdminUpdateModulo(_modulo); } function updateMinBidAmount(uint256 _minBidAmount) public onlyAdmin { minBidAmount = _minBidAmount; emit AdminUpdateMinBidAmount(_minBidAmount); } function updateBidLockupPeriod(uint256 _bidLockupPeriod) public onlyAdmin { bidLockupPeriod = _bidLockupPeriod; emit AdminUpdateBidLockupPeriod(_bidLockupPeriod); } function updatePlatformAccount(address _newPlatformAccount) public onlyAdmin { emit AdminUpdatePlatformAccount(platformAccount, _newPlatformAccount); platformAccount = _newPlatformAccount; } function pause() public onlyAdmin { super._pause(); } function unpause() public onlyAdmin { super._unpause(); } function _getLockupTime() internal view returns (uint256 lockupUntil) { lockupUntil = block.timestamp + bidLockupPeriod; } function _refundBidder(uint256 _id, address _receiver, uint256 _paymentAmount, address _newBidder, uint256 _newOffer) internal { (bool success,) = _receiver.call{value : _paymentAmount}(""); if (!success) { emit BidderRefundedFailed(_id, _receiver, _paymentAmount, _newBidder, _newOffer); } else { emit BidderRefunded(_id, _receiver, _paymentAmount, _newBidder, _newOffer); } } /// @dev This allows the processing of a marketplace sale to be delegated higher up the inheritance hierarchy function _processSale( uint256 _id, uint256 _paymentAmount, address _buyer, address _seller ) internal virtual returns (uint256); /// @dev This allows an auction mechanic to ask a marketplace if a new listing is permitted i.e. this could be false if the edition or token is already listed under a different mechanic function _isListingPermitted(uint256 _id) internal virtual returns (bool); } // File: contracts/marketplace/BuyNowMarketplace.sol pragma solidity 0.8.4; // "buy now" sale flow abstract contract BuyNowMarketplace is IBuyNowMarketplace, BaseMarketplace { // Buy now listing definition struct Listing { uint128 price; uint128 startDate; address seller; } /// @notice Edition or Token ID to Listing mapping(uint256 => Listing) public editionOrTokenListings; // list edition with "buy now" price and start date function listForBuyNow(address _seller, uint256 _id, uint128 _listingPrice, uint128 _startDate) public override whenNotPaused { require(_isListingPermitted(_id), "Listing is not permitted"); require(_isBuyNowListingPermitted(_id), "Buy now listing invalid"); require(_listingPrice >= minBidAmount, "Listing price not enough"); // Store listing data editionOrTokenListings[_id] = Listing(_listingPrice, _startDate, _seller); emit ListedForBuyNow(_id, _listingPrice, _seller, _startDate); } // Buy an token from the edition on the primary market function buyEditionToken(uint256 _id) public override payable whenNotPaused nonReentrant { _facilitateBuyNow(_id, _msgSender()); } // Buy an token from the edition on the primary market, ability to define the recipient function buyEditionTokenFor(uint256 _id, address _recipient) public override payable whenNotPaused nonReentrant { _facilitateBuyNow(_id, _recipient); } // update the "buy now" price function setBuyNowPriceListing(uint256 _id, uint128 _listingPrice) public override whenNotPaused { require( editionOrTokenListings[_id].seller == _msgSender() || accessControls.isVerifiedArtistProxy(editionOrTokenListings[_id].seller, _msgSender()), "Only seller can change price" ); // Set price editionOrTokenListings[_id].price = _listingPrice; // Emit event emit BuyNowPriceChanged(_id, _listingPrice); } function _facilitateBuyNow(uint256 _id, address _recipient) internal { Listing storage listing = editionOrTokenListings[_id]; require(address(0) != listing.seller, "No listing found"); require(msg.value >= listing.price, "List price not satisfied"); require(block.timestamp >= listing.startDate, "List not available yet"); uint256 tokenId = _processSale(_id, msg.value, _recipient, listing.seller); emit BuyNowPurchased(tokenId, _recipient, listing.seller, msg.value); } function _isBuyNowListingPermitted(uint256 _id) internal virtual returns (bool); } // File: contracts/marketplace/ReserveAuctionMarketplace.sol pragma solidity 0.8.4; abstract contract ReserveAuctionMarketplace is IReserveAuctionMarketplace, BaseMarketplace { event AdminUpdateReserveAuctionBidExtensionWindow(uint128 _reserveAuctionBidExtensionWindow); event AdminUpdateReserveAuctionLengthOnceReserveMet(uint128 _reserveAuctionLengthOnceReserveMet); // Reserve auction definition struct ReserveAuction { address seller; address bidder; uint128 reservePrice; uint128 bid; uint128 startDate; uint128 biddingEnd; } /// @notice 1 of 1 edition ID to reserve auction definition mapping(uint256 => ReserveAuction) public editionOrTokenWithReserveAuctions; /// @notice A reserve auction will be extended by this amount of time if a bid is received near the end uint128 public reserveAuctionBidExtensionWindow = 15 minutes; /// @notice Length that bidding window remains open once the reserve price for an auction has been met uint128 public reserveAuctionLengthOnceReserveMet = 24 hours; function listForReserveAuction( address _creator, uint256 _id, uint128 _reservePrice, uint128 _startDate ) public override whenNotPaused { require(_isListingPermitted(_id), "Listing not permitted"); require(_isReserveListingPermitted(_id), "Reserve listing not permitted"); require(_reservePrice >= minBidAmount, "Reserve price must be at least min bid"); editionOrTokenWithReserveAuctions[_id] = ReserveAuction({ seller : _creator, bidder : address(0), reservePrice : _reservePrice, startDate : _startDate, biddingEnd : 0, bid : 0 }); emit ListedForReserveAuction(_id, _reservePrice, _startDate); } function placeBidOnReserveAuction(uint256 _id) public override payable whenNotPaused nonReentrant { _placeBidOnReserveAuction(_id, _msgSender()); } function placeBidOnReserveAuctionFor(uint256 _id, address _bidder) public override payable whenNotPaused nonReentrant { _placeBidOnReserveAuction(_id, _bidder); } function _placeBidOnReserveAuction(uint256 _id, address _bidder) internal { ReserveAuction storage reserveAuction = editionOrTokenWithReserveAuctions[_id]; require(reserveAuction.reservePrice > 0, "Not set up for reserve auction"); require(block.timestamp >= reserveAuction.startDate, "Not accepting bids yet"); require(msg.value >= reserveAuction.bid + minBidAmount, "You have not exceeded previous bid by min bid amount"); uint128 originalBiddingEnd = reserveAuction.biddingEnd; // If the reserve has been met, then bidding will end in 24 hours // if we are near the end, we have bids, then extend the bidding end bool isCountDownTriggered = originalBiddingEnd > 0; if (msg.value >= reserveAuction.reservePrice && !isCountDownTriggered) { reserveAuction.biddingEnd = uint128(block.timestamp) + reserveAuctionLengthOnceReserveMet; } else if (isCountDownTriggered) { // if a bid has been placed, then we will have a bidding end timestamp // and we need to ensure no one can bid beyond this require(block.timestamp < originalBiddingEnd, "No longer accepting bids"); uint128 secondsUntilBiddingEnd = originalBiddingEnd - uint128(block.timestamp); // If bid received with in the extension window, extend bidding end if (secondsUntilBiddingEnd <= reserveAuctionBidExtensionWindow) { reserveAuction.biddingEnd = reserveAuction.biddingEnd + reserveAuctionBidExtensionWindow; } } // if someone else has previously bid, there is a bid we need to refund if (reserveAuction.bid > 0) { _refundBidder(_id, reserveAuction.bidder, reserveAuction.bid, _bidder, msg.value); } reserveAuction.bid = uint128(msg.value); reserveAuction.bidder = _bidder; emit BidPlacedOnReserveAuction(_id, reserveAuction.seller, _bidder, msg.value, originalBiddingEnd, reserveAuction.biddingEnd); } function resultReserveAuction(uint256 _id) public override whenNotPaused nonReentrant { ReserveAuction storage reserveAuction = editionOrTokenWithReserveAuctions[_id]; require(reserveAuction.reservePrice > 0, "No active auction"); require(reserveAuction.bid >= reserveAuction.reservePrice, "Reserve not met"); require(block.timestamp > reserveAuction.biddingEnd, "Bidding has not yet ended"); // N:B. anyone can result the action as only the winner and seller are compensated address winner = reserveAuction.bidder; address seller = reserveAuction.seller; uint256 winningBid = reserveAuction.bid; delete editionOrTokenWithReserveAuctions[_id]; _processSale(_id, winningBid, winner, seller); emit ReserveAuctionResulted(_id, winningBid, seller, winner, _msgSender()); } // Only permit bid withdrawals if reserve not met function withdrawBidFromReserveAuction(uint256 _id) public override whenNotPaused nonReentrant { ReserveAuction storage reserveAuction = editionOrTokenWithReserveAuctions[_id]; require(reserveAuction.reservePrice > 0, "No reserve auction in flight"); require(reserveAuction.bid < reserveAuction.reservePrice, "Bids can only be withdrawn if reserve not met"); require(reserveAuction.bidder == _msgSender(), "Only the bidder can withdraw their bid"); uint256 bidToRefund = reserveAuction.bid; _refundBidder(_id, reserveAuction.bidder, bidToRefund, address(0), 0); reserveAuction.bidder = address(0); reserveAuction.bid = 0; emit BidWithdrawnFromReserveAuction(_id, _msgSender(), uint128(bidToRefund)); } // can only do this if the reserve has not been met function updateReservePriceForReserveAuction(uint256 _id, uint128 _reservePrice) public override whenNotPaused nonReentrant { ReserveAuction storage reserveAuction = editionOrTokenWithReserveAuctions[_id]; require( reserveAuction.seller == _msgSender() || accessControls.isVerifiedArtistProxy(reserveAuction.seller, _msgSender()), "Not the seller" ); require(reserveAuction.biddingEnd == 0, "Reserve countdown commenced"); require(_reservePrice >= minBidAmount, "Reserve must be at least min bid"); // Trigger countdown if new reserve price is greater than any current bids if (reserveAuction.bid >= _reservePrice) { reserveAuction.biddingEnd = uint128(block.timestamp) + reserveAuctionLengthOnceReserveMet; } reserveAuction.reservePrice = _reservePrice; emit ReservePriceUpdated(_id, _reservePrice); } function emergencyExitBidFromReserveAuction(uint256 _id) public override whenNotPaused nonReentrant { ReserveAuction storage reserveAuction = editionOrTokenWithReserveAuctions[_id]; require(reserveAuction.bid > 0, "No bid in flight"); require(_hasReserveListingBeenInvalidated(_id), "Bid cannot be withdrawn as reserve auction listing is valid"); bool isSeller = reserveAuction.seller == _msgSender(); bool isBidder = reserveAuction.bidder == _msgSender(); require( isSeller || isBidder || accessControls.isVerifiedArtistProxy(reserveAuction.seller, _msgSender()) || accessControls.hasContractOrAdminRole(_msgSender()), "Only seller, bidder, contract or platform admin" ); // external call done last as a gas optimisation i.e. it wont be called if isSeller || isBidder is true _refundBidder(_id, reserveAuction.bidder, reserveAuction.bid, address(0), 0); emit EmergencyBidWithdrawFromReserveAuction(_id, reserveAuction.bidder, reserveAuction.bid); delete editionOrTokenWithReserveAuctions[_id]; } function updateReserveAuctionBidExtensionWindow(uint128 _reserveAuctionBidExtensionWindow) onlyAdmin public { reserveAuctionBidExtensionWindow = _reserveAuctionBidExtensionWindow; emit AdminUpdateReserveAuctionBidExtensionWindow(_reserveAuctionBidExtensionWindow); } function updateReserveAuctionLengthOnceReserveMet(uint128 _reserveAuctionLengthOnceReserveMet) onlyAdmin public { reserveAuctionLengthOnceReserveMet = _reserveAuctionLengthOnceReserveMet; emit AdminUpdateReserveAuctionLengthOnceReserveMet(_reserveAuctionLengthOnceReserveMet); } function _isReserveListingPermitted(uint256 _id) internal virtual returns (bool); function _hasReserveListingBeenInvalidated(uint256 _id) internal virtual returns (bool); function _removeReserveAuctionListing(uint256 _id) internal { ReserveAuction storage reserveAuction = editionOrTokenWithReserveAuctions[_id]; require(reserveAuction.reservePrice > 0, "No active auction"); require(reserveAuction.bid < reserveAuction.reservePrice, "Can only convert before reserve met"); require(reserveAuction.seller == _msgSender(), "Only the seller can convert"); // refund any bids if (reserveAuction.bid > 0) { _refundBidder(_id, reserveAuction.bidder, reserveAuction.bid, address(0), 0); } delete editionOrTokenWithReserveAuctions[_id]; } } // File: contracts/marketplace/KODAV3PrimaryMarketplace.sol pragma solidity 0.8.4; /// @title KnownOrigin Primary Marketplace for all V3 tokens /// @notice The following listing types are supported: Buy now, Stepped, Reserve and Offers /// @dev The contract is pausable and has reentrancy guards /// @author KnownOrigin Labs contract KODAV3PrimaryMarketplace is IKODAV3PrimarySaleMarketplace, BaseMarketplace, ReserveAuctionMarketplace, BuyNowMarketplace { event PrimaryMarketplaceDeployed(); event AdminSetKoCommissionOverrideForCreator(address indexed _creator, uint256 _koCommission); event AdminSetKoCommissionOverrideForEdition(uint256 indexed _editionId, uint256 _koCommission); event ConvertFromBuyNowToOffers(uint256 indexed _editionId, uint128 _startDate); event ConvertSteppedAuctionToBuyNow(uint256 indexed _editionId, uint128 _listingPrice, uint128 _startDate); event ReserveAuctionConvertedToOffers(uint256 indexed _editionId, uint128 _startDate); // KO Commission override definition for a given creator struct KOCommissionOverride { bool active; uint256 koCommission; } // Offer / Bid definition placed on an edition struct Offer { uint256 offer; address bidder; uint256 lockupUntil; } // Stepped auction definition struct Stepped { uint128 basePrice; uint128 stepPrice; uint128 startDate; address seller; uint16 currentStep; } /// @notice Edition ID -> KO commission override set by admin mapping(uint256 => KOCommissionOverride) public koCommissionOverrideForEditions; /// @notice primary sale creator -> KO commission override set by admin mapping(address => KOCommissionOverride) public koCommissionOverrideForCreators; /// @notice Edition ID to Offer mapping mapping(uint256 => Offer) public editionOffers; /// @notice Edition ID to StartDate mapping(uint256 => uint256) public editionOffersStartDate; /// @notice Edition ID to stepped auction mapping(uint256 => Stepped) public editionStep; /// @notice KO commission on every sale uint256 public platformPrimarySaleCommission = 15_00000; // 15.00000% constructor(IKOAccessControlsLookup _accessControls, IKODAV3 _koda, address _platformAccount) BaseMarketplace(_accessControls, _koda, _platformAccount) { emit PrimaryMarketplaceDeployed(); } // convert from a "buy now" listing and converting to "accepting offers" with an optional start date function convertFromBuyNowToOffers(uint256 _editionId, uint128 _startDate) public whenNotPaused { require( editionOrTokenListings[_editionId].seller == _msgSender() || accessControls.isVerifiedArtistProxy(editionOrTokenListings[_editionId].seller, _msgSender()), "Only seller can convert" ); // clear listing delete editionOrTokenListings[_editionId]; // set the start date for the offer (optional) editionOffersStartDate[_editionId] = _startDate; // Emit event emit ConvertFromBuyNowToOffers(_editionId, _startDate); } // Primary "offers" sale flow function enableEditionOffers(uint256 _editionId, uint128 _startDate) external override whenNotPaused onlyContract { // Set the start date if one supplied editionOffersStartDate[_editionId] = _startDate; // Emit event emit EditionAcceptingOffer(_editionId, _startDate); } function placeEditionBid(uint256 _editionId) public override payable whenNotPaused nonReentrant { _placeEditionBid(_editionId, _msgSender()); } function placeEditionBidFor(uint256 _editionId, address _bidder) public override payable whenNotPaused nonReentrant { _placeEditionBid(_editionId, _bidder); } function withdrawEditionBid(uint256 _editionId) public override whenNotPaused nonReentrant { Offer storage offer = editionOffers[_editionId]; require(offer.offer > 0, "No open bid"); require(offer.bidder == _msgSender(), "Not the top bidder"); require(block.timestamp >= offer.lockupUntil, "Bid lockup not elapsed"); // send money back to top bidder _refundBidder(_editionId, offer.bidder, offer.offer, address(0), 0); // emit event emit EditionBidWithdrawn(_editionId, _msgSender()); // delete offer delete editionOffers[_editionId]; } function rejectEditionBid(uint256 _editionId) public override whenNotPaused nonReentrant { Offer storage offer = editionOffers[_editionId]; require(offer.bidder != address(0), "No open bid"); address creatorOfEdition = koda.getCreatorOfEdition(_editionId); require( creatorOfEdition == _msgSender() || accessControls.isVerifiedArtistProxy(creatorOfEdition, _msgSender()), "Caller not the creator" ); // send money back to top bidder _refundBidder(_editionId, offer.bidder, offer.offer, address(0), 0); // emit event emit EditionBidRejected(_editionId, offer.bidder, offer.offer); // delete offer delete editionOffers[_editionId]; } function acceptEditionBid(uint256 _editionId, uint256 _offerPrice) public override whenNotPaused nonReentrant { Offer storage offer = editionOffers[_editionId]; require(offer.bidder != address(0), "No open bid"); require(offer.offer >= _offerPrice, "Offer price has changed"); address creatorOfEdition = koda.getCreatorOfEdition(_editionId); require( creatorOfEdition == _msgSender() || accessControls.isVerifiedArtistProxy(creatorOfEdition, _msgSender()), "Not creator" ); // get a new token from the edition to transfer ownership uint256 tokenId = _facilitateNextPrimarySale(_editionId, offer.offer, offer.bidder, false); // emit event emit EditionBidAccepted(_editionId, tokenId, offer.bidder, offer.offer); // clear open offer delete editionOffers[_editionId]; } // emergency admin "reject" button for stuck bids function adminRejectEditionBid(uint256 _editionId) public onlyAdmin nonReentrant { Offer storage offer = editionOffers[_editionId]; require(offer.bidder != address(0), "No open bid"); // send money back to top bidder if (offer.offer > 0) { _refundBidder(_editionId, offer.bidder, offer.offer, address(0), 0); } emit EditionBidRejected(_editionId, offer.bidder, offer.offer); // delete offer delete editionOffers[_editionId]; } function convertOffersToBuyItNow(uint256 _editionId, uint128 _listingPrice, uint128 _startDate) public override whenNotPaused nonReentrant { require(!_isEditionListed(_editionId), "Edition is listed"); address creatorOfEdition = koda.getCreatorOfEdition(_editionId); require( creatorOfEdition == _msgSender() || accessControls.isVerifiedArtistProxy(creatorOfEdition, _msgSender()), "Not creator" ); require(_listingPrice >= minBidAmount, "Listing price not enough"); // send money back to top bidder if existing offer found Offer storage offer = editionOffers[_editionId]; if (offer.offer > 0) { _refundBidder(_editionId, offer.bidder, offer.offer, address(0), 0); } // delete offer delete editionOffers[_editionId]; // delete rest of offer information delete editionOffersStartDate[_editionId]; // Store listing data editionOrTokenListings[_editionId] = Listing(_listingPrice, _startDate, _msgSender()); emit EditionConvertedFromOffersToBuyItNow(_editionId, _listingPrice, _startDate); } // Primary sale "stepped pricing" flow function listSteppedEditionAuction(address _creator, uint256 _editionId, uint128 _basePrice, uint128 _stepPrice, uint128 _startDate) public override whenNotPaused onlyContract { require(_basePrice >= minBidAmount, "Base price not enough"); // Store listing data editionStep[_editionId] = Stepped( _basePrice, _stepPrice, _startDate, _creator, uint16(0) ); emit EditionSteppedSaleListed(_editionId, _basePrice, _stepPrice, _startDate); } function updateSteppedAuction(uint256 _editionId, uint128 _basePrice, uint128 _stepPrice) public override whenNotPaused { Stepped storage steppedAuction = editionStep[_editionId]; require( steppedAuction.seller == _msgSender() || accessControls.isVerifiedArtistProxy(steppedAuction.seller, _msgSender()), "Only seller" ); require(steppedAuction.currentStep == 0, "Only when no sales"); require(_basePrice >= minBidAmount, "Base price not enough"); steppedAuction.basePrice = _basePrice; steppedAuction.stepPrice = _stepPrice; emit EditionSteppedAuctionUpdated(_editionId, _basePrice, _stepPrice); } function buyNextStep(uint256 _editionId) public override payable whenNotPaused nonReentrant { _buyNextStep(_editionId, _msgSender()); } function buyNextStepFor(uint256 _editionId, address _buyer) public override payable whenNotPaused nonReentrant { _buyNextStep(_editionId, _buyer); } function _buyNextStep(uint256 _editionId, address _buyer) internal { Stepped storage steppedAuction = editionStep[_editionId]; require(steppedAuction.seller != address(0), "Edition not listed for stepped auction"); require(steppedAuction.startDate <= block.timestamp, "Not started yet"); uint256 expectedPrice = _getNextEditionSteppedPrice(_editionId); require(msg.value >= expectedPrice, "Expected price not met"); uint256 tokenId = _facilitateNextPrimarySale(_editionId, expectedPrice, _buyer, true); // Bump the current step uint16 step = steppedAuction.currentStep; // no safemath for uint16 steppedAuction.currentStep = step + 1; // send back excess if supplied - will allow UX flow of setting max price to pay if (msg.value > expectedPrice) { (bool success,) = _msgSender().call{value : msg.value - expectedPrice}(""); require(success, "failed to send overspend back"); } emit EditionSteppedSaleBuy(_editionId, tokenId, _buyer, expectedPrice, step); } // creates an exit from a step if required but forces a buy now price function convertSteppedAuctionToListing(uint256 _editionId, uint128 _listingPrice, uint128 _startDate) public override nonReentrant whenNotPaused { Stepped storage steppedAuction = editionStep[_editionId]; require(_listingPrice >= minBidAmount, "List price not enough"); require( steppedAuction.seller == _msgSender() || accessControls.isVerifiedArtistProxy(steppedAuction.seller, _msgSender()), "Only seller can convert" ); // Store listing data editionOrTokenListings[_editionId] = Listing(_listingPrice, _startDate, steppedAuction.seller); // emit event emit ConvertSteppedAuctionToBuyNow(_editionId, _listingPrice, _startDate); // Clear up the step logic delete editionStep[_editionId]; } function convertSteppedAuctionToOffers(uint256 _editionId, uint128 _startDate) public override whenNotPaused { Stepped storage steppedAuction = editionStep[_editionId]; require( steppedAuction.seller == _msgSender() || accessControls.isVerifiedArtistProxy(steppedAuction.seller, _msgSender()), "Only seller can convert" ); // set the start date for the offer (optional) editionOffersStartDate[_editionId] = _startDate; // Clear up the step logic delete editionStep[_editionId]; emit ConvertFromBuyNowToOffers(_editionId, _startDate); } // Get the next function getNextEditionSteppedPrice(uint256 _editionId) public view returns (uint256 price) { price = _getNextEditionSteppedPrice(_editionId); } function _getNextEditionSteppedPrice(uint256 _editionId) internal view returns (uint256 price) { Stepped storage steppedAuction = editionStep[_editionId]; uint256 stepAmount = uint256(steppedAuction.stepPrice) * uint256(steppedAuction.currentStep); price = uint256(steppedAuction.basePrice) + stepAmount; } function convertReserveAuctionToBuyItNow(uint256 _editionId, uint128 _listingPrice, uint128 _startDate) public override whenNotPaused nonReentrant { require(_listingPrice >= minBidAmount, "Listing price not enough"); _removeReserveAuctionListing(_editionId); editionOrTokenListings[_editionId] = Listing(_listingPrice, _startDate, _msgSender()); emit ReserveAuctionConvertedToBuyItNow(_editionId, _listingPrice, _startDate); } function convertReserveAuctionToOffers(uint256 _editionId, uint128 _startDate) public override whenNotPaused nonReentrant { _removeReserveAuctionListing(_editionId); // set the start date for the offer (optional) editionOffersStartDate[_editionId] = _startDate; emit ReserveAuctionConvertedToOffers(_editionId, _startDate); } // admin function updatePlatformPrimarySaleCommission(uint256 _platformPrimarySaleCommission) public onlyAdmin { platformPrimarySaleCommission = _platformPrimarySaleCommission; emit AdminUpdatePlatformPrimarySaleCommission(_platformPrimarySaleCommission); } function setKoCommissionOverrideForCreator(address _creator, bool _active, uint256 _koCommission) public onlyAdmin { KOCommissionOverride storage koCommissionOverride = koCommissionOverrideForCreators[_creator]; koCommissionOverride.active = _active; koCommissionOverride.koCommission = _koCommission; emit AdminSetKoCommissionOverrideForCreator(_creator, _koCommission); } function setKoCommissionOverrideForEdition(uint256 _editionId, bool _active, uint256 _koCommission) public onlyAdmin { KOCommissionOverride storage koCommissionOverride = koCommissionOverrideForEditions[_editionId]; koCommissionOverride.active = _active; koCommissionOverride.koCommission = _koCommission; emit AdminSetKoCommissionOverrideForEdition(_editionId, _koCommission); } // internal function _isListingPermitted(uint256 _editionId) internal view override returns (bool) { return !_isEditionListed(_editionId); } function _isReserveListingPermitted(uint256 _editionId) internal view override returns (bool) { return koda.getSizeOfEdition(_editionId) == 1 && accessControls.hasContractRole(_msgSender()); } function _hasReserveListingBeenInvalidated(uint256 _id) internal view override returns (bool) { bool isApprovalActiveForMarketplace = koda.isApprovedForAll( editionOrTokenWithReserveAuctions[_id].seller, address(this) ); return !isApprovalActiveForMarketplace || koda.isSalesDisabledOrSoldOut(_id); } function _isBuyNowListingPermitted(uint256) internal view override returns (bool) { return accessControls.hasContractRole(_msgSender()); } function _processSale(uint256 _id, uint256 _paymentAmount, address _buyer, address) internal override returns (uint256) { return _facilitateNextPrimarySale(_id, _paymentAmount, _buyer, false); } function _facilitateNextPrimarySale(uint256 _editionId, uint256 _paymentAmount, address _buyer, bool _reverse) internal returns (uint256) { // for stepped sales, should they be sold in reverse order ie. 10...1 and not 1...10? // get next token to sell along with the royalties recipient and the original creator (address receiver, address creator, uint256 tokenId) = _reverse ? koda.facilitateReversePrimarySale(_editionId) : koda.facilitateNextPrimarySale(_editionId); // split money _handleEditionSaleFunds(_editionId, creator, receiver, _paymentAmount); // send token to buyer (assumes approval has been made, if not then this will fail) koda.safeTransferFrom(creator, _buyer, tokenId); // N:B. open offers are left once sold out for the bidder to withdraw or the artist to reject return tokenId; } function _handleEditionSaleFunds(uint256 _editionId, address _creator, address _receiver, uint256 _paymentAmount) internal { uint256 primarySaleCommission; if (koCommissionOverrideForEditions[_editionId].active) { primarySaleCommission = koCommissionOverrideForEditions[_editionId].koCommission; } else if (koCommissionOverrideForCreators[_creator].active) { primarySaleCommission = koCommissionOverrideForCreators[_creator].koCommission; } else { primarySaleCommission = platformPrimarySaleCommission; } uint256 koCommission = (_paymentAmount / modulo) * primarySaleCommission; if (koCommission > 0) { (bool koCommissionSuccess,) = platformAccount.call{value : koCommission}(""); require(koCommissionSuccess, "Edition commission payment failed"); } (bool success,) = _receiver.call{value : _paymentAmount - koCommission}(""); require(success, "Edition payment failed"); } // as offers are always possible, we wont count it as a listing function _isEditionListed(uint256 _editionId) internal view returns (bool) { if (editionOrTokenListings[_editionId].seller != address(0)) { return true; } if (editionStep[_editionId].seller != address(0)) { return true; } if (editionOrTokenWithReserveAuctions[_editionId].seller != address(0)) { return true; } return false; } function _placeEditionBid(uint256 _editionId, address _bidder) internal { require(!_isEditionListed(_editionId), "Edition is listed"); Offer storage offer = editionOffers[_editionId]; require(msg.value >= offer.offer + minBidAmount, "Bid not high enough"); // Honor start date if set uint256 startDate = editionOffersStartDate[_editionId]; if (startDate > 0) { require(block.timestamp >= startDate, "Not yet accepting offers"); // elapsed, so free storage delete editionOffersStartDate[_editionId]; } // send money back to top bidder if existing offer found if (offer.offer > 0) { _refundBidder(_editionId, offer.bidder, offer.offer, _msgSender(), msg.value); } // setup offer editionOffers[_editionId] = Offer(msg.value, _bidder, _getLockupTime()); emit EditionBidPlaced(_editionId, _bidder, msg.value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IKOAccessControlsLookup","name":"_accessControls","type":"address"},{"internalType":"contract IKODAV3","name":"_koda","type":"address"},{"internalType":"address","name":"_platformAccount","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"_token","type":"address"},{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AdminRecoverERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address payable","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AdminRecoverETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_creator","type":"address"},{"indexed":false,"internalType":"uint256","name":"_koCommission","type":"uint256"}],"name":"AdminSetKoCommissionOverrideForCreator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_koCommission","type":"uint256"}],"name":"AdminSetKoCommissionOverrideForEdition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IKOAccessControlsLookup","name":"_oldAddress","type":"address"},{"indexed":true,"internalType":"contract IKOAccessControlsLookup","name":"_newAddress","type":"address"}],"name":"AdminUpdateAccessControls","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_bidLockupPeriod","type":"uint256"}],"name":"AdminUpdateBidLockupPeriod","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_minBidAmount","type":"uint256"}],"name":"AdminUpdateMinBidAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_modulo","type":"uint256"}],"name":"AdminUpdateModulo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"_newAddress","type":"address"}],"name":"AdminUpdatePlatformAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_platformPrimarySaleCommission","type":"uint256"}],"name":"AdminUpdatePlatformPrimarySaleCommission","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"_reserveAuctionBidExtensionWindow","type":"uint128"}],"name":"AdminUpdateReserveAuctionBidExtensionWindow","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"_reserveAuctionLengthOnceReserveMet","type":"uint128"}],"name":"AdminUpdateReserveAuctionLengthOnceReserveMet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"address","name":"_currentOwner","type":"address"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_originalBiddingEnd","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_currentBiddingEnd","type":"uint256"}],"name":"BidPlacedOnReserveAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"},{"indexed":false,"internalType":"uint128","name":"_bid","type":"uint128"}],"name":"BidWithdrawnFromReserveAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_bid","type":"uint256"},{"indexed":false,"internalType":"address","name":"_newBidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_newOffer","type":"uint256"}],"name":"BidderRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_bid","type":"uint256"},{"indexed":false,"internalType":"address","name":"_newBidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_newOffer","type":"uint256"}],"name":"BidderRefundedFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"BuyNowDeListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"BuyNowPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_buyer","type":"address"},{"indexed":false,"internalType":"address","name":"_currentOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"BuyNowPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"ConvertFromBuyNowToOffers","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"_listingPrice","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"ConvertSteppedAuctionToBuyNow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"EditionAcceptingOffer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"EditionBidAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"EditionBidPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"EditionBidRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"}],"name":"EditionBidWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"_price","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"EditionConvertedFromOffersToBuyItNow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"_basePrice","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"_stepPrice","type":"uint128"}],"name":"EditionSteppedAuctionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"_currentStep","type":"uint16"}],"name":"EditionSteppedSaleBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"_basePrice","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"_stepPrice","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"EditionSteppedSaleListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"},{"indexed":false,"internalType":"uint128","name":"_bid","type":"uint128"}],"name":"EmergencyBidWithdrawFromReserveAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"},{"indexed":false,"internalType":"address","name":"_currentOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_startDate","type":"uint256"}],"name":"ListedForBuyNow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_reservePrice","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"ListedForReserveAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"PrimaryMarketplaceDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"_listingPrice","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"ReserveAuctionConvertedToBuyItNow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_editionId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"ReserveAuctionConvertedToOffers","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_finalPrice","type":"uint256"},{"indexed":false,"internalType":"address","name":"_currentOwner","type":"address"},{"indexed":false,"internalType":"address","name":"_winner","type":"address"},{"indexed":false,"internalType":"address","name":"_resulter","type":"address"}],"name":"ReserveAuctionResulted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_reservePrice","type":"uint256"}],"name":"ReservePriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"uint256","name":"_offerPrice","type":"uint256"}],"name":"acceptEditionBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"accessControls","outputs":[{"internalType":"contract IKOAccessControlsLookup","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"}],"name":"adminRejectEditionBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bidLockupPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"buyEditionToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"buyEditionTokenFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"}],"name":"buyNextStep","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"address","name":"_buyer","type":"address"}],"name":"buyNextStepFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"convertFromBuyNowToOffers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"uint128","name":"_listingPrice","type":"uint128"},{"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"convertOffersToBuyItNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"uint128","name":"_listingPrice","type":"uint128"},{"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"convertReserveAuctionToBuyItNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"convertReserveAuctionToOffers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"uint128","name":"_listingPrice","type":"uint128"},{"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"convertSteppedAuctionToListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"convertSteppedAuctionToOffers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"editionOffers","outputs":[{"internalType":"uint256","name":"offer","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"lockupUntil","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"editionOffersStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"editionOrTokenListings","outputs":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint128","name":"startDate","type":"uint128"},{"internalType":"address","name":"seller","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"editionOrTokenWithReserveAuctions","outputs":[{"internalType":"address","name":"seller","type":"address"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint128","name":"reservePrice","type":"uint128"},{"internalType":"uint128","name":"bid","type":"uint128"},{"internalType":"uint128","name":"startDate","type":"uint128"},{"internalType":"uint128","name":"biddingEnd","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"editionStep","outputs":[{"internalType":"uint128","name":"basePrice","type":"uint128"},{"internalType":"uint128","name":"stepPrice","type":"uint128"},{"internalType":"uint128","name":"startDate","type":"uint128"},{"internalType":"address","name":"seller","type":"address"},{"internalType":"uint16","name":"currentStep","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"emergencyExitBidFromReserveAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"enableEditionOffers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"}],"name":"getNextEditionSteppedPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"koCommissionOverrideForCreators","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"koCommission","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"koCommissionOverrideForEditions","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"koCommission","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"koda","outputs":[{"internalType":"contract IKODAV3","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_seller","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint128","name":"_listingPrice","type":"uint128"},{"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"listForBuyNow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint128","name":"_reservePrice","type":"uint128"},{"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"listForReserveAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"uint128","name":"_basePrice","type":"uint128"},{"internalType":"uint128","name":"_stepPrice","type":"uint128"},{"internalType":"uint128","name":"_startDate","type":"uint128"}],"name":"listSteppedEditionAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minBidAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"modulo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"placeBidOnReserveAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address","name":"_bidder","type":"address"}],"name":"placeBidOnReserveAuctionFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"}],"name":"placeEditionBid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"address","name":"_bidder","type":"address"}],"name":"placeEditionBidFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"platformAccount","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformPrimarySaleCommission","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"}],"name":"rejectEditionBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveAuctionBidExtensionWindow","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserveAuctionLengthOnceReserveMet","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"resultReserveAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint128","name":"_listingPrice","type":"uint128"}],"name":"setBuyNowPriceListing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_creator","type":"address"},{"internalType":"bool","name":"_active","type":"bool"},{"internalType":"uint256","name":"_koCommission","type":"uint256"}],"name":"setKoCommissionOverrideForCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"bool","name":"_active","type":"bool"},{"internalType":"uint256","name":"_koCommission","type":"uint256"}],"name":"setKoCommissionOverrideForEdition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IKOAccessControlsLookup","name":"_accessControls","type":"address"}],"name":"updateAccessControls","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bidLockupPeriod","type":"uint256"}],"name":"updateBidLockupPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minBidAmount","type":"uint256"}],"name":"updateMinBidAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_modulo","type":"uint256"}],"name":"updateModulo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPlatformAccount","type":"address"}],"name":"updatePlatformAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_platformPrimarySaleCommission","type":"uint256"}],"name":"updatePlatformPrimarySaleCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_reserveAuctionBidExtensionWindow","type":"uint128"}],"name":"updateReserveAuctionBidExtensionWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_reserveAuctionLengthOnceReserveMet","type":"uint128"}],"name":"updateReserveAuctionLengthOnceReserveMet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint128","name":"_reservePrice","type":"uint128"}],"name":"updateReservePriceForReserveAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"},{"internalType":"uint128","name":"_basePrice","type":"uint128"},{"internalType":"uint128","name":"_stepPrice","type":"uint128"}],"name":"updateSteppedAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"withdrawBidFromReserveAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_editionId","type":"uint256"}],"name":"withdrawEditionBid","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405262989680600455662386f26fc1000060055561546060065572015180000000000000000000000000000003846008556216e360600f553480156200004757600080fd5b5060405162005925380380620059258339810160408190526200006a91620000ed565b600160008181558154600280546001600160a01b03199081166001600160a01b03888116919091179092556001600160a81b0319909216610100888316021790935560038054909116928416929092179091556040517f2c09563128f33976972b5f859a25a031d534b6895710d898ef01875708dc8ec59190a150505062000159565b60008060006060848603121562000102578283fd5b83516200010f8162000140565b6020850151909350620001228162000140565b6040850151909250620001358162000140565b809150509250925092565b6001600160a01b03811681146200015657600080fd5b50565b6157bc80620001696000396000f3fe6080604052600436106103975760003560e01c8063748365ef116101dc578063a1d1e56411610102578063c21f86f4116100a0578063d599ee081161006f578063d599ee0814610c6f578063d5df687c14610c8f578063dee294ab14610caf578063ff89a80b14610ccf57600080fd5b8063c21f86f414610bf9578063c30f0db214610c19578063ce9e1ce514610c39578063cf500bec14610c4f57600080fd5b8063a8b3ed71116100dc578063a8b3ed7114610aec578063a9d9985e14610b0c578063b0a0085114610b2c578063b4f931b114610bd957600080fd5b8063a1d1e56414610a8c578063a340f39e14610aac578063a81b574714610acc57600080fd5b806387311d8f1161017a57806395880bfe1161014957806395880bfe14610a2357806395ac51ce14610a3957806397849eb314610a595780639c1d990714610a7957600080fd5b806387311d8f146108ff5780638d91997e1461092c5780638f084d7c1461094c5780639118644314610a0357600080fd5b80637f27c67c116101b65780637f27c67c146108365780637fb38ab0146108495780638456cb59146108ca57806384c95d2a146108df57600080fd5b8063748365ef146107b95780637d87bc80146107f65780637de3766f1461081657600080fd5b80634cb97c18116102c15780635e636b6f1161025f5780636ef3da941161022e5780636ef3da94146107465780637012663e1461076657806372ec7eec146107795780637480911b1461079957600080fd5b80635e636b6f146106d357806361200f94146106f35780636305246e146107135780636710c3f21461073357600080fd5b80634f4841191161029b5780634f48411914610643578063502942cd1461067d57806355d93d491461069d5780635c975abb146106b057600080fd5b80634cb97c18146105bf5780634d1f0a8e146105d25780634f17e281146105f257600080fd5b80632ade1bf311610339578063474379701161030857806347437970146105015780634860ee39146105695780634940ecf01461058957806349751788146105a957600080fd5b80632ade1bf31461046d5780632cd13c001461048d5780633f4ba83a146104cc57806347176275146104e157600080fd5b80630cf274c6116103755780630cf274c6146103f15780631171bda91461041157806320cd669514610431578063297452621461044457600080fd5b806302b433731461039c57806302ece38a146103be578063068bce8d146103d1575b600080fd5b3480156103a857600080fd5b506103bc6103b7366004615452565b610cef565b005b6103bc6103cc366004615452565b610f27565b3480156103dd57600080fd5b506103bc6103ec366004615502565b610f84565b3480156103fd57600080fd5b506103bc61040c3660046154b1565b61119b565b34801561041d57600080fd5b506103bc61042c366004615409565b6111f7565b6103bc61043f366004615482565b6112d4565b34801561045057600080fd5b5061045a60045481565b6040519081526020015b60405180910390f35b34801561047957600080fd5b506103bc6104883660046154d7565b611332565b34801561049957600080fd5b506008546104b490600160801b90046001600160801b031681565b6040516001600160801b039091168152602001610464565b3480156104d857600080fd5b506103bc6114a8565b3480156104ed57600080fd5b506103bc6104fc366004615340565b6114ba565b34801561050d57600080fd5b5061054661051c366004615452565b600c6020526000908152604090208054600182015460029092015490916001600160a01b03169083565b604080519384526001600160a01b03909216602084015290820152606001610464565b34801561057557600080fd5b506103bc610584366004615502565b611666565b34801561059557600080fd5b506103bc6105a4366004615340565b6118c7565b3480156105b557600080fd5b5061045a60055481565b6103bc6105cd366004615482565b611adb565b3480156105de57600080fd5b506103bc6105ed3660046154d7565b611b30565b3480156105fe57600080fd5b5061062c61060d36600461525b565b600b602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610464565b34801561064f57600080fd5b5061062c61065e366004615452565b600a602052600090815260409020805460019091015460ff9091169082565b34801561068957600080fd5b506103bc6106983660046154d7565b611cc1565b6103bc6106ab366004615452565b611d70565b3480156106bc57600080fd5b5060015460ff166040519015158152602001610464565b3480156106df57600080fd5b506103bc6106ee36600461538e565b611dc5565b3480156106ff57600080fd5b506103bc61070e366004615293565b611f56565b34801561071f57600080fd5b506103bc61072e366004615452565b612049565b6103bc610741366004615482565b61208d565b34801561075257600080fd5b506103bc61076136600461525b565b6120e2565b6103bc610774366004615452565b612238565b34801561078557600080fd5b506103bc610794366004615452565b61228d565b3480156107a557600080fd5b506103bc6107b4366004615438565b61231a565b3480156107c557600080fd5b506001546107de9061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610464565b34801561080257600080fd5b5061045a610811366004615452565b612370565b34801561082257600080fd5b506103bc610831366004615300565b612381565b6103bc610844366004615482565b6123e8565b34801561085557600080fd5b5061089b610864366004615452565b600960205260009081526040902080546001909101546001600160801b0380831692600160801b900416906001600160a01b031683565b604080516001600160801b0394851681529390921660208401526001600160a01b031690820152606001610464565b3480156108d657600080fd5b506103bc61243d565b3480156108eb57600080fd5b506002546107de906001600160a01b031681565b34801561090b57600080fd5b5061045a61091a366004615452565b600d6020526000908152604090205481565b34801561093857600080fd5b506103bc6109473660046154d7565b61244d565b34801561095857600080fd5b506109ba610967366004615452565b60076020526000908152604090208054600182015460028301546003909301546001600160a01b039283169392909116916001600160801b0380821692600160801b928390048216928282169291041686565b604080516001600160a01b0397881681529690951660208701526001600160801b03938416948601949094529082166060850152811660808401521660a082015260c001610464565b348015610a0f57600080fd5b506103bc610a1e366004615452565b6124c7565b348015610a2f57600080fd5b5061045a60065481565b348015610a4557600080fd5b506103bc610a54366004615452565b612504565b348015610a6557600080fd5b506003546107de906001600160a01b031681565b6103bc610a87366004615452565b612740565b348015610a9857600080fd5b506103bc610aa736600461525b565b612795565b348015610ab857600080fd5b506103bc610ac7366004615452565b6127f9565b348015610ad857600080fd5b506103bc610ae7366004615502565b612908565b348015610af857600080fd5b506103bc610b0736600461553d565b612c56565b348015610b1857600080fd5b506103bc610b27366004615452565b612f20565b348015610b3857600080fd5b50610b94610b47366004615452565b600e602052600090815260409020805460018201546002909201546001600160801b0380831693600160801b90930481169216906001600160a01b03811690600160a01b900461ffff1685565b604080516001600160801b039687168152948616602086015292909416918301919091526001600160a01b0316606082015261ffff909116608082015260a001610464565b348015610be557600080fd5b506103bc610bf4366004615452565b6132cc565b348015610c0557600080fd5b506103bc610c143660046154d7565b613309565b348015610c2557600080fd5b506103bc610c34366004615452565b61347c565b348015610c4557600080fd5b5061045a600f5481565b348015610c5b57600080fd5b506103bc610c6a366004615438565b6135e4565b348015610c7b57600080fd5b506103bc610c8a3660046154d7565b61363a565b348015610c9b57600080fd5b506103bc610caa366004615452565b6138ec565b348015610cbb57600080fd5b506103bc610cca366004615502565b613b6a565b348015610cdb57600080fd5b506008546104b4906001600160801b031681565b60015460ff1615610d1b5760405162461bcd60e51b8152600401610d12906155d4565b60405180910390fd5b60026000541415610d3e5760405162461bcd60e51b8152600401610d1290615635565b60026000818155828152600760205260409020908101546001600160801b0316610d9e5760405162461bcd60e51b815260206004820152601160248201527027379030b1ba34bb329030bab1ba34b7b760791b6044820152606401610d12565b60028101546001600160801b03808216600160801b909204161015610df75760405162461bcd60e51b815260206004820152600f60248201526e14995cd95c9d99481b9bdd081b595d608a1b6044820152606401610d12565b6003810154600160801b90046001600160801b03164211610e5a5760405162461bcd60e51b815260206004820152601960248201527f42696464696e6720686173206e6f742079657420656e646564000000000000006044820152606401610d12565b6001818101548254600280850154600087815260076020526040812080546001600160a01b0319908116825596810180549097169096559185018290556003909401556001600160a01b0391821692911690600160801b90046001600160801b0316610ec885828585613cb1565b50604080518281526001600160a01b038085166020830152851681830152336060820152905186917fa0a548bb147d15d7de045c333ab8b0ec3d0cc790775d009185aa0e009437507e919081900360800190a250506001600055505050565b60015460ff1615610f4a5760405162461bcd60e51b8152600401610d12906155d4565b60026000541415610f6d5760405162461bcd60e51b8152600401610d1290615635565b6002600055610f7c8133613cc9565b506001600055565b60015460ff1615610fa75760405162461bcd60e51b8152600401610d12906155d4565b6000838152600e6020526040902060028101546001600160a01b031633148061105f575060015460028201546001600160a01b036101009092048216916380371cce9116610ff23390565b6040518363ffffffff1660e01b815260040161100f92919061555e565b60206040518083038186803b15801561102757600080fd5b505afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f91906153ed565b6110995760405162461bcd60e51b815260206004820152600b60248201526a27b7363c9039b2b63632b960a91b6044820152606401610d12565b6002810154600160a01b900461ffff16156110eb5760405162461bcd60e51b81526020600482015260126024820152714f6e6c79207768656e206e6f2073616c657360701b6044820152606401610d12565b600554836001600160801b0316101561113e5760405162461bcd60e51b8152602060048201526015602482015274084c2e6ca40e0e4d2c6ca40dcdee840cadcdeeaced605b1b6044820152606401610d12565b6001600160801b03838116600160801b9184169182028117835560408051918252602082019290925285917fca6f94d6cf7150ed49f5d1ccd677efd457310ccf201845261d9098a6877dcf3c91015b60405180910390a250505050565b6111a3613eb3565b6000838152600a6020908152604091829020805460ff191685151517815560018101849055915183815285917f3435d39114497a2c6d70dbcc09a4026fdaca4c8eb9661f55f026fd79c0a28508910161118d565b6111ff613eb3565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561124957600080fd5b505af115801561125d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128191906153ed565b50816001600160a01b0316836001600160a01b03167f305fd4b7f973d3d7ee0074e0c7b4db74db3bbf0c21b17bf10e003985e4fc9f7b836040516112c791815260200190565b60405180910390a3505050565b60015460ff16156112f75760405162461bcd60e51b8152600401610d12906155d4565b6002600054141561131a5760405162461bcd60e51b8152600401610d1290615635565b60026000556113298282613cc9565b50506001600055565b60015460ff16156113555760405162461bcd60e51b8152600401610d12906155d4565b6000828152600960205260409020600101546001600160a01b031633148061141a5750600180546000848152600960205260409020909101546001600160a01b036101009092048216916380371cce91166113ad3390565b6040518363ffffffff1660e01b81526004016113ca92919061555e565b60206040518083038186803b1580156113e257600080fd5b505afa1580156113f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141a91906153ed565b6114365760405162461bcd60e51b8152600401610d1290615578565b600082815260096020908152604080832083815560010180546001600160a01b0319169055600d8252918290206001600160801b03841690819055915191825283917fc5cede647bcf791d83ff0ee63bb8ae1434f9795878081f8ad4b36ee1cb582aad91015b60405180910390a25050565b6114b0613eb3565b6114b8613f80565b565b60015460ff16156114dd5760405162461bcd60e51b8152600401610d12906155d4565b6114e683614013565b6115325760405162461bcd60e51b815260206004820152601860248201527f4c697374696e67206973206e6f74207065726d697474656400000000000000006044820152606401610d12565b61153b83614025565b6115875760405162461bcd60e51b815260206004820152601760248201527f427579206e6f77206c697374696e6720696e76616c69640000000000000000006044820152606401610d12565b600554826001600160801b031610156115b25760405162461bcd60e51b8152600401610d12906155fe565b60408051606080820183526001600160801b0385811680845285821660208086018281526001600160a01b038c8116888a0181815260008e8152600986528b9020995193518816600160801b0293909716929092178855945160019097018054979095166001600160a01b0319909716969096179093558551918252918101939093529282019290925284917f7fd7de54b3a4cc7952845fd3fa85208e0ba980067ead6d59721bebc8bd7ec414910161118d565b600260005414156116895760405162461bcd60e51b8152600401610d1290615635565b600260005560015460ff16156116b15760405162461bcd60e51b8152600401610d12906155d4565b6000838152600e602052604090206005546001600160801b03841610156117125760405162461bcd60e51b8152602060048201526015602482015274098d2e6e840e0e4d2c6ca40dcdee840cadcdeeaced605b1b6044820152606401610d12565b60028101546001600160a01b03163314806117bc575060015460028201546001600160a01b036101009092048216916380371cce911661174f3390565b6040518363ffffffff1660e01b815260040161176c92919061555e565b60206040518083038186803b15801561178457600080fd5b505afa158015611798573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bc91906153ed565b6117d85760405162461bcd60e51b8152600401610d1290615578565b604080516060810182526001600160801b03858116808352858216602080850182815260028801546001600160a01b0390811687890190815260008d815260098552899020975192518716600160801b0292909616919091178655935160019095018054959094166001600160a01b03199095169490941790925583519081529182015285917f3ed14e51a13ebed8bcb36a692319d51c90603eef8a9b49835ed0f77909e6bdc6910160405180910390a25050506000908152600e60205260408120818155600180820180546001600160801b0319169055600290910180546001600160b01b03191690559055565b60015460ff16156118ea5760405162461bcd60e51b8152600401610d12906155d4565b6118f383614013565b6119375760405162461bcd60e51b8152602060048201526015602482015274131a5cdd1a5b99c81b9bdd081c195c9b5a5d1d1959605a1b6044820152606401610d12565b611940836140b7565b61198c5760405162461bcd60e51b815260206004820152601d60248201527f52657365727665206c697374696e67206e6f74207065726d69747465640000006044820152606401610d12565b600554826001600160801b031610156119f65760405162461bcd60e51b815260206004820152602660248201527f52657365727665207072696365206d757374206265206174206c65617374206d6044820152651a5b88189a5960d21b6064820152608401610d12565b6040805160c0810182526001600160a01b038681168252600060208084018281526001600160801b03888116868801818152606088018681528a841660808a0181815260a08b018981528f8a5260078952988c90209a518b54908b166001600160a01b0319918216178c55965160018c01805491909b16971696909617909855905190518316600160801b90810291841691909117600289015592519451821690920293169290921760039094019390935583519081529182015284917fcd712ccc5669f36ad4dfb9acf905087c4b438eabe53e24c858c72bfa0515cb98910161118d565b60015460ff1615611afe5760405162461bcd60e51b8152600401610d12906155d4565b60026000541415611b215760405162461bcd60e51b8152600401610d1290615635565b6002600055611329828261415a565b60015460ff1615611b535760405162461bcd60e51b8152600401610d12906155d4565b6000828152600960205260409020600101546001600160a01b0316331480611c185750600180546000848152600960205260409020909101546001600160a01b036101009092048216916380371cce9116611bab3390565b6040518363ffffffff1660e01b8152600401611bc892919061555e565b60206040518083038186803b158015611be057600080fd5b505afa158015611bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1891906153ed565b611c645760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c792073656c6c65722063616e206368616e6765207072696365000000006044820152606401610d12565b60008281526009602090815260409182902080546001600160801b0319166001600160801b038516908117909155915191825283917f2acf0b64eca25e79ecb9831cce1c9045dce27614bb88deb1cc5b435e87278cdb910161149c565b60015460ff1615611ce45760405162461bcd60e51b8152600401610d12906155d4565b60026000541415611d075760405162461bcd60e51b8152600401610d1290615635565b6002600055611d15826143c4565b6000828152600d60209081526040918290206001600160801b03841690819055915191825283917f5ad253cc2bfa6797b2f1b2a45aa1b0e961d3c6ff8090cc72122c1745d3e84101910160405180910390a250506001600055565b60015460ff1615611d935760405162461bcd60e51b8152600401610d12906155d4565b60026000541415611db65760405162461bcd60e51b8152600401610d1290615635565b6002600055610f7c813361415a565b60015460ff1615611de85760405162461bcd60e51b8152600401610d12906155d4565b611df0614570565b600554836001600160801b03161015611e435760405162461bcd60e51b8152602060048201526015602482015274084c2e6ca40e0e4d2c6ca40dcdee840cadcdeeaced605b1b6044820152606401610d12565b6040805160a0810182526001600160801b03808616825284811660208084019182528583168486019081526001600160a01b03808c16606087019081526000608088018181528d8252600e909552889020965194518616600160801b029486169490941786559051600186018054919095166001600160801b03199190911617909355905160029093018054915161ffff16600160a01b026001600160b01b031990921693909216929092179190911790555184907fde833f743c6e9e4ce17e0e6662f66d3af9ecba83780a7c10cd54ffa7b049562e90611f47908690869086906001600160801b0393841681529183166020830152909116604082015260600190565b60405180910390a25050505050565b611f5e613eb3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611fab576040519150601f19603f3d011682016040523d82523d6000602084013e611fb0565b606091505b50509050806120015760405162461bcd60e51b815260206004820152601c60248201527f556e61626c6520746f2073656e6420726563697069656e7420455448000000006044820152606401610d12565b826001600160a01b03167f4d688afe1abc567d30e199aa99174c72a9653aec3e1e87dd2b5e60ed469fad558360405161203c91815260200190565b60405180910390a2505050565b612051613eb3565b60058190556040518181527f0e782e841a04fe2a18adf67ea33f1becfdca41420dee80c4c28d966524f2e6e7906020015b60405180910390a150565b60015460ff16156120b05760405162461bcd60e51b8152600401610d12906155d4565b600260005414156120d35760405162461bcd60e51b8152600401610d1290615635565b60026000556113298282614640565b6120ea613eb3565b6001600160a01b03811663c395fcb3336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561213957600080fd5b505afa15801561214d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217191906153ed565b6121d15760405162461bcd60e51b815260206004820152602b60248201527f53656e646572206d75737420686176652061646d696e20726f6c6520696e206e60448201526a195dc818dbdb9d1c9858dd60aa1b6064820152608401610d12565b6001546040516001600160a01b0380841692610100900416907facd428448d30f3fadee1e7d643a28cfee0ec86aef546e1cfc717d844b99eedf290600090a3600180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60015460ff161561225b5760405162461bcd60e51b8152600401610d12906155d4565b6002600054141561227e5760405162461bcd60e51b8152600401610d1290615635565b6002600055610f7c81336147c1565b612295613eb3565b600081116122e55760405162461bcd60e51b815260206004820152601b60248201527f4d6f64756c6f20706f696e742063616e6e6f74206265207a65726f00000000006044820152606401610d12565b60048190556040518181527f0974c11e488a74018e3da44e0750b7d0ec99a431c45f79a6110d722b823d0af090602001612082565b612322613eb3565b600880546001600160801b03908116600160801b918416918202179091556040519081527fa076ed7cc197f8c245d58d44bfdc92180b22f8e3ddd247c45ee0e84f79f7b2bd90602001612082565b600061237b82614b3a565b92915050565b612389613eb3565b6001600160a01b0383166000818152600b6020908152604091829020805460ff19168615151781556001810185905591518481529192917f036d5b8a890813b20be995ed13873cba592f6933b7f9c5d342b258f72ede6e78910161118d565b60015460ff161561240b5760405162461bcd60e51b8152600401610d12906155d4565b6002600054141561242e5760405162461bcd60e51b8152600401610d1290615635565b600260005561132982826147c1565b612445613eb3565b6114b8614b98565b60015460ff16156124705760405162461bcd60e51b8152600401610d12906155d4565b612478614570565b6000828152600d60209081526040918290206001600160801b03841690819055915191825283917f252bfd97a791429cb820c48af9674adf004431519d80a5d86fafdfb06863492c910161149c565b6124cf613eb3565b60068190556040518181527f46b8c32fce68a5f2dff628d3b2cf9374788f42ea33b343728a64a3b090b4479e90602001612082565b60015460ff16156125275760405162461bcd60e51b8152600401610d12906155d4565b6002600054141561254a5760405162461bcd60e51b8152600401610d1290615635565b60026000818155828152600760205260409020908101546001600160801b03166125b65760405162461bcd60e51b815260206004820152601c60248201527f4e6f20726573657276652061756374696f6e20696e20666c69676874000000006044820152606401610d12565b60028101546001600160801b03808216600160801b90920416106126325760405162461bcd60e51b815260206004820152602d60248201527f426964732063616e206f6e6c792062652077697468647261776e20696620726560448201526c1cd95c9d99481b9bdd081b595d609a1b6064820152608401610d12565b60018101546001600160a01b0316331461269d5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c7920746865206269646465722063616e207769746864726177207468656044820152651a5c88189a5960d21b6064820152608401610d12565b60028101546001820154600160801b9091046001600160801b0316906126d19084906001600160a01b031683600080614bee565b6001820180546001600160a01b03191690556002820180546001600160801b039081169091556040805185815233602082015291831682820152517fd1d72c9a0832cf3726713b61a67a8f1656cc01385640d04f1155b000d1b7b7519181900360600190a15050600160005550565b60015460ff16156127635760405162461bcd60e51b8152600401610d12906155d4565b600260005414156127865760405162461bcd60e51b8152600401610d1290615635565b6002600055610f7c8133614640565b61279d613eb3565b6003546040516001600160a01b038084169216907f0dcf4ed468afaf8b36d6f5982788e2b86c18a544e7fb05803a79f67cd097d59190600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b612801613eb3565b600260005414156128245760405162461bcd60e51b8152600401610d1290615635565b60026000908155818152600c6020526040902060018101546001600160a01b03166128615760405162461bcd60e51b8152600401610d12906155af565b80541561288957600181015481546128899184916001600160a01b0390911690600080614bee565b60018101548154604080516001600160a01b039093168352602083019190915283917fdd21daffb84ed4431b50ed9dedcd5e0cf1f96a4cc5976fefb4be54d43be3728191015b60405180910390a2506000908152600c60205260408120818155600180820180546001600160a01b031916905560029091018290559055565b60015460ff161561292b5760405162461bcd60e51b8152600401610d12906155d4565b6002600054141561294e5760405162461bcd60e51b8152600401610d1290615635565b600260005561295c83614cff565b1561299d5760405162461bcd60e51b815260206004820152601160248201527011591a5d1a5bdb881a5cc81b1a5cdd1959607a1b6044820152606401610d12565b60025460405163d41911d760e01b8152600481018590526000916001600160a01b03169063d41911d79060240160206040518083038186803b1580156129e257600080fd5b505afa1580156129f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1a9190615277565b90506001600160a01b038116331480612ab3575060015461010090046001600160a01b03166380371cce82336040518363ffffffff1660e01b8152600401612a6392919061555e565b60206040518083038186803b158015612a7b57600080fd5b505afa158015612a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab391906153ed565b612aed5760405162461bcd60e51b815260206004820152600b60248201526a2737ba1031b932b0ba37b960a91b6044820152606401610d12565b600554836001600160801b03161015612b185760405162461bcd60e51b8152600401610d12906155fe565b6000848152600c60205260409020805415612b4e5760018101548154612b4e9187916001600160a01b0390911690600080614bee565b6000858152600c602090815260408083208381556001810180546001600160a01b0319169055600201839055600d82528083209290925581516060810183526001600160801b038781168252861691810191909152908101336001600160a01b039081169091526000878152600960209081526040918290208451858301516001600160801b03918216600160801b9183169190910217825594830151600190910180546001600160a01b0319169190941617909255805188815287841692810192909252918516918101919091527f4ee58f1b139dbfa3b12ee1fc57ad8d513b35c670477df6dfde35944346b1d1949060600160405180910390a150506001600055505050565b60015460ff1615612c795760405162461bcd60e51b8152600401610d12906155d4565b60026000541415612c9c5760405162461bcd60e51b8152600401610d1290615635565b60026000908155828152600c6020526040902060018101546001600160a01b0316612cd95760405162461bcd60e51b8152600401610d12906155af565b8054821115612d2a5760405162461bcd60e51b815260206004820152601760248201527f4f6666657220707269636520686173206368616e6765640000000000000000006044820152606401610d12565b60025460405163d41911d760e01b8152600481018590526000916001600160a01b03169063d41911d79060240160206040518083038186803b158015612d6f57600080fd5b505afa158015612d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da79190615277565b90506001600160a01b038116331480612e40575060015461010090046001600160a01b03166380371cce82336040518363ffffffff1660e01b8152600401612df092919061555e565b60206040518083038186803b158015612e0857600080fd5b505afa158015612e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4091906153ed565b612e7a5760405162461bcd60e51b815260206004820152600b60248201526a2737ba1031b932b0ba37b960a91b6044820152606401610d12565b81546001830154600091612e9a918791906001600160a01b031684614d7c565b60018401548454604080516001600160a01b0390931683526020830191909152919250829187917fbb5456559b0c90450f12de9d601e1470b0edb240c3425838360bd25412e6b8be910160405180910390a3505050600091825250600c60205260408120818155600180820180546001600160a01b031916905560029091018290559055565b60015460ff1615612f435760405162461bcd60e51b8152600401610d12906155d4565b60026000541415612f665760405162461bcd60e51b8152600401610d1290615635565b6002600081815582815260076020526040902090810154600160801b90046001600160801b0316612fcc5760405162461bcd60e51b815260206004820152601060248201526f139bc8189a59081a5b88199b1a59da1d60821b6044820152606401610d12565b612fd582614f14565b6130475760405162461bcd60e51b815260206004820152603b60248201527f4269642063616e6e6f742062652077697468647261776e20617320726573657260448201527f76652061756374696f6e206c697374696e672069732076616c696400000000006064820152608401610d12565b80546001820154336001600160a01b0392831681149290911614818061306a5750805b80613101575060015483546001600160a01b036101009092048216916380371cce91166130943390565b6040518363ffffffff1660e01b81526004016130b192919061555e565b60206040518083038186803b1580156130c957600080fd5b505afa1580156130dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310191906153ed565b80613195575060015461010090046001600160a01b0316633d3d6fe2336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561315d57600080fd5b505afa158015613171573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319591906153ed565b6131f95760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792073656c6c65722c206269646465722c20636f6e7472616374206f7260448201526e10383630ba3337b9369030b236b4b760891b6064820152608401610d12565b6001830154600284015461322d9186916001600160a01b0390911690600160801b90046001600160801b0316600080614bee565b60018301546002840154604080516001600160a01b039093168352600160801b9091046001600160801b0316602083015285917f5254bc5658a9d8a2b41347762f2b035d708f4be1013ab8fb33922576e24570fe910160405180910390a2505050600090815260076020526040812080546001600160a01b03199081168255600180830180549092169091556002820183905560039091018290559055565b6132d4613eb3565b600f8190556040518181527fddddb61577530b164743cafe83935aeddb8888d7de39faeea75fd888bd1dcc7590602001612082565b60015460ff161561332c5760405162461bcd60e51b8152600401610d12906155d4565b6000828152600e6020526040902060028101546001600160a01b03163314806133e4575060015460028201546001600160a01b036101009092048216916380371cce91166133773390565b6040518363ffffffff1660e01b815260040161339492919061555e565b60206040518083038186803b1580156133ac57600080fd5b505afa1580156133c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e491906153ed565b6134005760405162461bcd60e51b8152600401610d1290615578565b6000838152600d602090815260408083206001600160801b03861690819055600e83528184209384556001840180546001600160801b0319169055600290930180546001600160b01b03191690555191825284917fc5cede647bcf791d83ff0ee63bb8ae1434f9795878081f8ad4b36ee1cb582aad910161203c565b60015460ff161561349f5760405162461bcd60e51b8152600401610d12906155d4565b600260005414156134c25760405162461bcd60e51b8152600401610d1290615635565b60026000908155818152600c6020526040902080546134f35760405162461bcd60e51b8152600401610d12906155af565b60018101546001600160a01b031633146135445760405162461bcd60e51b81526020600482015260126024820152712737ba103a3432903a37b8103134b23232b960711b6044820152606401610d12565b80600201544210156135915760405162461bcd60e51b8152602060048201526016602482015275109a59081b1bd8dadd5c081b9bdd08195b185c1cd95960521b6044820152606401610d12565b600181015481546135b29184916001600160a01b0390911690600080614bee565b60405133815282907f2ed9db6d233a11ddbebd6f8b9e9ee561a991b8ab9a839ad4eb724d8397b3cff6906020016128cf565b6135ec613eb3565b600880546001600160801b0319166001600160801b0383169081179091556040519081527f0db06cc6a30966b8f617c70443f80200492161af831f75a335f3c3820e71bacd90602001612082565b60015460ff161561365d5760405162461bcd60e51b8152600401610d12906155d4565b600260005414156136805760405162461bcd60e51b8152600401610d1290615635565b6002600090815582815260076020526040902080546001600160a01b0316331480613737575060015481546001600160a01b036101009092048216916380371cce91166136ca3390565b6040518363ffffffff1660e01b81526004016136e792919061555e565b60206040518083038186803b1580156136ff57600080fd5b505afa158015613713573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373791906153ed565b6137745760405162461bcd60e51b815260206004820152600e60248201526d2737ba103a34329039b2b63632b960911b6044820152606401610d12565b6003810154600160801b90046001600160801b0316156137d65760405162461bcd60e51b815260206004820152601b60248201527f5265736572766520636f756e74646f776e20636f6d6d656e63656400000000006044820152606401610d12565b600554826001600160801b031610156138315760405162461bcd60e51b815260206004820181905260248201527f52657365727665206d757374206265206174206c65617374206d696e206269646044820152606401610d12565b60028101546001600160801b03808416600160801b909204161061388c5760085461386c90600160801b90046001600160801b03164261566c565b6003820180546001600160801b03928316600160801b0292169190911790555b6002810180546001600160801b0319166001600160801b03841690811790915560405190815283907f87c77544fe96aeb9a3a6398d27ed891f9532d66ef82444a0a56aab18a58bbece906020015b60405180910390a25050600160005550565b60015460ff161561390f5760405162461bcd60e51b8152600401610d12906155d4565b600260005414156139325760405162461bcd60e51b8152600401610d1290615635565b60026000908155818152600c6020526040902060018101546001600160a01b031661396f5760405162461bcd60e51b8152600401610d12906155af565b60025460405163d41911d760e01b8152600481018490526000916001600160a01b03169063d41911d79060240160206040518083038186803b1580156139b457600080fd5b505afa1580156139c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ec9190615277565b90506001600160a01b038116331480613a85575060015461010090046001600160a01b03166380371cce82336040518363ffffffff1660e01b8152600401613a3592919061555e565b60206040518083038186803b158015613a4d57600080fd5b505afa158015613a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8591906153ed565b613aca5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b9103737ba103a34329031b932b0ba37b960511b6044820152606401610d12565b60018201548254613aeb9185916001600160a01b0390911690600080614bee565b60018201548254604080516001600160a01b039093168352602083019190915284917fdd21daffb84ed4431b50ed9dedcd5e0cf1f96a4cc5976fefb4be54d43be37281910160405180910390a250506000908152600c60205260408120818155600180820180546001600160a01b031916905560029091018290559055565b60015460ff1615613b8d5760405162461bcd60e51b8152600401610d12906155d4565b60026000541415613bb05760405162461bcd60e51b8152600401610d1290615635565b60026000556005546001600160801b0383161015613be05760405162461bcd60e51b8152600401610d12906155fe565b613be9836143c4565b6040518060600160405280836001600160801b03168152602001826001600160801b03168152602001613c193390565b6001600160a01b039081169091526000858152600960209081526040918290208451858301516001600160801b03918216600160801b9183169190910217825594830151600190910180546001600160a01b0319169190941617909255805185841681529284169183019190915284917f926bdcbf39866f134eede353f606580c48749e851283a077fde2912543b659df91016138da565b6000613cc08585856000614d7c565b95945050505050565b613cd282614cff565b15613d135760405162461bcd60e51b815260206004820152601160248201527011591a5d1a5bdb881a5cc81b1a5cdd1959607a1b6044820152606401610d12565b6000828152600c602052604090206005548154613d3091906156b4565b341015613d755760405162461bcd60e51b8152602060048201526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606401610d12565b6000838152600d60205260409020548015613dea5780421015613dda5760405162461bcd60e51b815260206004820152601860248201527f4e6f742079657420616363657074696e67206f666665727300000000000000006044820152606401610d12565b6000848152600d60205260408120555b815415613e115760018201548254613e119186916001600160a01b03909116903334614bee565b6040518060600160405280348152602001846001600160a01b03168152602001613e39615037565b90526000858152600c602090815260409182902083518155838201516001820180546001600160a01b0319166001600160a01b039283161790559383015160029091015581519286168352349083015285917f823a6e5c949aae9db807fd853796d0cf551fda5395f20faa534a3a2ef7149b9b910161118d565b60015461010090046001600160a01b031663c395fcb3336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015613f0957600080fd5b505afa158015613f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4191906153ed565b6114b85760405162461bcd60e51b815260206004820152601060248201526f21b0b63632b9103737ba1030b236b4b760811b6044820152606401610d12565b60015460ff16613fc95760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d12565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600061401e82614cff565b1592915050565b60015460009061010090046001600160a01b0316638c481207335b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561407f57600080fd5b505afa158015614093573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237b91906153ed565b6002546040516346c8e19d60e11b8152600481018390526000916001600160a01b031690638d91c33a9060240160206040518083038186803b1580156140fc57600080fd5b505afa158015614110573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614134919061546a565b600114801561237b575060015461010090046001600160a01b0316638c48120733614040565b6000828152600e6020526040902060028101546001600160a01b03166141d15760405162461bcd60e51b815260206004820152602660248201527f45646974696f6e206e6f74206c697374656420666f72207374657070656420616044820152653ab1ba34b7b760d11b6064820152608401610d12565b6001810154426001600160801b0390911611156142225760405162461bcd60e51b815260206004820152600f60248201526e139bdd081cdd185c9d1959081e595d608a1b6044820152606401610d12565b600061422d84614b3a565b9050803410156142785760405162461bcd60e51b8152602060048201526016602482015275115e1c1958dd1959081c1c9a58d9481b9bdd081b595d60521b6044820152606401610d12565b60006142878583866001614d7c565b6002840154909150600160a01b900461ffff166142a5816001615697565b8460020160146101000a81548161ffff021916908361ffff1602179055508234111561436c576000336142d88534615733565b604051600081818185875af1925050503d8060008114614314576040519150601f19603f3d011682016040523d82523d6000602084013e614319565b606091505b505090508061436a5760405162461bcd60e51b815260206004820152601d60248201527f6661696c656420746f2073656e64206f7665727370656e64206261636b0000006044820152606401610d12565b505b604080516001600160a01b03871681526020810185905261ffff8316818301529051839188917f41820cf4351ec738da5f8ada46c5a38d78c6aeaa3039cb1dddcf1ea6853dd3439181900360600190a3505050505050565b600081815260076020526040902060028101546001600160801b03166144205760405162461bcd60e51b815260206004820152601160248201527027379030b1ba34bb329030bab1ba34b7b760791b6044820152606401610d12565b60028101546001600160801b03808216600160801b90920416106144925760405162461bcd60e51b815260206004820152602360248201527f43616e206f6e6c7920636f6e76657274206265666f72652072657365727665206044820152621b595d60ea1b6064820152608401610d12565b80546001600160a01b031633146144eb5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79207468652073656c6c65722063616e20636f6e7665727400000000006044820152606401610d12565b6002810154600160801b90046001600160801b03161561453957600181015460028201546145399184916001600160a01b0390911690600160801b90046001600160801b0316600080614bee565b50600090815260076020526040812080546001600160a01b0319908116825560018201805490911690556002810182905560030155565b60015461010090046001600160a01b0316638c481207336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156145c657600080fd5b505afa1580156145da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145fe91906153ed565b6114b85760405162461bcd60e51b815260206004820152601360248201527210d85b1b195c881b9bdd0818dbdb9d1c9858dd606a1b6044820152606401610d12565b600082815260096020526040902060018101546001600160a01b031661469b5760405162461bcd60e51b815260206004820152601060248201526f139bc81b1a5cdd1a5b99c8199bdd5b9960821b6044820152606401610d12565b80546001600160801b03163410156146f55760405162461bcd60e51b815260206004820152601860248201527f4c697374207072696365206e6f742073617469736669656400000000000000006044820152606401610d12565b8054600160801b90046001600160801b031642101561474f5760405162461bcd60e51b8152602060048201526016602482015275131a5cdd081b9bdd08185d985a5b18589b19481e595d60521b6044820152606401610d12565b600181015460009061476f908590349086906001600160a01b0316613cb1565b6001830154604080516001600160a01b0380881682529092166020830152349082015290915081907f25a395eca5bca1a1ca0c1543a3e87384fabcf63100e03535276da15f838805b29060600161118d565b600082815260076020526040902060028101546001600160801b03166148295760405162461bcd60e51b815260206004820152601e60248201527f4e6f742073657420757020666f7220726573657276652061756374696f6e00006044820152606401610d12565b60038101546001600160801b031642101561487f5760405162461bcd60e51b8152602060048201526016602482015275139bdd081858d8d95c1d1a5b99c8189a591cc81e595d60521b6044820152606401610d12565b60055460028201546148a19190600160801b90046001600160801b03166156b4565b34101561490d5760405162461bcd60e51b815260206004820152603460248201527f596f752068617665206e6f742065786365656465642070726576696f757320626044820152731a5908189e481b5a5b88189a5908185b5bdd5b9d60621b6064820152608401610d12565b600381015460028201546001600160801b03600160801b9092048216918215159116341080159061493c575080155b156149825760085461495e90600160801b90046001600160801b03164261566c565b6003840180546001600160801b03928316600160801b029216919091179055614a4c565b8015614a4c57816001600160801b031642106149e05760405162461bcd60e51b815260206004820152601860248201527f4e6f206c6f6e67657220616363657074696e67206269647300000000000000006044820152606401610d12565b60006149ec428461570b565b6008549091506001600160801b0390811690821611614a4a576008546003850154614a2a916001600160801b0390811691600160801b90041661566c565b6003850180546001600160801b03928316600160801b0292169190911790555b505b6002830154600160801b90046001600160801b031615614a995760018301546002840154614a999187916001600160a01b0390911690600160801b90046001600160801b03168734614bee565b6002830180546001600160801b03908116600160801b348084168202929092179093556001860180546001600160a01b0319166001600160a01b038981169182179092558754600389015460408051929094168252602082019290925291820192909252858316606082015292900416608082015285907f0dacabc07ffe733bf314aba914422a6efa538ba8f6885bbd1ee3275c3b3f389d9060a001611f47565b6000818152600e60205260408120600281015481548391614b7791600160a01b90910461ffff1690600160801b90046001600160801b03166156ec565b8254909150614b909082906001600160801b03166156b4565b949350505050565b60015460ff1615614bbb5760405162461bcd60e51b8152600401610d12906155d4565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833613ff6565b6000846001600160a01b03168460405160006040518083038185875af1925050503d8060008114614c3b576040519150601f19603f3d011682016040523d82523d6000602084013e614c40565b606091505b5050905080614ca257604080516001600160a01b0387811682526020820187905285168183015260608101849052905187917f437414bccea896dfde9665f76dd6cbde1ec21a65c6e8bcd2afb4e9b0fb0ea196919081900360800190a2614cf7565b604080516001600160a01b0387811682526020820187905285168183015260608101849052905187917f0769c15e91f18239b38add21faad4a6ba30cd8f93aed73984c02d766af4970f4919081900360800190a25b505050505050565b6000818152600960205260408120600101546001600160a01b031615614d2757506001919050565b6000828152600e60205260409020600201546001600160a01b031615614d4f57506001919050565b6000828152600760205260409020546001600160a01b031615614d7457506001919050565b506000919050565b60008060008084614e0a576002546040516338896da960e01b8152600481018a90526001600160a01b03909116906338896da990602401606060405180830381600087803b158015614dcd57600080fd5b505af1158015614de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e0591906152be565b614e88565b60025460405163634a209360e01b8152600481018a90526001600160a01b039091169063634a209390602401606060405180830381600087803b158015614e5057600080fd5b505af1158015614e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e8891906152be565b925092509250614e9a8883858a61504c565b600254604051632142170760e11b81526001600160a01b038481166004830152888116602483015260448201849052909116906342842e0e90606401600060405180830381600087803b158015614ef057600080fd5b505af1158015614f04573d6000803e3d6000fd5b50929a9950505050505050505050565b60025460008281526007602052604080822054905163e985e9c560e01b8152919283926001600160a01b039182169263e985e9c592614f5a92911690309060040161555e565b60206040518083038186803b158015614f7257600080fd5b505afa158015614f86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614faa91906153ed565b9050801580615030575060025460405163e35ed67f60e01b8152600481018590526001600160a01b039091169063e35ed67f9060240160206040518083038186803b158015614ff857600080fd5b505afa15801561500c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061503091906153ed565b9392505050565b60006006544261504791906156b4565b905090565b6000848152600a602052604081205460ff161561507b57506000848152600a60205260409020600101546150c3565b6001600160a01b0384166000908152600b602052604090205460ff16156150be57506001600160a01b0383166000908152600b60205260409020600101546150c3565b50600f545b600081600454846150d491906156cc565b6150de91906156ec565b90508015615195576003546040516000916001600160a01b03169083908381818185875af1925050503d8060008114615133576040519150601f19603f3d011682016040523d82523d6000602084013e615138565b606091505b50509050806151935760405162461bcd60e51b815260206004820152602160248201527f45646974696f6e20636f6d6d697373696f6e207061796d656e74206661696c656044820152601960fa1b6064820152608401610d12565b505b60006001600160a01b0385166151ab8386615733565b604051600081818185875af1925050503d80600081146151e7576040519150601f19603f3d011682016040523d82523d6000602084013e6151ec565b606091505b50509050806152365760405162461bcd60e51b815260206004820152601660248201527511591a5d1a5bdb881c185e5b595b9d0819985a5b195960521b6044820152606401610d12565b50505050505050565b80356001600160801b038116811461525657600080fd5b919050565b60006020828403121561526c578081fd5b813561503081615760565b600060208284031215615288578081fd5b815161503081615760565b600080604083850312156152a5578081fd5b82356152b081615760565b946020939093013593505050565b6000806000606084860312156152d2578081fd5b83516152dd81615760565b60208501519093506152ee81615760565b80925050604084015190509250925092565b600080600060608486031215615314578283fd5b833561531f81615760565b9250602084013561532f81615778565b929592945050506040919091013590565b60008060008060808587031215615355578081fd5b843561536081615760565b9350602085013592506153756040860161523f565b91506153836060860161523f565b905092959194509250565b600080600080600060a086880312156153a5578081fd5b85356153b081615760565b9450602086013593506153c56040870161523f565b92506153d36060870161523f565b91506153e16080870161523f565b90509295509295909350565b6000602082840312156153fe578081fd5b815161503081615778565b60008060006060848603121561541d578283fd5b833561542881615760565b9250602084013561532f81615760565b600060208284031215615449578081fd5b6150308261523f565b600060208284031215615463578081fd5b5035919050565b60006020828403121561547b578081fd5b5051919050565b60008060408385031215615494578182fd5b8235915060208301356154a681615760565b809150509250929050565b6000806000606084860312156154c5578081fd5b83359250602084013561532f81615778565b600080604083850312156154e9578182fd5b823591506154f96020840161523f565b90509250929050565b600080600060608486031215615516578081fd5b833592506155266020850161523f565b91506155346040850161523f565b90509250925092565b6000806040838503121561554f578182fd5b50508035926020909101359150565b6001600160a01b0392831681529116602082015260400190565b60208082526017908201527f4f6e6c792073656c6c65722063616e20636f6e76657274000000000000000000604082015260600190565b6020808252600b908201526a139bc81bdc195b88189a5960aa1b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526018908201527f4c697374696e67207072696365206e6f7420656e6f7567680000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006001600160801b0380831681851680830382111561568e5761568e61574a565b01949350505050565b600061ffff80831681851680830382111561568e5761568e61574a565b600082198211156156c7576156c761574a565b500190565b6000826156e757634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156157065761570661574a565b500290565b60006001600160801b038381169083168181101561572b5761572b61574a565b039392505050565b6000828210156157455761574561574a565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461577557600080fd5b50565b801515811461577557600080fdfea2646970667358221220259cf77f06931a3032205863c4f37067b8747c4c3a47f1800aec4c48eb4145e664736f6c634300080400330000000000000000000000009028b16494a9363f3eaaf381a6fde67296abc68c000000000000000000000000abb3738f04dc2ec20f4ae4462c3d069d02ae045b000000000000000000000000de9e5ee9e7cd43399969cfb1c0e5596778c6464f
Deployed Bytecode
0x6080604052600436106103975760003560e01c8063748365ef116101dc578063a1d1e56411610102578063c21f86f4116100a0578063d599ee081161006f578063d599ee0814610c6f578063d5df687c14610c8f578063dee294ab14610caf578063ff89a80b14610ccf57600080fd5b8063c21f86f414610bf9578063c30f0db214610c19578063ce9e1ce514610c39578063cf500bec14610c4f57600080fd5b8063a8b3ed71116100dc578063a8b3ed7114610aec578063a9d9985e14610b0c578063b0a0085114610b2c578063b4f931b114610bd957600080fd5b8063a1d1e56414610a8c578063a340f39e14610aac578063a81b574714610acc57600080fd5b806387311d8f1161017a57806395880bfe1161014957806395880bfe14610a2357806395ac51ce14610a3957806397849eb314610a595780639c1d990714610a7957600080fd5b806387311d8f146108ff5780638d91997e1461092c5780638f084d7c1461094c5780639118644314610a0357600080fd5b80637f27c67c116101b65780637f27c67c146108365780637fb38ab0146108495780638456cb59146108ca57806384c95d2a146108df57600080fd5b8063748365ef146107b95780637d87bc80146107f65780637de3766f1461081657600080fd5b80634cb97c18116102c15780635e636b6f1161025f5780636ef3da941161022e5780636ef3da94146107465780637012663e1461076657806372ec7eec146107795780637480911b1461079957600080fd5b80635e636b6f146106d357806361200f94146106f35780636305246e146107135780636710c3f21461073357600080fd5b80634f4841191161029b5780634f48411914610643578063502942cd1461067d57806355d93d491461069d5780635c975abb146106b057600080fd5b80634cb97c18146105bf5780634d1f0a8e146105d25780634f17e281146105f257600080fd5b80632ade1bf311610339578063474379701161030857806347437970146105015780634860ee39146105695780634940ecf01461058957806349751788146105a957600080fd5b80632ade1bf31461046d5780632cd13c001461048d5780633f4ba83a146104cc57806347176275146104e157600080fd5b80630cf274c6116103755780630cf274c6146103f15780631171bda91461041157806320cd669514610431578063297452621461044457600080fd5b806302b433731461039c57806302ece38a146103be578063068bce8d146103d1575b600080fd5b3480156103a857600080fd5b506103bc6103b7366004615452565b610cef565b005b6103bc6103cc366004615452565b610f27565b3480156103dd57600080fd5b506103bc6103ec366004615502565b610f84565b3480156103fd57600080fd5b506103bc61040c3660046154b1565b61119b565b34801561041d57600080fd5b506103bc61042c366004615409565b6111f7565b6103bc61043f366004615482565b6112d4565b34801561045057600080fd5b5061045a60045481565b6040519081526020015b60405180910390f35b34801561047957600080fd5b506103bc6104883660046154d7565b611332565b34801561049957600080fd5b506008546104b490600160801b90046001600160801b031681565b6040516001600160801b039091168152602001610464565b3480156104d857600080fd5b506103bc6114a8565b3480156104ed57600080fd5b506103bc6104fc366004615340565b6114ba565b34801561050d57600080fd5b5061054661051c366004615452565b600c6020526000908152604090208054600182015460029092015490916001600160a01b03169083565b604080519384526001600160a01b03909216602084015290820152606001610464565b34801561057557600080fd5b506103bc610584366004615502565b611666565b34801561059557600080fd5b506103bc6105a4366004615340565b6118c7565b3480156105b557600080fd5b5061045a60055481565b6103bc6105cd366004615482565b611adb565b3480156105de57600080fd5b506103bc6105ed3660046154d7565b611b30565b3480156105fe57600080fd5b5061062c61060d36600461525b565b600b602052600090815260409020805460019091015460ff9091169082565b604080519215158352602083019190915201610464565b34801561064f57600080fd5b5061062c61065e366004615452565b600a602052600090815260409020805460019091015460ff9091169082565b34801561068957600080fd5b506103bc6106983660046154d7565b611cc1565b6103bc6106ab366004615452565b611d70565b3480156106bc57600080fd5b5060015460ff166040519015158152602001610464565b3480156106df57600080fd5b506103bc6106ee36600461538e565b611dc5565b3480156106ff57600080fd5b506103bc61070e366004615293565b611f56565b34801561071f57600080fd5b506103bc61072e366004615452565b612049565b6103bc610741366004615482565b61208d565b34801561075257600080fd5b506103bc61076136600461525b565b6120e2565b6103bc610774366004615452565b612238565b34801561078557600080fd5b506103bc610794366004615452565b61228d565b3480156107a557600080fd5b506103bc6107b4366004615438565b61231a565b3480156107c557600080fd5b506001546107de9061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610464565b34801561080257600080fd5b5061045a610811366004615452565b612370565b34801561082257600080fd5b506103bc610831366004615300565b612381565b6103bc610844366004615482565b6123e8565b34801561085557600080fd5b5061089b610864366004615452565b600960205260009081526040902080546001909101546001600160801b0380831692600160801b900416906001600160a01b031683565b604080516001600160801b0394851681529390921660208401526001600160a01b031690820152606001610464565b3480156108d657600080fd5b506103bc61243d565b3480156108eb57600080fd5b506002546107de906001600160a01b031681565b34801561090b57600080fd5b5061045a61091a366004615452565b600d6020526000908152604090205481565b34801561093857600080fd5b506103bc6109473660046154d7565b61244d565b34801561095857600080fd5b506109ba610967366004615452565b60076020526000908152604090208054600182015460028301546003909301546001600160a01b039283169392909116916001600160801b0380821692600160801b928390048216928282169291041686565b604080516001600160a01b0397881681529690951660208701526001600160801b03938416948601949094529082166060850152811660808401521660a082015260c001610464565b348015610a0f57600080fd5b506103bc610a1e366004615452565b6124c7565b348015610a2f57600080fd5b5061045a60065481565b348015610a4557600080fd5b506103bc610a54366004615452565b612504565b348015610a6557600080fd5b506003546107de906001600160a01b031681565b6103bc610a87366004615452565b612740565b348015610a9857600080fd5b506103bc610aa736600461525b565b612795565b348015610ab857600080fd5b506103bc610ac7366004615452565b6127f9565b348015610ad857600080fd5b506103bc610ae7366004615502565b612908565b348015610af857600080fd5b506103bc610b0736600461553d565b612c56565b348015610b1857600080fd5b506103bc610b27366004615452565b612f20565b348015610b3857600080fd5b50610b94610b47366004615452565b600e602052600090815260409020805460018201546002909201546001600160801b0380831693600160801b90930481169216906001600160a01b03811690600160a01b900461ffff1685565b604080516001600160801b039687168152948616602086015292909416918301919091526001600160a01b0316606082015261ffff909116608082015260a001610464565b348015610be557600080fd5b506103bc610bf4366004615452565b6132cc565b348015610c0557600080fd5b506103bc610c143660046154d7565b613309565b348015610c2557600080fd5b506103bc610c34366004615452565b61347c565b348015610c4557600080fd5b5061045a600f5481565b348015610c5b57600080fd5b506103bc610c6a366004615438565b6135e4565b348015610c7b57600080fd5b506103bc610c8a3660046154d7565b61363a565b348015610c9b57600080fd5b506103bc610caa366004615452565b6138ec565b348015610cbb57600080fd5b506103bc610cca366004615502565b613b6a565b348015610cdb57600080fd5b506008546104b4906001600160801b031681565b60015460ff1615610d1b5760405162461bcd60e51b8152600401610d12906155d4565b60405180910390fd5b60026000541415610d3e5760405162461bcd60e51b8152600401610d1290615635565b60026000818155828152600760205260409020908101546001600160801b0316610d9e5760405162461bcd60e51b815260206004820152601160248201527027379030b1ba34bb329030bab1ba34b7b760791b6044820152606401610d12565b60028101546001600160801b03808216600160801b909204161015610df75760405162461bcd60e51b815260206004820152600f60248201526e14995cd95c9d99481b9bdd081b595d608a1b6044820152606401610d12565b6003810154600160801b90046001600160801b03164211610e5a5760405162461bcd60e51b815260206004820152601960248201527f42696464696e6720686173206e6f742079657420656e646564000000000000006044820152606401610d12565b6001818101548254600280850154600087815260076020526040812080546001600160a01b0319908116825596810180549097169096559185018290556003909401556001600160a01b0391821692911690600160801b90046001600160801b0316610ec885828585613cb1565b50604080518281526001600160a01b038085166020830152851681830152336060820152905186917fa0a548bb147d15d7de045c333ab8b0ec3d0cc790775d009185aa0e009437507e919081900360800190a250506001600055505050565b60015460ff1615610f4a5760405162461bcd60e51b8152600401610d12906155d4565b60026000541415610f6d5760405162461bcd60e51b8152600401610d1290615635565b6002600055610f7c8133613cc9565b506001600055565b60015460ff1615610fa75760405162461bcd60e51b8152600401610d12906155d4565b6000838152600e6020526040902060028101546001600160a01b031633148061105f575060015460028201546001600160a01b036101009092048216916380371cce9116610ff23390565b6040518363ffffffff1660e01b815260040161100f92919061555e565b60206040518083038186803b15801561102757600080fd5b505afa15801561103b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105f91906153ed565b6110995760405162461bcd60e51b815260206004820152600b60248201526a27b7363c9039b2b63632b960a91b6044820152606401610d12565b6002810154600160a01b900461ffff16156110eb5760405162461bcd60e51b81526020600482015260126024820152714f6e6c79207768656e206e6f2073616c657360701b6044820152606401610d12565b600554836001600160801b0316101561113e5760405162461bcd60e51b8152602060048201526015602482015274084c2e6ca40e0e4d2c6ca40dcdee840cadcdeeaced605b1b6044820152606401610d12565b6001600160801b03838116600160801b9184169182028117835560408051918252602082019290925285917fca6f94d6cf7150ed49f5d1ccd677efd457310ccf201845261d9098a6877dcf3c91015b60405180910390a250505050565b6111a3613eb3565b6000838152600a6020908152604091829020805460ff191685151517815560018101849055915183815285917f3435d39114497a2c6d70dbcc09a4026fdaca4c8eb9661f55f026fd79c0a28508910161118d565b6111ff613eb3565b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb90604401602060405180830381600087803b15801561124957600080fd5b505af115801561125d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128191906153ed565b50816001600160a01b0316836001600160a01b03167f305fd4b7f973d3d7ee0074e0c7b4db74db3bbf0c21b17bf10e003985e4fc9f7b836040516112c791815260200190565b60405180910390a3505050565b60015460ff16156112f75760405162461bcd60e51b8152600401610d12906155d4565b6002600054141561131a5760405162461bcd60e51b8152600401610d1290615635565b60026000556113298282613cc9565b50506001600055565b60015460ff16156113555760405162461bcd60e51b8152600401610d12906155d4565b6000828152600960205260409020600101546001600160a01b031633148061141a5750600180546000848152600960205260409020909101546001600160a01b036101009092048216916380371cce91166113ad3390565b6040518363ffffffff1660e01b81526004016113ca92919061555e565b60206040518083038186803b1580156113e257600080fd5b505afa1580156113f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141a91906153ed565b6114365760405162461bcd60e51b8152600401610d1290615578565b600082815260096020908152604080832083815560010180546001600160a01b0319169055600d8252918290206001600160801b03841690819055915191825283917fc5cede647bcf791d83ff0ee63bb8ae1434f9795878081f8ad4b36ee1cb582aad91015b60405180910390a25050565b6114b0613eb3565b6114b8613f80565b565b60015460ff16156114dd5760405162461bcd60e51b8152600401610d12906155d4565b6114e683614013565b6115325760405162461bcd60e51b815260206004820152601860248201527f4c697374696e67206973206e6f74207065726d697474656400000000000000006044820152606401610d12565b61153b83614025565b6115875760405162461bcd60e51b815260206004820152601760248201527f427579206e6f77206c697374696e6720696e76616c69640000000000000000006044820152606401610d12565b600554826001600160801b031610156115b25760405162461bcd60e51b8152600401610d12906155fe565b60408051606080820183526001600160801b0385811680845285821660208086018281526001600160a01b038c8116888a0181815260008e8152600986528b9020995193518816600160801b0293909716929092178855945160019097018054979095166001600160a01b0319909716969096179093558551918252918101939093529282019290925284917f7fd7de54b3a4cc7952845fd3fa85208e0ba980067ead6d59721bebc8bd7ec414910161118d565b600260005414156116895760405162461bcd60e51b8152600401610d1290615635565b600260005560015460ff16156116b15760405162461bcd60e51b8152600401610d12906155d4565b6000838152600e602052604090206005546001600160801b03841610156117125760405162461bcd60e51b8152602060048201526015602482015274098d2e6e840e0e4d2c6ca40dcdee840cadcdeeaced605b1b6044820152606401610d12565b60028101546001600160a01b03163314806117bc575060015460028201546001600160a01b036101009092048216916380371cce911661174f3390565b6040518363ffffffff1660e01b815260040161176c92919061555e565b60206040518083038186803b15801561178457600080fd5b505afa158015611798573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117bc91906153ed565b6117d85760405162461bcd60e51b8152600401610d1290615578565b604080516060810182526001600160801b03858116808352858216602080850182815260028801546001600160a01b0390811687890190815260008d815260098552899020975192518716600160801b0292909616919091178655935160019095018054959094166001600160a01b03199095169490941790925583519081529182015285917f3ed14e51a13ebed8bcb36a692319d51c90603eef8a9b49835ed0f77909e6bdc6910160405180910390a25050506000908152600e60205260408120818155600180820180546001600160801b0319169055600290910180546001600160b01b03191690559055565b60015460ff16156118ea5760405162461bcd60e51b8152600401610d12906155d4565b6118f383614013565b6119375760405162461bcd60e51b8152602060048201526015602482015274131a5cdd1a5b99c81b9bdd081c195c9b5a5d1d1959605a1b6044820152606401610d12565b611940836140b7565b61198c5760405162461bcd60e51b815260206004820152601d60248201527f52657365727665206c697374696e67206e6f74207065726d69747465640000006044820152606401610d12565b600554826001600160801b031610156119f65760405162461bcd60e51b815260206004820152602660248201527f52657365727665207072696365206d757374206265206174206c65617374206d6044820152651a5b88189a5960d21b6064820152608401610d12565b6040805160c0810182526001600160a01b038681168252600060208084018281526001600160801b03888116868801818152606088018681528a841660808a0181815260a08b018981528f8a5260078952988c90209a518b54908b166001600160a01b0319918216178c55965160018c01805491909b16971696909617909855905190518316600160801b90810291841691909117600289015592519451821690920293169290921760039094019390935583519081529182015284917fcd712ccc5669f36ad4dfb9acf905087c4b438eabe53e24c858c72bfa0515cb98910161118d565b60015460ff1615611afe5760405162461bcd60e51b8152600401610d12906155d4565b60026000541415611b215760405162461bcd60e51b8152600401610d1290615635565b6002600055611329828261415a565b60015460ff1615611b535760405162461bcd60e51b8152600401610d12906155d4565b6000828152600960205260409020600101546001600160a01b0316331480611c185750600180546000848152600960205260409020909101546001600160a01b036101009092048216916380371cce9116611bab3390565b6040518363ffffffff1660e01b8152600401611bc892919061555e565b60206040518083038186803b158015611be057600080fd5b505afa158015611bf4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1891906153ed565b611c645760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c792073656c6c65722063616e206368616e6765207072696365000000006044820152606401610d12565b60008281526009602090815260409182902080546001600160801b0319166001600160801b038516908117909155915191825283917f2acf0b64eca25e79ecb9831cce1c9045dce27614bb88deb1cc5b435e87278cdb910161149c565b60015460ff1615611ce45760405162461bcd60e51b8152600401610d12906155d4565b60026000541415611d075760405162461bcd60e51b8152600401610d1290615635565b6002600055611d15826143c4565b6000828152600d60209081526040918290206001600160801b03841690819055915191825283917f5ad253cc2bfa6797b2f1b2a45aa1b0e961d3c6ff8090cc72122c1745d3e84101910160405180910390a250506001600055565b60015460ff1615611d935760405162461bcd60e51b8152600401610d12906155d4565b60026000541415611db65760405162461bcd60e51b8152600401610d1290615635565b6002600055610f7c813361415a565b60015460ff1615611de85760405162461bcd60e51b8152600401610d12906155d4565b611df0614570565b600554836001600160801b03161015611e435760405162461bcd60e51b8152602060048201526015602482015274084c2e6ca40e0e4d2c6ca40dcdee840cadcdeeaced605b1b6044820152606401610d12565b6040805160a0810182526001600160801b03808616825284811660208084019182528583168486019081526001600160a01b03808c16606087019081526000608088018181528d8252600e909552889020965194518616600160801b029486169490941786559051600186018054919095166001600160801b03199190911617909355905160029093018054915161ffff16600160a01b026001600160b01b031990921693909216929092179190911790555184907fde833f743c6e9e4ce17e0e6662f66d3af9ecba83780a7c10cd54ffa7b049562e90611f47908690869086906001600160801b0393841681529183166020830152909116604082015260600190565b60405180910390a25050505050565b611f5e613eb3565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611fab576040519150601f19603f3d011682016040523d82523d6000602084013e611fb0565b606091505b50509050806120015760405162461bcd60e51b815260206004820152601c60248201527f556e61626c6520746f2073656e6420726563697069656e7420455448000000006044820152606401610d12565b826001600160a01b03167f4d688afe1abc567d30e199aa99174c72a9653aec3e1e87dd2b5e60ed469fad558360405161203c91815260200190565b60405180910390a2505050565b612051613eb3565b60058190556040518181527f0e782e841a04fe2a18adf67ea33f1becfdca41420dee80c4c28d966524f2e6e7906020015b60405180910390a150565b60015460ff16156120b05760405162461bcd60e51b8152600401610d12906155d4565b600260005414156120d35760405162461bcd60e51b8152600401610d1290615635565b60026000556113298282614640565b6120ea613eb3565b6001600160a01b03811663c395fcb3336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561213957600080fd5b505afa15801561214d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217191906153ed565b6121d15760405162461bcd60e51b815260206004820152602b60248201527f53656e646572206d75737420686176652061646d696e20726f6c6520696e206e60448201526a195dc818dbdb9d1c9858dd60aa1b6064820152608401610d12565b6001546040516001600160a01b0380841692610100900416907facd428448d30f3fadee1e7d643a28cfee0ec86aef546e1cfc717d844b99eedf290600090a3600180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60015460ff161561225b5760405162461bcd60e51b8152600401610d12906155d4565b6002600054141561227e5760405162461bcd60e51b8152600401610d1290615635565b6002600055610f7c81336147c1565b612295613eb3565b600081116122e55760405162461bcd60e51b815260206004820152601b60248201527f4d6f64756c6f20706f696e742063616e6e6f74206265207a65726f00000000006044820152606401610d12565b60048190556040518181527f0974c11e488a74018e3da44e0750b7d0ec99a431c45f79a6110d722b823d0af090602001612082565b612322613eb3565b600880546001600160801b03908116600160801b918416918202179091556040519081527fa076ed7cc197f8c245d58d44bfdc92180b22f8e3ddd247c45ee0e84f79f7b2bd90602001612082565b600061237b82614b3a565b92915050565b612389613eb3565b6001600160a01b0383166000818152600b6020908152604091829020805460ff19168615151781556001810185905591518481529192917f036d5b8a890813b20be995ed13873cba592f6933b7f9c5d342b258f72ede6e78910161118d565b60015460ff161561240b5760405162461bcd60e51b8152600401610d12906155d4565b6002600054141561242e5760405162461bcd60e51b8152600401610d1290615635565b600260005561132982826147c1565b612445613eb3565b6114b8614b98565b60015460ff16156124705760405162461bcd60e51b8152600401610d12906155d4565b612478614570565b6000828152600d60209081526040918290206001600160801b03841690819055915191825283917f252bfd97a791429cb820c48af9674adf004431519d80a5d86fafdfb06863492c910161149c565b6124cf613eb3565b60068190556040518181527f46b8c32fce68a5f2dff628d3b2cf9374788f42ea33b343728a64a3b090b4479e90602001612082565b60015460ff16156125275760405162461bcd60e51b8152600401610d12906155d4565b6002600054141561254a5760405162461bcd60e51b8152600401610d1290615635565b60026000818155828152600760205260409020908101546001600160801b03166125b65760405162461bcd60e51b815260206004820152601c60248201527f4e6f20726573657276652061756374696f6e20696e20666c69676874000000006044820152606401610d12565b60028101546001600160801b03808216600160801b90920416106126325760405162461bcd60e51b815260206004820152602d60248201527f426964732063616e206f6e6c792062652077697468647261776e20696620726560448201526c1cd95c9d99481b9bdd081b595d609a1b6064820152608401610d12565b60018101546001600160a01b0316331461269d5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c7920746865206269646465722063616e207769746864726177207468656044820152651a5c88189a5960d21b6064820152608401610d12565b60028101546001820154600160801b9091046001600160801b0316906126d19084906001600160a01b031683600080614bee565b6001820180546001600160a01b03191690556002820180546001600160801b039081169091556040805185815233602082015291831682820152517fd1d72c9a0832cf3726713b61a67a8f1656cc01385640d04f1155b000d1b7b7519181900360600190a15050600160005550565b60015460ff16156127635760405162461bcd60e51b8152600401610d12906155d4565b600260005414156127865760405162461bcd60e51b8152600401610d1290615635565b6002600055610f7c8133614640565b61279d613eb3565b6003546040516001600160a01b038084169216907f0dcf4ed468afaf8b36d6f5982788e2b86c18a544e7fb05803a79f67cd097d59190600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b612801613eb3565b600260005414156128245760405162461bcd60e51b8152600401610d1290615635565b60026000908155818152600c6020526040902060018101546001600160a01b03166128615760405162461bcd60e51b8152600401610d12906155af565b80541561288957600181015481546128899184916001600160a01b0390911690600080614bee565b60018101548154604080516001600160a01b039093168352602083019190915283917fdd21daffb84ed4431b50ed9dedcd5e0cf1f96a4cc5976fefb4be54d43be3728191015b60405180910390a2506000908152600c60205260408120818155600180820180546001600160a01b031916905560029091018290559055565b60015460ff161561292b5760405162461bcd60e51b8152600401610d12906155d4565b6002600054141561294e5760405162461bcd60e51b8152600401610d1290615635565b600260005561295c83614cff565b1561299d5760405162461bcd60e51b815260206004820152601160248201527011591a5d1a5bdb881a5cc81b1a5cdd1959607a1b6044820152606401610d12565b60025460405163d41911d760e01b8152600481018590526000916001600160a01b03169063d41911d79060240160206040518083038186803b1580156129e257600080fd5b505afa1580156129f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1a9190615277565b90506001600160a01b038116331480612ab3575060015461010090046001600160a01b03166380371cce82336040518363ffffffff1660e01b8152600401612a6392919061555e565b60206040518083038186803b158015612a7b57600080fd5b505afa158015612a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab391906153ed565b612aed5760405162461bcd60e51b815260206004820152600b60248201526a2737ba1031b932b0ba37b960a91b6044820152606401610d12565b600554836001600160801b03161015612b185760405162461bcd60e51b8152600401610d12906155fe565b6000848152600c60205260409020805415612b4e5760018101548154612b4e9187916001600160a01b0390911690600080614bee565b6000858152600c602090815260408083208381556001810180546001600160a01b0319169055600201839055600d82528083209290925581516060810183526001600160801b038781168252861691810191909152908101336001600160a01b039081169091526000878152600960209081526040918290208451858301516001600160801b03918216600160801b9183169190910217825594830151600190910180546001600160a01b0319169190941617909255805188815287841692810192909252918516918101919091527f4ee58f1b139dbfa3b12ee1fc57ad8d513b35c670477df6dfde35944346b1d1949060600160405180910390a150506001600055505050565b60015460ff1615612c795760405162461bcd60e51b8152600401610d12906155d4565b60026000541415612c9c5760405162461bcd60e51b8152600401610d1290615635565b60026000908155828152600c6020526040902060018101546001600160a01b0316612cd95760405162461bcd60e51b8152600401610d12906155af565b8054821115612d2a5760405162461bcd60e51b815260206004820152601760248201527f4f6666657220707269636520686173206368616e6765640000000000000000006044820152606401610d12565b60025460405163d41911d760e01b8152600481018590526000916001600160a01b03169063d41911d79060240160206040518083038186803b158015612d6f57600080fd5b505afa158015612d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612da79190615277565b90506001600160a01b038116331480612e40575060015461010090046001600160a01b03166380371cce82336040518363ffffffff1660e01b8152600401612df092919061555e565b60206040518083038186803b158015612e0857600080fd5b505afa158015612e1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4091906153ed565b612e7a5760405162461bcd60e51b815260206004820152600b60248201526a2737ba1031b932b0ba37b960a91b6044820152606401610d12565b81546001830154600091612e9a918791906001600160a01b031684614d7c565b60018401548454604080516001600160a01b0390931683526020830191909152919250829187917fbb5456559b0c90450f12de9d601e1470b0edb240c3425838360bd25412e6b8be910160405180910390a3505050600091825250600c60205260408120818155600180820180546001600160a01b031916905560029091018290559055565b60015460ff1615612f435760405162461bcd60e51b8152600401610d12906155d4565b60026000541415612f665760405162461bcd60e51b8152600401610d1290615635565b6002600081815582815260076020526040902090810154600160801b90046001600160801b0316612fcc5760405162461bcd60e51b815260206004820152601060248201526f139bc8189a59081a5b88199b1a59da1d60821b6044820152606401610d12565b612fd582614f14565b6130475760405162461bcd60e51b815260206004820152603b60248201527f4269642063616e6e6f742062652077697468647261776e20617320726573657260448201527f76652061756374696f6e206c697374696e672069732076616c696400000000006064820152608401610d12565b80546001820154336001600160a01b0392831681149290911614818061306a5750805b80613101575060015483546001600160a01b036101009092048216916380371cce91166130943390565b6040518363ffffffff1660e01b81526004016130b192919061555e565b60206040518083038186803b1580156130c957600080fd5b505afa1580156130dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310191906153ed565b80613195575060015461010090046001600160a01b0316633d3d6fe2336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561315d57600080fd5b505afa158015613171573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061319591906153ed565b6131f95760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c792073656c6c65722c206269646465722c20636f6e7472616374206f7260448201526e10383630ba3337b9369030b236b4b760891b6064820152608401610d12565b6001830154600284015461322d9186916001600160a01b0390911690600160801b90046001600160801b0316600080614bee565b60018301546002840154604080516001600160a01b039093168352600160801b9091046001600160801b0316602083015285917f5254bc5658a9d8a2b41347762f2b035d708f4be1013ab8fb33922576e24570fe910160405180910390a2505050600090815260076020526040812080546001600160a01b03199081168255600180830180549092169091556002820183905560039091018290559055565b6132d4613eb3565b600f8190556040518181527fddddb61577530b164743cafe83935aeddb8888d7de39faeea75fd888bd1dcc7590602001612082565b60015460ff161561332c5760405162461bcd60e51b8152600401610d12906155d4565b6000828152600e6020526040902060028101546001600160a01b03163314806133e4575060015460028201546001600160a01b036101009092048216916380371cce91166133773390565b6040518363ffffffff1660e01b815260040161339492919061555e565b60206040518083038186803b1580156133ac57600080fd5b505afa1580156133c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e491906153ed565b6134005760405162461bcd60e51b8152600401610d1290615578565b6000838152600d602090815260408083206001600160801b03861690819055600e83528184209384556001840180546001600160801b0319169055600290930180546001600160b01b03191690555191825284917fc5cede647bcf791d83ff0ee63bb8ae1434f9795878081f8ad4b36ee1cb582aad910161203c565b60015460ff161561349f5760405162461bcd60e51b8152600401610d12906155d4565b600260005414156134c25760405162461bcd60e51b8152600401610d1290615635565b60026000908155818152600c6020526040902080546134f35760405162461bcd60e51b8152600401610d12906155af565b60018101546001600160a01b031633146135445760405162461bcd60e51b81526020600482015260126024820152712737ba103a3432903a37b8103134b23232b960711b6044820152606401610d12565b80600201544210156135915760405162461bcd60e51b8152602060048201526016602482015275109a59081b1bd8dadd5c081b9bdd08195b185c1cd95960521b6044820152606401610d12565b600181015481546135b29184916001600160a01b0390911690600080614bee565b60405133815282907f2ed9db6d233a11ddbebd6f8b9e9ee561a991b8ab9a839ad4eb724d8397b3cff6906020016128cf565b6135ec613eb3565b600880546001600160801b0319166001600160801b0383169081179091556040519081527f0db06cc6a30966b8f617c70443f80200492161af831f75a335f3c3820e71bacd90602001612082565b60015460ff161561365d5760405162461bcd60e51b8152600401610d12906155d4565b600260005414156136805760405162461bcd60e51b8152600401610d1290615635565b6002600090815582815260076020526040902080546001600160a01b0316331480613737575060015481546001600160a01b036101009092048216916380371cce91166136ca3390565b6040518363ffffffff1660e01b81526004016136e792919061555e565b60206040518083038186803b1580156136ff57600080fd5b505afa158015613713573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373791906153ed565b6137745760405162461bcd60e51b815260206004820152600e60248201526d2737ba103a34329039b2b63632b960911b6044820152606401610d12565b6003810154600160801b90046001600160801b0316156137d65760405162461bcd60e51b815260206004820152601b60248201527f5265736572766520636f756e74646f776e20636f6d6d656e63656400000000006044820152606401610d12565b600554826001600160801b031610156138315760405162461bcd60e51b815260206004820181905260248201527f52657365727665206d757374206265206174206c65617374206d696e206269646044820152606401610d12565b60028101546001600160801b03808416600160801b909204161061388c5760085461386c90600160801b90046001600160801b03164261566c565b6003820180546001600160801b03928316600160801b0292169190911790555b6002810180546001600160801b0319166001600160801b03841690811790915560405190815283907f87c77544fe96aeb9a3a6398d27ed891f9532d66ef82444a0a56aab18a58bbece906020015b60405180910390a25050600160005550565b60015460ff161561390f5760405162461bcd60e51b8152600401610d12906155d4565b600260005414156139325760405162461bcd60e51b8152600401610d1290615635565b60026000908155818152600c6020526040902060018101546001600160a01b031661396f5760405162461bcd60e51b8152600401610d12906155af565b60025460405163d41911d760e01b8152600481018490526000916001600160a01b03169063d41911d79060240160206040518083038186803b1580156139b457600080fd5b505afa1580156139c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ec9190615277565b90506001600160a01b038116331480613a85575060015461010090046001600160a01b03166380371cce82336040518363ffffffff1660e01b8152600401613a3592919061555e565b60206040518083038186803b158015613a4d57600080fd5b505afa158015613a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a8591906153ed565b613aca5760405162461bcd60e51b815260206004820152601660248201527521b0b63632b9103737ba103a34329031b932b0ba37b960511b6044820152606401610d12565b60018201548254613aeb9185916001600160a01b0390911690600080614bee565b60018201548254604080516001600160a01b039093168352602083019190915284917fdd21daffb84ed4431b50ed9dedcd5e0cf1f96a4cc5976fefb4be54d43be37281910160405180910390a250506000908152600c60205260408120818155600180820180546001600160a01b031916905560029091018290559055565b60015460ff1615613b8d5760405162461bcd60e51b8152600401610d12906155d4565b60026000541415613bb05760405162461bcd60e51b8152600401610d1290615635565b60026000556005546001600160801b0383161015613be05760405162461bcd60e51b8152600401610d12906155fe565b613be9836143c4565b6040518060600160405280836001600160801b03168152602001826001600160801b03168152602001613c193390565b6001600160a01b039081169091526000858152600960209081526040918290208451858301516001600160801b03918216600160801b9183169190910217825594830151600190910180546001600160a01b0319169190941617909255805185841681529284169183019190915284917f926bdcbf39866f134eede353f606580c48749e851283a077fde2912543b659df91016138da565b6000613cc08585856000614d7c565b95945050505050565b613cd282614cff565b15613d135760405162461bcd60e51b815260206004820152601160248201527011591a5d1a5bdb881a5cc81b1a5cdd1959607a1b6044820152606401610d12565b6000828152600c602052604090206005548154613d3091906156b4565b341015613d755760405162461bcd60e51b8152602060048201526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606401610d12565b6000838152600d60205260409020548015613dea5780421015613dda5760405162461bcd60e51b815260206004820152601860248201527f4e6f742079657420616363657074696e67206f666665727300000000000000006044820152606401610d12565b6000848152600d60205260408120555b815415613e115760018201548254613e119186916001600160a01b03909116903334614bee565b6040518060600160405280348152602001846001600160a01b03168152602001613e39615037565b90526000858152600c602090815260409182902083518155838201516001820180546001600160a01b0319166001600160a01b039283161790559383015160029091015581519286168352349083015285917f823a6e5c949aae9db807fd853796d0cf551fda5395f20faa534a3a2ef7149b9b910161118d565b60015461010090046001600160a01b031663c395fcb3336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015613f0957600080fd5b505afa158015613f1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f4191906153ed565b6114b85760405162461bcd60e51b815260206004820152601060248201526f21b0b63632b9103737ba1030b236b4b760811b6044820152606401610d12565b60015460ff16613fc95760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610d12565b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600061401e82614cff565b1592915050565b60015460009061010090046001600160a01b0316638c481207335b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b15801561407f57600080fd5b505afa158015614093573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237b91906153ed565b6002546040516346c8e19d60e11b8152600481018390526000916001600160a01b031690638d91c33a9060240160206040518083038186803b1580156140fc57600080fd5b505afa158015614110573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614134919061546a565b600114801561237b575060015461010090046001600160a01b0316638c48120733614040565b6000828152600e6020526040902060028101546001600160a01b03166141d15760405162461bcd60e51b815260206004820152602660248201527f45646974696f6e206e6f74206c697374656420666f72207374657070656420616044820152653ab1ba34b7b760d11b6064820152608401610d12565b6001810154426001600160801b0390911611156142225760405162461bcd60e51b815260206004820152600f60248201526e139bdd081cdd185c9d1959081e595d608a1b6044820152606401610d12565b600061422d84614b3a565b9050803410156142785760405162461bcd60e51b8152602060048201526016602482015275115e1c1958dd1959081c1c9a58d9481b9bdd081b595d60521b6044820152606401610d12565b60006142878583866001614d7c565b6002840154909150600160a01b900461ffff166142a5816001615697565b8460020160146101000a81548161ffff021916908361ffff1602179055508234111561436c576000336142d88534615733565b604051600081818185875af1925050503d8060008114614314576040519150601f19603f3d011682016040523d82523d6000602084013e614319565b606091505b505090508061436a5760405162461bcd60e51b815260206004820152601d60248201527f6661696c656420746f2073656e64206f7665727370656e64206261636b0000006044820152606401610d12565b505b604080516001600160a01b03871681526020810185905261ffff8316818301529051839188917f41820cf4351ec738da5f8ada46c5a38d78c6aeaa3039cb1dddcf1ea6853dd3439181900360600190a3505050505050565b600081815260076020526040902060028101546001600160801b03166144205760405162461bcd60e51b815260206004820152601160248201527027379030b1ba34bb329030bab1ba34b7b760791b6044820152606401610d12565b60028101546001600160801b03808216600160801b90920416106144925760405162461bcd60e51b815260206004820152602360248201527f43616e206f6e6c7920636f6e76657274206265666f72652072657365727665206044820152621b595d60ea1b6064820152608401610d12565b80546001600160a01b031633146144eb5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c79207468652073656c6c65722063616e20636f6e7665727400000000006044820152606401610d12565b6002810154600160801b90046001600160801b03161561453957600181015460028201546145399184916001600160a01b0390911690600160801b90046001600160801b0316600080614bee565b50600090815260076020526040812080546001600160a01b0319908116825560018201805490911690556002810182905560030155565b60015461010090046001600160a01b0316638c481207336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b1580156145c657600080fd5b505afa1580156145da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145fe91906153ed565b6114b85760405162461bcd60e51b815260206004820152601360248201527210d85b1b195c881b9bdd0818dbdb9d1c9858dd606a1b6044820152606401610d12565b600082815260096020526040902060018101546001600160a01b031661469b5760405162461bcd60e51b815260206004820152601060248201526f139bc81b1a5cdd1a5b99c8199bdd5b9960821b6044820152606401610d12565b80546001600160801b03163410156146f55760405162461bcd60e51b815260206004820152601860248201527f4c697374207072696365206e6f742073617469736669656400000000000000006044820152606401610d12565b8054600160801b90046001600160801b031642101561474f5760405162461bcd60e51b8152602060048201526016602482015275131a5cdd081b9bdd08185d985a5b18589b19481e595d60521b6044820152606401610d12565b600181015460009061476f908590349086906001600160a01b0316613cb1565b6001830154604080516001600160a01b0380881682529092166020830152349082015290915081907f25a395eca5bca1a1ca0c1543a3e87384fabcf63100e03535276da15f838805b29060600161118d565b600082815260076020526040902060028101546001600160801b03166148295760405162461bcd60e51b815260206004820152601e60248201527f4e6f742073657420757020666f7220726573657276652061756374696f6e00006044820152606401610d12565b60038101546001600160801b031642101561487f5760405162461bcd60e51b8152602060048201526016602482015275139bdd081858d8d95c1d1a5b99c8189a591cc81e595d60521b6044820152606401610d12565b60055460028201546148a19190600160801b90046001600160801b03166156b4565b34101561490d5760405162461bcd60e51b815260206004820152603460248201527f596f752068617665206e6f742065786365656465642070726576696f757320626044820152731a5908189e481b5a5b88189a5908185b5bdd5b9d60621b6064820152608401610d12565b600381015460028201546001600160801b03600160801b9092048216918215159116341080159061493c575080155b156149825760085461495e90600160801b90046001600160801b03164261566c565b6003840180546001600160801b03928316600160801b029216919091179055614a4c565b8015614a4c57816001600160801b031642106149e05760405162461bcd60e51b815260206004820152601860248201527f4e6f206c6f6e67657220616363657074696e67206269647300000000000000006044820152606401610d12565b60006149ec428461570b565b6008549091506001600160801b0390811690821611614a4a576008546003850154614a2a916001600160801b0390811691600160801b90041661566c565b6003850180546001600160801b03928316600160801b0292169190911790555b505b6002830154600160801b90046001600160801b031615614a995760018301546002840154614a999187916001600160a01b0390911690600160801b90046001600160801b03168734614bee565b6002830180546001600160801b03908116600160801b348084168202929092179093556001860180546001600160a01b0319166001600160a01b038981169182179092558754600389015460408051929094168252602082019290925291820192909252858316606082015292900416608082015285907f0dacabc07ffe733bf314aba914422a6efa538ba8f6885bbd1ee3275c3b3f389d9060a001611f47565b6000818152600e60205260408120600281015481548391614b7791600160a01b90910461ffff1690600160801b90046001600160801b03166156ec565b8254909150614b909082906001600160801b03166156b4565b949350505050565b60015460ff1615614bbb5760405162461bcd60e51b8152600401610d12906155d4565b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833613ff6565b6000846001600160a01b03168460405160006040518083038185875af1925050503d8060008114614c3b576040519150601f19603f3d011682016040523d82523d6000602084013e614c40565b606091505b5050905080614ca257604080516001600160a01b0387811682526020820187905285168183015260608101849052905187917f437414bccea896dfde9665f76dd6cbde1ec21a65c6e8bcd2afb4e9b0fb0ea196919081900360800190a2614cf7565b604080516001600160a01b0387811682526020820187905285168183015260608101849052905187917f0769c15e91f18239b38add21faad4a6ba30cd8f93aed73984c02d766af4970f4919081900360800190a25b505050505050565b6000818152600960205260408120600101546001600160a01b031615614d2757506001919050565b6000828152600e60205260409020600201546001600160a01b031615614d4f57506001919050565b6000828152600760205260409020546001600160a01b031615614d7457506001919050565b506000919050565b60008060008084614e0a576002546040516338896da960e01b8152600481018a90526001600160a01b03909116906338896da990602401606060405180830381600087803b158015614dcd57600080fd5b505af1158015614de1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e0591906152be565b614e88565b60025460405163634a209360e01b8152600481018a90526001600160a01b039091169063634a209390602401606060405180830381600087803b158015614e5057600080fd5b505af1158015614e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e8891906152be565b925092509250614e9a8883858a61504c565b600254604051632142170760e11b81526001600160a01b038481166004830152888116602483015260448201849052909116906342842e0e90606401600060405180830381600087803b158015614ef057600080fd5b505af1158015614f04573d6000803e3d6000fd5b50929a9950505050505050505050565b60025460008281526007602052604080822054905163e985e9c560e01b8152919283926001600160a01b039182169263e985e9c592614f5a92911690309060040161555e565b60206040518083038186803b158015614f7257600080fd5b505afa158015614f86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614faa91906153ed565b9050801580615030575060025460405163e35ed67f60e01b8152600481018590526001600160a01b039091169063e35ed67f9060240160206040518083038186803b158015614ff857600080fd5b505afa15801561500c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061503091906153ed565b9392505050565b60006006544261504791906156b4565b905090565b6000848152600a602052604081205460ff161561507b57506000848152600a60205260409020600101546150c3565b6001600160a01b0384166000908152600b602052604090205460ff16156150be57506001600160a01b0383166000908152600b60205260409020600101546150c3565b50600f545b600081600454846150d491906156cc565b6150de91906156ec565b90508015615195576003546040516000916001600160a01b03169083908381818185875af1925050503d8060008114615133576040519150601f19603f3d011682016040523d82523d6000602084013e615138565b606091505b50509050806151935760405162461bcd60e51b815260206004820152602160248201527f45646974696f6e20636f6d6d697373696f6e207061796d656e74206661696c656044820152601960fa1b6064820152608401610d12565b505b60006001600160a01b0385166151ab8386615733565b604051600081818185875af1925050503d80600081146151e7576040519150601f19603f3d011682016040523d82523d6000602084013e6151ec565b606091505b50509050806152365760405162461bcd60e51b815260206004820152601660248201527511591a5d1a5bdb881c185e5b595b9d0819985a5b195960521b6044820152606401610d12565b50505050505050565b80356001600160801b038116811461525657600080fd5b919050565b60006020828403121561526c578081fd5b813561503081615760565b600060208284031215615288578081fd5b815161503081615760565b600080604083850312156152a5578081fd5b82356152b081615760565b946020939093013593505050565b6000806000606084860312156152d2578081fd5b83516152dd81615760565b60208501519093506152ee81615760565b80925050604084015190509250925092565b600080600060608486031215615314578283fd5b833561531f81615760565b9250602084013561532f81615778565b929592945050506040919091013590565b60008060008060808587031215615355578081fd5b843561536081615760565b9350602085013592506153756040860161523f565b91506153836060860161523f565b905092959194509250565b600080600080600060a086880312156153a5578081fd5b85356153b081615760565b9450602086013593506153c56040870161523f565b92506153d36060870161523f565b91506153e16080870161523f565b90509295509295909350565b6000602082840312156153fe578081fd5b815161503081615778565b60008060006060848603121561541d578283fd5b833561542881615760565b9250602084013561532f81615760565b600060208284031215615449578081fd5b6150308261523f565b600060208284031215615463578081fd5b5035919050565b60006020828403121561547b578081fd5b5051919050565b60008060408385031215615494578182fd5b8235915060208301356154a681615760565b809150509250929050565b6000806000606084860312156154c5578081fd5b83359250602084013561532f81615778565b600080604083850312156154e9578182fd5b823591506154f96020840161523f565b90509250929050565b600080600060608486031215615516578081fd5b833592506155266020850161523f565b91506155346040850161523f565b90509250925092565b6000806040838503121561554f578182fd5b50508035926020909101359150565b6001600160a01b0392831681529116602082015260400190565b60208082526017908201527f4f6e6c792073656c6c65722063616e20636f6e76657274000000000000000000604082015260600190565b6020808252600b908201526a139bc81bdc195b88189a5960aa1b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526018908201527f4c697374696e67207072696365206e6f7420656e6f7567680000000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006001600160801b0380831681851680830382111561568e5761568e61574a565b01949350505050565b600061ffff80831681851680830382111561568e5761568e61574a565b600082198211156156c7576156c761574a565b500190565b6000826156e757634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156157065761570661574a565b500290565b60006001600160801b038381169083168181101561572b5761572b61574a565b039392505050565b6000828210156157455761574561574a565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461577557600080fd5b50565b801515811461577557600080fdfea2646970667358221220259cf77f06931a3032205863c4f37067b8747c4c3a47f1800aec4c48eb4145e664736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009028b16494a9363f3eaaf381a6fde67296abc68c000000000000000000000000abb3738f04dc2ec20f4ae4462c3d069d02ae045b000000000000000000000000de9e5ee9e7cd43399969cfb1c0e5596778c6464f
-----Decoded View---------------
Arg [0] : _accessControls (address): 0x9028b16494a9363F3EAaf381a6Fde67296abc68C
Arg [1] : _koda (address): 0xABB3738f04Dc2Ec20f4AE4462c3d069d02AE045B
Arg [2] : _platformAccount (address): 0xde9e5eE9E7cD43399969Cfb1C0E5596778c6464F
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000009028b16494a9363f3eaaf381a6fde67296abc68c
Arg [1] : 000000000000000000000000abb3738f04dc2ec20f4ae4462c3d069d02ae045b
Arg [2] : 000000000000000000000000de9e5ee9e7cd43399969cfb1c0e5596778c6464f
Deployed Bytecode Sourcemap
47264:19658:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41425:902;;;;;;;;;;-1:-1:-1;41425:902:0;;;;;:::i;:::-;;:::i;:::-;;50578:182;;;;;;:::i;:::-;;:::i;55845:737::-;;;;;;;;;;-1:-1:-1;55845:737:0;;;;;:::i;:::-;;:::i;61869:422::-;;;;;;;;;;-1:-1:-1;61869:422:0;;;;;:::i;:::-;;:::i;31275:208::-;;;;;;;;;;-1:-1:-1;31275:208:0;;;;;:::i;:::-;;:::i;50768:197::-;;;;;;:::i;:::-;;:::i;30828:33::-;;;;;;;;;;;;;;;;;;;34294:25:1;;;34282:2;34267:18;30828:33:0;;;;;;;;49541:651;;;;;;;;;;-1:-1:-1;49541:651:0;;;;;:::i;:::-;;:::i;38091:60::-;;;;;;;;;;-1:-1:-1;38091:60:0;;;;-1:-1:-1;;;38091:60:0;;-1:-1:-1;;;;;38091:60:0;;;;;;-1:-1:-1;;;;;31387:47:1;;;31369:66;;31357:2;31342:18;38091:60:0;31324:117:1;32971:71:0;;;;;;;;;;;;;:::i;34721:566::-;;;;;;;;;;-1:-1:-1;34721:566:0;;;;;:::i;:::-;;:::i;48831:46::-;;;;;;;;;;-1:-1:-1;48831:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48831:46:0;;;;;;;;35384:25:1;;;-1:-1:-1;;;;;35445:32:1;;;35440:2;35425:18;;35418:60;35494:18;;;35487:34;35372:2;35357:18;48831:46:0;35339:188:1;58176:854:0;;;;;;;;;;-1:-1:-1;58176:854:0;;;;;:::i;:::-;;:::i;38160:767::-;;;;;;;;;;-1:-1:-1;38160:767:0;;;;;:::i;:::-;;:::i;30921:40::-;;;;;;;;;;;;;;;;56772:187;;;;;;:::i;:::-;;:::i;35858:525::-;;;;;;;;;;-1:-1:-1;35858:525:0;;;;;:::i;:::-;;:::i;48698:79::-;;;;;;;;;;-1:-1:-1;48698:79:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10446:14:1;;10439:22;10421:41;;10493:2;10478:18;;10471:34;;;;10394:18;48698:79:0;10376:135:1;48533:79:0;;;;;;;;;;-1:-1:-1;48533:79:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;60752:390;;;;;;;;;;-1:-1:-1;60752:390:0;;;;;:::i;:::-;;:::i;56590:174::-;;;;;;:::i;:::-;;:::i;24814:86::-;;;;;;;;;;-1:-1:-1;24885:7:0;;;;24814:86;;10226:14:1;;10219:22;10201:41;;10189:2;10174:18;24814:86:0;10156:92:1;55262:575:0;;;;;;;;;;-1:-1:-1;55262:575:0;;;;;:::i;:::-;;:::i;31491:271::-;;;;;;;;;;-1:-1:-1;31491:271:0;;;;;:::i;:::-;;:::i;32303:169::-;;;;;;;;;;-1:-1:-1;32303:169:0;;;;;:::i;:::-;;:::i;35625:190::-;;;;;;:::i;:::-;;:::i;31770:322::-;;;;;;;;;;-1:-1:-1;31770:322:0;;;;;:::i;:::-;;:::i;38935:186::-;;;;;;:::i;:::-;;:::i;32100:195::-;;;;;;;;;;-1:-1:-1;32100:195:0;;;;;:::i;:::-;;:::i;45757:301::-;;;;;;;;;;-1:-1:-1;45757:301:0;;;;;:::i;:::-;;:::i;30596:45::-;;;;;;;;;;-1:-1:-1;30596:45:0;;;;;;;-1:-1:-1;;;;;30596:45:0;;;;;;-1:-1:-1;;;;;6636:32:1;;;6618:51;;6606:2;6591:18;30596:45:0;6573:102:1;59741:158:0;;;;;;;;;;-1:-1:-1;59741:158:0;;;;;:::i;:::-;;:::i;61445:416::-;;;;;;;;;;-1:-1:-1;61445:416:0;;;;;:::i;:::-;;:::i;39129:201::-;;;;;;:::i;:::-;;:::i;34598:57::-;;;;;;;;;;-1:-1:-1;34598:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;34598:57:0;;;;-1:-1:-1;;;34598:57:0;;;;-1:-1:-1;;;;;34598:57:0;;;;;;;-1:-1:-1;;;;;33011:15:1;;;32993:34;;33063:15;;;;33058:2;33043:18;;33036:43;-1:-1:-1;;;;;33115:32:1;33095:18;;;33088:60;32928:2;32913:18;34598:57:0;32895:259:1;32896:67:0;;;;;;;;;;;;;:::i;30681:19::-;;;;;;;;;;-1:-1:-1;30681:19:0;;;;-1:-1:-1;;;;;30681:19:0;;;48927:57;;;;;;;;;;-1:-1:-1;48927:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;50237:333;;;;;;;;;;-1:-1:-1;50237:333:0;;;;;:::i;:::-;;:::i;37721:75::-;;;;;;;;;;-1:-1:-1;37721:75:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37721:75:0;;;;;;;;;-1:-1:-1;;;;;37721:75:0;;;;-1:-1:-1;;;37721:75:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7332:15:1;;;7314:34;;7384:15;;;;7379:2;7364:18;;7357:43;-1:-1:-1;;;;;7489:15:1;;;7469:18;;;7462:43;;;;7541:15;;;7536:2;7521:18;;7514:43;7594:15;;7588:3;7573:19;;7566:44;7647:15;7294:3;7626:19;;7619:44;7263:3;7248:19;37721:75:0;7230:439:1;32480:187:0;;;;;;;;;;-1:-1:-1;32480:187:0;;;;;:::i;:::-;;:::i;31005:40::-;;;;;;;;;;;;;;;;42390:815;;;;;;;;;;-1:-1:-1;42390:815:0;;;;;:::i;:::-;;:::i;30751:30::-;;;;;;;;;;-1:-1:-1;30751:30:0;;;;-1:-1:-1;;;;;30751:30:0;;;35355:169;;;;;;:::i;:::-;;:::i;32675:213::-;;;;;;;;;;-1:-1:-1;32675:213:0;;;;;:::i;:::-;;:::i;53457:522::-;;;;;;;;;;-1:-1:-1;53457:522:0;;;;;:::i;:::-;;:::i;53987:1223::-;;;;;;;;;;-1:-1:-1;53987:1223:0;;;;;:::i;:::-;;:::i;52448:946::-;;;;;;;;;;-1:-1:-1;52448:946:0;;;;;:::i;:::-;;:::i;44257:1195::-;;;;;;;;;;-1:-1:-1;44257:1195:0;;;;;:::i;:::-;;:::i;49040:46::-;;;;;;;;;;-1:-1:-1;49040:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49040:46:0;;;;-1:-1:-1;;;49040:46:0;;;;;;;;-1:-1:-1;;;;;49040:46:0;;;-1:-1:-1;;;49040:46:0;;;;;;;;;;-1:-1:-1;;;;;33891:15:1;;;33873:34;;33943:15;;;33938:2;33923:18;;33916:43;33995:15;;;;33975:18;;;33968:43;;;;-1:-1:-1;;;;;34047:32:1;34042:2;34027:18;;34020:60;34129:6;34117:19;;;34111:3;34096:19;;34089:48;33807:3;33792:19;49040:46:0;33774:369:1;61166:271:0;;;;;;;;;;-1:-1:-1;61166:271:0;;;;;:::i;:::-;;:::i;59038:674::-;;;;;;;;;;-1:-1:-1;59038:674:0;;;;;:::i;:::-;;:::i;50973:657::-;;;;;;;;;;-1:-1:-1;50973:657:0;;;;;:::i;:::-;;:::i;49140:55::-;;;;;;;;;;;;;;;;45460:289;;;;;;;;;;-1:-1:-1;45460:289:0;;;;;:::i;:::-;;:::i;43270:979::-;;;;;;;;;;-1:-1:-1;43270:979:0;;;;;:::i;:::-;;:::i;51638:802::-;;;;;;;;;;-1:-1:-1;51638:802:0;;;;;:::i;:::-;;:::i;60253:491::-;;;;;;;;;;-1:-1:-1;60253:491:0;;;;;:::i;:::-;;:::i;37914:60::-;;;;;;;;;;-1:-1:-1;37914:60:0;;;;-1:-1:-1;;;;;37914:60:0;;;41425:902;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;;;;;;;;;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;;;41582:38;;;:33:::2;:38;::::0;;;;41641:27;;::::2;::::0;-1:-1:-1;;;;;41641:27:0::2;41633:61;;;::::0;-1:-1:-1;;;41633:61:0;;22077:2:1;41633:61:0::2;::::0;::::2;22059:21:1::0;22116:2;22096:18;;;22089:30;-1:-1:-1;;;22135:18:1;;;22128:47;22192:18;;41633:61:0::2;22049:167:1::0;41633:61:0::2;41735:27;::::0;::::2;::::0;-1:-1:-1;;;;;41735:27:0;;::::2;-1:-1:-1::0;;;41713:18:0;;::::2;;:49;;41705:77;;;::::0;-1:-1:-1;;;41705:77:0;;16759:2:1;41705:77:0::2;::::0;::::2;16741:21:1::0;16798:2;16778:18;;;16771:30;-1:-1:-1;;;16817:18:1;;;16810:45;16872:18;;41705:77:0::2;16731:165:1::0;41705:77:0::2;41819:25;::::0;::::2;::::0;-1:-1:-1;;;41819:25:0;::::2;-1:-1:-1::0;;;;;41819:25:0::2;41801:15;:43;41793:81;;;::::0;-1:-1:-1;;;41793:81:0;;14937:2:1;41793:81:0::2;::::0;::::2;14919:21:1::0;14976:2;14956:18;;;14949:30;15015:27;14995:18;;;14988:55;15060:18;;41793:81:0::2;14909:175:1::0;41793:81:0::2;41998:21;::::0;;::::2;::::0;42047;;42100:18:::2;::::0;;::::2;::::0;41981:14:::2;42136:38:::0;;;:33:::2;:38;::::0;;;;42129:45;;-1:-1:-1;;;;;;42129:45:0;;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;;;;::::2;::::0;;;::::2;::::0;;::::2;::::0;-1:-1:-1;;;;;41998:21:0;;::::2;::::0;42047;::::2;::::0;-1:-1:-1;;;42100:18:0;::::2;-1:-1:-1::0;;;;;42100:18:0::2;42187:45;42136:38:::0;42100:18;41998:21;42047;42187:12:::2;:45::i;:::-;-1:-1:-1::0;42250:69:0::2;::::0;;34561:25:1;;;-1:-1:-1;;;;;34660:15:1;;;34655:2;34640:18;;34633:43;34712:15;;34692:18;;;34685:43;23606:10:0;34759:2:1;34744:18;;34737:43;42250:69:0;;42273:3;;42250:69:::2;::::0;;;;;34548:3:1;42250:69:0;;::::2;-1:-1:-1::0;;21913:1:0::1;22865:7;:22:::0;-1:-1:-1;;;41425:902:0:o;50578:182::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;50710:42:::2;50727:10:::0;23606;50710:16:::2;:42::i;:::-;-1:-1:-1::0;21913:1:0::1;22865:7;:22:::0;50578:182::o;55845:737::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;55991:30:::1;56024:23:::0;;;:11:::1;:23;::::0;;;;56082:21:::1;::::0;::::1;::::0;-1:-1:-1;;;;;56082:21:0::1;23606:10:::0;56082:37:::1;::::0;:127:::1;;-1:-1:-1::0;56136:14:0::1;::::0;56173:21:::1;::::0;::::1;::::0;-1:-1:-1;;;;;56136:14:0::1;::::0;;::::1;::::0;::::1;::::0;:36:::1;::::0;56173:21:::1;56196:12;23606:10:::0;;23526:98;56196:12:::1;56136:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56060:188;;;::::0;-1:-1:-1;;;56060:188:0;;20676:2:1;56060:188:0::1;::::0;::::1;20658:21:1::0;20715:2;20695:18;;;20688:30;-1:-1:-1;;;20734:18:1;;;20727:41;20785:18;;56060:188:0::1;20648:161:1::0;56060:188:0::1;56269:26;::::0;::::1;::::0;-1:-1:-1;;;56269:26:0;::::1;;;:31:::0;56261:62:::1;;;::::0;-1:-1:-1;;;56261:62:0;;18588:2:1;56261:62:0::1;::::0;::::1;18570:21:1::0;18627:2;18607:18;;;18600:30;-1:-1:-1;;;18646:18:1;;;18639:48;18704:18;;56261:62:0::1;18560:168:1::0;56261:62:0::1;56356:12;;56342:10;-1:-1:-1::0;;;;;56342:26:0::1;;;56334:60;;;::::0;-1:-1:-1;;;56334:60:0;;24185:2:1;56334:60:0::1;::::0;::::1;24167:21:1::0;24224:2;24204:18;;;24197:30;-1:-1:-1;;;24243:18:1;;;24236:51;24304:18;;56334:60:0::1;24157:171:1::0;56334:60:0::1;-1:-1:-1::0;;;;;56407:37:0;;::::1;-1:-1:-1::0;;;56455:37:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;56510:64:::1;::::0;;32317:34:1;;;32382:2;32367:18;;32360:43;;;;56539:10:0;;56510:64:::1;::::0;32237:18:1;56510:64:0::1;;;;;;;;25180:1;55845:737:::0;;;:::o;61869:422::-;30368:12;:10;:12::i;:::-;61997:49:::1;62049:43:::0;;;:31:::1;:43;::::0;;;;;;;;62103:37;;-1:-1:-1;;62103:37:0::1;::::0;::::1;;;::::0;;-1:-1:-1;62151:33:0;::::1;:49:::0;;;62218:65;;34294:25:1;;;62049:43:0;;62218:65:::1;::::0;34267:18:1;62218:65:0::1;34249:76:1::0;31275:208:0;30368:12;:10;:12::i;:::-;31377:36:::1;::::0;-1:-1:-1;;;31377:36:0;;-1:-1:-1;;;;;9161:32:1;;;31377:36:0::1;::::0;::::1;9143:51:1::0;9210:18;;;9203:34;;;31377:15:0;::::1;::::0;::::1;::::0;9116:18:1;;31377:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31455:10;-1:-1:-1::0;;;;;31429:46:0::1;31447:6;-1:-1:-1::0;;;;;31429:46:0::1;;31467:7;31429:46;;;;34294:25:1::0;;34282:2;34267:18;;34249:76;31429:46:0::1;;;;;;;;31275:208:::0;;;:::o;50768:197::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;50920:37:::2;50937:10:::0;50949:7;50920:16:::2;:37::i;:::-;-1:-1:-1::0;;21913:1:0::1;22865:7;:22:::0;50768:197::o;49541:651::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;49680:34:::1;::::0;;;:22:::1;:34;::::0;;;;:41:::1;;::::0;-1:-1:-1;;;;;49680:41:0::1;23606:10:::0;49680:57:::1;::::0;:167:::1;;-1:-1:-1::0;49754:14:0::1;::::0;;49791:34:::1;::::0;;;:22:::1;:34;::::0;;;;:41;;::::1;::::0;-1:-1:-1;;;;;49754:14:0::1;::::0;;::::1;::::0;::::1;::::0;:36:::1;::::0;49791:41:::1;49834:12;23606:10:::0;;23526:98;49834:12:::1;49754:93;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49658:240;;;;-1:-1:-1::0;;;49658:240:0::1;;;;;;;:::i;:::-;49944:34;::::0;;;:22:::1;:34;::::0;;;;;;;49937:41;;;;::::1;::::0;;-1:-1:-1;;;;;;49937:41:0::1;::::0;;50047:22:::1;:34:::0;;;;;;-1:-1:-1;;;;;50047:47:0;::::1;::::0;;;;50135:49;;31369:66:1;;;49944:34:0;;50135:49:::1;::::0;31342:18:1;50135:49:0::1;;;;;;;;49541:651:::0;;:::o;32971:71::-;30368:12;:10;:12::i;:::-;33018:16:::1;:14;:16::i;:::-;32971:71::o:0;34721:566::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;34881:24:::1;34901:3;34881:19;:24::i;:::-;34873:61;;;::::0;-1:-1:-1;;;34873:61:0;;11179:2:1;34873:61:0::1;::::0;::::1;11161:21:1::0;11218:2;11198:18;;;11191:30;11257:26;11237:18;;;11230:54;11301:18;;34873:61:0::1;11151:174:1::0;34873:61:0::1;34953:30;34979:3;34953:25;:30::i;:::-;34945:66;;;::::0;-1:-1:-1;;;34945:66:0;;24893:2:1;34945:66:0::1;::::0;::::1;24875:21:1::0;24932:2;24912:18;;;24905:30;24971:25;24951:18;;;24944:53;25014:18;;34945:66:0::1;24865:173:1::0;34945:66:0::1;35047:12;;35030:13;-1:-1:-1::0;;;;;35030:29:0::1;;;35022:66;;;;-1:-1:-1::0;;;35022:66:0::1;;;;;;;:::i;:::-;35162:43;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;35162:43:0;;::::1;::::0;;;;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;;;;;35162:43:0;;::::1;::::0;;;;;;-1:-1:-1;35132:27:0;;;:22:::1;:27:::0;;;;;:73;;;;;::::1;-1:-1:-1::0;;;35132:73:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;;::::1;::::0;;;;;::::1;-1:-1:-1::0;;;;;;35132:73:0;;::::1;::::0;;;::::1;::::0;;;35223:56;;31924:34:1;;;31974:18;;;31967:60;;;;32043:18;;;32036:43;;;;35132:27:0;;35223:56:::1;::::0;31844:18:1;35223:56:0::1;31826:259:1::0;58176:854:0;21957:1;22553:7;;:19;;22545:63;;;;-1:-1:-1;;;22545:63:0;;;;;;;:::i;:::-;21957:1;22686:7;:18;24885:7;;;;25139:9:::1;25131:38;;;;-1:-1:-1::0;;;25131:38:0::1;;;;;;;:::i;:::-;58353:30:::2;58386:23:::0;;;:11:::2;:23;::::0;;;;58445:12:::2;::::0;-1:-1:-1;;;;;58428:29:0;::::2;;;58420:63;;;::::0;-1:-1:-1;;;58420:63:0;;17879:2:1;58420:63:0::2;::::0;::::2;17861:21:1::0;17918:2;17898:18;;;17891:30;-1:-1:-1;;;17937:18:1;;;17930:51;17998:18;;58420:63:0::2;17851:171:1::0;58420:63:0::2;58518:21;::::0;::::2;::::0;-1:-1:-1;;;;;58518:21:0::2;23606:10:::0;58518:37:::2;::::0;:127:::2;;-1:-1:-1::0;58572:14:0::2;::::0;58609:21:::2;::::0;::::2;::::0;-1:-1:-1;;;;;58572:14:0::2;::::0;;::::2;::::0;::::2;::::0;:36:::2;::::0;58609:21:::2;58632:12;23606:10:::0;;23526:98;58632:12:::2;58572:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58496:200;;;;-1:-1:-1::0;;;58496:200:0::2;;;;;;;:::i;:::-;58777:57;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;58777:57:0;;::::2;::::0;;;;;::::2;;::::0;;::::2;::::0;;;58812:21:::2;::::0;::::2;::::0;-1:-1:-1;;;;;58812:21:0;;::::2;58777:57:::0;;;;;;-1:-1:-1;58740:34:0;;;:22:::2;:34:::0;;;;;:94;;;;;::::2;-1:-1:-1::0;;;58740:94:0::2;::::0;;;::::2;::::0;;;::::2;::::0;;;;58812:21;58740:94;;::::2;::::0;;;;;::::2;-1:-1:-1::0;;;;;;58740:94:0;;::::2;::::0;;;::::2;::::0;;;58875:68;;32317:34:1;;;32367:18;;;32360:43;58740:34:0;;58875:68:::2;::::0;32237:18:1;58875:68:0::2;;;;;;;-1:-1:-1::0;;;58999:23:0::2;::::0;;;:11:::2;:23;::::0;;;;58992:30;;;;;;::::2;::::0;;-1:-1:-1;;;;;;58992:30:0::2;::::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;;;;58992:30:0;;;22865:22;;58176:854::o;38160:767::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;38367:24:::1;38387:3;38367:19;:24::i;:::-;38359:58;;;::::0;-1:-1:-1;;;38359:58:0;;25245:2:1;38359:58:0::1;::::0;::::1;25227:21:1::0;25284:2;25264:18;;;25257:30;-1:-1:-1;;;25303:18:1;;;25296:51;25364:18;;38359:58:0::1;25217:171:1::0;38359:58:0::1;38436:31;38463:3;38436:26;:31::i;:::-;38428:73;;;::::0;-1:-1:-1;;;38428:73:0;;19973:2:1;38428:73:0::1;::::0;::::1;19955:21:1::0;20012:2;19992:18;;;19985:30;20051:31;20031:18;;;20024:59;20100:18;;38428:73:0::1;19945:179:1::0;38428:73:0::1;38537:12;;38520:13;-1:-1:-1::0;;;;;38520:29:0::1;;;38512:80;;;::::0;-1:-1:-1;;;38512:80:0;;14530:2:1;38512:80:0::1;::::0;::::1;14512:21:1::0;14569:2;14549:18;;;14542:30;14608:34;14588:18;;;14581:62;-1:-1:-1;;;14659:18:1;;;14652:36;14705:19;;38512:80:0::1;14502:228:1::0;38512:80:0::1;38646:200;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;38646:200:0;;::::1;::::0;;-1:-1:-1;38646:200:0::1;::::0;;::::1;::::0;;;-1:-1:-1;;;;;38646:200:0;;::::1;::::0;;;;;;;;;;;;;;::::1;::::0;;;;;;;;;;;;38605:38;;;:33:::1;:38:::0;;;;;;:241;;;;;;::::1;-1:-1:-1::0;;;;;;38605:241:0;;::::1;;::::0;;;;-1:-1:-1;38605:241:0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;;38605:241:0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;;38864:55;;32317:34:1;;;32367:18;;;32360:43;38605:38:0;;38864:55:::1;::::0;32237:18:1;38864:55:0::1;32219:190:1::0;56772:187:0;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;56919:32:::2;56932:10:::0;56944:6;56919:12:::2;:32::i;35858:525::-:0;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;36003:27:::1;::::0;;;:22:::1;:27;::::0;;;;:34:::1;;::::0;-1:-1:-1;;;;;36003:34:0::1;23606:10:::0;36003:50:::1;::::0;:153:::1;;-1:-1:-1::0;36070:14:0::1;::::0;;36107:27:::1;::::0;;;:22:::1;:27;::::0;;;;:34;;::::1;::::0;-1:-1:-1;;;;;36070:14:0::1;::::0;;::::1;::::0;::::1;::::0;:36:::1;::::0;36107:34:::1;36143:12;23606:10:::0;;23526:98;36143:12:::1;36070:86;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35981:231;;;::::0;-1:-1:-1;;;35981:231:0;;13348:2:1;35981:231:0::1;::::0;::::1;13330:21:1::0;13387:2;13367:18;;;13360:30;13426;13406:18;;;13399:58;13474:18;;35981:231:0::1;13320:178:1::0;35981:231:0::1;36247:27;::::0;;;:22:::1;:27;::::0;;;;;;;;:49;;-1:-1:-1;;;;;;36247:49:0::1;-1:-1:-1::0;;;;;36247:49:0;::::1;::::0;;::::1;::::0;;;36337:38;;31369:66:1;;;36247:27:0;;36337:38:::1;::::0;31342:18:1;36337:38:0::1;31324:117:1::0;60752:390:0;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;60905:40:::2;60934:10:::0;60905:28:::2;:40::i;:::-;61014:34;::::0;;;:22:::2;:34;::::0;;;;;;;;-1:-1:-1;;;;;61014:47:0;::::2;::::0;;;;61079:55;;31369:66:1;;;61014:34:0;;61079:55:::2;::::0;31342:18:1;61079:55:0::2;;;;;;;-1:-1:-1::0;;21913:1:0::1;22865:7;:22:::0;60752:390::o;56590:174::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;56718:38:::2;56731:10:::0;23606;56718:12:::2;:38::i;55262:575::-:0;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;30093:15:::1;:13;:15::i;:::-;55491:12:::2;;55477:10;-1:-1:-1::0;;;;;55477:26:0::2;;;55469:60;;;::::0;-1:-1:-1;;;55469:60:0;;24185:2:1;55469:60:0::2;::::0;::::2;24167:21:1::0;24224:2;24204:18;;;24197:30;-1:-1:-1;;;24243:18:1;;;24236:51;24304:18;;55469:60:0::2;24157:171:1::0;55469:60:0::2;55599:140;::::0;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;55599:140:0;;::::2;::::0;;;;::::2;;::::0;;::::2;::::0;;;;;::::2;::::0;;;;;;-1:-1:-1;;;;;55599:140:0;;::::2;::::0;;;;;;-1:-1:-1;55599:140:0;;;;;;55573:23;;;:11:::2;:23:::0;;;;;;:166;;;;;::::2;-1:-1:-1::0;;;55573:166:0::2;::::0;;::::2;::::0;;;::::2;::::0;;;;;;::::2;::::0;;;;;::::2;-1:-1:-1::0;;;;;;55573:166:0;;;::::2;;::::0;;;;;::::2;::::0;;::::2;::::0;;;;55599:140:::2;55573:166;-1:-1:-1::0;;;55573:166:0::2;-1:-1:-1::0;;;;;;55573:166:0;;;;;;::::2;::::0;;;;;;;::::2;::::0;;55757:72;55585:10;;55757:72:::2;::::0;::::2;::::0;55621:10;;55646;;55671;;-1:-1:-1;;;;;33432:15:1;;;33414:34;;33484:15;;;33479:2;33464:18;;33457:43;33536:15;;;33531:2;33516:18;;33509:43;33349:2;33334:18;;33316:242;55757:72:0::2;;;;;;;;55262:575:::0;;;;;:::o;31491:271::-;30368:12;:10;:12::i;:::-;31590::::1;31607:10;-1:-1:-1::0;;;;;31607:15:0::1;31631:7;31607:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31589:54;;;31662:7;31654:48;;;::::0;-1:-1:-1;;;31654:48:0;;16049:2:1;31654:48:0::1;::::0;::::1;16031:21:1::0;16088:2;16068:18;;;16061:30;16127;16107:18;;;16100:58;16175:18;;31654:48:0::1;16021:178:1::0;31654:48:0::1;31734:10;-1:-1:-1::0;;;;;31718:36:0::1;;31746:7;31718:36;;;;34294:25:1::0;;34282:2;34267:18;;34249:76;31718:36:0::1;;;;;;;;30391:1;31491:271:::0;;:::o;32303:169::-;30368:12;:10;:12::i;:::-;32382::::1;:28:::0;;;32426:38:::1;::::0;34294:25:1;;;32426:38:0::1;::::0;34282:2:1;34267:18;32426:38:0::1;;;;;;;;32303:169:::0;:::o;35625:190::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;35773:34:::2;35791:3:::0;35796:10;35773:17:::2;:34::i;31770:322::-:0;30368:12;:10;:12::i;:::-;-1:-1:-1;;;;;31877:28:0;::::1;;23606:10:::0;31877:42:::1;::::0;-1:-1:-1;;;;;;31877:42:0::1;::::0;;;;;;-1:-1:-1;;;;;6636:32:1;;;31877:42:0::1;::::0;::::1;6618:51:1::0;6591:18;;31877:42:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31869:98;;;::::0;-1:-1:-1;;;31869:98:0;;25595:2:1;31869:98:0::1;::::0;::::1;25577:21:1::0;25634:2;25614:18;;;25607:30;25673:34;25653:18;;;25646:62;-1:-1:-1;;;25724:18:1;;;25717:41;25775:19;;31869:98:0::1;25567:233:1::0;31869:98:0::1;32009:14;::::0;31983:58:::1;::::0;-1:-1:-1;;;;;31983:58:0;;::::1;::::0;32009:14:::1;::::0;::::1;;::::0;31983:58:::1;::::0;;;::::1;32052:14;:32:::0;;-1:-1:-1;;;;;32052:32:0;;::::1;;;-1:-1:-1::0;;;;;;32052:32:0;;::::1;::::0;;;::::1;::::0;;31770:322::o;38935:186::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;39069:44:::2;39095:3:::0;23606:10;39069:25:::2;:44::i;32100:195::-:0;30368:12;:10;:12::i;:::-;32185:1:::1;32175:7;:11;32167:51;;;::::0;-1:-1:-1;;;32167:51:0;;30653:2:1;32167:51:0::1;::::0;::::1;30635:21:1::0;30692:2;30672:18;;;30665:30;30731:29;30711:18;;;30704:57;30778:18;;32167:51:0::1;30625:177:1::0;32167:51:0::1;32229:6;:16:::0;;;32261:26:::1;::::0;34294:25:1;;;32261:26:0::1;::::0;34282:2:1;34267:18;32261:26:0::1;34249:76:1::0;45757:301:0;30368:12;:10;:12::i;:::-;45880:34:::1;:72:::0;;-1:-1:-1;;;;;45880:72:0;;::::1;-1:-1:-1::0;;;45880:72:0;;::::1;::::0;;::::1;;::::0;;;45968:82:::1;::::0;31369:66:1;;;45968:82:0::1;::::0;31357:2:1;31342:18;45968:82:0::1;31324:117:1::0;59741:158:0;59818:13;59852:39;59880:10;59852:27;:39::i;:::-;59844:47;59741:158;-1:-1:-1;;59741:158:0:o;61445:416::-;30368:12;:10;:12::i;:::-;-1:-1:-1;;;;;61623:41:0;::::1;61571:49;61623:41:::0;;;:31:::1;:41;::::0;;;;;;;;61675:37;;-1:-1:-1;;61675:37:0::1;::::0;::::1;;;::::0;;-1:-1:-1;61723:33:0;::::1;:49:::0;;;61790:63;;34294:25:1;;;61623:41:0;;;61790:63:::1;::::0;34267:18:1;61790:63:0::1;34249:76:1::0;39129:201:0;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;39283:39:::2;39309:3:::0;39314:7;39283:25:::2;:39::i;32896:67::-:0;30368:12;:10;:12::i;:::-;32941:14:::1;:12;:14::i;50237:333::-:0;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;30093:15:::1;:13;:15::i;:::-;50429:34:::2;::::0;;;:22:::2;:34;::::0;;;;;;;;-1:-1:-1;;;;;50429:47:0;::::2;::::0;;;;50517:45;;31369:66:1;;;50429:34:0;;50517:45:::2;::::0;31342:18:1;50517:45:0::2;31324:117:1::0;32480:187:0;30368:12;:10;:12::i;:::-;32565:15:::1;:34:::0;;;32615:44:::1;::::0;34294:25:1;;;32615:44:0::1;::::0;34282:2:1;34267:18;32615:44:0::1;34249:76:1::0;42390:815:0;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;;;42556:38;;;:33:::2;:38;::::0;;;;42615:27;;::::2;::::0;-1:-1:-1;;;;;42615:27:0::2;42607:72;;;::::0;-1:-1:-1;;;42607:72:0;;21369:2:1;42607:72:0::2;::::0;::::2;21351:21:1::0;21408:2;21388:18;;;21381:30;21447;21427:18;;;21420:58;21495:18;;42607:72:0::2;21341:178:1::0;42607:72:0::2;42719:27;::::0;::::2;::::0;-1:-1:-1;;;;;42719:27:0;;::::2;-1:-1:-1::0;;;42698:18:0;;::::2;;:48;42690:106;;;::::0;-1:-1:-1;;;42690:106:0;;11884:2:1;42690:106:0::2;::::0;::::2;11866:21:1::0;11923:2;11903:18;;;11896:30;11962:34;11942:18;;;11935:62;-1:-1:-1;;;12013:18:1;;;12006:43;12066:19;;42690:106:0::2;11856:235:1::0;42690:106:0::2;42815:21;::::0;::::2;::::0;-1:-1:-1;;;;;42815:21:0::2;23606:10:::0;42815:37:::2;42807:88;;;::::0;-1:-1:-1;;;42807:88:0;;15291:2:1;42807:88:0::2;::::0;::::2;15273:21:1::0;15330:2;15310:18;;;15303:30;15369:34;15349:18;;;15342:62;-1:-1:-1;;;15420:18:1;;;15413:36;15466:19;;42807:88:0::2;15263:228:1::0;42807:88:0::2;42930:18;::::0;::::2;::::0;42978:21:::2;::::0;::::2;::::0;-1:-1:-1;;;42930:18:0;;::::2;-1:-1:-1::0;;;;;42930:18:0::2;::::0;42959:69:::2;::::0;42973:3;;-1:-1:-1;;;;;42978:21:0::2;42930:18:::0;42908:19:::2;::::0;42959:13:::2;:69::i;:::-;43041:21;::::0;::::2;:34:::0;;-1:-1:-1;;;;;;43041:34:0::2;::::0;;43086:18:::2;::::0;::::2;:22:::0;;-1:-1:-1;;;;;43086:22:0;;::::2;::::0;;;43126:71:::2;::::0;;34993:25:1;;;23606:10:0;35049:2:1;35034:18;;35027:60;35123:47;;;35103:18;;;35096:75;43126:71:0;::::2;::::0;;;;34981:2:1;43126:71:0;;::::2;-1:-1:-1::0;;21913:1:0::1;22865:7;:22:::0;-1:-1:-1;42390:815:0:o;35355:169::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;35480:36:::2;35498:3:::0;23606:10;35480:17:::2;:36::i;32675:213::-:0;30368:12;:10;:12::i;:::-;32795:15:::1;::::0;32768:64:::1;::::0;-1:-1:-1;;;;;32768:64:0;;::::1;::::0;32795:15:::1;::::0;32768:64:::1;::::0;32795:15:::1;::::0;32768:64:::1;32843:15;:37:::0;;-1:-1:-1;;;;;;32843:37:0::1;-1:-1:-1::0;;;;;32843:37:0;;;::::1;::::0;;;::::1;::::0;;32675:213::o;53457:522::-;30368:12;:10;:12::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;;;53571:25;;;:13:::2;:25;::::0;;;;53615:12:::2;::::0;::::2;::::0;-1:-1:-1;;;;;53615:12:0::2;53607:50;;;;-1:-1:-1::0;;;53607:50:0::2;;;;;;;:::i;:::-;53716:11:::0;;:15;53712:115:::2;;53774:12;::::0;::::2;::::0;53788:11;;53748:67:::2;::::0;53762:10;;-1:-1:-1;;;;;53774:12:0;;::::2;::::0;::::2;::::0;53748:13:::2;:67::i;:::-;53875:12;::::0;::::2;::::0;53889:11;;53844:57:::2;::::0;;-1:-1:-1;;;;;53875:12:0;;::::2;9143:51:1::0;;9225:2;9210:18;;9203:34;;;;53863:10:0;;53844:57:::2;::::0;9116:18:1;53844:57:0::2;;;;;;;;-1:-1:-1::0;53946:25:0::2;::::0;;;:13:::2;:25;::::0;;;;53939:32;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;;;;53939:32:0::2;::::0;;::::2;::::0;;::::2;::::0;;;22865:22;;53457:522::o;53987:1223::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;54166:28:::2;54183:10:::0;54166:16:::2;:28::i;:::-;54165:29;54157:59;;;::::0;-1:-1:-1;;;54157:59:0;;22776:2:1;54157:59:0::2;::::0;::::2;22758:21:1::0;22815:2;22795:18;;;22788:30;-1:-1:-1;;;22834:18:1;;;22827:47;22891:18;;54157:59:0::2;22748:167:1::0;54157:59:0::2;54256:4;::::0;:36:::2;::::0;-1:-1:-1;;;54256:36:0;;::::2;::::0;::::2;34294:25:1::0;;;54229:24:0::2;::::0;-1:-1:-1;;;;;54256:4:0::2;::::0;:24:::2;::::0;34267:18:1;;54256:36:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54229:63:::0;-1:-1:-1;;;;;;54325:32:0;::::2;23606:10:::0;54325:32:::2;::::0;:117:::2;;-1:-1:-1::0;54374:14:0::2;::::0;::::2;::::0;::::2;-1:-1:-1::0;;;;;54374:14:0::2;:36;54411:16:::0;23606:10;54374:68:::2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54303:178;;;::::0;-1:-1:-1;;;54303:178:0;;19288:2:1;54303:178:0::2;::::0;::::2;19270:21:1::0;19327:2;19307:18;;;19300:30;-1:-1:-1;;;19346:18:1;;;19339:41;19397:18;;54303:178:0::2;19260:161:1::0;54303:178:0::2;54519:12;;54502:13;-1:-1:-1::0;;;;;54502:29:0::2;;;54494:66;;;;-1:-1:-1::0;;;54494:66:0::2;;;;;;;:::i;:::-;54639:19;54661:25:::0;;;:13:::2;:25;::::0;;;;54701:11;;:15;54697:115:::2;;54759:12;::::0;::::2;::::0;54773:11;;54733:67:::2;::::0;54747:10;;-1:-1:-1;;;;;54759:12:0;;::::2;::::0;::::2;::::0;54733:13:::2;:67::i;:::-;54856:25;::::0;;;:13:::2;:25;::::0;;;;;;;54849:32;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;;54849:32:0::2;::::0;;::::2;;::::0;;;54946:22:::2;:34:::0;;;;;54939:41;;;;55061:48;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;55061:48:0;;::::2;::::0;;;::::2;::::0;;::::2;::::0;;;;;;;23606:10;-1:-1:-1;;;;;55061:48:0;;::::2;::::0;;;55024:34:::2;::::0;;;:22:::2;:34;::::0;;;;;;;;:85;;;;::::2;::::0;-1:-1:-1;;;;;55024:85:0;;::::2;-1:-1:-1::0;;;55024:85:0;;::::2;::::0;;;::::2;;::::0;;;;::::2;::::0;;;;::::2;::::0;;-1:-1:-1;;;;;;55024:85:0::2;::::0;;;::::2;;::::0;;;55127:75;;35734:25:1;;;35848:15;;;35828:18;;;35821:43;;;;35900:15;;;35880:18;;;35873:43;;;;55127:75:0::2;::::0;35722:2:1;35707:18;55127:75:0::2;;;;;;;-1:-1:-1::0;;21913:1:0::1;22865:7;:22:::0;-1:-1:-1;;;53987:1223:0:o;52448:946::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;;;52611:25;;;:13:::2;:25;::::0;;;;52655:12:::2;::::0;::::2;::::0;-1:-1:-1;;;;;52655:12:0::2;52647:50;;;;-1:-1:-1::0;;;52647:50:0::2;;;;;;;:::i;:::-;52716:11:::0;;:26;-1:-1:-1;52716:26:0::2;52708:62;;;::::0;-1:-1:-1;;;52708:62:0;;28495:2:1;52708:62:0::2;::::0;::::2;28477:21:1::0;28534:2;28514:18;;;28507:30;28573:25;28553:18;;;28546:53;28616:18;;52708:62:0::2;28467:173:1::0;52708:62:0::2;52810:4;::::0;:36:::2;::::0;-1:-1:-1;;;52810:36:0;;::::2;::::0;::::2;34294:25:1::0;;;52783:24:0::2;::::0;-1:-1:-1;;;;;52810:4:0::2;::::0;:24:::2;::::0;34267:18:1;;52810:36:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52783:63:::0;-1:-1:-1;;;;;;52879:32:0;::::2;23606:10:::0;52879:32:::2;::::0;:117:::2;;-1:-1:-1::0;52928:14:0::2;::::0;::::2;::::0;::::2;-1:-1:-1::0;;;;;52928:14:0::2;:36;52965:16:::0;23606:10;52928:68:::2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52857:178;;;::::0;-1:-1:-1;;;52857:178:0;;19288:2:1;52857:178:0::2;::::0;::::2;19270:21:1::0;19327:2;19307:18;;;19300:30;-1:-1:-1;;;19346:18:1;;;19339:41;19397:18;;52857:178:0::2;19260:161:1::0;52857:178:0::2;53172:11:::0;;53185:12:::2;::::0;::::2;::::0;53115:15:::2;::::0;53133:72:::2;::::0;53160:10;;53172:11;-1:-1:-1;;;;;53185:12:0::2;53115:15:::0;53133:26:::2;:72::i;:::-;53286:12;::::0;::::2;::::0;53300:11;;53246:66:::2;::::0;;-1:-1:-1;;;;;53286:12:0;;::::2;9143:51:1::0;;9225:2;9210:18;;9203:34;;;;53115:90:0;;-1:-1:-1;53115:90:0;;53265:10;;53246:66:::2;::::0;9116:18:1;53246:66:0::2;;;;;;;-1:-1:-1::0;;;53361:25:0::2;::::0;;;-1:-1:-1;53361:13:0::2;:25;::::0;;;;53354:32;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;;;;53354:32:0::2;::::0;;::::2;::::0;;::::2;::::0;;;22865:22;;52448:946::o;44257:1195::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;;;44428:38;;;:33:::2;:38;::::0;;;;44487:18;;::::2;::::0;-1:-1:-1;;;44487:18:0;::::2;-1:-1:-1::0;;;;;44487:18:0::2;44479:51;;;::::0;-1:-1:-1;;;44479:51:0;;27455:2:1;44479:51:0::2;::::0;::::2;27437:21:1::0;27494:2;27474:18;;;27467:30;-1:-1:-1;;;27513:18:1;;;27506:46;27569:18;;44479:51:0::2;27427:166:1::0;44479:51:0::2;44549:38;44583:3;44549:33;:38::i;:::-;44541:110;;;::::0;-1:-1:-1;;;44541:110:0;;17451:2:1;44541:110:0::2;::::0;::::2;17433:21:1::0;17490:2;17470:18;;;17463:30;17529:34;17509:18;;;17502:62;17600:29;17580:18;;;17573:57;17647:19;;44541:110:0::2;17423:249:1::0;44541:110:0::2;44680:21:::0;;44744::::2;::::0;::::2;::::0;23606:10;-1:-1:-1;;;;;44680:21:0;;::::2;:37:::0;::::2;::::0;44744:21;;::::2;:37;44680::::0;;44814:33:::2;;;44839:8;44814:33;:123;;;-1:-1:-1::0;44864:14:0::2;::::0;44901:21;;-1:-1:-1;;;;;44864:14:0::2;::::0;;::::2;::::0;::::2;::::0;:36:::2;::::0;44901:21:::2;44924:12;23606:10:::0;;23526:98;44924:12:::2;44864:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44814:191;;;-1:-1:-1::0;44954:14:0::2;::::0;::::2;::::0;::::2;-1:-1:-1::0;;;;;44954:14:0::2;:37;23606:10:::0;44954:51:::2;::::0;-1:-1:-1;;;;;;44954:51:0::2;::::0;;;;;;-1:-1:-1;;;;;6636:32:1;;;44954:51:0::2;::::0;::::2;6618::1::0;6591:18;;44954:51:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44792:288;;;::::0;-1:-1:-1;;;44792:288:0;;31009:2:1;44792:288:0::2;::::0;::::2;30991:21:1::0;31048:2;31028:18;;;31021:30;31087:34;31067:18;;;31060:62;-1:-1:-1;;;31138:18:1;;;31131:45;31193:19;;44792:288:0::2;30981:237:1::0;44792:288:0::2;45225:21;::::0;::::2;::::0;45248:18:::2;::::0;::::2;::::0;45206:76:::2;::::0;45220:3;;-1:-1:-1;;;;;45225:21:0;;::::2;::::0;-1:-1:-1;;;45248:18:0;::::2;-1:-1:-1::0;;;;;45248:18:0::2;45225:21;::::0;45206:13:::2;:76::i;:::-;45344:21;::::0;::::2;::::0;45367:18:::2;::::0;::::2;::::0;45300:86:::2;::::0;;-1:-1:-1;;;;;45344:21:0;;::::2;8823:51:1::0;;-1:-1:-1;;;45367:18:0;;::::2;-1:-1:-1::0;;;;;45367:18:0::2;8905:2:1::0;8890:18;;8883:75;45339:3:0;;45300:86:::2;::::0;8796:18:1;45300:86:0::2;;;;;;;-1:-1:-1::0;;;45406:38:0::2;::::0;;;:33:::2;:38;::::0;;;;45399:45;;-1:-1:-1;;;;;;45399:45:0;;::::2;::::0;;;;;::::2;::::0;;;;::::2;::::0;;;::::2;::::0;::::2;::::0;;;::::2;::::0;;::::2;::::0;;;22865:22;;44257:1195::o;61166:271::-;30368:12;:10;:12::i;:::-;61279:29:::1;:62:::0;;;61357:72:::1;::::0;34294:25:1;;;61357:72:0::1;::::0;34282:2:1;34267:18;61357:72:0::1;34249:76:1::0;59038:674:0;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;59173:30:::1;59206:23:::0;;;:11:::1;:23;::::0;;;;59264:21:::1;::::0;::::1;::::0;-1:-1:-1;;;;;59264:21:0::1;23606:10:::0;59264:37:::1;::::0;:127:::1;;-1:-1:-1::0;59318:14:0::1;::::0;59355:21:::1;::::0;::::1;::::0;-1:-1:-1;;;;;59318:14:0::1;::::0;;::::1;::::0;::::1;::::0;:36:::1;::::0;59355:21:::1;59378:12;23606:10:::0;;23526:98;59378:12:::1;59318:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59242:200;;;;-1:-1:-1::0;;;59242:200:0::1;;;;;;;:::i;:::-;59511:34;::::0;;;:22:::1;:34;::::0;;;;;;;-1:-1:-1;;;;;59511:47:0;::::1;::::0;;;;59614:11:::1;:23:::0;;;;;59607:30;;;;;::::1;::::0;;-1:-1:-1;;;;;;59607:30:0::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;59607:30:0;;;59655:49;31369:66:1;;;59511:34:0;;59655:49:::1;::::0;31342:18:1;59655:49:0::1;31324:117:1::0;50973:657:0;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;;;51117:25;;;:13:::2;:25;::::0;;;;51161:11;;51153:39:::2;;;;-1:-1:-1::0;;;51153:39:0::2;;;;;;;:::i;:::-;51211:12;::::0;::::2;::::0;-1:-1:-1;;;;;51211:12:0::2;23606:10:::0;51211:28:::2;51203:59;;;::::0;-1:-1:-1;;;51203:59:0;;26007:2:1;51203:59:0::2;::::0;::::2;25989:21:1::0;26046:2;26026:18;;;26019:30;-1:-1:-1;;;26065:18:1;;;26058:48;26123:18;;51203:59:0::2;25979:168:1::0;51203:59:0::2;51300:5;:17;;;51281:15;:36;;51273:71;;;::::0;-1:-1:-1;;;51273:71:0;;27800:2:1;51273:71:0::2;::::0;::::2;27782:21:1::0;27839:2;27819:18;;;27812:30;-1:-1:-1;;;27858:18:1;;;27851:52;27920:18;;51273:71:0::2;27772:172:1::0;51273:71:0::2;51425:12;::::0;::::2;::::0;51439:11;;51399:67:::2;::::0;51413:10;;-1:-1:-1;;;;;51425:12:0;;::::2;::::0;::::2;::::0;51399:13:::2;:67::i;:::-;51507:45;::::0;23606:10;6618:51:1;;51527:10:0;;51507:45:::2;::::0;6606:2:1;6591:18;51507:45:0::2;6573:102:1::0;45460:289:0;30368:12;:10;:12::i;:::-;45579:32:::1;:68:::0;;-1:-1:-1;;;;;;45579:68:0::1;-1:-1:-1::0;;;;;45579:68:0;::::1;::::0;;::::1;::::0;;;45663:78:::1;::::0;31369:66:1;;;45663:78:0::1;::::0;31357:2:1;31342:18;45663:78:0::1;31324:117:1::0;43270:979:0;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;;;43465:38;;;:33:::2;:38;::::0;;;;43538:21;;-1:-1:-1;;;;;43538:21:0::2;23606:10:::0;43538:37:::2;::::0;:127:::2;;-1:-1:-1::0;43592:14:0::2;::::0;43629:21;;-1:-1:-1;;;;;43592:14:0::2;::::0;;::::2;::::0;::::2;::::0;:36:::2;::::0;43629:21:::2;43652:12;23606:10:::0;;23526:98;43652:12:::2;43592:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43516:191;;;::::0;-1:-1:-1;;;43516:191:0;;27112:2:1;43516:191:0::2;::::0;::::2;27094:21:1::0;27151:2;27131:18;;;27124:30;-1:-1:-1;;;27170:18:1;;;27163:44;27224:18;;43516:191:0::2;27084:164:1::0;43516:191:0::2;43728:25;::::0;::::2;::::0;-1:-1:-1;;;43728:25:0;::::2;-1:-1:-1::0;;;;;43728:25:0::2;:30:::0;43720:70:::2;;;::::0;-1:-1:-1;;;43720:70:0;;23122:2:1;43720:70:0::2;::::0;::::2;23104:21:1::0;23161:2;23141:18;;;23134:30;23200:29;23180:18;;;23173:57;23247:18;;43720:70:0::2;23094:177:1::0;43720:70:0::2;43826:12;;43809:13;-1:-1:-1::0;;;;;43809:29:0::2;;;43801:74;;;::::0;-1:-1:-1;;;43801:74:0;;12638:2:1;43801:74:0::2;::::0;::::2;12620:21:1::0;;;12657:18;;;12650:30;12716:34;12696:18;;;12689:62;12768:18;;43801:74:0::2;12610:182:1::0;43801:74:0::2;43976:18;::::0;::::2;::::0;-1:-1:-1;;;;;43976:35:0;;::::2;-1:-1:-1::0;;;43976:18:0;;::::2;;:35;43972:157;;44083:34;::::0;44056:61:::2;::::0;-1:-1:-1;;;44083:34:0;::::2;-1:-1:-1::0;;;;;44083:34:0::2;44064:15;44056:61;:::i;:::-;44028:25;::::0;::::2;:89:::0;;-1:-1:-1;;;;;44028:89:0;;::::2;-1:-1:-1::0;;;44028:89:0::2;::::0;::::2;::::0;;;::::2;::::0;;43972:157:::2;44141:27;::::0;::::2;:43:::0;;-1:-1:-1;;;;;;44141:43:0::2;-1:-1:-1::0;;;;;44141:43:0;::::2;::::0;;::::2;::::0;;;44202:39:::2;::::0;31369:66:1;;;44222:3:0;;44202:39:::2;::::0;31357:2:1;31342:18;44202:39:0::2;;;;;;;;-1:-1:-1::0;;21913:1:0::1;22865:7;:22:::0;-1:-1:-1;43270:979:0:o;51638:802::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;;;51780:25;;;:13:::2;:25;::::0;;;;51824:12:::2;::::0;::::2;::::0;-1:-1:-1;;;;;51824:12:0::2;51816:50;;;;-1:-1:-1::0;;;51816:50:0::2;;;;;;;:::i;:::-;51906:4;::::0;:36:::2;::::0;-1:-1:-1;;;51906:36:0;;::::2;::::0;::::2;34294:25:1::0;;;51879:24:0::2;::::0;-1:-1:-1;;;;;51906:4:0::2;::::0;:24:::2;::::0;34267:18:1;;51906:36:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51879:63:::0;-1:-1:-1;;;;;;51975:32:0;::::2;23606:10:::0;51975:32:::2;::::0;:117:::2;;-1:-1:-1::0;52024:14:0::2;::::0;::::2;::::0;::::2;-1:-1:-1::0;;;;;52024:14:0::2;:36;52061:16:::0;23606:10;52024:68:::2;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51953:189;;;::::0;-1:-1:-1;;;51953:189:0;;23834:2:1;51953:189:0::2;::::0;::::2;23816:21:1::0;23873:2;23853:18;;;23846:30;-1:-1:-1;;;23892:18:1;;;23885:52;23954:18;;51953:189:0::2;23806:172:1::0;51953:189:0::2;52223:12;::::0;::::2;::::0;52237:11;;52197:67:::2;::::0;52211:10;;-1:-1:-1;;;;;52223:12:0;;::::2;::::0;::::2;::::0;52197:13:::2;:67::i;:::-;52336:12;::::0;::::2;::::0;52350:11;;52305:57:::2;::::0;;-1:-1:-1;;;;;52336:12:0;;::::2;9143:51:1::0;;9225:2;9210:18;;9203:34;;;;52324:10:0;;52305:57:::2;::::0;9116:18:1;52305:57:0::2;;;;;;;-1:-1:-1::0;;52407:25:0::2;::::0;;;:13:::2;:25;::::0;;;;52400:32;;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;;;;52400:32:0::2;::::0;;::::2;::::0;;::::2;::::0;;;22865:22;;51638:802::o;60253:491::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;21957:1:::1;22553:7;;:19;;22545:63;;;;-1:-1:-1::0;;;22545:63:0::1;;;;;;;:::i;:::-;21957:1;22686:7;:18:::0;60456:12:::2;::::0;-1:-1:-1;;;;;60439:29:0;::::2;;;60431:66;;;;-1:-1:-1::0;;;60431:66:0::2;;;;;;;:::i;:::-;60508:40;60537:10;60508:28;:40::i;:::-;60598:48;;;;;;;;60606:13;-1:-1:-1::0;;;;;60598:48:0::2;;;;;60621:10;-1:-1:-1::0;;;;;60598:48:0::2;;;;;60633:12;23606:10:::0;;23526:98;60633:12:::2;-1:-1:-1::0;;;;;60598:48:0;;::::2;::::0;;;60561:34:::2;::::0;;;:22:::2;:34;::::0;;;;;;;;:85;;;;::::2;::::0;-1:-1:-1;;;;;60561:85:0;;::::2;-1:-1:-1::0;;;60561:85:0;;::::2;::::0;;;::::2;;::::0;;;;::::2;::::0;;;;::::2;::::0;;-1:-1:-1;;;;;;60561:85:0::2;::::0;;;::::2;;::::0;;;60664:72;;32335:15:1;;;32317:34;;32387:15;;;32367:18;;;32360:43;;;;60561:34:0;;60664:72:::2;::::0;32237:18:1;60664:72:0::2;32219:190:1::0;63210:208:0;63321:7;63348:62;63375:3;63380:14;63396:6;63404:5;63348:26;:62::i;:::-;63341:69;63210:208;-1:-1:-1;;;;;63210:208:0:o;65927:992::-;66019:28;66036:10;66019:16;:28::i;:::-;66018:29;66010:59;;;;-1:-1:-1;;;66010:59:0;;22776:2:1;66010:59:0;;;22758:21:1;22815:2;22795:18;;;22788:30;-1:-1:-1;;;22834:18:1;;;22827:47;22891:18;;66010:59:0;22748:167:1;66010:59:0;66082:19;66104:25;;;:13;:25;;;;;66175:12;;66161:11;;:26;;66175:12;66161:26;:::i;:::-;66148:9;:39;;66140:71;;;;-1:-1:-1;;;66140:71:0;;17103:2:1;66140:71:0;;;17085:21:1;17142:2;17122:18;;;17115:30;-1:-1:-1;;;17161:18:1;;;17154:49;17220:18;;66140:71:0;17075:169:1;66140:71:0;66260:17;66280:34;;;:22;:34;;;;;;66329:13;;66325:210;;66386:9;66367:15;:28;;66359:65;;;;-1:-1:-1;;;66359:65:0;;18935:2:1;66359:65:0;;;18917:21:1;18974:2;18954:18;;;18947:30;19013:26;18993:18;;;18986:54;19057:18;;66359:65:0;18907:174:1;66359:65:0;66489:34;;;;:22;:34;;;;;66482:41;66325:210;66617:11;;:15;66613:125;;66675:12;;;;66689:11;;66649:77;;66663:10;;-1:-1:-1;;;;;66675:12:0;;;;23606:10;66716:9;66649:13;:77::i;:::-;66802:43;;;;;;;;66808:9;66802:43;;;;66819:7;-1:-1:-1;;;;;66802:43:0;;;;;66828:16;:14;:16::i;:::-;66802:43;;66774:25;;;;:13;:25;;;;;;;;;:71;;;;;;;;;;;;;-1:-1:-1;;;;;;66774:71:0;-1:-1:-1;;;;;66774:71:0;;;;;;;;;;;;;;;66863:48;;9161:32:1;;;9143:51;;66901:9:0;9210:18:1;;;9203:34;66774:25:0;;66863:48;;9116:18:1;66863:48:0;9098:145:1;30408:124:0;30462:14;;;;;-1:-1:-1;;;;;30462:14:0;:27;23606:10;30462:41;;-1:-1:-1;;;;;;30462:41:0;;;;;;;-1:-1:-1;;;;;6636:32:1;;;30462:41:0;;;6618:51:1;6591:18;;30462:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30454:70;;;;-1:-1:-1;;;30454:70:0;;28847:2:1;30454:70:0;;;28829:21:1;28886:2;28866:18;;;28859:30;-1:-1:-1;;;28905:18:1;;;28898:46;28961:18;;30454:70:0;28819:166:1;25873:120:0;24885:7;;;;25409:41;;;;-1:-1:-1;;;25409:41:0;;12999:2:1;25409:41:0;;;12981:21:1;13038:2;13018:18;;;13011:30;-1:-1:-1;;;13057:18:1;;;13050:50;13117:18;;25409:41:0;12971:170:1;25409:41:0;25932:7:::1;:15:::0;;-1:-1:-1;;25932:15:0::1;::::0;;25963:22:::1;23606:10:::0;25972:12:::1;25963:22;::::0;-1:-1:-1;;;;;6636:32:1;;;6618:51;;6606:2;6591:18;25963:22:0::1;;;;;;;25873:120::o:0;62318:142::-;62399:4;62424:28;62441:10;62424:16;:28::i;:::-;62423:29;;62318:142;-1:-1:-1;;62318:142:0:o;63050:152::-;63150:14;;63126:4;;63150:14;;;-1:-1:-1;;;;;63150:14:0;:30;23606:10;63181:12;63150:44;;-1:-1:-1;;;;;;63150:44:0;;;;;;;-1:-1:-1;;;;;6636:32:1;;;63150:44:0;;;6618:51:1;6591:18;;63150:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;62468:206::-;62580:4;;:33;;-1:-1:-1;;;62580:33:0;;;;;34294:25:1;;;62556:4:0;;-1:-1:-1;;;;;62580:4:0;;:21;;34267:18:1;;62580:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62617:1;62580:38;:86;;;;-1:-1:-1;62622:14:0;;;;;-1:-1:-1;;;;;62622:14:0;:30;23606:10;62653:12;23526:98;56967:1126;57045:30;57078:23;;;:11;:23;;;;;57120:21;;;;-1:-1:-1;;;;;57120:21:0;57112:86;;;;-1:-1:-1;;;57112:86:0;;26354:2:1;57112:86:0;;;26336:21:1;26393:2;26373:18;;;26366:30;26432:34;26412:18;;;26405:62;-1:-1:-1;;;26483:18:1;;;26476:36;26529:19;;57112:86:0;26326:228:1;57112:86:0;57217:24;;;;57245:15;-1:-1:-1;;;;;57217:24:0;;;:43;;57209:71;;;;-1:-1:-1;;;57209:71:0;;28151:2:1;57209:71:0;;;28133:21:1;28190:2;28170:18;;;28163:30;-1:-1:-1;;;28209:18:1;;;28202:45;28264:18;;57209:71:0;28123:165:1;57209:71:0;57293:21;57317:39;57345:10;57317:27;:39::i;:::-;57293:63;;57388:13;57375:9;:26;;57367:61;;;;-1:-1:-1;;;57367:61:0;;21726:2:1;57367:61:0;;;21708:21:1;21765:2;21745:18;;;21738:30;-1:-1:-1;;;21784:18:1;;;21777:52;21846:18;;57367:61:0;21698:172:1;57367:61:0;57441:15;57459:67;57486:10;57498:13;57513:6;57521:4;57459:26;:67::i;:::-;57587:26;;;;57441:85;;-1:-1:-1;;;;57587:26:0;;;;57690:8;57587:26;57697:1;57690:8;:::i;:::-;57661:14;:26;;;:37;;;;;;;;;;;;;;;;;;57817:13;57805:9;:25;57801:196;;;57848:12;23606:10;57891:25;57903:13;57891:9;:25;:::i;:::-;57865:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57847:74;;;57944:7;57936:49;;;;-1:-1:-1;;;57936:49:0;;24535:2:1;57936:49:0;;;24517:21:1;24574:2;24554:18;;;24547:30;24613:31;24593:18;;;24586:59;24662:18;;57936:49:0;24507:179:1;57936:49:0;57801:196;;58014:71;;;-1:-1:-1;;;;;9918:32:1;;9900:51;;9982:2;9967:18;;9960:34;;;10042:6;10030:19;;10010:18;;;10003:47;58014:71:0;;58048:7;;58036:10;;58014:71;;;;;9888:2:1;58014:71:0;;;56967:1126;;;;;;:::o;46251:655::-;46322:37;46362:38;;;:33;:38;;;;;46421:27;;;;-1:-1:-1;;;;;46421:27:0;46413:61;;;;-1:-1:-1;;;46413:61:0;;22077:2:1;46413:61:0;;;22059:21:1;22116:2;22096:18;;;22089:30;-1:-1:-1;;;22135:18:1;;;22128:47;22192:18;;46413:61:0;22049:167:1;46413:61:0;46514:27;;;;-1:-1:-1;;;;;46514:27:0;;;-1:-1:-1;;;46493:18:0;;;;:48;46485:96;;;;-1:-1:-1;;;46485:96:0;;13705:2:1;46485:96:0;;;13687:21:1;13744:2;13724:18;;;13717:30;13783:34;13763:18;;;13756:62;-1:-1:-1;;;13834:18:1;;;13827:33;13877:19;;46485:96:0;13677:225:1;46485:96:0;46600:21;;-1:-1:-1;;;;;46600:21:0;23606:10;46600:37;46592:77;;;;-1:-1:-1;;;46592:77:0;;23478:2:1;46592:77:0;;;23460:21:1;23517:2;23497:18;;;23490:30;23556:29;23536:18;;;23529:57;23603:18;;46592:77:0;23450:177:1;46592:77:0;46714:18;;;;-1:-1:-1;;;46714:18:0;;-1:-1:-1;;;;;46714:18:0;:22;46710:131;;46772:21;;;;46795:18;;;;46753:76;;46767:3;;-1:-1:-1;;;;;46772:21:0;;;;-1:-1:-1;;;46795:18:0;;-1:-1:-1;;;;;46795:18:0;46772:21;;46753:13;:76::i;:::-;-1:-1:-1;46860:38:0;;;;:33;:38;;;;;46853:45;;-1:-1:-1;;;;;;46853:45:0;;;;;;;;;;;;;;;;;;;;;;;;46251:655::o;30136:133::-;30193:14;;;;;-1:-1:-1;;;;;30193:14:0;:30;23606:10;30193:44;;-1:-1:-1;;;;;;30193:44:0;;;;;;;-1:-1:-1;;;;;6636:32:1;;;30193:44:0;;;6618:51:1;6591:18;;30193:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30185:76;;;;-1:-1:-1;;;30185:76:0;;30305:2:1;30185:76:0;;;30287:21:1;30344:2;30324:18;;;30317:30;-1:-1:-1;;;30363:18:1;;;30356:49;30422:18;;30185:76:0;30277:169:1;36391:533:0;36471:23;36497:27;;;:22;:27;;;;;36557:14;;;;-1:-1:-1;;;;;36557:14:0;36535:57;;;;-1:-1:-1;;;36535:57:0;;20331:2:1;36535:57:0;;;20313:21:1;20370:2;20350:18;;;20343:30;-1:-1:-1;;;20389:18:1;;;20382:46;20445:18;;36535:57:0;20303:166:1;36535:57:0;36624:13;;-1:-1:-1;;;;;36624:13:0;36611:9;:26;;36603:63;;;;-1:-1:-1;;;36603:63:0;;22423:2:1;36603:63:0;;;22405:21:1;22462:2;22442:18;;;22435:30;22501:26;22481:18;;;22474:54;22545:18;;36603:63:0;22395:174:1;36603:63:0;36704:17;;-1:-1:-1;;;36704:17:0;;-1:-1:-1;;;;;36704:17:0;36685:15;:36;;36677:71;;;;-1:-1:-1;;;36677:71:0;;26761:2:1;36677:71:0;;;26743:21:1;26800:2;26780:18;;;26773:30;-1:-1:-1;;;26819:18:1;;;26812:52;26881:18;;36677:71:0;26733:172:1;36677:71:0;36820:14;;;;36761:15;;36779:56;;36792:3;;36797:9;;36808:10;;-1:-1:-1;;;;;36820:14:0;36779:12;:56::i;:::-;36890:14;;;;36853:63;;;-1:-1:-1;;;;;7932:15:1;;;7914:34;;36890:14:0;;;7979:2:1;7964:18;;7957:43;36906:9:0;8016:18:1;;;8009:34;36761:74:0;;-1:-1:-1;36761:74:0;;36853:63;;7864:2:1;7849:18;36853:63:0;7831:218:1;39338:2079:0;39423:37;39463:38;;;:33;:38;;;;;39520:27;;;;-1:-1:-1;;;;;39520:27:0;39512:74;;;;-1:-1:-1;;;39512:74:0;;18229:2:1;39512:74:0;;;18211:21:1;18268:2;18248:18;;;18241:30;18307:32;18287:18;;;18280:60;18357:18;;39512:74:0;18201:180:1;39512:74:0;39624:24;;;;-1:-1:-1;;;;;39624:24:0;39605:15;:43;;39597:78;;;;-1:-1:-1;;;39597:78:0;;15698:2:1;39597:78:0;;;15680:21:1;15737:2;15717:18;;;15710:30;-1:-1:-1;;;15756:18:1;;;15749:52;15818:18;;39597:78:0;15670:172:1;39597:78:0;39728:12;;39707:18;;;;:33;;39728:12;-1:-1:-1;;;39707:18:0;;-1:-1:-1;;;;;39707:18:0;:33;:::i;:::-;39694:9;:46;;39686:111;;;;-1:-1:-1;;;39686:111:0;;14109:2:1;39686:111:0;;;14091:21:1;14148:2;14128:18;;;14121:30;14187:34;14167:18;;;14160:62;-1:-1:-1;;;14238:18:1;;;14231:50;14298:19;;39686:111:0;14081:242:1;39686:111:0;39839:25;;;;40110:27;;;;-1:-1:-1;;;;;;;;39839:25:0;;;;;;40058:22;;;;40110:27;40097:9;:40;;;;:65;;;40142:20;40141:21;40097:65;40093:856;;;40234:34;;40207:61;;-1:-1:-1;;;40234:34:0;;-1:-1:-1;;;;;40234:34:0;40215:15;40207:61;:::i;:::-;40179:25;;;:89;;-1:-1:-1;;;;;40179:89:0;;;-1:-1:-1;;;40179:89:0;;;;;;;;;40093:856;;;40299:20;40295:654;;;40513:18;-1:-1:-1;;;;;40495:36:0;:15;:36;40487:73;;;;-1:-1:-1;;;40487:73:0;;16406:2:1;40487:73:0;;;16388:21:1;16445:2;16425:18;;;16418:30;16484:26;16464:18;;;16457:54;16528:18;;40487:73:0;16378:174:1;40487:73:0;40575:30;40608:45;40637:15;40608:18;:45;:::i;:::-;40781:32;;40575:78;;-1:-1:-1;;;;;;40781:32:0;;;40755:58;;;;40751:187;;40890:32;;40862:25;;;;:60;;-1:-1:-1;;;;;40890:32:0;;;;-1:-1:-1;;;40862:25:0;;;:60;:::i;:::-;40834:25;;;:88;;-1:-1:-1;;;;;40834:88:0;;;-1:-1:-1;;;40834:88:0;;;;;;;;;40751:187;40295:654;;41046:18;;;;-1:-1:-1;;;41046:18:0;;-1:-1:-1;;;;;41046:18:0;:22;41042:136;;41104:21;;;;41127:18;;;;41085:81;;41099:3;;-1:-1:-1;;;;;41104:21:0;;;;-1:-1:-1;;;41127:18:0;;-1:-1:-1;;;;;41127:18:0;41147:7;41156:9;41085:13;:81::i;:::-;41190:18;;;:39;;-1:-1:-1;;;;;41190:39:0;;;-1:-1:-1;;;41219:9:0;41190:39;;;;;;;;;;;;-1:-1:-1;41240:21:0;;:31;;-1:-1:-1;;;;;;41240:31:0;-1:-1:-1;;;;;41240:31:0;;;;;;;;;41320:21;;41383:25;;;;41289:120;;;41320:21;;;;8351:34:1;;8416:2;8401:18;;8394:43;;;;8453:18;;;8446:34;;;;8569:15;;;8564:2;8549:18;;8542:43;41383:25:0;;;;8616:3:1;8601:19;;8594:44;41315:3:0;;41289:120;;8300:3:1;8285:19;41289:120:0;8267:377:1;59907:338:0;59987:13;60046:23;;;:11;:23;;;;;60145:26;;;;60109:24;;59987:13;;60101:71;;-1:-1:-1;;;60145:26:0;;;;;;-1:-1:-1;;;60109:24:0;;-1:-1:-1;;;;;60109:24:0;60101:71;:::i;:::-;60199:24;;60080:92;;-1:-1:-1;60191:46:0;;60080:92;;-1:-1:-1;;;;;60199:24:0;60191:46;:::i;:::-;60183:54;59907:338;-1:-1:-1;;;;59907:338:0:o;25614:118::-;24885:7;;;;25139:9;25131:38;;;;-1:-1:-1;;;25131:38:0;;;;;;;:::i;:::-;25684:4:::1;25674:14:::0;;-1:-1:-1;;25674:14:0::1;::::0;::::1;::::0;;25704:20:::1;23606:10:::0;25711:12:::1;23526:98:::0;33194:444;33333:12;33350:9;-1:-1:-1;;;;;33350:14:0;33373;33350:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33332:60;;;33408:7;33403:228;;33437:75;;;-1:-1:-1;;;;;9535:15:1;;;9517:34;;9582:2;9567:18;;9560:34;;;9630:15;;9610:18;;;9603:43;9677:2;9662:18;;9655:34;;;33437:75:0;;33458:3;;33437:75;;;;;;9466:3:1;33437:75:0;;;33403:228;;;33550:69;;;-1:-1:-1;;;;;9535:15:1;;;9517:34;;9582:2;9567:18;;9560:34;;;9630:15;;9610:18;;;9603:43;9677:2;9662:18;;9655:34;;;33550:69:0;;33565:3;;33550:69;;;;;;9466:3:1;33550:69:0;;;33403:228;33194:444;;;;;;:::o;65480:439::-;65549:4;65570:34;;;:22;:34;;;;;:41;;;-1:-1:-1;;;;;65570:41:0;:55;65566:99;;-1:-1:-1;65649:4:0;;65480:439;-1:-1:-1;65480:439:0:o;65566:99::-;65723:1;65681:23;;;:11;:23;;;;;:30;;;-1:-1:-1;;;;;65681:30:0;:44;65677:88;;-1:-1:-1;65749:4:0;;65480:439;-1:-1:-1;65480:439:0:o;65677:88::-;65845:1;65781:45;;;:33;:45;;;;;:52;-1:-1:-1;;;;;65781:52:0;:66;65777:110;;-1:-1:-1;65871:4:0;;65480:439;-1:-1:-1;65480:439:0:o;65777:110::-;-1:-1:-1;65906:5:0;;65480:439;-1:-1:-1;65480:439:0:o;63426:913::-;63555:7;63766:16;63784:15;63801;63820:8;:119;;63897:4;;:42;;-1:-1:-1;;;63897:42:0;;;;;34294:25:1;;;-1:-1:-1;;;;;63897:4:0;;;;:30;;34267:18:1;;63897:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63820:119;;;63840:4;;:45;;-1:-1:-1;;;63840:45:0;;;;;34294:25:1;;;-1:-1:-1;;;;;63840:4:0;;;;:33;;34267:18:1;;63840:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63765:174;;;;;;63976:70;64000:10;64012:7;64021:8;64031:14;63976:23;:70::i;:::-;64152:4;;:47;;-1:-1:-1;;;64152:47:0;;-1:-1:-1;;;;;7932:15:1;;;64152:47:0;;;7914:34:1;7984:15;;;7964:18;;;7957:43;8016:18;;;8009:34;;;64152:4:0;;;;:21;;7849:18:1;;64152:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64324:7:0;;63426:913;-1:-1:-1;;;;;;;;;;63426:913:0:o;62682:360::-;62825:4;;62770;62861:38;;;:33;:38;;;;;;:45;62825:120;;-1:-1:-1;;;62825:120:0;;62770:4;;;;-1:-1:-1;;;;;62825:4:0;;;;:21;;:120;;62861:45;;;62929:4;;62825:120;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62787:158;;62966:30;62965:31;:69;;;-1:-1:-1;63000:4:0;;:34;;-1:-1:-1;;;63000:34:0;;;;;34294:25:1;;;-1:-1:-1;;;;;63000:4:0;;;;:29;;34267:18:1;;63000:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62958:76;62682:360;-1:-1:-1;;;62682:360:0:o;33050:136::-;33099:19;33163:15;;33145;:33;;;;:::i;:::-;33131:47;;33050:136;:::o;64347:1056::-;64481:29;64527:43;;;:31;:43;;;;;:50;;;64523:432;;;-1:-1:-1;64618:43:0;;;;:31;:43;;;;;:56;;;64523:432;;;-1:-1:-1;;;;;64705:41:0;;;;;;:31;:41;;;;;:48;;;64701:254;;;-1:-1:-1;;;;;;64794:41:0;;;;;;:31;:41;;;;;:54;;;64701:254;;;-1:-1:-1;64914:29:0;;64701:254;64967:20;65018:21;65008:6;;64991:14;:23;;;;:::i;:::-;64990:49;;;;:::i;:::-;64967:72;-1:-1:-1;65054:16:0;;65050:205;;65117:15;;:46;;65088:24;;-1:-1:-1;;;;;65117:15:0;;65146:12;;65088:24;65117:46;65088:24;65117:46;65146:12;65117:15;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65087:76;;;65186:19;65178:65;;;;-1:-1:-1;;;65178:65:0;;29903:2:1;65178:65:0;;;29885:21:1;29942:2;29922:18;;;29915:30;29981:34;29961:18;;;29954:62;-1:-1:-1;;;30032:18:1;;;30025:31;30073:19;;65178:65:0;29875:223:1;65178:65:0;65050:205;;65268:12;-1:-1:-1;;;;;65285:14:0;;65308:29;65325:12;65308:14;:29;:::i;:::-;65285:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65267:75;;;65361:7;65353:42;;;;-1:-1:-1;;;65353:42:0;;29552:2:1;65353:42:0;;;29534:21:1;29591:2;29571:18;;;29564:30;-1:-1:-1;;;29610:18:1;;;29603:52;29672:18;;65353:42:0;29524:172:1;65353:42:0;64347:1056;;;;;;;:::o;14:188:1:-;82:20;;-1:-1:-1;;;;;131:46:1;;121:57;;111:2;;192:1;189;182:12;111:2;63:139;;;:::o;207:257::-;266:6;319:2;307:9;298:7;294:23;290:32;287:2;;;340:6;332;325:22;287:2;384:9;371:23;403:31;428:5;403:31;:::i;469:261::-;539:6;592:2;580:9;571:7;567:23;563:32;560:2;;;613:6;605;598:22;560:2;650:9;644:16;669:31;694:5;669:31;:::i;735:333::-;811:6;819;872:2;860:9;851:7;847:23;843:32;840:2;;;893:6;885;878:22;840:2;937:9;924:23;956:31;981:5;956:31;:::i;:::-;1006:5;1058:2;1043:18;;;;1030:32;;-1:-1:-1;;;830:238:1:o;1073:456::-;1161:6;1169;1177;1230:2;1218:9;1209:7;1205:23;1201:32;1198:2;;;1251:6;1243;1236:22;1198:2;1288:9;1282:16;1307:31;1332:5;1307:31;:::i;:::-;1407:2;1392:18;;1386:25;1357:5;;-1:-1:-1;1420:33:1;1386:25;1420:33;:::i;:::-;1472:7;1462:17;;;1519:2;1508:9;1504:18;1498:25;1488:35;;1188:341;;;;;:::o;1534:460::-;1608:6;1616;1624;1677:2;1665:9;1656:7;1652:23;1648:32;1645:2;;;1698:6;1690;1683:22;1645:2;1742:9;1729:23;1761:31;1786:5;1761:31;:::i;:::-;1811:5;-1:-1:-1;1868:2:1;1853:18;;1840:32;1881:30;1840:32;1881:30;:::i;:::-;1635:359;;1930:7;;-1:-1:-1;;;1984:2:1;1969:18;;;;1956:32;;1635:359::o;1999:474::-;2085:6;2093;2101;2109;2162:3;2150:9;2141:7;2137:23;2133:33;2130:2;;;2184:6;2176;2169:22;2130:2;2228:9;2215:23;2247:31;2272:5;2247:31;:::i;:::-;2297:5;-1:-1:-1;2349:2:1;2334:18;;2321:32;;-1:-1:-1;2372:38:1;2406:2;2391:18;;2372:38;:::i;:::-;2362:48;;2429:38;2463:2;2452:9;2448:18;2429:38;:::i;:::-;2419:48;;2120:353;;;;;;;:::o;2478:549::-;2573:6;2581;2589;2597;2605;2658:3;2646:9;2637:7;2633:23;2629:33;2626:2;;;2680:6;2672;2665:22;2626:2;2724:9;2711:23;2743:31;2768:5;2743:31;:::i;:::-;2793:5;-1:-1:-1;2845:2:1;2830:18;;2817:32;;-1:-1:-1;2868:38:1;2902:2;2887:18;;2868:38;:::i;:::-;2858:48;;2925:38;2959:2;2948:9;2944:18;2925:38;:::i;:::-;2915:48;;2982:39;3016:3;3005:9;3001:19;2982:39;:::i;:::-;2972:49;;2616:411;;;;;;;;:::o;3032:255::-;3099:6;3152:2;3140:9;3131:7;3127:23;3123:32;3120:2;;;3173:6;3165;3158:22;3120:2;3210:9;3204:16;3229:28;3251:5;3229:28;:::i;3292:481::-;3384:6;3392;3400;3453:2;3441:9;3432:7;3428:23;3424:32;3421:2;;;3474:6;3466;3459:22;3421:2;3518:9;3505:23;3537:31;3562:5;3537:31;:::i;:::-;3587:5;-1:-1:-1;3644:2:1;3629:18;;3616:32;3657:33;3616:32;3657:33;:::i;4070:196::-;4129:6;4182:2;4170:9;4161:7;4157:23;4153:32;4150:2;;;4203:6;4195;4188:22;4150:2;4231:29;4250:9;4231:29;:::i;4271:190::-;4330:6;4383:2;4371:9;4362:7;4358:23;4354:32;4351:2;;;4404:6;4396;4389:22;4351:2;-1:-1:-1;4432:23:1;;4341:120;-1:-1:-1;4341:120:1:o;4466:194::-;4536:6;4589:2;4577:9;4568:7;4564:23;4560:32;4557:2;;;4610:6;4602;4595:22;4557:2;-1:-1:-1;4638:16:1;;4547:113;-1:-1:-1;4547:113:1:o;4665:325::-;4733:6;4741;4794:2;4782:9;4773:7;4769:23;4765:32;4762:2;;;4815:6;4807;4800:22;4762:2;4856:9;4843:23;4833:33;;4916:2;4905:9;4901:18;4888:32;4929:31;4954:5;4929:31;:::i;:::-;4979:5;4969:15;;;4752:238;;;;;:::o;4995:387::-;5069:6;5077;5085;5138:2;5126:9;5117:7;5113:23;5109:32;5106:2;;;5159:6;5151;5144:22;5106:2;5200:9;5187:23;5177:33;;5260:2;5249:9;5245:18;5232:32;5273:28;5295:5;5273:28;:::i;5387:264::-;5455:6;5463;5516:2;5504:9;5495:7;5491:23;5487:32;5484:2;;;5537:6;5529;5522:22;5484:2;5578:9;5565:23;5555:33;;5607:38;5641:2;5630:9;5626:18;5607:38;:::i;:::-;5597:48;;5474:177;;;;;:::o;5656:338::-;5733:6;5741;5749;5802:2;5790:9;5781:7;5777:23;5773:32;5770:2;;;5823:6;5815;5808:22;5770:2;5864:9;5851:23;5841:33;;5893:38;5927:2;5916:9;5912:18;5893:38;:::i;:::-;5883:48;;5950:38;5984:2;5973:9;5969:18;5950:38;:::i;:::-;5940:48;;5760:234;;;;;:::o;5999:258::-;6067:6;6075;6128:2;6116:9;6107:7;6103:23;6099:32;6096:2;;;6149:6;6141;6134:22;6096:2;-1:-1:-1;;6177:23:1;;;6247:2;6232:18;;;6219:32;;-1:-1:-1;6086:171:1:o;6680:304::-;-1:-1:-1;;;;;6910:15:1;;;6892:34;;6962:15;;6957:2;6942:18;;6935:43;6842:2;6827:18;;6809:175::o;11330:347::-;11532:2;11514:21;;;11571:2;11551:18;;;11544:30;11610:25;11605:2;11590:18;;11583:53;11668:2;11653:18;;11504:173::o;12096:335::-;12298:2;12280:21;;;12337:2;12317:18;;;12310:30;-1:-1:-1;;;12371:2:1;12356:18;;12349:41;12422:2;12407:18;;12270:161::o;19426:340::-;19628:2;19610:21;;;19667:2;19647:18;;;19640:30;-1:-1:-1;;;19701:2:1;19686:18;;19679:46;19757:2;19742:18;;19600:166::o;20814:348::-;21016:2;20998:21;;;21055:2;21035:18;;;21028:30;21094:26;21089:2;21074:18;;21067:54;21153:2;21138:18;;20988:174::o;28990:355::-;29192:2;29174:21;;;29231:2;29211:18;;;29204:30;29270:33;29265:2;29250:18;;29243:61;29336:2;29321:18;;29164:181::o;35927:253::-;35967:3;-1:-1:-1;;;;;36056:2:1;36053:1;36049:10;36086:2;36083:1;36079:10;36117:3;36113:2;36109:12;36104:3;36101:21;36098:2;;;36125:18;;:::i;:::-;36161:13;;35975:205;-1:-1:-1;;;;35975:205:1:o;36185:224::-;36224:3;36252:6;36285:2;36282:1;36278:10;36315:2;36312:1;36308:10;36346:3;36342:2;36338:12;36333:3;36330:21;36327:2;;;36354:18;;:::i;36414:128::-;36454:3;36485:1;36481:6;36478:1;36475:13;36472:2;;;36491:18;;:::i;:::-;-1:-1:-1;36527:9:1;;36462:80::o;36547:217::-;36587:1;36613;36603:2;;-1:-1:-1;;;36638:31:1;;36692:4;36689:1;36682:15;36720:4;36645:1;36710:15;36603:2;-1:-1:-1;36749:9:1;;36593:171::o;36769:168::-;36809:7;36875:1;36871;36867:6;36863:14;36860:1;36857:21;36852:1;36845:9;36838:17;36834:45;36831:2;;;36882:18;;:::i;:::-;-1:-1:-1;36922:9:1;;36821:116::o;36942:246::-;36982:4;-1:-1:-1;;;;;37095:10:1;;;;37065;;37117:12;;;37114:2;;;37132:18;;:::i;:::-;37169:13;;36991:197;-1:-1:-1;;;36991:197:1:o;37193:125::-;37233:4;37261:1;37258;37255:8;37252:2;;;37266:18;;:::i;:::-;-1:-1:-1;37303:9:1;;37242:76::o;37323:127::-;37384:10;37379:3;37375:20;37372:1;37365:31;37415:4;37412:1;37405:15;37439:4;37436:1;37429:15;37455:131;-1:-1:-1;;;;;37530:31:1;;37520:42;;37510:2;;37576:1;37573;37566:12;37510:2;37500:86;:::o;37591:118::-;37677:5;37670:13;37663:21;37656:5;37653:32;37643:2;;37699:1;37696;37689:12
Swarm Source
ipfs://259cf77f06931a3032205863c4f37067b8747c4c3a47f1800aec4c48eb4145e6
Loading...
Loading
Loading...
Loading
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.