Contract
0xbE9Be72ffc4a854CC2E56072843040d8D22903C9
2
Contract Overview
Balance:
1.2001 MOVR
MOVR Value:
$4.57 (@ $3.81/MOVR)
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
MarketPlace
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at moonriver.moonscan.io on 2021-10-26 */ //Custom NFT Marketplace Contract. From your favorite beans around - MoonBeans! pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } 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); } 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; } interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } 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); } 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; } } contract MarketPlace is IERC721Receiver, ReentrancyGuard, Ownable { event TokenListed(address indexed token, uint256 indexed id, uint256 indexed price, uint256 timestamp); event TokenDelisted(address indexed token, uint256 indexed id, uint256 timestamp); event TokenPurchased(address indexed oldOwner, address indexed newOwner, uint256 indexed price, address collection, uint256 tokenId); event BidPlaced(address indexed token, uint256 indexed id, uint256 indexed price, address buyer, uint256 timestamp, bool escrowed); event BidCancelled(address indexed token, uint256 indexed id, uint256 indexed price, address buyer, bool escrowed, uint256 timestamp); event EscrowReturned(address indexed user, uint256 indexed price); // Fees are out of 1000, to theoretically allow for 0.1 - 0.9% fees in the future. uint256 public devFee = 10; //1% uint256 public beanieHolderFee = 10; //1% uint256 public beanBuybackFee = 10; //1% uint256 public defaultCollectionOwnerFee = 20; //2% uint256 public totalEscrowedAmount = 0; uint256 public specialTaxGas = 100000; address public TOKEN = 0x98878B06940aE243284CA214f92Bb71a2b032B8A; //WMOVR address public devAddress = 0x24312a0b911fE2199fbea92efab55e2ECCeC637D; address public beanieHolderAddress = 0x6e0fa1dC8E3e6510aeBF14fCa3d83C77a9780ecB; address public beanBuybackAddress = 0xE9b8258668E17AFA5D09de9F10381dE5565dbDc0; address public featuredCollection = 0xd3A9c48Df4d9342dc1A0EE2c185CE50588729Fa9; struct Listing { uint256 price; uint256 timestamp; uint256 tokenId; bool accepted; } struct Offer { uint256 price; uint256 timestamp; bool accepted; address buyer; bool escrowed; } bool public tradingPaused = false; bool public useSuperGasTaxes = true; bool public feesOn = true; bool public delistAfterAcceptingOffer = true; bool public clearBidsAfterAcceptingOffer = false; mapping(address => bool) collectionTradingEnabled; mapping(address => mapping(uint256 => Listing[])) listings; mapping(address => mapping(uint256 => Offer[])) offers; mapping(address => address) collectionOwners; mapping(address => uint256) totalInEscrow; mapping(address => uint256) collectionOwnerFees; // Required in order to receive ERC 721's. function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } // Required in order to receive MOVR/ETH. receive() external payable { } // LISTINGS // Public wrapper around token delisting, requiring ownership to delist. function delistToken(address ca, uint256 tokenId) public { require(msg.sender == IERC721(ca).ownerOf(tokenId), "Only the owner of a token can delist it."); _delistToken(ca, tokenId); } // Returns value in the 'listings' mapping for a specific address + id to the default (0). function _delistToken(address ca, uint256 tokenId) private { listings[ca][tokenId].push(Listing(0, block.timestamp, tokenId, false)); emit TokenDelisted(ca, tokenId, block.timestamp); } // Lists a token at the specified price point. function listToken(address ca, uint256 tokenId, uint256 price) public { require(msg.sender == IERC721(ca).ownerOf(tokenId), "Only the owner of a token can list it."); require(price > 0, "Cannot set price to 0."); require(IERC721(ca).isApprovedForAll(msg.sender, address(this)), "Marketplace not approved to handle this users tokens."); listings[ca][tokenId].push(Listing(price, block.timestamp, tokenId, false)); emit TokenListed(ca, tokenId, price, block.timestamp); } // Check if a token already has any listings. function isListed(address ca, uint256 tokenId) public view returns (bool) { uint256 index = listings[ca][tokenId].length; if (index == 0) { return false; } return listings[ca][tokenId][index - 1].price != 0; } // Getter for the current asking price on a specific token. function getCurrentListingPrice(address ca, uint256 tokenId) public view returns (uint256){ return getCurrentListing(ca, tokenId).price; } // Getter for the latest listing on a specific token. function getCurrentListing(address ca, uint256 tokenId) public view returns (Listing memory){ uint256 numListings = getNumberOfListings(ca, tokenId); require(numListings > 0, 'No listings for this token.'); return listings[ca][tokenId][numListings-1]; } // Getter for all listings of a unique token. function getTokenListingHistory(address ca, uint256 tokenId) external view returns (Listing[] memory) { return listings[ca][tokenId]; } // Allows a buyer to buy at the listed price. function fulfillListing(address ca, uint256 tokenId) external payable nonReentrant { require(!tradingPaused, "Marketplace trading is disabled."); require(collectionTradingEnabled[ca], "Trading for this collection is not enabled."); uint256 price = getCurrentListingPrice(ca, tokenId); require(msg.value >= price, "The amount sent is less than the asking price."); //get current NFT owner, verify approval address payable oldOwner = payable(IERC721(ca).ownerOf(tokenId)); require(IERC721(ca).isApprovedForAll(oldOwner, address(this)), "Marketplace not approved to transfer this NFT."); //get buyer, calculate fees, store seller original balance address payable newOwner = payable(msg.sender); (uint256 devFeeAmount, uint256 beanieHolderFeeAmount, uint256 beanBuybackFeeAmount, uint256 collectionOwnerFeeAmount, uint256 remainder) = calculateAmounts(ca, price); uint256 oldOwnerMovrBalance = oldOwner.balance; //swippity swappity IERC721(ca).safeTransferFrom(oldOwner, newOwner, tokenId); oldOwner.transfer(remainder); //Check that all went swimmingly require(IERC721(ca).ownerOf(tokenId) == newOwner, "NFT was not successfully transferred."); require(oldOwner.balance >= (oldOwnerMovrBalance + remainder), "Funds were not successfully sent."); emit TokenPurchased(oldOwner, newOwner, price, ca, tokenId); //fees if (feesOn) { payable(collectionOwners[ca]).transfer(collectionOwnerFeeAmount); payable(devAddress).transfer(devFeeAmount); if (useSuperGasTaxes) { sendClaimableBeanieFee(beanieHolderAddress, beanieHolderFeeAmount); sendClaimableBeanieFee(beanBuybackAddress, beanBuybackFeeAmount); } else { payable(beanieHolderAddress).transfer(beanieHolderFeeAmount); payable(beanBuybackAddress).transfer(beanBuybackFeeAmount); } } markListingAsAccepted(ca, tokenId); _delistToken(ca, tokenId); } // OFFERS // Make a standard offer (checks balance of bidder, but does not escrow). function makeOffer(address ca, uint256 tokenId, uint256 price) public { require(msg.sender != IERC721(ca).ownerOf(tokenId), "Can not bid on your own NFT."); require(price > 0, "Cannot bid a price of 0."); require(msg.sender.balance >= price, "The buyer does not have enough money to make the bid."); require(IERC20(TOKEN).allowance(msg.sender, address(this)) >= price, "Not an escrowed bid; approval required (Default: WMOVR)."); offers[ca][tokenId].push(Offer(price, block.timestamp, false, msg.sender, false)); emit BidPlaced(ca, tokenId, price, msg.sender, block.timestamp, false); } // Make an escrowed offer (checks balance of bidder, then holds the bid in the contract as an escrow). function makeEscrowedOffer(address ca, uint256 tokenId, uint256 price) public payable nonReentrant { require(msg.sender != IERC721(ca).ownerOf(tokenId), "Can not bid on your own NFT."); require(price > 0, "Cannot bid a price of 0."); require(msg.value >= price, "The buyer did not send enough money for an escrowed bid."); totalEscrowedAmount += msg.value; totalInEscrow[msg.sender] += msg.value; offers[ca][tokenId].push(Offer(price, block.timestamp, false, msg.sender, true)); emit BidPlaced(ca, tokenId, price, msg.sender, block.timestamp, true); } // Cancel an offer (escrowed or not). Could have gas issues if there's too many offers... function cancelOffer(address ca, uint256 tokenId, uint256 price, bool escrowed) external nonReentrant { Offer[] storage _offers = _getOffers(ca, tokenId); for (uint i = 0; i < _offers.length; i++) { if (escrowed) { if (_offers[i].price == price && _offers[i].buyer == msg.sender && _offers[i].escrowed && !_offers[i].accepted) { delete offers[ca][tokenId][i]; returnEscrowedFunds(msg.sender, price); emit BidCancelled(ca, tokenId, price, msg.sender, escrowed, block.timestamp); return; } } else { if (_offers[i].price == price && _offers[i].buyer == msg.sender && !_offers[i].escrowed && !_offers[i].accepted) { delete offers[ca][tokenId][i]; emit BidCancelled(ca, tokenId, price, msg.sender, escrowed, block.timestamp); return; } } } revert('No cancellable offer found.'); } // Getter for all bids on a unique token. function getOffers(address ca, uint256 tokenId) external view returns (Offer[] memory) { return offers[ca][tokenId]; } // Same as above, but for internal calls/passing offers object by reference. function _getOffers(address ca, uint256 tokenId) internal view returns (Offer[] storage) { return offers[ca][tokenId]; } // Accept an active offer. function acceptOffer(address ca, uint256 tokenId, uint256 price, address from, bool escrowedBid) external nonReentrant { IERC721 _nft = IERC721(ca); require(msg.sender == _nft.ownerOf(tokenId), "Only the owner of this NFT can accept an offer."); require(_nft.isApprovedForAll(msg.sender, address(this)), "Marketplace not approved to transfer this NFT."); require(!tradingPaused, "Marketplace trading is disabled."); require(collectionTradingEnabled[ca], "Trading for this collection is not enabled."); Offer[] storage _offers = _getOffers(ca, tokenId); uint256 correctIndex = 999999999999999999; for (uint i = _offers.length-1; i >= 0; i--) { if (_offers[i].price == price && _offers[i].buyer == from && _offers[i].accepted == false && _offers[i].escrowed == escrowedBid ) { correctIndex = i; break; } } require(correctIndex != 999999999999999999, "Matching offer not found..."); // Actually perform trade address payable oldOwner = payable(address(msg.sender)); address payable newOwner = payable(address(from)); if (escrowedBid) { escrowedPurchase(_nft, ca, tokenId, price, oldOwner, newOwner); } else { tokenPurchase(_nft, ca, tokenId, price, oldOwner, newOwner); } // Clean up data structures markOfferAsAccepted(ca, tokenId, correctIndex, _offers[correctIndex]); if (clearBidsAfterAcceptingOffer) { _clearAllBids(ca, tokenId); } if(delistAfterAcceptingOffer && isListed(ca, tokenId)) { _delistToken(ca, tokenId); } } // PUBLIC ESCROW FUNCTIONS function addMoneyToEscrow() external payable nonReentrant { require(msg.value > 10000000 gwei, "Minimum escrow deposit is 0.01 MOVR."); totalEscrowedAmount += msg.value; totalInEscrow[msg.sender] += msg.value; } function withdrawMoneyFromEscrow(uint256 amount) external nonReentrant { require(totalInEscrow[msg.sender] >= amount, "Trying to withdraw more than deposited."); returnEscrowedFunds(msg.sender, amount); } function getEscrowedAmount(address user) external view returns (uint256) { return totalInEscrow[user]; } // OTHER PUBLIC FUNCTIONS function getCollectionOwner(address ca) external view returns (address) { return collectionOwners[ca]; } function totalFees() public view returns (uint256) { return (devFee + beanieHolderFee + beanBuybackFee + defaultCollectionOwnerFee); } function checkEscrowAmount(address user) external view returns (uint256) { return totalInEscrow[user]; } function isCollectionTrading(address ca) external view returns (bool) { return collectionTradingEnabled[ca]; } function getCollectionFee(address ca) external view returns (uint256) { return collectionOwnerFees[ca]; } // ADMIN FUNCTIONS function clearAllBids(address ca, uint256 tokenId) external onlyOwner { _clearAllBids(ca, tokenId); } function clearAllListings(address ca, uint256 tokenId) external onlyOwner { delete listings[ca][tokenId]; } function setTrading(bool value) external onlyOwner { require(tradingPaused != value, "Already set to that value."); tradingPaused = value; } function setSuperGasTaxes(bool value) external onlyOwner { require(useSuperGasTaxes != value, "Already set to that value."); useSuperGasTaxes = value; } function setCollectionTrading(address ca, bool value) external onlyOwner { require(collectionTradingEnabled[ca] != value, "Already set to that value."); collectionTradingEnabled[ca] = value; } function setCollectionOwner(address ca, address owner) external onlyOwner { collectionOwners[ca] = owner; } function setDevFee(uint256 fee) external onlyOwner { require (fee <= 100, "Max 10% fee"); devFee = fee; } function setBeanieHolderFee(uint256 fee) external onlyOwner { require (fee <= 100, "Max 10% fee"); beanieHolderFee = fee; } function setBeanBuyBackFee(uint256 fee) external onlyOwner { require (fee <= 100, "Max 10% fee"); beanBuybackFee = fee; } function setCollectionOwnerFee(address ca, uint256 fee) external onlyOwner { require (fee <= 100, "Max 10% fee"); collectionOwnerFees[ca] = fee; } function setDevAddress(address _address) external onlyOwner { devAddress = _address; } function setBeanieHolderAddress(address _address) external onlyOwner { beanieHolderAddress = _address; } function setBeanBuybackAddress(address _address) external onlyOwner { beanBuybackAddress = _address; } function setFeaturedCollection(address _collection) external onlyOwner { featuredCollection = _collection; } function setSpecialGasTax(uint256 gasAmount) external onlyOwner { specialTaxGas = gasAmount; } function setFeesOn(bool _value) external onlyOwner { feesOn = _value; } function setDelistAfterAcceptingOffer(bool _value) external onlyOwner { delistAfterAcceptingOffer = _value; } function setClearBidsAfterAcceptingOffer(bool _value) external onlyOwner { clearBidsAfterAcceptingOffer = _value; } // Emergency only - Recover Tokens function recoverToken(address _token, uint256 amount) external onlyOwner { IERC20(_token).transfer(owner(), amount); } // Emergency only - Recover NFTs function recoverNFT(address _token, uint256 tokenId) external onlyOwner { IERC721(_token).transferFrom(address(this), owner(), tokenId); } // Emergency only - Recover MOVR function RecoverMOVR(address to, uint256 amount) external onlyOwner { payable(to).transfer(amount); } // PRIVATE HELPERS function calculateAmounts(address ca, uint256 amount) private view returns (uint256, uint256, uint256, uint256, uint256){ uint256 _collectionOwnerFee = collectionOwnerFees[ca] == 0 ? defaultCollectionOwnerFee : collectionOwnerFees[ca]; uint256 devFeeAmount = amount * devFee / 1000; uint256 beanieHolderFeeAmount = amount * beanieHolderFee / 1000; uint256 beanBuybackFeeAmount = amount * beanBuybackFee / 1000; uint256 collectionOwnerFeeAmount = amount * _collectionOwnerFee / 1000; uint256 remainder = amount - (devFeeAmount + beanieHolderFeeAmount + beanBuybackFeeAmount + collectionOwnerFeeAmount); return (devFeeAmount, beanieHolderFeeAmount, beanBuybackFeeAmount, collectionOwnerFeeAmount, remainder); } function getNumberOfListings(address ca, uint256 tokenId) private view returns (uint256) { return listings[ca][tokenId].length; } function markListingAsAccepted(address ca, uint256 tokenId) private { Listing memory current = getCurrentListing(ca, tokenId); Listing memory replaced = current; replaced.accepted = true; uint256 index = getNumberOfListings(ca, tokenId); if (index != 0) { listings[ca][tokenId][index - 1] = replaced; } } function markOfferAsAccepted(address ca, uint256 tokenId, uint256 i, Offer storage offer) private { Offer memory replaced = offer; replaced.accepted = true; offers[ca][tokenId][i] = replaced; } function returnEscrowedFunds(address user, uint256 price) private { require(totalEscrowedAmount >= price, "Not enough funds to return escrow. Theoretically impossible."); require(totalInEscrow[user] >= price, "Not enough funds to return escrow. Theoretically impossible."); totalEscrowedAmount -= price; totalInEscrow[user] -= price; payable(user).transfer(price); emit EscrowReturned(user, price); } function escrowedPurchase(IERC721 _nft, address ca, uint256 tokenId, uint256 price, address payable oldOwner, address payable newOwner) private { require(totalInEscrow[newOwner] >= price, "Buyer does not have enough money in escrow."); require(totalEscrowedAmount >= price, "Escrow balance too low."); uint256 oldOwnerMovrBalance = oldOwner.balance; //calculate fees (uint256 devFeeAmount, uint256 beanieHolderFeeAmount, uint256 beanBuybackFeeAmount, uint256 collectionOwnerFeeAmount, uint256 remainder) = calculateAmounts(ca, price); totalInEscrow[newOwner] -= price; totalEscrowedAmount -= price; //swippity swappity _nft.safeTransferFrom(oldOwner, newOwner, tokenId); oldOwner.transfer(remainder); //check that all went swimmingly require(oldOwner.balance >= (oldOwnerMovrBalance + remainder), "Funds were not successfully sent."); require(_nft.ownerOf(tokenId) == newOwner, "NFT was not successfully transferred."); emit TokenPurchased(oldOwner, newOwner, price, ca, tokenId); //fees if (feesOn) { payable(collectionOwners[ca]).transfer(collectionOwnerFeeAmount); payable(devAddress).transfer(devFeeAmount); if (useSuperGasTaxes) { sendClaimableBeanieFee(beanieHolderAddress, beanieHolderFeeAmount); sendClaimableBeanieFee(beanBuybackAddress, beanBuybackFeeAmount); } else { payable(beanieHolderAddress).transfer(beanieHolderFeeAmount); payable(beanBuybackAddress).transfer(beanBuybackFeeAmount); } } } function tokenPurchase(IERC721 _nft, address ca, uint256 tokenId, uint256 price, address payable oldOwner, address payable newOwner) private { IERC20 _token = IERC20(TOKEN); require(_token.balanceOf(msg.sender) >= price, "Buyer does not have enough money to purchase."); require(_token.allowance(newOwner, address(this)) >= price, "Marketplace not approved to spend buyer tokens."); (uint256 devFeeAmount, uint256 beanieHolderFeeAmount, uint256 beanBuybackFeeAmount, uint256 collectionOwnerFeeAmount, uint256 remainder) = calculateAmounts(ca, price); _nft.safeTransferFrom(oldOwner, newOwner, tokenId); _token.transferFrom(newOwner, oldOwner, remainder); require(_token.balanceOf(oldOwner) >= remainder, "Funds were not successfully sent."); require(_nft.ownerOf(tokenId) == newOwner, "NFT was not successfully transferred."); emit TokenPurchased(oldOwner, newOwner, price, ca, tokenId); //fees if (feesOn) { _token.transferFrom(address(this), collectionOwners[ca], collectionOwnerFeeAmount); _token.transferFrom(address(this), devAddress, devFeeAmount); _token.transferFrom(address(this), beanieHolderAddress, beanieHolderFeeAmount); _token.transferFrom(address(this), beanBuybackAddress, beanBuybackFeeAmount); } } function sendClaimableBeanieFee(address recipient, uint256 amount) internal { (bool success, ) = recipient.call{gas: specialTaxGas, value: amount}(""); require(success, "Transfer failed."); } function _clearAllBids(address ca, uint256 tokenId) internal { delete offers[ca][tokenId]; } }
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"bool","name":"escrowed","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BidCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bool","name":"escrowed","type":"bool"}],"name":"BidPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"}],"name":"EscrowReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenDelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenPurchased","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RecoverMOVR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"bool","name":"escrowedBid","type":"bool"}],"name":"acceptOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addMoneyToEscrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"beanBuybackAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beanBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beanieHolderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beanieHolderFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"escrowed","type":"bool"}],"name":"cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"checkEscrowAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"clearAllBids","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"clearAllListings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearBidsAfterAcceptingOffer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultCollectionOwnerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delistAfterAcceptingOffer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"delistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"featuredCollection","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"fulfillListing","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"}],"name":"getCollectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"}],"name":"getCollectionOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCurrentListing","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"accepted","type":"bool"}],"internalType":"struct MarketPlace.Listing","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCurrentListingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getEscrowedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOffers","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"accepted","type":"bool"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"bool","name":"escrowed","type":"bool"}],"internalType":"struct MarketPlace.Offer[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenListingHistory","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"accepted","type":"bool"}],"internalType":"struct MarketPlace.Listing[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"}],"name":"isCollectionTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"listToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"makeEscrowedOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"makeOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"recoverNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setBeanBuyBackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setBeanBuybackAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setBeanieHolderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setBeanieHolderFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setClearBidsAfterAcceptingOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"setCollectionOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setCollectionOwnerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setCollectionTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setDelistAfterAcceptingOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"}],"name":"setFeaturedCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setFeesOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasAmount","type":"uint256"}],"name":"setSpecialGasTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setSuperGasTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"specialTaxGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEscrowedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useSuperGasTaxes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawMoneyFromEscrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600a60028190556003819055600481905560146005556000600655620186a0600755600880546001600160a01b03199081167398878b06940ae243284ca214f92bb71a2b032b8a179091556009805482167324312a0b911fe2199fbea92efab55e2eccec637d17905581548116736e0fa1dc8e3e6510aebf14fca3d83c77a9780ecb17909155600b805490911673e9b8258668e17afa5d09de9f10381de5565dbdc0179055600c80546001600160c81b0319167701010100d3a9c48df4d9342dc1a0ee2c185ce50588729fa9179055348015620000e057600080fd5b506001600055620000f133620000f7565b62000149565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b614a8680620001596000396000f3fe6080604052600436106103a65760003560e01c806382bfefc8116101e7578063cbde64051161010d578063db8c96c7116100a0578063ea98a9501161006f578063ea98a95014610b0a578063f2fde38b14610b37578063feb8840614610b57578063ff09343614610b7757600080fd5b8063db8c96c714610a7b578063dfd3da7e14610a9b578063e0777a1414610abc578063e9a7720b14610ae957600080fd5b8063d0d41fe1116100dc578063d0d41fe114610a0f578063d1ffa71a14610a2f578063d3810e2414610a45578063d77fb11e14610a5b57600080fd5b8063cbde64051461098e578063ccd68371146109ae578063cd653ee6146109ce578063cdb3cd25146109ef57600080fd5b80639011f8fe11610185578063ac63391511610154578063ac633915146108f8578063b29a814014610918578063b3a4f97b14610938578063b966373a1461096e57600080fd5b80639011f8fe14610882578063943816361461089857806395483e81146108b8578063ab78f369146108d857600080fd5b806389394ef5116101c157806389394ef5146107f85780638a6169ae1461080b5780638da5cb5b146108445780638f70ccf71461086257600080fd5b806382bfefc8146107b857806382ff441c146107d8578063846f45a01461058257600080fd5b80634fbcd584116102cc5780636b872a961161026a57806376dda5051161023957806376dda505146107455780637b25b94a146107655780637de3bd07146107785780637e07590d1461079857600080fd5b80636b872a96146106b75780636b8894c4146106d7578063715018a6146106f7578063745b69ca1461070c57600080fd5b80635c827858116102a65780635c82785814610641578063675ef65c146106615780636827e764146106815780636a139d7a1461069757600080fd5b80634fbcd584146105e057806353e23e2e1461060057806357ccdcf81461062157600080fd5b806329bdfd94116103445780633ad10ef6116103135780633ad10ef61461054a5780633fd9d6ff146105825780634a5c213c146105b85780634ad6a3a2146105c057600080fd5b806329bdfd94146104c35780632a7b4bff146104d95780632eb81fdf1461050a5780633319a00d1461052a57600080fd5b80631c75b6b2116103805780631c75b6b21461044b57806320184b111461046d578063273499f01461048d5780632855ffe2146104ad57600080fd5b806313114a9d146103b2578063150b7a02146103da57806317c66b8c1461041e57600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506103c7610b97565b6040519081526020015b60405180910390f35b3480156103e657600080fd5b506104056103f53660046142f5565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016103d1565b34801561042a57600080fd5b5061043e6104393660046143d5565b610bc8565b6040516103d19190614401565b34801561045757600080fd5b5061046b610466366004614472565b610c6e565b005b34801561047957600080fd5b5061046b6104883660046143d5565b610cc7565b34801561049957600080fd5b5061046b6104a8366004614499565b610d2e565b3480156104b957600080fd5b506103c760035481565b3480156104cf57600080fd5b506103c760075481565b3480156104e557600080fd5b50600c546104fa90600160b81b900460ff1681565b60405190151581526020016103d1565b34801561051657600080fd5b5061046b6105253660046144f8565b6111b7565b34801561053657600080fd5b5061046b6105453660046143d5565b6111ff565b34801561055657600080fd5b5060095461056a906001600160a01b031681565b6040516001600160a01b0390911681526020016103d1565b34801561058e57600080fd5b506103c761059d36600461451c565b6001600160a01b031660009081526011602052604090205490565b61046b6112a0565b3480156105cc57600080fd5b5061046b6105db366004614472565b61136c565b3480156105ec57600080fd5b5061046b6105fb3660046143d5565b61139b565b34801561060c57600080fd5b50600c546104fa90600160a01b900460ff1681565b34801561062d57600080fd5b5061046b61063c3660046143d5565b6113d3565b34801561064d57600080fd5b50600b5461056a906001600160a01b031681565b34801561066d57600080fd5b5061046b61067c3660046144f8565b611438565b34801561068d57600080fd5b506103c760025481565b3480156106a357600080fd5b5061046b6106b236600461451c565b611480565b3480156106c357600080fd5b5061046b6106d2366004614472565b6114cc565b3480156106e357600080fd5b5061046b6106f236600461451c565b611574565b34801561070357600080fd5b5061046b6115c0565b34801561071857600080fd5b5061056a61072736600461451c565b6001600160a01b039081166000908152601060205260409020541690565b34801561075157600080fd5b5061046b6107603660046144f8565b6115f6565b61046b6107733660046143d5565b61163e565b34801561078457600080fd5b5061046b610793366004614539565b611be2565b3480156107a457600080fd5b5061046b6107b3366004614539565b611f73565b3480156107c457600080fd5b5060085461056a906001600160a01b031681565b3480156107e457600080fd5b5061046b6107f336600461456e565b612241565b61046b610806366004614539565b6122d5565b34801561081757600080fd5b506104fa61082636600461451c565b6001600160a01b03166000908152600d602052604090205460ff1690565b34801561085057600080fd5b506001546001600160a01b031661056a565b34801561086e57600080fd5b5061046b61087d3660046144f8565b6125d8565b34801561088e57600080fd5b506103c760065481565b3480156108a457600080fd5b5061046b6108b33660046145a7565b612651565b3480156108c457600080fd5b5061046b6108d3366004614472565b612a4c565b3480156108e457600080fd5b5061046b6108f3366004614472565b612a9c565b34801561090457600080fd5b50600c5461056a906001600160a01b031681565b34801561092457600080fd5b5061046b6109333660046143d5565b612aec565b34801561094457600080fd5b506103c761095336600461451c565b6001600160a01b031660009081526012602052604090205490565b34801561097a57600080fd5b5061046b61098936600461451c565b612bb7565b34801561099a57600080fd5b5061046b6109a93660046145f1565b612c03565b3480156109ba57600080fd5b5061046b6109c93660046144f8565b612c5b565b3480156109da57600080fd5b50600c546104fa90600160b01b900460ff1681565b3480156109fb57600080fd5b506104fa610a0a3660046143d5565b612cd4565b348015610a1b57600080fd5b5061046b610a2a36600461451c565b612d60565b348015610a3b57600080fd5b506103c760045481565b348015610a5157600080fd5b506103c760055481565b348015610a6757600080fd5b5061046b610a763660046143d5565b612dac565b348015610a8757600080fd5b506103c7610a963660046143d5565b612e02565b348015610aa757600080fd5b50600c546104fa90600160a81b900460ff1681565b348015610ac857600080fd5b50610adc610ad73660046143d5565b612e16565b6040516103d1919061461f565b348015610af557600080fd5b50600c546104fa90600160c01b900460ff1681565b348015610b1657600080fd5b50610b2a610b253660046143d5565b612f41565b6040516103d1919061464c565b348015610b4357600080fd5b5061046b610b5236600461451c565b612ff8565b348015610b6357600080fd5b5061046b610b723660046143d5565b613093565b348015610b8357600080fd5b50600a5461056a906001600160a01b031681565b6000600554600454600354600254610baf91906146dd565b610bb991906146dd565b610bc391906146dd565b905090565b6001600160a01b0382166000908152600e602090815260408083208484528252808320805482518185028101850190935280835260609492939192909184015b82821015610c61576000848152602090819020604080516080810182526004860290920180548352600180820154848601526002820154928401929092526003015460ff16151560608301529083529092019101610c08565b5050505090505b92915050565b6001546001600160a01b03163314610ca15760405162461bcd60e51b8152600401610c98906146f5565b60405180910390fd5b6064811115610cc25760405162461bcd60e51b8152600401610c989061472a565b600255565b6001546001600160a01b03163314610cf15760405162461bcd60e51b8152600401610c98906146f5565b6064811115610d125760405162461bcd60e51b8152600401610c989061472a565b6001600160a01b03909116600090815260126020526040902055565b60026000541415610d515760405162461bcd60e51b8152600401610c989061474f565b60026000556040516331a9108f60e11b81526004810185905285906001600160a01b03821690636352211e9060240160206040518083038186803b158015610d9857600080fd5b505afa158015610dac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd09190614786565b6001600160a01b0316336001600160a01b031614610e485760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c7920746865206f776e6572206f662074686973204e46542063616e206160448201526e31b1b2b83a1030b71037b33332b91760891b6064820152608401610c98565b60405163e985e9c560e01b81523360048201523060248201526001600160a01b0382169063e985e9c59060440160206040518083038186803b158015610e8d57600080fd5b505afa158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec591906147a3565b610ee15760405162461bcd60e51b8152600401610c98906147c0565b600c54600160a01b900460ff1615610f3b5760405162461bcd60e51b815260206004820181905260248201527f4d61726b6574706c6163652074726164696e672069732064697361626c65642e6044820152606401610c98565b6001600160a01b0386166000908152600d602052604090205460ff16610f735760405162461bcd60e51b8152600401610c989061480e565b6001600160a01b0386166000908152600f60209081526040808320888452909152812080549091670de0b6b3a763ffff91610fb090600190614859565b90505b86838281548110610fc657610fc6614870565b9060005260206000209060030201600001541480156110205750856001600160a01b0316838281548110610ffc57610ffc614870565b600091825260209091206003909102016002015461010090046001600160a01b0316145b8015611052575082818154811061103957611039614870565b600091825260209091206002600390920201015460ff16155b8015611091575084151583828154811061106e5761106e614870565b906000526020600020906003020160020160159054906101000a900460ff161515145b1561109e578091506110b0565b806110a881614886565b915050610fb3565b5080670de0b6b3a763ffff14156111095760405162461bcd60e51b815260206004820152601b60248201527f4d61746368696e67206f66666572206e6f7420666f756e642e2e2e00000000006044820152606401610c98565b338585156111245761111f858b8b8b8686613186565b611132565b611132858b8b8b86866135db565b61115d8a8a8587878154811061114a5761114a614870565b9060005260206000209060030201613c71565b600c54600160c01b900460ff1615611179576111798a8a613d74565b600c54600160b81b900460ff16801561119757506111978a8a612cd4565b156111a6576111a68a8a613da0565b505060016000555050505050505050565b6001546001600160a01b031633146111e15760405162461bcd60e51b8152600401610c98906146f5565b600c8054911515600160c01b0260ff60c01b19909216919091179055565b6001546001600160a01b031633146112295760405162461bcd60e51b8152600401610c98906146f5565b816001600160a01b03166323b872dd3061124b6001546001600160a01b031690565b846040518463ffffffff1660e01b815260040161126a9392919061489d565b600060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050505050565b600260005414156112c35760405162461bcd60e51b8152600401610c989061474f565b6002600055662386f26fc10000341161132a5760405162461bcd60e51b8152602060048201526024808201527f4d696e696d756d20657363726f77206465706f73697420697320302e3031204d60448201526327ab291760e11b6064820152608401610c98565b346006600082825461133c91906146dd565b909155505033600090815260116020526040812080543492906113609084906146dd565b90915550506001600055565b6001546001600160a01b031633146113965760405162461bcd60e51b8152600401610c98906146f5565b600755565b6001546001600160a01b031633146113c55760405162461bcd60e51b8152600401610c98906146f5565b6113cf8282613d74565b5050565b6001546001600160a01b031633146113fd5760405162461bcd60e51b8152600401610c98906146f5565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611433573d6000803e3d6000fd5b505050565b6001546001600160a01b031633146114625760405162461bcd60e51b8152600401610c98906146f5565b600c8054911515600160b01b0260ff60b01b19909216919091179055565b6001546001600160a01b031633146114aa5760405162461bcd60e51b8152600401610c98906146f5565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600260005414156114ef5760405162461bcd60e51b8152600401610c989061474f565b60026000908155338152601160205260409020548111156115625760405162461bcd60e51b815260206004820152602760248201527f547279696e6720746f207769746864726177206d6f7265207468616e2064657060448201526637b9b4ba32b21760c91b6064820152608401610c98565b61156c3382613e5b565b506001600055565b6001546001600160a01b0316331461159e5760405162461bcd60e51b8152600401610c98906146f5565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146115ea5760405162461bcd60e51b8152600401610c98906146f5565b6115f46000613f6a565b565b6001546001600160a01b031633146116205760405162461bcd60e51b8152600401610c98906146f5565b600c8054911515600160b81b0260ff60b81b19909216919091179055565b600260005414156116615760405162461bcd60e51b8152600401610c989061474f565b6002600055600c54600160a01b900460ff16156116c05760405162461bcd60e51b815260206004820181905260248201527f4d61726b6574706c6163652074726164696e672069732064697361626c65642e6044820152606401610c98565b6001600160a01b0382166000908152600d602052604090205460ff166116f85760405162461bcd60e51b8152600401610c989061480e565b60006117048383612e02565b90508034101561176d5760405162461bcd60e51b815260206004820152602e60248201527f54686520616d6f756e742073656e74206973206c657373207468616e2074686560448201526d1030b9b5b4b73390383934b1b29760911b6064820152608401610c98565b6040516331a9108f60e11b8152600481018390526000906001600160a01b03851690636352211e9060240160206040518083038186803b1580156117b057600080fd5b505afa1580156117c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e89190614786565b60405163e985e9c560e01b81526001600160a01b0380831660048301523060248301529192509085169063e985e9c59060440160206040518083038186803b15801561183357600080fd5b505afa158015611847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186b91906147a3565b6118875760405162461bcd60e51b8152600401610c98906147c0565b336000808080806118988a89613fbc565b945094509450945094506000876001600160a01b03163190508a6001600160a01b03166342842e0e89898d6040518463ffffffff1660e01b81526004016118e19392919061489d565b600060405180830381600087803b1580156118fb57600080fd5b505af115801561190f573d6000803e3d6000fd5b50506040516001600160a01b038b16925084156108fc02915084906000818181858888f19350505050158015611949573d6000803e3d6000fd5b506040516331a9108f60e11b8152600481018b90526001600160a01b0380891691908d1690636352211e9060240160206040518083038186803b15801561198f57600080fd5b505afa1580156119a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c79190614786565b6001600160a01b0316146119ed5760405162461bcd60e51b8152600401610c98906148c1565b6119f782826146dd565b886001600160a01b0316311015611a205760405162461bcd60e51b8152600401610c9890614906565b604080516001600160a01b038d81168252602082018d90528b92818b1692918c16917fe84a930f9e56d6b1a9a6619750ca0a3827c08b1634164de2ca9b49798890486f910160405180910390a4600c54600160b01b900460ff1615611bbc576001600160a01b03808c1660009081526010602052604080822054905192169185156108fc0291869190818181858888f19350505050158015611ac6573d6000803e3d6000fd5b506009546040516001600160a01b039091169087156108fc029088906000818181858888f19350505050158015611b01573d6000803e3d6000fd5b50600c54600160a81b900460ff1615611b4557600a54611b2a906001600160a01b0316866140c1565b600b54611b40906001600160a01b0316856140c1565b611bbc565b600a546040516001600160a01b039091169086156108fc029087906000818181858888f19350505050158015611b7f573d6000803e3d6000fd5b50600b546040516001600160a01b039091169085156108fc029086906000818181858888f19350505050158015611bba573d6000803e3d6000fd5b505b611bc68b8b61415b565b611bd08b8b613da0565b50506001600055505050505050505050565b6040516331a9108f60e11b8152600481018390526001600160a01b03841690636352211e9060240160206040518083038186803b158015611c2257600080fd5b505afa158015611c36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5a9190614786565b6001600160a01b0316336001600160a01b03161415611cbb5760405162461bcd60e51b815260206004820152601c60248201527f43616e206e6f7420626964206f6e20796f7572206f776e204e46542e000000006044820152606401610c98565b60008111611d065760405162461bcd60e51b815260206004820152601860248201527721b0b73737ba103134b2103090383934b1b29037b310181760411b6044820152606401610c98565b3331811115611d755760405162461bcd60e51b815260206004820152603560248201527f54686520627579657220646f6573206e6f74206861766520656e6f756768206d60448201527437b732bc903a379036b0b5b2903a3432903134b21760591b6064820152608401610c98565b600854604051636eb1769f60e11b815233600482015230602482015282916001600160a01b03169063dd62ed3e9060440160206040518083038186803b158015611dbe57600080fd5b505afa158015611dd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df69190614947565b1015611e6a5760405162461bcd60e51b815260206004820152603860248201527f4e6f7420616e20657363726f776564206269643b20617070726f76616c20726560448201527f717569726564202844656661756c743a20574d4f5652292e00000000000000006064820152608401610c98565b6001600160a01b038381166000818152600f602090815260408083208784528252808320815160a08101835287815242818501818152828501878152336060808601828152608087018b8152885460018082018b55998d528b8d2098516003909102909801978855945197870197909755915160029095018054965193511515600160a81b0260ff60a81b1994909c1661010002610100600160a81b0319961515969096166001600160a81b03199097169690961794909417919091169890981790925582519081529283015281019190915283928592917fc04359f39c9f4a2c55808f46b81414842c7568aa3f1a7c9160c70dbf32d79a8891015b60405180910390a4505050565b6040516331a9108f60e11b8152600481018390526001600160a01b03841690636352211e9060240160206040518083038186803b158015611fb357600080fd5b505afa158015611fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611feb9190614786565b6001600160a01b0316336001600160a01b03161461205a5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c7920746865206f776e6572206f66206120746f6b656e2063616e206c6960448201526539ba1034ba1760d11b6064820152608401610c98565b600081116120a35760405162461bcd60e51b815260206004820152601660248201527521b0b73737ba1039b2ba10383934b1b2903a3790181760511b6044820152606401610c98565b60405163e985e9c560e01b81523360048201523060248201526001600160a01b0384169063e985e9c59060440160206040518083038186803b1580156120e857600080fd5b505afa1580156120fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212091906147a3565b61218a5760405162461bcd60e51b815260206004820152603560248201527f4d61726b6574706c616365206e6f7420617070726f76656420746f2068616e646044820152743632903a3434b9903ab9b2b939903a37b5b2b7399760591b6064820152608401610c98565b6001600160a01b0383166000818152600e6020908152604080832086845282528083208151608081018352868152428185018181528285018a815260608401888152855460018082018855968a52988890209451600490990290940197885590519387019390935591516002860155516003909401805460ff191694151594909417909355519182528392859290917fda2d7fa13c443a4ce51bb68b8ce92f41fac2c10d9d5bdb6a9e9a91429020b7c39101611f66565b6001546001600160a01b0316331461226b5760405162461bcd60e51b8152600401610c98906146f5565b6001600160a01b0382166000908152600d602052604090205460ff16151581151514156122aa5760405162461bcd60e51b8152600401610c9890614960565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b600260005414156122f85760405162461bcd60e51b8152600401610c989061474f565b60026000556040516331a9108f60e11b8152600481018390526001600160a01b03841690636352211e9060240160206040518083038186803b15801561233d57600080fd5b505afa158015612351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123759190614786565b6001600160a01b0316336001600160a01b031614156123d65760405162461bcd60e51b815260206004820152601c60248201527f43616e206e6f7420626964206f6e20796f7572206f776e204e46542e000000006044820152606401610c98565b600081116124215760405162461bcd60e51b815260206004820152601860248201527721b0b73737ba103134b2103090383934b1b29037b310181760411b6044820152606401610c98565b803410156124975760405162461bcd60e51b815260206004820152603860248201527f54686520627579657220646964206e6f742073656e6420656e6f756768206d6f60448201527f6e657920666f7220616e20657363726f776564206269642e00000000000000006064820152608401610c98565b34600660008282546124a991906146dd565b909155505033600090815260116020526040812080543492906124cd9084906146dd565b90915550506001600160a01b038381166000818152600f602090815260408083208784528252808320815160a0810183528781524281850181815282850187815233606080860182815260016080880181815289548083018b55998d529b8b902097516003909902909701978855935187870155915160029096018054935199516001600160a81b0319909416961515610100600160a81b0319169690961761010099909b16989098029990991760ff60a81b1916600160a81b911515919091021790925582519485529284015282015283928592917fc04359f39c9f4a2c55808f46b81414842c7568aa3f1a7c9160c70dbf32d79a88910160405180910390a45050600160005550565b6001546001600160a01b031633146126025760405162461bcd60e51b8152600401610c98906146f5565b600c5460ff600160a01b90910416151581151514156126335760405162461bcd60e51b8152600401610c9890614960565b600c8054911515600160a01b0260ff60a01b19909216919091179055565b600260005414156126745760405162461bcd60e51b8152600401610c989061474f565b600260009081556001600160a01b0385168152600f602090815260408083208684529091528120905b81548110156129f857821561285357838282815481106126bf576126bf614870565b9060005260206000209060030201600001541480156127195750336001600160a01b03168282815481106126f5576126f5614870565b600091825260209091206003909102016002015461010090046001600160a01b0316145b8015612752575081818154811061273257612732614870565b906000526020600020906003020160020160159054906101000a900460ff165b8015612784575081818154811061276b5761276b614870565b600091825260209091206002600390920201015460ff16155b1561284e576001600160a01b0386166000908152600f6020908152604080832088845290915290208054829081106127be576127be614870565b600091825260208220600390910201818155600181019190915560020180546001600160b01b03191690556127f33385613e5b565b6040805133815284151560208201524291810191909152849086906001600160a01b038916907fd2c5c6bf17cda2bc1b6c61b2de68b0738dc35ca17f4cdbecd6192cf49a741f88906060015b60405180910390a45050612a41565b6129e6565b8382828154811061286657612866614870565b9060005260206000209060030201600001541480156128c05750336001600160a01b031682828154811061289c5761289c614870565b600091825260209091206003909102016002015461010090046001600160a01b0316145b80156128fa57508181815481106128d9576128d9614870565b906000526020600020906003020160020160159054906101000a900460ff16155b801561292c575081818154811061291357612913614870565b600091825260209091206002600390920201015460ff16155b156129e6576001600160a01b0386166000908152600f60209081526040808320888452909152902080548290811061296657612966614870565b600091825260208083206003929092029091018281556001810192909255600290910180546001600160b01b031916905560408051338152851515928101929092524290820152849086906001600160a01b038916907fd2c5c6bf17cda2bc1b6c61b2de68b0738dc35ca17f4cdbecd6192cf49a741f889060600161283f565b806129f081614997565b91505061269d565b5060405162461bcd60e51b815260206004820152601b60248201527f4e6f2063616e63656c6c61626c65206f6666657220666f756e642e00000000006044820152606401610c98565b505060016000555050565b6001546001600160a01b03163314612a765760405162461bcd60e51b8152600401610c98906146f5565b6064811115612a975760405162461bcd60e51b8152600401610c989061472a565b600455565b6001546001600160a01b03163314612ac65760405162461bcd60e51b8152600401610c98906146f5565b6064811115612ae75760405162461bcd60e51b8152600401610c989061472a565b600355565b6001546001600160a01b03163314612b165760405162461bcd60e51b8152600401610c98906146f5565b816001600160a01b031663a9059cbb612b376001546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015612b7f57600080fd5b505af1158015612b93573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143391906147a3565b6001546001600160a01b03163314612be15760405162461bcd60e51b8152600401610c98906146f5565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314612c2d5760405162461bcd60e51b8152600401610c98906146f5565b6001600160a01b03918216600090815260106020526040902080546001600160a01b03191691909216179055565b6001546001600160a01b03163314612c855760405162461bcd60e51b8152600401610c98906146f5565b600c5460ff600160a81b9091041615158115151415612cb65760405162461bcd60e51b8152600401610c9890614960565b600c8054911515600160a81b0260ff60a81b19909216919091179055565b6001600160a01b0382166000908152600e6020908152604080832084845290915281205480612d07576000915050610c68565b6001600160a01b0384166000908152600e602090815260408083208684529091529020612d35600183614859565b81548110612d4557612d45614870565b60009182526020909120600490910201541515949350505050565b6001546001600160a01b03163314612d8a5760405162461bcd60e51b8152600401610c98906146f5565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314612dd65760405162461bcd60e51b8152600401610c98906146f5565b6001600160a01b0382166000908152600e6020908152604080832084845290915281206113cf91614229565b6000612e0e8383612e16565b519392505050565b612e4360405180608001604052806000815260200160008152602001600081526020016000151581525090565b6001600160a01b0383166000908152600e6020908152604080832085845290915290205480612eb45760405162461bcd60e51b815260206004820152601b60248201527f4e6f206c697374696e677320666f72207468697320746f6b656e2e00000000006044820152606401610c98565b6001600160a01b0384166000908152600e602090815260408083208684529091529020612ee2600183614859565b81548110612ef257612ef2614870565b60009182526020918290206040805160808101825260049093029091018054835260018101549383019390935260028301549082015260039091015460ff161515606082015291505092915050565b6001600160a01b0382166000908152600f602090815260408083208484528252808320805482518185028101850190935280835260609492939192909184015b82821015610c615760008481526020908190206040805160a08101825260038602909201805483526001808201548486015260029091015460ff8082161515938501939093526001600160a01b036101008204166060850152600160a81b9004909116151560808301529083529092019101612f81565b6001546001600160a01b031633146130225760405162461bcd60e51b8152600401610c98906146f5565b6001600160a01b0381166130875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c98565b61309081613f6a565b50565b6040516331a9108f60e11b8152600481018290526001600160a01b03831690636352211e9060240160206040518083038186803b1580156130d357600080fd5b505afa1580156130e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310b9190614786565b6001600160a01b0316336001600160a01b03161461317c5760405162461bcd60e51b815260206004820152602860248201527f4f6e6c7920746865206f776e6572206f66206120746f6b656e2063616e2064656044820152673634b9ba1034ba1760c11b6064820152608401610c98565b6113cf8282613da0565b6001600160a01b0381166000908152601160205260409020548311156132025760405162461bcd60e51b815260206004820152602b60248201527f427579657220646f6573206e6f74206861766520656e6f756768206d6f6e657960448201526a1034b71032b9b1b937bb9760a91b6064820152608401610c98565b8260065410156132545760405162461bcd60e51b815260206004820152601760248201527f457363726f772062616c616e636520746f6f206c6f772e0000000000000000006044820152606401610c98565b6001600160a01b0382163160008080808061326f8b8a613fbc565b6001600160a01b038c1660009081526011602052604081208054969b5094995092975090955093508b926132a4908490614859565b9250508190555088600660008282546132bd9190614859565b9091555050604051632142170760e11b81526001600160a01b038d16906342842e0e906132f2908b908b908f9060040161489d565b600060405180830381600087803b15801561330c57600080fd5b505af1158015613320573d6000803e3d6000fd5b50506040516001600160a01b038b16925083156108fc02915083906000818181858888f1935050505015801561335a573d6000803e3d6000fd5b5061336581876146dd565b886001600160a01b031631101561338e5760405162461bcd60e51b8152600401610c9890614906565b6040516331a9108f60e11b8152600481018b90526001600160a01b0380891691908e1690636352211e9060240160206040518083038186803b1580156133d357600080fd5b505afa1580156133e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340b9190614786565b6001600160a01b0316146134315760405162461bcd60e51b8152600401610c98906148c1565b604080516001600160a01b038d81168252602082018d90528b92818b1692918c16917fe84a930f9e56d6b1a9a6619750ca0a3827c08b1634164de2ca9b49798890486f910160405180910390a4600c54600160b01b900460ff16156135cd576001600160a01b03808c1660009081526010602052604080822054905192169184156108fc0291859190818181858888f193505050501580156134d7573d6000803e3d6000fd5b506009546040516001600160a01b039091169086156108fc029087906000818181858888f19350505050158015613512573d6000803e3d6000fd5b50600c54600160a81b900460ff161561355657600a5461353b906001600160a01b0316856140c1565b600b54613551906001600160a01b0316846140c1565b6135cd565b600a546040516001600160a01b039091169085156108fc029086906000818181858888f19350505050158015613590573d6000803e3d6000fd5b50600b546040516001600160a01b039091169084156108fc029085906000818181858888f193505050501580156135cb573d6000803e3d6000fd5b505b505050505050505050505050565b6008546040516370a0823160e01b81523360048201526001600160a01b0390911690849082906370a082319060240160206040518083038186803b15801561362257600080fd5b505afa158015613636573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365a9190614947565b10156136be5760405162461bcd60e51b815260206004820152602d60248201527f427579657220646f6573206e6f74206861766520656e6f756768206d6f6e657960448201526c103a3790383ab931b430b9b29760991b6064820152608401610c98565b604051636eb1769f60e11b81526001600160a01b03838116600483015230602483015285919083169063dd62ed3e9060440160206040518083038186803b15801561370857600080fd5b505afa15801561371c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137409190614947565b10156137a65760405162461bcd60e51b815260206004820152602f60248201527f4d61726b6574706c616365206e6f7420617070726f76656420746f207370656e60448201526e3210313abcb2b9103a37b5b2b7399760891b6064820152608401610c98565b60008060008060006137b88b8a613fbc565b945094509450945094508b6001600160a01b03166342842e0e89898d6040518463ffffffff1660e01b81526004016137f29392919061489d565b600060405180830381600087803b15801561380c57600080fd5b505af1158015613820573d6000803e3d6000fd5b50506040516323b872dd60e01b81526001600160a01b03891692506323b872dd9150613854908a908c90869060040161489d565b602060405180830381600087803b15801561386e57600080fd5b505af1158015613882573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a691906147a3565b506040516370a0823160e01b81526001600160a01b0389811660048301528291908816906370a082319060240160206040518083038186803b1580156138eb57600080fd5b505afa1580156138ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139239190614947565b10156139415760405162461bcd60e51b8152600401610c9890614906565b6040516331a9108f60e11b8152600481018b90526001600160a01b0380891691908e1690636352211e9060240160206040518083038186803b15801561398657600080fd5b505afa15801561399a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139be9190614786565b6001600160a01b0316146139e45760405162461bcd60e51b8152600401610c98906148c1565b604080516001600160a01b038d81168252602082018d90528b92818b1692918c16917fe84a930f9e56d6b1a9a6619750ca0a3827c08b1634164de2ca9b49798890486f910160405180910390a4600c54600160b01b900460ff16156135cd576001600160a01b038b8116600090815260106020526040908190205490516323b872dd60e01b8152828916926323b872dd92613a8a9230929190911690879060040161489d565b602060405180830381600087803b158015613aa457600080fd5b505af1158015613ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613adc91906147a3565b506009546040516323b872dd60e01b81526001600160a01b03808916926323b872dd92613b1192309216908a9060040161489d565b602060405180830381600087803b158015613b2b57600080fd5b505af1158015613b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b6391906147a3565b50600a546040516323b872dd60e01b81526001600160a01b03808916926323b872dd92613b989230921690899060040161489d565b602060405180830381600087803b158015613bb257600080fd5b505af1158015613bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bea91906147a3565b50600b546040516323b872dd60e01b81526001600160a01b03808916926323b872dd92613c1f9230921690889060040161489d565b602060405180830381600087803b158015613c3957600080fd5b505af1158015613c4d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135cb91906147a3565b6040805160a0810182528254815260018084015460208084019190915260028501546001600160a01b03610100820481166060860152600160a81b90910460ff1615156080850152838501929092529087166000908152600f825283812087825290915291909120805482919085908110613cee57613cee614870565b6000918252602091829020835160039092020190815590820151600182015560408201516002909101805460608401516080909401511515600160a81b0260ff60a81b196001600160a01b0390951661010002610100600160a81b0319941515949094166001600160a81b03199092169190911792909217929092161790555050505050565b6001600160a01b0382166000908152600f6020908152604080832084845290915281206113cf9161424a565b6001600160a01b0382166000818152600e60209081526040808320858452825280832081516080810183528481524281850181815282850189815260608401888152855460018082018855968a52988890209451600490990290940197885590519387019390935591516002860155516003909401805460ff191694151594909417909355519182528392917f1a99fed16d0c92a9f028b3f166d0aab2b85f7b731686df5d1b75d0171f450764910160405180910390a35050565b806006541015613e7d5760405162461bcd60e51b8152600401610c98906149b2565b6001600160a01b038216600090815260116020526040902054811115613eb55760405162461bcd60e51b8152600401610c98906149b2565b8060066000828254613ec79190614859565b90915550506001600160a01b03821660009081526011602052604081208054839290613ef4908490614859565b90915550506040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015613f2f573d6000803e3d6000fd5b5060405181906001600160a01b038416907fbf1a0ef092ef679427b427c6a95d51133522541e667b737b795a77f2b61c240d90600090a35050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152601260205260408120548190819081908190819015614002576001600160a01b038816600090815260126020526040902054614006565b6005545b905060006103e86002548961401b9190614a0f565b6140259190614a2e565b905060006103e86003548a61403a9190614a0f565b6140449190614a2e565b905060006103e86004548b6140599190614a0f565b6140639190614a2e565b905060006103e8614074868d614a0f565b61407e9190614a2e565b90506000818361408e86886146dd565b61409891906146dd565b6140a291906146dd565b6140ac908d614859565b949d939c50919a509850919650945050505050565b6000826001600160a01b031660075483604051600060405180830381858888f193505050503d8060008114614112576040519150601f19603f3d011682016040523d82523d6000602084013e614117565b606091505b50509050806114335760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610c98565b60006141678383612e16565b600160608201526001600160a01b0384166000908152600e6020908152604080832086845290915290205490915081908015614222576001600160a01b0385166000908152600e60209081526040808320878452909152902082906141cd600184614859565b815481106141dd576141dd614870565b6000918252602091829020835160049290920201908155908201516001820155604082015160028201556060909101516003909101805460ff19169115159190911790555b5050505050565b5080546000825560040290600052602060002090810190613090919061426b565b5080546000825560030290600052602060002090810190613090919061429d565b5b8082111561429957600080825560018201819055600282015560038101805460ff1916905560040161426c565b5090565b5b8082111561429957600080825560018201556002810180546001600160b01b031916905560030161429e565b6001600160a01b038116811461309057600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561430b57600080fd5b8435614316816142ca565b93506020850135614326816142ca565b925060408501359150606085013567ffffffffffffffff8082111561434a57600080fd5b818701915087601f83011261435e57600080fd5b813581811115614370576143706142df565b604051601f8201601f19908116603f01168101908382118183101715614398576143986142df565b816040528281528a60208487010111156143b157600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600080604083850312156143e857600080fd5b82356143f3816142ca565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015614466576144538385518051825260208101516020830152604081015160408301526060810151151560608301525050565b928401926080929092019160010161441d565b50909695505050505050565b60006020828403121561448457600080fd5b5035919050565b801515811461309057600080fd5b600080600080600060a086880312156144b157600080fd5b85356144bc816142ca565b9450602086013593506040860135925060608601356144da816142ca565b915060808601356144ea8161448b565b809150509295509295909350565b60006020828403121561450a57600080fd5b81356145158161448b565b9392505050565b60006020828403121561452e57600080fd5b8135614515816142ca565b60008060006060848603121561454e57600080fd5b8335614559816142ca565b95602085013595506040909401359392505050565b6000806040838503121561458157600080fd5b823561458c816142ca565b9150602083013561459c8161448b565b809150509250929050565b600080600080608085870312156145bd57600080fd5b84356145c8816142ca565b9350602085013592506040850135915060608501356145e68161448b565b939692955090935050565b6000806040838503121561460457600080fd5b823561460f816142ca565b9150602083013561459c816142ca565b81518152602080830151908201526040808301519082015260608083015115159082015260808101610c68565b602080825282518282018190526000919060409081850190868401855b828110156146ba578151805185528681015187860152858101511515868601526060808201516001600160a01b03169086015260809081015115159085015260a09093019290850190600101614669565b5091979650505050505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156146f0576146f06146c7565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600b908201526a4d6178203130252066656560a81b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60006020828403121561479857600080fd5b8151614515816142ca565b6000602082840312156147b557600080fd5b81516145158161448b565b6020808252602e908201527f4d61726b6574706c616365206e6f7420617070726f76656420746f207472616e60408201526d39b332b9103a3434b99027232a1760911b606082015260800190565b6020808252602b908201527f54726164696e6720666f72207468697320636f6c6c656374696f6e206973206e60408201526a37ba1032b730b13632b21760a91b606082015260800190565b60008282101561486b5761486b6146c7565b500390565b634e487b7160e01b600052603260045260246000fd5b600081614895576148956146c7565b506000190190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60208082526025908201527f4e465420776173206e6f74207375636365737366756c6c79207472616e736665604082015264393932b21760d91b606082015260800190565b60208082526021908201527f46756e64732077657265206e6f74207375636365737366756c6c792073656e746040820152601760f91b606082015260800190565b60006020828403121561495957600080fd5b5051919050565b6020808252601a908201527f416c72656164792073657420746f20746861742076616c75652e000000000000604082015260600190565b60006000198214156149ab576149ab6146c7565b5060010190565b6020808252603c908201527f4e6f7420656e6f7567682066756e647320746f2072657475726e20657363726f60408201527f772e205468656f7265746963616c6c7920696d706f737369626c652e00000000606082015260800190565b6000816000190483118215151615614a2957614a296146c7565b500290565b600082614a4b57634e487b7160e01b600052601260045260246000fd5b50049056fea264697066735822122029a3d11a93db113dede96cd089b11266b331004efe8f7cfe939c53c40310601264736f6c63430008090033
Deployed ByteCode Sourcemap
12376:20641:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24461:142;;;;;;;;;;;;;:::i;:::-;;;160:25:1;;;148:2;133:18;24461:142:0;;;;;;;;14705:158;;;;;;;;;;-1:-1:-1;14705:158:0;;;;;:::i;:::-;-1:-1:-1;;;14705:158:0;;;;;;;;;;-1:-1:-1;;;;;;1897:33:1;;;1879:52;;1867:2;1852:18;14705:158:0;1735:202:1;16991:143:0;;;;;;;;;;-1:-1:-1;16991:143:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25894:118::-;;;;;;;;;;-1:-1:-1;25894:118:0;;;;;:::i;:::-;;:::i;:::-;;26300:159;;;;;;;;;;-1:-1:-1;26300:159:0;;;;;:::i;:::-;;:::i;22062:1632::-;;;;;;;;;;-1:-1:-1;22062:1632:0;;;;;:::i;:::-;;:::i;13246:35::-;;;;;;;;;;;;;;;;13433:37;;;;;;;;;;;;;;;;14232:44;;;;;;;;;;-1:-1:-1;14232:44:0;;;;-1:-1:-1;;;14232:44:0;;;;;;;;;4388:14:1;;4381:22;4363:41;;4351:2;4336:18;14232:44:0;4223:187:1;27237:123:0;;;;;;;;;;-1:-1:-1;27237:123:0;;;;;:::i;:::-;;:::i;27572:146::-;;;;;;;;;;-1:-1:-1;27572:146:0;;;;;:::i;:::-;;:::i;13555:70::-;;;;;;;;;;-1:-1:-1;13555:70:0;;;;-1:-1:-1;;;;;13555:70:0;;;;;;-1:-1:-1;;;;;4825:32:1;;;4807:51;;4795:2;4780:18;13555:70:0;4661:203:1;24192:112:0;;;;;;;;;;-1:-1:-1;24192:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;24279:19:0;24256:7;24279:19;;;:13;:19;;;;;;;24192:112;23734:229;;;:::i;26921:102::-;;;;;;;;;;-1:-1:-1;26921:102:0;;;;;:::i;:::-;;:::i;24996:109::-;;;;;;;;;;-1:-1:-1;24996:109:0;;;;;:::i;:::-;;:::i;14124:33::-;;;;;;;;;;-1:-1:-1;14124:33:0;;;;-1:-1:-1;;;14124:33:0;;;;;;27760:109;;;;;;;;;;-1:-1:-1;27760:109:0;;;;;:::i;:::-;;:::i;13714:78::-;;;;;;;;;;-1:-1:-1;13714:78:0;;;;-1:-1:-1;;;;;13714:78:0;;;27029:79;;;;;;;;;;-1:-1:-1;27029:79:0;;;;;:::i;:::-;;:::i;13210:26::-;;;;;;;;;;;;;;;;26683:110;;;;;;;;;;-1:-1:-1;26683:110:0;;;;;:::i;:::-;;:::i;23969:217::-;;;;;;;;;;-1:-1:-1;23969:217:0;;;;;:::i;:::-;;:::i;26799:116::-;;;;;;;;;;-1:-1:-1;26799:116:0;;;;;:::i;:::-;;:::i;1444:94::-;;;;;;;;;;;;;:::i;24343:112::-;;;;;;;;;;-1:-1:-1;24343:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;24429:20:0;;;24406:7;24429:20;;;:16;:20;;;;;;;;24343:112;27114:117;;;;;;;;;;-1:-1:-1;27114:117:0;;;;;:::i;:::-;;:::i;17189:1993::-;;;;;;:::i;:::-;;:::i;19282:619::-;;;;;;;;;;-1:-1:-1;19282:619:0;;;;;:::i;:::-;;:::i;15596:497::-;;;;;;;;;;-1:-1:-1;15596:497:0;;;;;:::i;:::-;;:::i;13477:65::-;;;;;;;;;;-1:-1:-1;13477:65:0;;;;-1:-1:-1;;;;;13477:65:0;;;25562:205;;;;;;;;;;-1:-1:-1;25562:205:0;;;;;:::i;:::-;;:::i;20013:591::-;;;;;;:::i;:::-;;:::i;24727:118::-;;;;;;;;;;-1:-1:-1;24727:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;24811:28:0;24791:4;24811:28;;;:24;:28;;;;;;;;;24727:118;793:87;;;;;;;;;;-1:-1:-1;866:6:0;;-1:-1:-1;;;;;866:6:0;793:87;;25232:153;;;;;;;;;;-1:-1:-1;25232:153:0;;;;;:::i;:::-;;:::i;13390:38::-;;;;;;;;;;;;;;;;20703:932;;;;;;;;;;-1:-1:-1;20703:932:0;;;;;:::i;:::-;;:::i;26160:134::-;;;;;;;;;;-1:-1:-1;26160:134:0;;;;;:::i;:::-;;:::i;26018:136::-;;;;;;;;;;-1:-1:-1;26018:136:0;;;;;:::i;:::-;;:::i;13797:78::-;;;;;;;;;;-1:-1:-1;13797:78:0;;;;-1:-1:-1;;;;;13797:78:0;;;27404:126;;;;;;;;;;-1:-1:-1;27404:126:0;;;;;:::i;:::-;;:::i;24851:113::-;;;;;;;;;;-1:-1:-1;24851:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;24935:23:0;24912:7;24935:23;;;:19;:23;;;;;;;24851:113;26565:112;;;;;;;;;;-1:-1:-1;26565:112:0;;;;;:::i;:::-;;:::i;25773:115::-;;;;;;;;;;-1:-1:-1;25773:115:0;;;;;:::i;:::-;;:::i;25391:165::-;;;;;;;;;;-1:-1:-1;25391:165:0;;;;;:::i;:::-;;:::i;14202:25::-;;;;;;;;;;-1:-1:-1;14202:25:0;;;;-1:-1:-1;;;14202:25:0;;;;;;16148:239;;;;;;;;;;-1:-1:-1;16148:239:0;;;;;:::i;:::-;;:::i;26465:94::-;;;;;;;;;;-1:-1:-1;26465:94:0;;;;;:::i;:::-;;:::i;13291:34::-;;;;;;;;;;;;;;;;13335:45;;;;;;;;;;;;;;;;25111:115;;;;;;;;;;-1:-1:-1;25111:115:0;;;;;:::i;:::-;;:::i;16456:146::-;;;;;;;;;;-1:-1:-1;16456:146:0;;;;;:::i;:::-;;:::i;14162:35::-;;;;;;;;;;-1:-1:-1;14162:35:0;;;;-1:-1:-1;;;14162:35:0;;;;;;16665:271;;;;;;;;;;-1:-1:-1;16665:271:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14281:48::-;;;;;;;;;;-1:-1:-1;14281:48:0;;;;-1:-1:-1;;;14281:48:0;;;;;;21686:126;;;;;;;;;;-1:-1:-1;21686:126:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1693:192::-;;;;;;;;;;-1:-1:-1;1693:192:0;;;;;:::i;:::-;;:::i;15045:197::-;;;;;;;;;;-1:-1:-1;15045:197:0;;;;;:::i;:::-;;:::i;13630:79::-;;;;;;;;;;-1:-1:-1;13630:79:0;;;;-1:-1:-1;;;;;13630:79:0;;;24461:142;24503:7;24571:25;;24554:14;;24536:15;;24527:6;;:24;;;;:::i;:::-;:41;;;;:::i;:::-;:69;;;;:::i;:::-;24519:78;;24461:142;:::o;16991:143::-;-1:-1:-1;;;;;17107:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;17100:28;;;;;;;;;;;;;;;;;17075:16;;17100:28;;17107:21;;17100:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16991:143;;;;;:::o;25894:118::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;;;;;;;;;25968:3:::1;25961;:10;;25952:35;;;;-1:-1:-1::0;;;25952:35:0::1;;;;;;;:::i;:::-;25994:6;:12:::0;25894:118::o;26300:159::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26398:3:::1;26391;:10;;26382:35;;;;-1:-1:-1::0;;;26382:35:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26424:23:0;;::::1;;::::0;;;:19:::1;:23;::::0;;;;:29;26300:159::o;22062:1632::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;22243:21:::1;::::0;-1:-1:-1;;;22243:21:0;;::::1;::::0;::::1;160:25:1::0;;;22211:2:0;;-1:-1:-1;;;;;22243:12:0;::::1;::::0;::::1;::::0;133:18:1;;22243:21:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22229:35:0::1;:10;-1:-1:-1::0;;;;;22229:35:0::1;;22221:95;;;::::0;-1:-1:-1;;;22221:95:0;;9907:2:1;22221:95:0::1;::::0;::::1;9889:21:1::0;9946:2;9926:18;;;9919:30;9985:34;9965:18;;;9958:62;-1:-1:-1;;;10036:18:1;;;10029:45;10091:19;;22221:95:0::1;9705:411:1::0;22221:95:0::1;22331:48;::::0;-1:-1:-1;;;22331:48:0;;22353:10:::1;22331:48;::::0;::::1;10333:34:1::0;22373:4:0::1;10383:18:1::0;;;10376:43;-1:-1:-1;;;;;22331:21:0;::::1;::::0;::::1;::::0;10268:18:1;;22331:48:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22323:107;;;;-1:-1:-1::0;;;22323:107:0::1;;;;;;;:::i;:::-;22446:13;::::0;-1:-1:-1;;;22446:13:0;::::1;;;22445:14;22437:59;;;::::0;-1:-1:-1;;;22437:59:0;;11297:2:1;22437:59:0::1;::::0;::::1;11279:21:1::0;;;11316:18;;;11309:30;11375:34;11355:18;;;11348:62;11427:18;;22437:59:0::1;11095:356:1::0;22437:59:0::1;-1:-1:-1::0;;;;;22511:28:0;::::1;;::::0;;;:24:::1;:28;::::0;;;;;::::1;;22503:84;;;;-1:-1:-1::0;;;22503:84:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22001:10:0;;22594:23:::1;22001:10:::0;;;:6;:10;;;;;;;;:19;;;;;;;;22712:14;;22001:19;;22673:18:::1;::::0;22712:16:::1;::::0;22727:1:::1;::::0;22712:16:::1;:::i;:::-;22703:25;;22698:278;22776:5;22756:7;22764:1;22756:10;;;;;;;;:::i;:::-;;;;;;;;;;;:16;;;:25;:62;;;;;22814:4;-1:-1:-1::0;;;;;22794:24:0::1;:7;22802:1;22794:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:16;;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;22794:16:0::1;:24;22756:62;:103;;;;;22831:7;22839:1;22831:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:19:::1;:10;::::0;;::::1;;:19;::::0;::::1;;:28;22756:103;:150;;;;;22895:11;22872:34;;:7;22880:1;22872:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;;;;;;;;;;:34;;;22756:150;22752:217;;;22942:1;22927:16;;22954:5;;22752:217;22738:3:::0;::::1;::::0;::::1;:::i;:::-;;;;22698:278;;;;22990:12;23006:18;22990:34;;22982:74;;;::::0;-1:-1:-1;;;22982:74:0;;12473:2:1;22982:74:0::1;::::0;::::1;12455:21:1::0;12512:2;12492:18;;;12485:30;12551:29;12531:18;;;12524:57;12598:18;;22982:74:0::1;12271:351:1::0;22982:74:0::1;23139:10;23201:4:::0;23214:178;::::1;;;23240:62;23257:4;23263:2;23267:7;23276:5;23283:8;23293;23240:16;:62::i;:::-;23214:178;;;23325:59;23339:4;23345:2;23349:7;23358:5;23365:8;23375;23325:13;:59::i;:::-;23433:69;23453:2;23457:7;23466:12;23480:7;23488:12;23480:21;;;;;;;;:::i;:::-;;;;;;;;;;;23433:19;:69::i;:::-;23513:28;::::0;-1:-1:-1;;;23513:28:0;::::1;;;23509:77;;;23552:26;23566:2;23570:7;23552:13;:26::i;:::-;23595:25;::::0;-1:-1:-1;;;23595:25:0;::::1;;;:50:::0;::::1;;;;23624:21;23633:2;23637:7;23624:8;:21::i;:::-;23592:97;;;23656:25;23669:2;23673:7;23656:12;:25::i;:::-;-1:-1:-1::0;;11387:1:0;12339:7;:22;-1:-1:-1;;;;;;;;22062:1632:0:o;27237:123::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27317:28:::1;:37:::0;;;::::1;;-1:-1:-1::0;;;27317:37:0::1;-1:-1:-1::0;;;;27317:37:0;;::::1;::::0;;;::::1;::::0;;27237:123::o;27572:146::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27659:6:::1;-1:-1:-1::0;;;;;27651:28:0::1;;27688:4;27695:7;866:6:::0;;-1:-1:-1;;;;;866:6:0;;793:87;27695:7:::1;27704;27651:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27572:146:::0;;:::o;23734:229::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;23819:13:::1;23807:9;:25;23799:74;;;::::0;-1:-1:-1;;;23799:74:0;;13209:2:1;23799:74:0::1;::::0;::::1;13191:21:1::0;13248:2;13228:18;;;13221:30;13287:34;13267:18;;;13260:62;-1:-1:-1;;;13338:18:1;;;13331:34;13382:19;;23799:74:0::1;13007:400:1::0;23799:74:0::1;23903:9;23880:19;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;23933:10:0::1;23919:25;::::0;;;:13:::1;:25;::::0;;;;:38;;23948:9:::1;::::0;23919:25;:38:::1;::::0;23948:9;;23919:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;11387:1:0;12339:7;:22;23734:229::o;26921:102::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26992:13:::1;:25:::0;26921:102::o;24996:109::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;25073:26:::1;25087:2;25091:7;25073:13;:26::i;:::-;24996:109:::0;;:::o;27760:::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27835:28:::1;::::0;-1:-1:-1;;;;;27835:20:0;::::1;::::0;:28;::::1;;;::::0;27856:6;;27835:28:::1;::::0;;;27856:6;27835:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;27760:109:::0;;:::o;27029:79::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27087:6:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;27087:15:0::1;-1:-1:-1::0;;;;27087:15:0;;::::1;::::0;;;::::1;::::0;;27029:79::o;26683:110::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26758:18:::1;:29:::0;;-1:-1:-1;;;;;;26758:29:0::1;-1:-1:-1::0;;;;;26758:29:0;;;::::1;::::0;;;::::1;::::0;;26683:110::o;23969:217::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;;;24069:10:::1;24055:25:::0;;:13:::1;:25;::::0;;;;;:35;-1:-1:-1;24055:35:0::1;24047:87;;;::::0;-1:-1:-1;;;24047:87:0;;13614:2:1;24047:87:0::1;::::0;::::1;13596:21:1::0;13653:2;13633:18;;;13626:30;13692:34;13672:18;;;13665:62;-1:-1:-1;;;13743:18:1;;;13736:37;13790:19;;24047:87:0::1;13412:403:1::0;24047:87:0::1;24141:39;24161:10;24173:6;24141:19;:39::i;:::-;-1:-1:-1::0;11387:1:0;12339:7;:22;23969:217::o;26799:116::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26877:18:::1;:32:::0;;-1:-1:-1;;;;;;26877:32:0::1;-1:-1:-1::0;;;;;26877:32:0;;;::::1;::::0;;;::::1;::::0;;26799:116::o;1444:94::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;1509:21:::1;1527:1;1509:9;:21::i;:::-;1444:94::o:0;27114:117::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27191:25:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;27191:34:0::1;-1:-1:-1::0;;;;27191:34:0;;::::1;::::0;;;::::1;::::0;;27114:117::o;17189:1993::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;17288:13:::1;::::0;-1:-1:-1;;;17288:13:0;::::1;;;17287:14;17279:59;;;::::0;-1:-1:-1;;;17279:59:0;;11297:2:1;17279:59:0::1;::::0;::::1;11279:21:1::0;;;11316:18;;;11309:30;11375:34;11355:18;;;11348:62;11427:18;;17279:59:0::1;11095:356:1::0;17279:59:0::1;-1:-1:-1::0;;;;;17353:28:0;::::1;;::::0;;;:24:::1;:28;::::0;;;;;::::1;;17345:84;;;;-1:-1:-1::0;;;17345:84:0::1;;;;;;;:::i;:::-;17436:13;17452:35;17475:2;17479:7;17452:22;:35::i;:::-;17436:51;;17515:5;17502:9;:18;;17494:77;;;::::0;-1:-1:-1;;;17494:77:0;;14022:2:1;17494:77:0::1;::::0;::::1;14004:21:1::0;14061:2;14041:18;;;14034:30;14100:34;14080:18;;;14073:62;-1:-1:-1;;;14151:18:1;;;14144:44;14205:19;;17494:77:0::1;13820:410:1::0;17494:77:0::1;17661:28;::::0;-1:-1:-1;;;17661:28:0;;::::1;::::0;::::1;160:25:1::0;;;17626:24:0::1;::::0;-1:-1:-1;;;;;17661:19:0;::::1;::::0;::::1;::::0;133:18:1;;17661:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17705:53;::::0;-1:-1:-1;;;17705:53:0;;-1:-1:-1;;;;;10351:15:1;;;17705:53:0::1;::::0;::::1;10333:34:1::0;17752:4:0::1;10383:18:1::0;;;10376:43;17626:64:0;;-1:-1:-1;17705:28:0;;::::1;::::0;::::1;::::0;10268:18:1;;17705:53:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17697:112;;;;-1:-1:-1::0;;;17697:112:0::1;;;;;;;:::i;:::-;17917:10;17882:24;::::0;;;;18074:27:::1;18091:2:::0;18095:5;18074:16:::1;:27::i;:::-;17935:166;;;;;;;;;;18108:27;18138:8;-1:-1:-1::0;;;;;18138:16:0::1;;18108:46;;18196:2;-1:-1:-1::0;;;;;18188:28:0::1;;18217:8;18227;18237:7;18188:57;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18252:28:0::1;::::0;-1:-1:-1;;;;;18252:17:0;::::1;::::0;-1:-1:-1;18252:28:0;::::1;;;::::0;-1:-1:-1;18270:9:0;;18252:28:::1;::::0;;;18270:9;18252:17;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;18335:28:0::1;::::0;-1:-1:-1;;;18335:28:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;18335:40:0;;::::1;::::0;:19;;::::1;::::0;::::1;::::0;133:18:1;;18335:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18335:40:0::1;;18327:90;;;;-1:-1:-1::0;;;18327:90:0::1;;;;;;;:::i;:::-;18453:31;18475:9:::0;18453:19;:31:::1;:::i;:::-;18432:8;-1:-1:-1::0;;;;;18432:16:0::1;;:53;;18424:99;;;;-1:-1:-1::0;;;18424:99:0::1;;;;;;;:::i;:::-;18535:54;::::0;;-1:-1:-1;;;;;15948:32:1;;;15930:51;;16012:2;15997:18;;15990:34;;;18570:5:0;;18535:54;;::::1;::::0;;;::::1;::::0;::::1;::::0;15903:18:1;18535:54:0::1;;;;;;;18614:6;::::0;-1:-1:-1;;;18614:6:0;::::1;;;18610:492;;;-1:-1:-1::0;;;;;18639:20:0;;::::1;;::::0;;;:16:::1;:20;::::0;;;;;;18631:64;;18639:20;::::1;::::0;18631:64;::::1;;;::::0;18670:24;;18631:64;;18639:20;18631:64;18670:24;18639:20;18631:64;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;18712:10:0::1;::::0;18704:42:::1;::::0;-1:-1:-1;;;;;18712:10:0;;::::1;::::0;18704:42;::::1;;;::::0;18733:12;;18712:10:::1;18704:42:::0;18712:10;18704:42;18733:12;18712:10;18704:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;18759:16:0::1;::::0;-1:-1:-1;;;18759:16:0;::::1;;;18755:340;;;18811:19;::::0;18788:66:::1;::::0;-1:-1:-1;;;;;18811:19:0::1;18832:21:::0;18788:22:::1;:66::i;:::-;18888:18;::::0;18865:64:::1;::::0;-1:-1:-1;;;;;18888:18:0::1;18908:20:::0;18865:22:::1;:64::i;:::-;18755:340;;;18964:19;::::0;18956:60:::1;::::0;-1:-1:-1;;;;;18964:19:0;;::::1;::::0;18956:60;::::1;;;::::0;18994:21;;18964:19:::1;18956:60:::0;18964:19;18956:60;18994:21;18964:19;18956:60;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;19035:18:0::1;::::0;19027:58:::1;::::0;-1:-1:-1;;;;;19035:18:0;;::::1;::::0;19027:58;::::1;;;::::0;19064:20;;19035:18:::1;19027:58:::0;19035:18;19027:58;19064:20;19035:18;19027:58;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;18755:340;19110:34;19132:2;19136:7;19110:21;:34::i;:::-;19151:25;19164:2;19168:7;19151:12;:25::i;:::-;-1:-1:-1::0;;11387:1:0;12339:7;:22;-1:-1:-1;;;;;;;;;17189:1993:0:o;19282:619::-;19381:28;;-1:-1:-1;;;19381:28:0;;;;;160:25:1;;;-1:-1:-1;;;;;19381:19:0;;;;;133:18:1;;19381:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19367:42:0;:10;-1:-1:-1;;;;;19367:42:0;;;19359:83;;;;-1:-1:-1;;;19359:83:0;;16237:2:1;19359:83:0;;;16219:21:1;16276:2;16256:18;;;16249:30;16315;16295:18;;;16288:58;16363:18;;19359:83:0;16035:352:1;19359:83:0;19465:1;19457:5;:9;19449:46;;;;-1:-1:-1;;;19449:46:0;;16594:2:1;19449:46:0;;;16576:21:1;16633:2;16613:18;;;16606:30;-1:-1:-1;;;16652:18:1;;;16645:54;16716:18;;19449:46:0;16392:348:1;19449:46:0;19510:10;:18;:27;-1:-1:-1;19510:27:0;19502:93;;;;-1:-1:-1;;;19502:93:0;;16947:2:1;19502:93:0;;;16929:21:1;16986:2;16966:18;;;16959:30;17025:34;17005:18;;;16998:62;-1:-1:-1;;;17076:18:1;;;17069:51;17137:19;;19502:93:0;16745:417:1;19502:93:0;19617:5;;19610:50;;-1:-1:-1;;;19610:50:0;;19634:10;19610:50;;;10333:34:1;19654:4:0;10383:18:1;;;10376:43;19664:5:0;;-1:-1:-1;;;;;19617:5:0;;19610:23;;10268:18:1;;19610:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;19602:128;;;;-1:-1:-1;;;19602:128:0;;17558:2:1;19602:128:0;;;17540:21:1;17597:2;17577:18;;;17570:30;17636:34;17616:18;;;17609:62;17707:26;17687:18;;;17680:54;17751:19;;19602:128:0;17356:420:1;19602:128:0;-1:-1:-1;;;;;19737:10:0;;;;;;;:6;:10;;;;;;;;:19;;;;;;;;19762:55;;;;;;;;;;19775:15;19762:55;;;;;;;;;;;;19799:10;19762:55;;;;;;;;;;;;;19737:81;;19762:55;19737:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19737:81:0;-1:-1:-1;;;;19737:81:0;;;;;;-1:-1:-1;;;;;;19737:81:0;;;;;;;-1:-1:-1;;;;;;19737:81:0;;;;;;;;;;;;;;;;;;;;;;19830:65;;17977:51:1;;;18044:18;;;18037:34;18087:18;;18080:50;;;;19762:55:0;;19737:19;;:10;19830:65;;17950:18:1;19830:65:0;;;;;;;;19282:619;;;:::o;15596:497::-;15695:28;;-1:-1:-1;;;15695:28:0;;;;;160:25:1;;;-1:-1:-1;;;;;15695:19:0;;;;;133:18:1;;15695:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;15681:42:0;:10;-1:-1:-1;;;;;15681:42:0;;15673:93;;;;-1:-1:-1;;;15673:93:0;;18343:2:1;15673:93:0;;;18325:21:1;18382:2;18362:18;;;18355:30;18421:34;18401:18;;;18394:62;-1:-1:-1;;;18472:18:1;;;18465:36;18518:19;;15673:93:0;18141:402:1;15673:93:0;15789:1;15781:5;:9;15773:44;;;;-1:-1:-1;;;15773:44:0;;18750:2:1;15773:44:0;;;18732:21:1;18789:2;18769:18;;;18762:30;-1:-1:-1;;;18808:18:1;;;18801:52;18870:18;;15773:44:0;18548:346:1;15773:44:0;15832:55;;-1:-1:-1;;;15832:55:0;;15861:10;15832:55;;;10333:34:1;15881:4:0;10383:18:1;;;10376:43;-1:-1:-1;;;;;15832:28:0;;;;;10268:18:1;;15832:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15824:121;;;;-1:-1:-1;;;15824:121:0;;19101:2:1;15824:121:0;;;19083:21:1;19140:2;19120:18;;;19113:30;19179:34;19159:18;;;19152:62;-1:-1:-1;;;19230:18:1;;;19223:51;19291:19;;15824:121:0;18899:417:1;15824:121:0;-1:-1:-1;;;;;15952:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;15979:47;;;;;;;;;;15994:15;15979:47;;;;;;;;;;;;;;;;;;15952:75;;15979:47;15952:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15952:75:0;;;;;;;;;;;16039:48;160:25:1;;;15979:47:0;;15952:21;;:12;;16039:48;;133:18:1;16039:48:0;14:177:1;25562:205:0;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25650:28:0;::::1;;::::0;;;:24:::1;:28;::::0;;;;;::::1;;:37;;::::0;::::1;;;;25642:76;;;;-1:-1:-1::0;;;25642:76:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25725:28:0;;;::::1;;::::0;;;:24:::1;:28;::::0;;;;:36;;-1:-1:-1;;25725:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25562:205::o;20013:591::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;20141:28:::1;::::0;-1:-1:-1;;;20141:28:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;20141:19:0;::::1;::::0;::::1;::::0;133:18:1;;20141:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20127:42:0::1;:10;-1:-1:-1::0;;;;;20127:42:0::1;;;20119:83;;;::::0;-1:-1:-1;;;20119:83:0;;16237:2:1;20119:83:0::1;::::0;::::1;16219:21:1::0;16276:2;16256:18;;;16249:30;16315;16295:18;;;16288:58;16363:18;;20119:83:0::1;16035:352:1::0;20119:83:0::1;20225:1;20217:5;:9;20209:46;;;::::0;-1:-1:-1;;;20209:46:0;;16594:2:1;20209:46:0::1;::::0;::::1;16576:21:1::0;16633:2;16613:18;;;16606:30;-1:-1:-1;;;16652:18:1;;;16645:54;16716:18;;20209:46:0::1;16392:348:1::0;20209:46:0::1;20283:5;20270:9;:18;;20262:87;;;::::0;-1:-1:-1;;;20262:87:0;;19878:2:1;20262:87:0::1;::::0;::::1;19860:21:1::0;19917:2;19897:18;;;19890:30;19956:34;19936:18;;;19929:62;20027:26;20007:18;;;20000:54;20071:19;;20262:87:0::1;19676:420:1::0;20262:87:0::1;20379:9;20356:19;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;20409:10:0::1;20395:25;::::0;;;:13:::1;:25;::::0;;;;:38;;20424:9:::1;::::0;20395:25;:38:::1;::::0;20424:9;;20395:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;20442:10:0;;::::1;;::::0;;;:6:::1;:10;::::0;;;;;;;:19;;;;;;;;20467:54;;::::1;::::0;::::1;::::0;;;;;20480:15:::1;20467:54:::0;;::::1;::::0;;;;;;;;;20504:10:::1;20467:54:::0;;;;;;;;;;;;;;20442:80;;;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;;20442:80:0;;;;::::1;;-1:-1:-1::0;;;;;;20442:80:0;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;20442:80:0::1;-1:-1:-1::0;;;20442:80:0;::::1;;::::0;;;::::1;;::::0;;;20534:64;;17977:51:1;;;18044:18;;;18037:34;18087:18;;18080:50;20467:54:0;;20442:19;;:10;20534:64:::1;::::0;17950:18:1;20534:64:0::1;;;;;;;-1:-1:-1::0;;11387:1:0;12339:7;:22;-1:-1:-1;20013:591:0:o;25232:153::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;25298:13:::1;::::0;::::1;-1:-1:-1::0;;;25298:13:0;;::::1;;:22;;::::0;::::1;;;;25290:61;;;;-1:-1:-1::0;;;25290:61:0::1;;;;;;;:::i;:::-;25358:13;:21:::0;;;::::1;;-1:-1:-1::0;;;25358:21:0::1;-1:-1:-1::0;;;;25358:21:0;;::::1;::::0;;;::::1;::::0;;25232:153::o;20703:932::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;;;-1:-1:-1;;;;;22001:10:0;;;;:6;:10;;;;;;;;:19;;;;;;;;;20868:718:::1;20889:14:::0;;20885:18;::::1;20868:718;;;20923:8;20919:660;;;20968:5;20948:7;20956:1;20948:10;;;;;;;;:::i;:::-;;;;;;;;;;;:16;;;:25;:59;;;;;20997:10;-1:-1:-1::0;;;;;20977:30:0::1;:7;20985:1;20977:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:16;;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;20977:16:0::1;:30;20948:59;:82;;;;;21011:7;21019:1;21011:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;;;;;;;;;;20948:82;:106;;;;;21035:7;21043:1;21035:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:19:::1;:10;::::0;;::::1;;:19;::::0;::::1;;21034:20;20948:106;20944:325;;;-1:-1:-1::0;;;;;21076:10:0;::::1;;::::0;;;:6:::1;:10;::::0;;;;;;;:19;;;;;;;;:22;;21096:1;;21076:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;21069:29:::0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;;;;;21069:29:0;;;21111:38:::1;21131:10;21143:5:::0;21111:19:::1;:38::i;:::-;21167:71;::::0;;21200:10:::1;20297:51:1::0;;20391:14;;20384:22;20379:2;20364:18;;20357:50;21222:15:0::1;20423:18:1::0;;;20416:34;;;;21193:5:0;;21184:7;;-1:-1:-1;;;;;21167:71:0;::::1;::::0;::::1;::::0;20285:2:1;20270:18;21167:71:0::1;;;;;;;;21251:7;;;;20944:325;20919:660;;;21319:5;21299:7;21307:1;21299:10;;;;;;;;:::i;:::-;;;;;;;;;;;:16;;;:25;:59;;;;;21348:10;-1:-1:-1::0;;;;;21328:30:0::1;:7;21336:1;21328:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:16;;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;21328:16:0::1;:30;21299:59;:83;;;;;21363:7;21371:1;21363:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;;;;;;;;;;21362:20;21299:83;:107;;;;;21387:7;21395:1;21387:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:19:::1;:10;::::0;;::::1;;:19;::::0;::::1;;21386:20;21299:107;21295:275;;;-1:-1:-1::0;;;;;21428:10:0;::::1;;::::0;;;:6:::1;:10;::::0;;;;;;;:19;;;;;;;;:22;;21448:1;;21428:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;21421:29:::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;21421:29:0;;;21468:71:::1;::::0;;21501:10:::1;20297:51:1::0;;20391:14;;20384:22;20364:18;;;20357:50;;;;21523:15:0::1;20423:18:1::0;;;20416:34;21494:5:0;;21485:7;;-1:-1:-1;;;;;21468:71:0;::::1;::::0;::::1;::::0;20285:2:1;20270:18;21468:71:0::1;20101:355:1::0;21295:275:0::1;20905:3:::0;::::1;::::0;::::1;:::i;:::-;;;;20868:718;;;-1:-1:-1::0;21592:37:0::1;::::0;-1:-1:-1;;;21592:37:0;;20803:2:1;21592:37:0::1;::::0;::::1;20785:21:1::0;20842:2;20822:18;;;20815:30;20881:29;20861:18;;;20854:57;20928:18;;21592:37:0::1;20601:351:1::0;12191:1:0::1;-1:-1:-1::0;;11387:1:0;12339:7;:22;-1:-1:-1;;20703:932:0:o;26160:134::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26242:3:::1;26235;:10;;26226:35;;;;-1:-1:-1::0;;;26226:35:0::1;;;;;;;:::i;:::-;26268:14;:20:::0;26160:134::o;26018:136::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26101:3:::1;26094;:10;;26085:35;;;;-1:-1:-1::0;;;26085:35:0::1;;;;;;;:::i;:::-;26127:15;:21:::0;26018:136::o;27404:126::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27491:6:::1;-1:-1:-1::0;;;;;27484:23:0::1;;27508:7;866:6:::0;;-1:-1:-1;;;;;866:6:0;;793:87;27508:7:::1;27484:40;::::0;-1:-1:-1;;;;;;27484:40:0::1;::::0;;;;;;-1:-1:-1;;;;;15948:32:1;;;27484:40:0::1;::::0;::::1;15930:51:1::0;15997:18;;;15990:34;;;15903:18;;27484:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26565:112::-:0;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26641:19:::1;:30:::0;;-1:-1:-1;;;;;;26641:30:0::1;-1:-1:-1::0;;;;;26641:30:0;;;::::1;::::0;;;::::1;::::0;;26565:112::o;25773:115::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25854:20:0;;::::1;;::::0;;;:16:::1;:20;::::0;;;;:28;;-1:-1:-1;;;;;;25854:28:0::1;::::0;;;::::1;;::::0;;25773:115::o;25391:165::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;25463:16:::1;::::0;::::1;-1:-1:-1::0;;;25463:16:0;;::::1;;:25;;::::0;::::1;;;;25455:64;;;;-1:-1:-1::0;;;25455:64:0::1;;;;;;;:::i;:::-;25526:16;:24:::0;;;::::1;;-1:-1:-1::0;;;25526:24:0::1;-1:-1:-1::0;;;;25526:24:0;;::::1;::::0;;;::::1;::::0;;25391:165::o;16148:239::-;-1:-1:-1;;;;;16245:12:0;;16216:4;16245:12;;;:8;:12;;;;;;;;:21;;;;;;;;:28;16284:10;16280:45;;16312:5;16305:12;;;;;16280:45;-1:-1:-1;;;;;16338:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;16360:9;16368:1;16360:5;:9;:::i;:::-;16338:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:38;:43;;;16148:239;-1:-1:-1;;;;16148:239:0:o;26465:94::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26532:10:::1;:21:::0;;-1:-1:-1;;;;;;26532:21:0::1;-1:-1:-1::0;;;;;26532:21:0;;;::::1;::::0;;;::::1;::::0;;26465:94::o;25111:115::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25199:12:0;::::1;;::::0;;;:8:::1;:12;::::0;;;;;;;:21;;;;;;;;25192:28:::1;::::0;::::1;:::i;16456:146::-:0;16538:7;16560:30;16578:2;16582:7;16560:17;:30::i;:::-;:36;;16456:146;-1:-1:-1;;;16456:146:0:o;16665:271::-;16742:14;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16742:14:0;-1:-1:-1;;;;;28756:12:0;;16764:19;28756:12;;;:8;:12;;;;;;;;:21;;;;;;;;:28;16833:15;16825:55;;;;-1:-1:-1;;;16825:55:0;;21159:2:1;16825:55:0;;;21141:21:1;21198:2;21178:18;;;21171:30;21237:29;21217:18;;;21210:57;21284:18;;16825:55:0;20957:351:1;16825:55:0;-1:-1:-1;;;;;16894:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;16916:13;16928:1;16916:11;:13;:::i;:::-;16894:36;;;;;;;;:::i;:::-;;;;;;;;;;16887:43;;;;;;;;16894:36;;;;;;;16887:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16665:271:0;;;;:::o;21686:126::-;-1:-1:-1;;;;;21787:10:0;;;;;;:6;:10;;;;;;;;:19;;;;;;;;21780:26;;;;;;;;;;;;;;;;;21757:14;;21780:26;;21787:19;;21780:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21780:26:0;;;;;;;;-1:-1:-1;;;21780:26:0;;;;;;;;;;;;;;;;;;;;;1693:192;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1782:22:0;::::1;1774:73;;;::::0;-1:-1:-1;;;1774:73:0;;21515:2:1;1774:73:0::1;::::0;::::1;21497:21:1::0;21554:2;21534:18;;;21527:30;21593:34;21573:18;;;21566:62;-1:-1:-1;;;21644:18:1;;;21637:36;21690:19;;1774:73:0::1;21313:402:1::0;1774:73:0::1;1858:19;1868:8;1858:9;:19::i;:::-;1693:192:::0;:::o;15045:197::-;15131:28;;-1:-1:-1;;;15131:28:0;;;;;160:25:1;;;-1:-1:-1;;;;;15131:19:0;;;;;133:18:1;;15131:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;15117:42:0;:10;-1:-1:-1;;;;;15117:42:0;;15109:95;;;;-1:-1:-1;;;15109:95:0;;21922:2:1;15109:95:0;;;21904:21:1;21961:2;21941:18;;;21934:30;22000:34;21980:18;;;21973:62;-1:-1:-1;;;22051:18:1;;;22044:38;22099:19;;15109:95:0;21720:404:1;15109:95:0;15211:25;15224:2;15228:7;15211:12;:25::i;29804:1573::-;-1:-1:-1;;;;;29963:23:0;;;;;;:13;:23;;;;;;:32;-1:-1:-1;29963:32:0;29955:88;;;;-1:-1:-1;;;29955:88:0;;22331:2:1;29955:88:0;;;22313:21:1;22370:2;22350:18;;;22343:30;22409:34;22389:18;;;22382:62;-1:-1:-1;;;22460:18:1;;;22453:41;22511:19;;29955:88:0;22129:407:1;29955:88:0;30081:5;30058:19;;:28;;30050:64;;;;-1:-1:-1;;;30050:64:0;;22743:2:1;30050:64:0;;;22725:21:1;22782:2;22762:18;;;22755:30;22821:25;22801:18;;;22794:53;22864:18;;30050:64:0;22541:347:1;30050:64:0;-1:-1:-1;;;;;30151:16:0;;;30121:27;;;;;30337;30354:2;30358:5;30337:16;:27::i;:::-;-1:-1:-1;;;;;30371:23:0;;;;;;:13;:23;;;;;:32;;30198:166;;-1:-1:-1;30198:166:0;;-1:-1:-1;30198:166:0;;-1:-1:-1;30198:166:0;;-1:-1:-1;30198:166:0;-1:-1:-1;30398:5:0;;30371:32;;30398:5;;30371:32;:::i;:::-;;;;;;;;30433:5;30410:19;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;30472:50:0;;-1:-1:-1;;;30472:50:0;;-1:-1:-1;;;;;30472:21:0;;;;;:50;;30494:8;;30504;;30514:7;;30472:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30529:28:0;;-1:-1:-1;;;;;30529:17:0;;;-1:-1:-1;30529:28:0;;;;;-1:-1:-1;30547:9:0;;30529:28;;;;30547:9;30529:17;:28;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30633:31:0;30655:9;30633:19;:31;:::i;:::-;30612:8;-1:-1:-1;;;;;30612:16:0;;:53;;30604:99;;;;-1:-1:-1;;;30604:99:0;;;;;;;:::i;:::-;30718:21;;-1:-1:-1;;;30718:21:0;;;;;160:25:1;;;-1:-1:-1;;;;;30718:33:0;;;;:12;;;;;;133:18:1;;30718:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30718:33:0;;30710:83;;;;-1:-1:-1;;;30710:83:0;;;;;;;:::i;:::-;30805:54;;;-1:-1:-1;;;;;15948:32:1;;;15930:51;;16012:2;15997:18;;15990:34;;;30840:5:0;;30805:54;;;;;;;;;;15903:18:1;30805:54:0;;;;;;;30884:6;;-1:-1:-1;;;30884:6:0;;;;30880:492;;;-1:-1:-1;;;;;30909:20:0;;;;;;;:16;:20;;;;;;;30901:64;;30909:20;;;30901:64;;;;;30940:24;;30901:64;;30909:20;30901:64;30940:24;30909:20;30901:64;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30982:10:0;;30974:42;;-1:-1:-1;;;;;30982:10:0;;;;30974:42;;;;;31003:12;;30982:10;30974:42;30982:10;30974:42;31003:12;30982:10;30974:42;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31029:16:0;;-1:-1:-1;;;31029:16:0;;;;31025:340;;;31081:19;;31058:66;;-1:-1:-1;;;;;31081:19:0;31102:21;31058:22;:66::i;:::-;31158:18;;31135:64;;-1:-1:-1;;;;;31158:18:0;31178:20;31135:22;:64::i;:::-;31025:340;;;31234:19;;31226:60;;-1:-1:-1;;;;;31234:19:0;;;;31226:60;;;;;31264:21;;31234:19;31226:60;31234:19;31226:60;31264:21;31234:19;31226:60;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31305:18:0;;31297:58;;-1:-1:-1;;;;;31305:18:0;;;;31297:58;;;;;31334:20;;31305:18;31297:58;31305:18;31297:58;31334:20;31305:18;31297:58;;;;;;;;;;;;;;;;;;;;;31025:340;29948:1429;;;;;;29804:1573;;;;;;:::o;31383:1313::-;31554:5;;31575:28;;-1:-1:-1;;;31575:28:0;;31592:10;31575:28;;;4807:51:1;-1:-1:-1;;;;;31554:5:0;;;;31607;;31554;;31575:16;;4780:18:1;;31575:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;31567:95;;;;-1:-1:-1;;;31567:95:0;;23095:2:1;31567:95:0;;;23077:21:1;23134:2;23114:18;;;23107:30;23173:34;23153:18;;;23146:62;-1:-1:-1;;;23224:18:1;;;23217:43;23277:19;;31567:95:0;22893:409:1;31567:95:0;31677:41;;-1:-1:-1;;;31677:41:0;;-1:-1:-1;;;;;10351:15:1;;;31677:41:0;;;10333:34:1;31712:4:0;10383:18:1;;;10376:43;31722:5:0;;31677:16;;;;;;10268:18:1;;31677:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;31669:110;;;;-1:-1:-1;;;31669:110:0;;23509:2:1;31669:110:0;;;23491:21:1;23548:2;23528:18;;;23521:30;23587:34;23567:18;;;23560:62;-1:-1:-1;;;23638:18:1;;;23631:45;23693:19;;31669:110:0;23307:411:1;31669:110:0;31787:20;31809:29;31840:28;31870:32;31904:17;31925:27;31942:2;31946:5;31925:16;:27::i;:::-;31786:166;;;;;;;;;;31961:4;-1:-1:-1;;;;;31961:21:0;;31983:8;31993;32003:7;31961:50;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32018:50:0;;-1:-1:-1;;;32018:50:0;;-1:-1:-1;;;;;32018:19:0;;;-1:-1:-1;32018:19:0;;-1:-1:-1;32018:50:0;;32038:8;;32048;;32058:9;;32018:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32085:26:0;;-1:-1:-1;;;32085:26:0;;-1:-1:-1;;;;;4825:32:1;;;32085:26:0;;;4807:51:1;32115:9:0;;32085:16;;;;;;4780:18:1;;32085:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;32077:85;;;;-1:-1:-1;;;32077:85:0;;;;;;;:::i;:::-;32177:21;;-1:-1:-1;;;32177:21:0;;;;;160:25:1;;;-1:-1:-1;;;;;32177:33:0;;;;:12;;;;;;133:18:1;;32177:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32177:33:0;;32169:83;;;;-1:-1:-1;;;32169:83:0;;;;;;;:::i;:::-;32264:54;;;-1:-1:-1;;;;;15948:32:1;;;15930:51;;16012:2;15997:18;;15990:34;;;32299:5:0;;32264:54;;;;;;;;;;15903:18:1;32264:54:0;;;;;;;32343:6;;-1:-1:-1;;;32343:6:0;;;;32339:352;;;-1:-1:-1;;;;;32395:20:0;;;;;;;:16;:20;;;;;;;;32360:82;;-1:-1:-1;;;32360:82:0;;:19;;;;;;:82;;32388:4;;32395:20;;;;;32417:24;;32360:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32486:10:0;;32451:60;;-1:-1:-1;;;32451:60:0;;-1:-1:-1;;;;;32451:19:0;;;;;;:60;;32479:4;;32486:10;;32498:12;;32451:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32555:19:0;;32520:78;;-1:-1:-1;;;32520:78:0;;-1:-1:-1;;;;;32520:19:0;;;;;;:78;;32548:4;;32555:19;;32576:21;;32520:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32642:18:0;;32607:76;;-1:-1:-1;;;32607:76:0;;-1:-1:-1;;;;;32607:19:0;;;;;;:76;;32635:4;;32642:18;;32662:20;;32607:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29148:211::-;29253:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29253:29:0;;;;;;;;;-1:-1:-1;;;29253:29:0;;;;;;;;;;;;;;29289:24;;;;29320:10;;;29253:21;29320:10;;;:6;:10;;;;;:19;;;;;;;;;;:22;;29253:29;;29320:19;29340:1;;29320:22;;;;;;:::i;:::-;;;;;;;;;;:33;;:22;;;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29320:33:0;-1:-1:-1;;;;;;;;;29320:33:0;;;;;-1:-1:-1;;;;;;29320:33:0;;;;;;;-1:-1:-1;;;;;;29320:33:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29148:211:0:o;32912:100::-;-1:-1:-1;;;;;32987:10:0;;;;;;:6;:10;;;;;;;;:19;;;;;;;;32980:26;;;:::i;15342:198::-;-1:-1:-1;;;;;15408:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;15435:43;;;;;;;;;;15446:15;15435:43;;;;;;;;;;;;;;;;;;15408:71;;15435:43;15408:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15408:71:0;;;;;;;;;;;15491:43;160:25:1;;;15408:21:0;;:12;15491:43;;133:18:1;15491:43:0;;;;;;;15342:198;;:::o;29365:433::-;29469:5;29446:19;;:28;;29438:101;;;;-1:-1:-1;;;29438:101:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29554:19:0;;;;;;:13;:19;;;;;;:28;-1:-1:-1;29554:28:0;29546:101;;;;-1:-1:-1;;;29546:101:0;;;;;;;:::i;:::-;29677:5;29654:19;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;29689:19:0;;;;;;:13;:19;;;;;:28;;29712:5;;29689:19;:28;;29712:5;;29689:28;:::i;:::-;;;;-1:-1:-1;;29724:29:0;;-1:-1:-1;;;;;29724:22:0;;;:29;;;;;29747:5;;29724:29;;;;29747:5;29724:22;:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29765:27:0;;29786:5;;-1:-1:-1;;;;;29765:27:0;;;;;;;;29365:433;;:::o;1893:173::-;1968:6;;;-1:-1:-1;;;;;1985:17:0;;;-1:-1:-1;;;;;;1985:17:0;;;;;;;2018:40;;1968:6;;;1985:17;1968:6;;2018:40;;1949:16;;2018:40;1938:128;1893:173;:::o;27901:746::-;-1:-1:-1;;;;;28058:23:0;;27977:7;28058:23;;;:19;:23;;;;;;27977:7;;;;;;;;;;28058:28;:82;;-1:-1:-1;;;;;28117:23:0;;;;;;:19;:23;;;;;;28058:82;;;28089:25;;28058:82;28028:112;;28147:20;28188:4;28179:6;;28170;:15;;;;:::i;:::-;:22;;;;:::i;:::-;28147:45;;28199:29;28258:4;28240:15;;28231:6;:24;;;;:::i;:::-;:31;;;;:::i;:::-;28199:63;;28269:28;28326:4;28309:14;;28300:6;:23;;;;:::i;:::-;:30;;;;:::i;:::-;28269:61;-1:-1:-1;28337:32:0;28403:4;28372:28;28381:19;28372:6;:28;:::i;:::-;:35;;;;:::i;:::-;28337:70;-1:-1:-1;28414:17:0;28337:70;28483:20;28444:36;28459:21;28444:12;:36;:::i;:::-;:59;;;;:::i;:::-;:86;;;;:::i;:::-;28434:97;;:6;:97;:::i;:::-;28546:12;;28560:21;;-1:-1:-1;28583:20:0;;-1:-1:-1;28583:20:0;-1:-1:-1;28546:12:0;;-1:-1:-1;27901:746:0;-1:-1:-1;;;;;27901:746:0:o;32702:204::-;32786:12;32804:9;-1:-1:-1;;;;;32804:14:0;32824:13;;32846:6;32804:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32785:72;;;32872:7;32864:36;;;;-1:-1:-1;;;32864:36:0;;25175:2:1;32864:36:0;;;25157:21:1;25214:2;25194:18;;;25187:30;-1:-1:-1;;;25233:18:1;;;25226:46;25289:18;;32864:36:0;24973:340:1;28796:346:0;28871:22;28896:30;28914:2;28918:7;28896:17;:30::i;:::-;28993:4;28973:17;;;:24;-1:-1:-1;;;;;28756:12:0;;28933:23;28756:12;;;:8;:12;;;;;;;;:21;;;;;;;;:28;28973:17;;-1:-1:-1;28973:17:0;;29065:10;;29061:76;;-1:-1:-1;;;;;29086:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;29121:8;;29108:9;29116:1;29108:5;:9;:::i;:::-;29086:32;;;;;;;;:::i;:::-;;;;;;;;;;:43;;:32;;;;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29086:43:0;;;;;;;;;;29061:76;28864:278;;;28796:346;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;271:31:1;;261:42;;251:70;;317:1;314;307:12;332:127;393:10;388:3;384:20;381:1;374:31;424:4;421:1;414:15;448:4;445:1;438:15;464:1266;559:6;567;575;583;636:3;624:9;615:7;611:23;607:33;604:53;;;653:1;650;643:12;604:53;692:9;679:23;711:31;736:5;711:31;:::i;:::-;761:5;-1:-1:-1;818:2:1;803:18;;790:32;831:33;790:32;831:33;:::i;:::-;883:7;-1:-1:-1;937:2:1;922:18;;909:32;;-1:-1:-1;992:2:1;977:18;;964:32;1015:18;1045:14;;;1042:34;;;1072:1;1069;1062:12;1042:34;1110:6;1099:9;1095:22;1085:32;;1155:7;1148:4;1144:2;1140:13;1136:27;1126:55;;1177:1;1174;1167:12;1126:55;1213:2;1200:16;1235:2;1231;1228:10;1225:36;;;1241:18;;:::i;:::-;1316:2;1310:9;1284:2;1370:13;;-1:-1:-1;;1366:22:1;;;1390:2;1362:31;1358:40;1346:53;;;1414:18;;;1434:22;;;1411:46;1408:72;;;1460:18;;:::i;:::-;1500:10;1496:2;1489:22;1535:2;1527:6;1520:18;1575:7;1570:2;1565;1561;1557:11;1553:20;1550:33;1547:53;;;1596:1;1593;1586:12;1547:53;1652:2;1647;1643;1639:11;1634:2;1626:6;1622:15;1609:46;1697:1;1692:2;1687;1679:6;1675:15;1671:24;1664:35;1718:6;1708:16;;;;;;;464:1266;;;;;;;:::o;1942:315::-;2010:6;2018;2071:2;2059:9;2050:7;2046:23;2042:32;2039:52;;;2087:1;2084;2077:12;2039:52;2126:9;2113:23;2145:31;2170:5;2145:31;:::i;:::-;2195:5;2247:2;2232:18;;;;2219:32;;-1:-1:-1;;;1942:315:1:o;2543:701::-;2762:2;2814:21;;;2884:13;;2787:18;;;2906:22;;;2733:4;;2762:2;2985:15;;;;2959:2;2944:18;;;2733:4;3028:190;3042:6;3039:1;3036:13;3028:190;;;3091:45;3132:3;3123:6;3117:13;2341:5;2335:12;2330:3;2323:25;2397:4;2390:5;2386:16;2380:23;2373:4;2368:3;2364:14;2357:47;2453:4;2446:5;2442:16;2436:23;2429:4;2424:3;2420:14;2413:47;2523:4;2516:5;2512:16;2506:23;2499:31;2492:39;2485:4;2480:3;2476:14;2469:63;;;2262:276;3091:45;3193:15;;;;3165:4;3156:14;;;;;3064:1;3057:9;3028:190;;;-1:-1:-1;3235:3:1;;2543:701;-1:-1:-1;;;;;;2543:701:1:o;3249:180::-;3308:6;3361:2;3349:9;3340:7;3336:23;3332:32;3329:52;;;3377:1;3374;3367:12;3329:52;-1:-1:-1;3400:23:1;;3249:180;-1:-1:-1;3249:180:1:o;3434:118::-;3520:5;3513:13;3506:21;3499:5;3496:32;3486:60;;3542:1;3539;3532:12;3557:661;3649:6;3657;3665;3673;3681;3734:3;3722:9;3713:7;3709:23;3705:33;3702:53;;;3751:1;3748;3741:12;3702:53;3790:9;3777:23;3809:31;3834:5;3809:31;:::i;:::-;3859:5;-1:-1:-1;3911:2:1;3896:18;;3883:32;;-1:-1:-1;3962:2:1;3947:18;;3934:32;;-1:-1:-1;4018:2:1;4003:18;;3990:32;4031:33;3990:32;4031:33;:::i;:::-;4083:7;-1:-1:-1;4142:3:1;4127:19;;4114:33;4156:30;4114:33;4156:30;:::i;:::-;4205:7;4195:17;;;3557:661;;;;;;;;:::o;4415:241::-;4471:6;4524:2;4512:9;4503:7;4499:23;4495:32;4492:52;;;4540:1;4537;4530:12;4492:52;4579:9;4566:23;4598:28;4620:5;4598:28;:::i;:::-;4645:5;4415:241;-1:-1:-1;;;4415:241:1:o;4869:247::-;4928:6;4981:2;4969:9;4960:7;4956:23;4952:32;4949:52;;;4997:1;4994;4987:12;4949:52;5036:9;5023:23;5055:31;5080:5;5055:31;:::i;5121:383::-;5198:6;5206;5214;5267:2;5255:9;5246:7;5242:23;5238:32;5235:52;;;5283:1;5280;5273:12;5235:52;5322:9;5309:23;5341:31;5366:5;5341:31;:::i;:::-;5391:5;5443:2;5428:18;;5415:32;;-1:-1:-1;5494:2:1;5479:18;;;5466:32;;5121:383;-1:-1:-1;;;5121:383:1:o;5509:382::-;5574:6;5582;5635:2;5623:9;5614:7;5610:23;5606:32;5603:52;;;5651:1;5648;5641:12;5603:52;5690:9;5677:23;5709:31;5734:5;5709:31;:::i;:::-;5759:5;-1:-1:-1;5816:2:1;5801:18;;5788:32;5829:30;5788:32;5829:30;:::i;:::-;5878:7;5868:17;;;5509:382;;;;;:::o;5896:519::-;5979:6;5987;5995;6003;6056:3;6044:9;6035:7;6031:23;6027:33;6024:53;;;6073:1;6070;6063:12;6024:53;6112:9;6099:23;6131:31;6156:5;6131:31;:::i;:::-;6181:5;-1:-1:-1;6233:2:1;6218:18;;6205:32;;-1:-1:-1;6284:2:1;6269:18;;6256:32;;-1:-1:-1;6340:2:1;6325:18;;6312:32;6353:30;6312:32;6353:30;:::i;:::-;5896:519;;;;-1:-1:-1;5896:519:1;;-1:-1:-1;;5896:519:1:o;6420:388::-;6488:6;6496;6549:2;6537:9;6528:7;6524:23;6520:32;6517:52;;;6565:1;6562;6555:12;6517:52;6604:9;6591:23;6623:31;6648:5;6623:31;:::i;:::-;6673:5;-1:-1:-1;6730:2:1;6715:18;;6702:32;6743:33;6702:32;6743:33;:::i;6813:245::-;2335:12;;2323:25;;2397:4;2386:16;;;2380:23;2364:14;;;2357:47;2453:4;2442:16;;;2436:23;2420:14;;;2413:47;2523:4;2512:16;;;2506:23;2499:31;2492:39;2476:14;;;2469:63;6995:3;6980:19;;7008:44;2262:276;7063:1055;7278:2;7330:21;;;7400:13;;7303:18;;;7422:22;;;7249:4;;7278:2;7463;;7481:18;;;;7522:15;;;7249:4;7565:527;7579:6;7576:1;7573:13;7565:527;;;7638:13;;7676:9;;7664:22;;7726:11;;;7720:18;7706:12;;;7699:40;7793:11;;;7787:18;7780:26;7773:34;7759:12;;;7752:56;7831:4;7879:11;;;7873:18;-1:-1:-1;;;;;7869:44:1;7855:12;;;7848:66;7937:4;7995:11;;;7989:18;7982:26;7975:34;7961:12;;;7954:56;7901:3;8030:14;;;;8067:15;;;;7910:1;7594:9;7565:527;;;-1:-1:-1;8109:3:1;;7063:1055;-1:-1:-1;;;;;;;7063:1055:1:o;8123:127::-;8184:10;8179:3;8175:20;8172:1;8165:31;8215:4;8212:1;8205:15;8239:4;8236:1;8229:15;8255:128;8295:3;8326:1;8322:6;8319:1;8316:13;8313:39;;;8332:18;;:::i;:::-;-1:-1:-1;8368:9:1;;8255:128::o;8388:356::-;8590:2;8572:21;;;8609:18;;;8602:30;8668:34;8663:2;8648:18;;8641:62;8735:2;8720:18;;8388:356::o;8749:335::-;8951:2;8933:21;;;8990:2;8970:18;;;8963:30;-1:-1:-1;;;9024:2:1;9009:18;;9002:41;9075:2;9060:18;;8749:335::o;9089:355::-;9291:2;9273:21;;;9330:2;9310:18;;;9303:30;9369:33;9364:2;9349:18;;9342:61;9435:2;9420:18;;9089:355::o;9449:251::-;9519:6;9572:2;9560:9;9551:7;9547:23;9543:32;9540:52;;;9588:1;9585;9578:12;9540:52;9620:9;9614:16;9639:31;9664:5;9639:31;:::i;10430:245::-;10497:6;10550:2;10538:9;10529:7;10525:23;10521:32;10518:52;;;10566:1;10563;10556:12;10518:52;10598:9;10592:16;10617:28;10639:5;10617:28;:::i;10680:410::-;10882:2;10864:21;;;10921:2;10901:18;;;10894:30;10960:34;10955:2;10940:18;;10933:62;-1:-1:-1;;;11026:2:1;11011:18;;11004:44;11080:3;11065:19;;10680:410::o;11456:407::-;11658:2;11640:21;;;11697:2;11677:18;;;11670:30;11736:34;11731:2;11716:18;;11709:62;-1:-1:-1;;;11802:2:1;11787:18;;11780:41;11853:3;11838:19;;11456:407::o;11868:125::-;11908:4;11936:1;11933;11930:8;11927:34;;;11941:18;;:::i;:::-;-1:-1:-1;11978:9:1;;11868:125::o;11998:127::-;12059:10;12054:3;12050:20;12047:1;12040:31;12090:4;12087:1;12080:15;12114:4;12111:1;12104:15;12130:136;12169:3;12197:5;12187:39;;12206:18;;:::i;:::-;-1:-1:-1;;;12242:18:1;;12130:136::o;12627:375::-;-1:-1:-1;;;;;12885:15:1;;;12867:34;;12937:15;;;;12932:2;12917:18;;12910:43;12984:2;12969:18;;12962:34;;;;12817:2;12802:18;;12627:375::o;14948:401::-;15150:2;15132:21;;;15189:2;15169:18;;;15162:30;15228:34;15223:2;15208:18;;15201:62;-1:-1:-1;;;15294:2:1;15279:18;;15272:35;15339:3;15324:19;;14948:401::o;15354:397::-;15556:2;15538:21;;;15595:2;15575:18;;;15568:30;15634:34;15629:2;15614:18;;15607:62;-1:-1:-1;;;15700:2:1;15685:18;;15678:31;15741:3;15726:19;;15354:397::o;17167:184::-;17237:6;17290:2;17278:9;17269:7;17265:23;17261:32;17258:52;;;17306:1;17303;17296:12;17258:52;-1:-1:-1;17329:16:1;;17167:184;-1:-1:-1;17167:184:1:o;19321:350::-;19523:2;19505:21;;;19562:2;19542:18;;;19535:30;19601:28;19596:2;19581:18;;19574:56;19662:2;19647:18;;19321:350::o;20461:135::-;20500:3;-1:-1:-1;;20521:17:1;;20518:43;;;20541:18;;:::i;:::-;-1:-1:-1;20588:1:1;20577:13;;20461:135::o;23939:424::-;24141:2;24123:21;;;24180:2;24160:18;;;24153:30;24219:34;24214:2;24199:18;;24192:62;24290:30;24285:2;24270:18;;24263:58;24353:3;24338:19;;23939:424::o;24368:168::-;24408:7;24474:1;24470;24466:6;24462:14;24459:1;24456:21;24451:1;24444:9;24437:17;24433:45;24430:71;;;24481:18;;:::i;:::-;-1:-1:-1;24521:9:1;;24368:168::o;24541:217::-;24581:1;24607;24597:132;;24651:10;24646:3;24642:20;24639:1;24632:31;24686:4;24683:1;24676:15;24714:4;24711:1;24704:15;24597:132;-1:-1:-1;24743:9:1;;24541:217::o
Swarm Source
ipfs://29a3d11a93db113dede96cd089b11266b331004efe8f7cfe939c53c403106012
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.