Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 6 from a total of 6 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Approve Offer | 16333936 | 1152 days ago | IN | 0 ETH | 0.00074841 | ||||
| Create Offer | 16333931 | 1152 days ago | IN | 0 ETH | 0.00242782 | ||||
| Buy Offer | 16333880 | 1152 days ago | IN | 0.0002 ETH | 0.00228569 | ||||
| Approve Offer | 16333869 | 1152 days ago | IN | 0 ETH | 0.00081057 | ||||
| Create Offer | 16321020 | 1154 days ago | IN | 0 ETH | 0.00326099 | ||||
| Create Offer | 16320094 | 1154 days ago | IN | 0 ETH | 0.00297969 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Market
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-12-27
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
/*
'########::'########:'########::'##::::'##:
##.... ##: ##.....:: ##.... ##: ##:::: ##:
##:::: ##: ##::::::: ##:::: ##: ##:::: ##:
########:: ######::: ########:: ##:::: ##:
##.... ##: ##...:::: ##.. ##::: ##:::: ##:
##:::: ##: ##::::::: ##::. ##:: ##:::: ##:
########:: ########: ##:::. ##:. #######::
........:::........::..:::::..:::.......:::
*/
interface IModule {
function getModule(uint module_) external view returns (address);
}
/**
* @notice Connection's interface with Roles SC
*/
interface IRoles {
function isVerifiedUser(address user_) external returns (bool);
function isModerator(address user_) external returns (bool);
function isUser(address user_) external returns (bool);
}
/**
* @notice Connection's interface with ERC20 SC
*/
interface IERC20 {
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function transferFrom(address from, address to,uint256 amount) external returns (bool);
}
/**
* @notice Connection's interface with ERC721 SC
*/
interface IERC721 {
function ownerOf(uint256 tokenId) external view returns (address owner);
function isApprovedForAll(address owner, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
function getRoyalties() external view returns (uint);
function deployer() external view returns (address);
}
/**
* @notice The interface to implement in the market contract
*/
interface IMarket {
event OfferCreated(uint256 id, string hiddenId);
event OfferCompleted(uint id, string hiddenId, address buyer);
event OfferApproved(uint256 offerId);
event OfferCancelled(uint256 offerId);
}
/**
* @notice Paper interface
*/
interface IPaperKeyManager {
function register(address _paperKey) external returns (bool);
function verify( bytes32 _hash, bytes32 _nonce, bytes calldata _signature) external returns (bool);
}
/**
* @notice Market logic
*/
contract Market is IMarket {
/**
* @notice The roles interface
*/
IRoles rolesContract;
/**
* @notice Only-paper interface
*/
IPaperKeyManager paperKeyManager;
/**
* @notice Amount of offers (counter)
*/
uint256 public offersCount;
/**
* @notice List of offers
*/
mapping(uint256 => Offer) public offersList;
/**
* @notice List of actions winners
*/
mapping(uint256 => address) public auctionWinners;
/**
* @notice List of approved offers
*/
mapping(uint256 => bool) public approvedOffers;
/**
* @notice If of valid ERC20 tokens
*/
mapping(address => bool) public validERC20;
/**
* @notice List of ERC721 approved
*/
mapping(address => bool) public approvedERC721;
/**
* @notice Module Manager instance
*/
IModule moduleManager;
/**
* @notice wallet to which royalties will be sent
*/
address public beruWallet;
/**
* @notice percentaje of beru's royalties
*/
uint public beruRoyalies;
/**
* @notice Struct created when at leas an ERC721 is put up for { sell / auction }
* @param info encoded params {}
* @param collection encoded collection's Ids
* @param tokenId encoded token's Ids
* @param collectionAddress array of collectionAddreses
* @param paymentToken Token to accept for the listing
* @param seller The address that sells the NFT (owner or approved)
*/
struct Offer {
uint256 info;
uint256 tokenIds;
address[] collectionAddresses;
address paymentToken;
address seller;
}
//! --------------------------------------------------------------------------- EVENTS ---------------------------------------------------------------------------
/**
* @notice Event triggered when someone bid in an auction
*/
event BiddedForAuction(address who, uint256 offerId, uint256 amount, string id);
/**
* @notice Fired when an auction winner is changed because the wallet has no funds (or not sufficient)
*/
event ChangedWinner(uint offerId, address newWinner);
/**
* @notice Event triggered when an offer changes status { approved / deprecated }
*/
event ChangeStatusERC721(address ERC721, address who, bool newStatus);
/**
* @notice Event triggered when an offer is activated
*/
event ApprovedOffer(uint offerId, address who);
/**
* @notice Event triggered when an ERC20 address is validated (or not)
*/
event ERC20Validated(address token, bool valid);
/**
* @notice Event triggered when the funds were sent
*/
event FundsSended(uint256 beruRoyalties , uint256 creatorsRoyalties , uint256 sellerFunds);
/**
*@notice Event triggered when the royalties wer sent
*/
event RoyaltiesSended(address to, uint256 amount);
/**
* @notice Event triggered when beruWallet was set
*/
event BeruWalletSet(address newBeruWallet);
/**
* @notice Event triggered when beruRoyalties was set
*/
event BeruRoyaliesSet(uint256 newRoyalties);
/**
*@notice Event triggered when a minBid was set in an auction
*/
event MinBidSet(uint256 offerId, uint256 value);
/**
* @notice Event triggered when an offer ends with paper
*/
event PaperOfferCompleted(uint id, string hiddenId, address buyer);
//! --------------------------------------------------------------------------- MODIFIERS ---------------------------------------------------------------------------
/**
* @notice Only offers that are approved or created by a moderator
* @param offerId_ Offer id to check if approved
*/
modifier onlyApprovedOffers(uint256 offerId_) {
require(
(approvedOffers[offerId_] == true) ||
(rolesContract.isVerifiedUser(offersList[offerId_].seller)),
'M101'
);
_;
}
/**
*@notice the offer must be active
*@param offerId_ the offer to check if is active
*/
modifier onlyActiveOffers(uint256 offerId_) {
require(isActive(offerId_), 'M113');
_;
}
/**
* @notice Only a moderator can call
*/
modifier onlyModerator {
require(rolesContract.isModerator(msg.sender), 'M120');
_;
}
/**
* @notice only offer must be an auction
* @param offerId_ the offer to check if is an auction
*/
modifier onlyAuctions(uint256 offerId_) {
require(isAuction(offerId_), 'M110');
_;
}
/**
*@notice only Votation Module can call
*/
modifier onlyVotationModule {
require(msg.sender == moduleManager.getModule(3), 'M133');
_;
}
/**
* @notice only paper modifier
*/
modifier onlyPaper(bytes32 _hash, bytes32 _nonce, bytes calldata _signature) {
bool success = paperKeyManager.verify(_hash, _nonce, _signature);
require(success, 'Failed to verify signature');
_;
}
/**
* @notice Builder
* @param module_ Module manager
*/
constructor(address module_) {
moduleManager = IModule(module_);
address roles = moduleManager.getModule(0);
rolesContract = IRoles(roles);
}
/**
* @notice Function to refresh the addresses used in this contract
*/
function refresh() public onlyVotationModule {
address roles = moduleManager.getModule(0);
rolesContract = IRoles(roles);
}
//! --------------------------------------------------------------------------- PAPER -----------------------------------------------------------------------------
/**
* @notice only paper register function
* @param _paperKey token obtained after register the SC paper in the paper developer dashboard
*/
function registerPaperKey(address _paperKey) external onlyVotationModule() {
require(paperKeyManager.register(_paperKey), 'Error registering key');
}
/**
* @notice function to set paperKeyManager
* @param _paperKeyManagerAddress address from which to instantiate paper key manager
*/
function setPaperKeyManager(address _paperKeyManagerAddress) public onlyVotationModule() {
paperKeyManager = IPaperKeyManager(_paperKeyManagerAddress);
}
/**
* @notice Eligibility method
* @param offerId_ The offer id to check
*/
function eligibilityMethod(uint offerId_) onlyActiveOffers(offerId_) public view returns (string memory) {
Offer memory offer = offersList[offerId_];
uint[] memory tokenIds = getDecodedTokenIds(offerId_);
for (uint256 i; i < offer.collectionAddresses.length; i++) {
require(IERC721(offer.collectionAddresses[i]).ownerOf(tokenIds[i]) == offer.seller, 'E413');
require(IERC721(offer.collectionAddresses[i]).isApprovedForAll(offer.seller, address(this)), 'M118');
}
return '';
}
/**
* @notice function to validate params from a purchase
* @param offerId_ The offer id to check
* @param directBuy_ Indicate if is a direct purchase {just for auctions}
* @param buyer_ the user who used onlyPaper to buy
*/
function _paperValidateBuyParams(uint256 offerId_, bool directBuy_, address buyer_) internal view {
Offer memory offer = offersList[offerId_];
if (isAuction(offerId_) && !directBuy_) {
require(!validateAuctionTime(offerId_), 'M111');
require(buyer_ == auctionWinners[offerId_], 'M112');
}
if (offer.paymentToken == address(0)) {
require(msg.value >= getValue(offerId_), 'M114');
} else {
require(IERC20(offer.paymentToken).allowance(msg.sender, address(this) ) >= getValue(offerId_),'M115');
}
}
/**
* @notice Function to transanc all tokens bought to buyer
* @param offerId_ the user who used onlyPaper to buy
* @param buyer_ user who bought the
*/
function _paperTransactAllTokens(uint256 offerId_, address buyer_) internal {
Offer memory offer = offersList[offerId_];
uint256[] memory auxTokenIds = getDecodedTokenIds(offerId_);
for (uint256 i = 0; i < offer.collectionAddresses.length; i++) {
require(IERC721(offer.collectionAddresses[i]).ownerOf(auxTokenIds[i]) == offer.seller , 'E413');
require(IERC721(offer.collectionAddresses[i]).isApprovedForAll(offer.seller, address(this)), 'M118');
IERC721(offer.collectionAddresses[i]).safeTransferFrom(offer.seller, buyer_, auxTokenIds[i], 'M135');
}
}
/**
* @notice Buy offer method modified to use only paper
* @param offerId_ the offer to buy
* @param buyer_ the user who used onlyPaper to buy
* @param directBuy_ this is just for auctions. Indicate if the if is a direct purchase
* @param hiddenId_ the Offer's fireBase Id.
* @param nonce_ variable used for onlyPaper methods
* @param signature_ valiable used for onlyPaper methods
*/
function buyWithPaper(
uint256 offerId_,
address buyer_,
bool directBuy_,
string memory hiddenId_,
bytes32 nonce_,
bytes calldata signature_
) public payable onlyActiveOffers(offerId_)
onlyPaper(keccak256(abi.encode(offerId_, buyer_, directBuy_, hiddenId_)), nonce_, signature_)
{
_paperValidateBuyParams(offerId_, directBuy_, buyer_);
setInactive(offerId_);
_splitFunds(offerId_, getValue(offerId_));
_paperTransactAllTokens(offerId_, buyer_);
emit PaperOfferCompleted(offerId_, hiddenId_, buyer_);
}
//! --------------------------------------------------------------------------- CREATE OFFER ---------------------------------------------------------------------------
/**
* @notice function to validate the params { all params } sent for create an offer
* @param isAuction_ indicate if the offer is going to be an auction or not
* @param endTime_ indicate the time when the offer will be end (just if is acution)
* @param minBid_ Min bid allowed
* @param tokenIds_ array of token's ids to sell
* @param value_ Value of the offer
* @param collectionAddresses_ array of collections's addresses
* @param paymentToken_ You can ask for USDT, DAI or Matic/Ether
*/
function _validateCreateParams(
bool isAuction_,
uint48 endTime_,
uint96 minBid_,
uint96 value_,
uint256[] memory tokenIds_,
address[] memory collectionAddresses_,
address paymentToken_
) internal view {
require (tokenIds_.length == collectionAddresses_.length , 'E806');
require(tokenIds_.length < 6,'M127');
require(value_ > 0, 'M102');
require(isValidERC20(paymentToken_), 'M106');
if (isAuction_){
require(endTime_ > block.timestamp + 3600,'M134');
require(value_ > minBid_, 'M103');
}
}
/**
* @notice function to validate the ownership of the tokens of an offer
* @param tokenIds_ array of token's ids
* @param collectionAddresses_ array of collecti's addresesss
* @return flag true if the offer have unapproved collection addresses
*/
function _validateOwnership(uint256[] memory tokenIds_, address[] memory collectionAddresses_) internal view returns (bool flag) {
for (uint256 i; i < collectionAddresses_.length; i++) {
require(IERC721(collectionAddresses_[i]).ownerOf(tokenIds_[i]) == msg.sender, 'E413');
require(IERC721(collectionAddresses_[i]).isApprovedForAll(msg.sender, address(this)), 'M118');
if (!approvedERC721[collectionAddresses_[i]] && !flag) flag = true;
}
}
/**
* @notice Function to create offers
* @param isAuction_ If it is auction
* @param endTime_ time when offers ends (just for auction)
* @param minBid_ Min bid allowed
* @param tokenIds_ array of token's ids to sell
* @param value_ Value of the offer
* @param collectionAddresses_ array of collections's addresses
* @param paymentToken_ You can ask for USDT, DAI or Matic/Ether
* @param hiddenId_ Offre's id in fireBase
*/
function createOffer(
bool isAuction_,
uint48 endTime_,
uint96 minBid_,
uint96 value_,
uint256[] memory tokenIds_,
address[] memory collectionAddresses_,
address paymentToken_,
string memory hiddenId_
) public {
_validateCreateParams(isAuction_, endTime_, minBid_, value_, tokenIds_, collectionAddresses_, paymentToken_);
bool notApproved = _validateOwnership(tokenIds_, collectionAddresses_);
if (!notApproved) approvedOffers[offersCount] = true;
offersList[offersCount] = Offer(
encodeInfo(isAuction_ ? 1 : 0, endTime_, minBid_, value_),
encode(tokenIds_),
collectionAddresses_,
paymentToken_,
msg.sender
);
emit OfferCreated(offersCount, hiddenId_);
offersCount++;
}
//! --------------------------------------------------------------------------- BUY OFFER ---------------------------------------------------------------------------
/**
* @notice function to validate params from a purchase
* @param offerId_ The offer id to check
* @param directBuy_ Indicate if is a direct purchase {just for auctions}
*/
function _validateBuyParams(uint256 offerId_, bool directBuy_) internal view {
Offer memory offer = offersList[offerId_];
if (isAuction(offerId_) && !directBuy_) {
require(!validateAuctionTime(offerId_), 'M111');
require(msg.sender == auctionWinners[offerId_], 'M112');
}
if (offer.paymentToken == address(0)) {
require(msg.value >= getValue(offerId_), 'M114');
} else {
require(IERC20(offer.paymentToken).allowance(msg.sender, address(this) ) >= getValue(offerId_),'M115');
}
}
/**
* @notice Function to transanc all tokens bought
* @param offerId_ The offer bought
*/
function _transactAllTokens(uint256 offerId_) internal {
Offer memory offer = offersList[offerId_];
uint256[] memory auxTokenIds = getDecodedTokenIds(offerId_);
for (uint256 i = 0; i < offer.collectionAddresses.length; i++) {
require(IERC721(offer.collectionAddresses[i]).ownerOf(auxTokenIds[i]) == offer.seller , 'E413');
require(IERC721(offer.collectionAddresses[i]).isApprovedForAll(offer.seller, address(this)), 'M118');
IERC721(offer.collectionAddresses[i]).safeTransferFrom(offer.seller, msg.sender, auxTokenIds[i], '');
}
}
/**
* @notice For buying a fixed offer & closing an auction
* @param offerId_ The offer to buy
* @param directBuy_ This is just for auctions. Indicate if the if is a direct purchase
* @param hiddenId_ The Offer's fireBase Id.
*/
function buyOffer(uint256 offerId_, bool directBuy_, string memory hiddenId_) public payable onlyActiveOffers(offerId_) onlyApprovedOffers(offerId_) {
_validateBuyParams(offerId_, directBuy_);
setInactive(offerId_);
_splitFunds(offerId_,getValue(offerId_)); //* ADDED
_transactAllTokens(offerId_);
emit OfferCompleted( offerId_, hiddenId_, msg.sender);
}
//! --------------------------------------------------------------------------- BID IN AUCTION ---------------------------------------------------------------------------
/**
* @notice Function to validate bid parameters to bid in an auction
* @param offerId_ The auction to check
* @param value_ The value to chek
*/
function _validateBidParams(uint256 offerId_, uint256 value_) internal view {
require((value_ > 0) && (getMinBid(offerId_) < value_), 'M121');
require(validateAuctionTime(offerId_),'M107');
}
/**
* @notice Function to validate if the msg.sender have enough balance to bid in an auction
* @param offerId_ The auction to check
* @param value_ The value to check
*/
function _validateUserBalance(uint256 offerId_, uint256 value_) internal view {
uint balance = getActualBalance(msg.sender, offersList[offerId_].paymentToken);
require(value_ < balance, 'M123');
}
/**
* @notice function that allows to bid in an auction
* @param offerId_ The auction id
* @param value_ The value to bid
*/
function bidForAuction(uint256 offerId_, uint256 value_, string memory id) public onlyActiveOffers(offerId_) onlyApprovedOffers(offerId_) onlyAuctions(offerId_) {
_validateBidParams(offerId_, value_);
_validateUserBalance(offerId_, value_);
setMinBid(offerId_, value_);
auctionWinners[offerId_] = msg.sender;
emit BiddedForAuction(msg.sender, offerId_, value_, id);
}
//! ------------------------------------------------------------------------- ROYALTIES --------------------------------------------------------------------------
/**
* @notice function to send ERC20 founds
* @param offerId_ offerId to check
* @param to_ who will receive the funds
* @param value_ the amount to send
*/
function _sendFunds(uint256 offerId_,address to_, uint256 value_) internal {
if (offersList[offerId_].paymentToken == address(0)) {
(bool success, ) = payable(to_).call{ value: value_ }("");
require(success, "M117");
} else {
require ( IERC20(offersList[offerId_].paymentToken).transferFrom(
msg.sender,
to_,
value_
), 'M120');
}
}
/**
* @notice Function to transfer royalies to Beru { wallet }
* @param value_ amount from which the commission percentage is calculated
* @return toBeru amount tranfered to beru
*/
function _sendRoyaltiesToBeru(uint256 offerId_, uint256 value_) internal returns (uint256 toBeru) {
toBeru = value_ * beruRoyalies / 1000 ; // %<0
_sendFunds(offerId_,beruWallet,toBeru);
emit RoyaltiesSended(beruWallet,toBeru);
}
/**
* @notice Function to send royalties to the NFT's creators
* @param offerId_ offer involved
* @param value_ price paid for the offer
* @return toCreators amount of roayalities transfered to creators
*/
function _sendRoyaltiesToCreators(uint256 offerId_, uint256 value_) internal returns (uint256 toCreators) {
address[] memory collectionAddrees_ = offersList[offerId_].collectionAddresses;
uint256 aux = value_ / collectionAddrees_.length;
for(uint i = 0; i < collectionAddrees_.length; i++) {
IERC721 proxy = IERC721(collectionAddrees_[i]);
if (proxy.getRoyalties() > 0) {
uint256 toTransfer = aux * proxy.getRoyalties() /1000;
_sendFunds(offerId_,proxy.deployer(), toTransfer);
toCreators += toTransfer;
emit RoyaltiesSended(proxy.deployer(), toTransfer);
}
}
}
/**
* @notice function to send founsd and royalties to collectio's creators, beru and the seller
* @param offerId_ the offer finished and bought
* @param value_ price paid for the offer
*/
function _splitFunds(uint256 offerId_, uint256 value_) internal {
uint256 royaltiesToBeru = _sendRoyaltiesToBeru(offerId_,value_);
uint256 royaltiesToCreators = _sendRoyaltiesToCreators(offerId_,value_);
uint256 fundsToSeller = value_ - royaltiesToBeru - royaltiesToCreators;
_sendFunds(offerId_, offersList[offerId_].seller , fundsToSeller);
emit FundsSended(royaltiesToBeru , royaltiesToCreators , fundsToSeller);
}
//! --------------------------------------------------------------------------- Encode & Decode ---------------------------------------------------------------------------
/**
* @notice Function to encode {auction, endtime, min, value} in info's encoded parameter
* @param isAuction_ True or false 0 / 1 if is auction
* @param endTime_ time when auctions ends (just for auctions)
* @param min_ min bid (just for auctions)
* @param value_ the offer's value for purchase
* @return finalValue_ the params encoded in a uint
*/
function encodeInfo(
uint isAuction_,
uint48 endTime_,
uint96 min_,
uint96 value_
) internal pure returns (uint finalValue_) {
finalValue_ = (1 * (10 ** 75)) + (1 * (10 ** 74)) + (isAuction_ * (10 ** 73)) + (uint(endTime_) * (10 ** 58)) + (uint(min_) * (10 ** 29)) + (value_);
}
/**
* @notice This is made to encode an array of uints and return just a uint
* @param array_ is an array that has the ids to encode
* @return aux have the ids encoded
*/
function encode(uint[] memory array_) public pure returns (uint256 aux) {
for (uint i; i < array_.length; ++i) {
aux += array_[i] * (10 ** (i * 15));
}
aux += array_.length * 1e75;
}
/**
* @notice This is made to decode a uint an retunrn an array of ids
* @param encoded_ This uint has encoded up to 5 ids that correspond to an array
* @return tokenIds This array have the ids decoded
*/
function decode(uint encoded_) public pure returns (uint[] memory tokenIds){
uint amount = (encoded_ / 1e75) % 1e15;
tokenIds = new uint[](amount);
for (uint i; i < amount; ++i){
tokenIds[i] = (encoded_ / (10 ** (i * 15)) % 1e15);
}
}
//! --------------------------------------------------------------------------- SETTERS ---------------------------------------------------------------------------
/**
* @notice validate an ERC721 collection
* @param erc721_ collection address
* @param validated_ new status of this ERC721 collection
*/
function validateERC721(address erc721_, bool validated_) public onlyModerator {
approvedERC721[erc721_] = validated_;
emit ChangeStatusERC721(erc721_, msg.sender, validated_);
}
/**
* @notice This is made to approve a valid offer
* @param offerId_ The offer id to validate
*/
function approveOffer(uint offerId_) public onlyModerator onlyActiveOffers(offerId_) {
approvedOffers[offerId_] = true;
emit OfferApproved(offerId_);
}
/**
* @notice function to set status active in an offer
* @param offerId_ offerId to set active
*/
function setInactive(uint offerId_) internal {
require(isActive(offerId_),'M108');
offersList[offerId_].info = offersList[offerId_].info - (1 * 1e74);
}
/**
* @notice function to set the minBid in an auction
* @param offerId_ the offer id to set the minBid
* @param min_ the value to set
*/
function setMinBid(uint offerId_, uint min_) internal {
offersList[offerId_].info = ((offersList[offerId_].info / 1e58) * 1e58 ) + (min_ * 1e29) + (offersList[offerId_].info % 1e29);
emit MinBidSet(offerId_, min_);
}
/**
* @notice Function to deprecate any active offer
* @param offerId_ The offer id to deprecate
*/
function deprecateOffer(uint256 offerId_) public onlyModerator onlyActiveOffers(offerId_) {
setInactive(offerId_);
emit OfferCancelled(offerId_);
}
/**
* @notice Validate an ERC20 token as payment method
* @param token_ The token address
* @param validated_ If is validated or not
*/
function validateERC20(address token_, bool validated_) public onlyVotationModule {
validERC20[token_] = validated_;
emit ERC20Validated(token_, validated_);
}
/**
* @notice Function to set {bidder_} as winner of the auction {offerId_}
* @param offerId_ Offer index
* @param newWinner_ The consecuent highest bidder of the auction
*/
function setWinner(uint256 offerId_, address newWinner_) public onlyModerator {
(uint256 oldWinnerBalance, uint256 newWinnerBalance) =
(
getActualBalance(auctionWinners[offerId_], offersList[offerId_].paymentToken),
getActualBalance(newWinner_, offersList[offerId_].paymentToken)
);
require(getMinBid(offerId_) > oldWinnerBalance,'M129');
require(getMinBid(offerId_) <= newWinnerBalance,'M130');
auctionWinners[offerId_] = newWinner_;
emit ChangedWinner(offerId_, newWinner_);
}
/**
* @notice function to set Beru Wallet address
* @param address_ the new address
*/
function setBeruWallet(address address_) public onlyVotationModule() {
beruWallet = address_;
emit BeruWalletSet(address_);
}
/**
* @notice function to set Beru Royalties
* @param value_ value of the new royalties
*/
function setBeruRoyalties(uint256 value_) public onlyVotationModule() {
require(value_<=1000,'M109');
beruRoyalies = value_;
emit BeruRoyaliesSet(value_);
}
//! --------------------------------------------------------------------------- GETTERS ---------------------------------------------------------------------------
/**
* @notice function to return the {isActive} encoded in info
* @param offerId_ the offerId where we get the data
*/
function isActive(uint offerId_) public view returns (bool) {
return ((offersList[offerId_].info / 1e74) % 10) == 1 ? true : false;
}
/**
* @notice function to return the {isAuction} encoded in info
* @param offerId_ the offerId where we get the data
*/
function isAuction(uint offerId_) public view returns (bool) {
return ((offersList[offerId_].info / 1e73) % 10) == 1 ? true : false;
}
/**
* @notice function to return the {endTime} encoded in info
* @param offerId_ the offerId where we get the data
*/
function getEndTime(uint offerId_) public view returns (uint) {
return (offersList[offerId_].info / 1e58) % 1e15;
}
/**
* @notice function to return the {minBid} encoded in info
* @param offerId_ the offerId where we get the data
*/
function getMinBid(uint offerId_) public view returns (uint) {
return (offersList[offerId_].info / 1e29) % 1e29;
}
/**
* @notice function to return the {value} encoded in info
* @param offerId_ the offerId where we get the data
*/
function getValue(uint offerId_) public view returns (uint) {
return offersList[offerId_].info % 1e29;
}
/**
* @notice function to return an array of token Ids previusly encoded
* @param offerId_ the offerId where we get the data
*/
function getDecodedTokenIds(uint offerId_) public view returns (uint[] memory) {
return decode(offersList[offerId_].tokenIds);
}
/**
* @notice Validates if an auction is still valid or not
* @param offerId_ The auction
* @return valid if it is valid or not
*/
function validateAuctionTime(uint256 offerId_) public view onlyAuctions(offerId_) returns (bool) {
return getEndTime(offerId_) > block.timestamp;
}
/**
* @notice Function to check if {token_} is a validERC20 for payment method
* @param token_ The token address
* @return bool if {token_} is valid
*/
function isValidERC20(address token_) public view returns (bool) {
return validERC20[token_];
}
/**
* @notice Helper function that returns the balance of {who} in {paymentToken} token
* @param who_ Address to check balance
* @param paymentToken_ Address of the token to check
*/
function getActualBalance(address who_, address paymentToken_) public view returns (uint balance) {
if (paymentToken_ == address(0))
balance = address(who_).balance;
else balance = IERC20(paymentToken_).balanceOf(who_);
}
/**
* @notice function to get the encoded collection address uint
* @param offerId_ offer Id to check
*/
function getCollectionAddresses(uint256 offerId_) public view returns (address[] memory){
return offersList[offerId_].collectionAddresses;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"module_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"address","name":"who","type":"address"}],"name":"ApprovedOffer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRoyalties","type":"uint256"}],"name":"BeruRoyaliesSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newBeruWallet","type":"address"}],"name":"BeruWalletSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"string","name":"id","type":"string"}],"name":"BiddedForAuction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ERC721","type":"address"},{"indexed":false,"internalType":"address","name":"who","type":"address"},{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"ChangeStatusERC721","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"address","name":"newWinner","type":"address"}],"name":"ChangedWinner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"bool","name":"valid","type":"bool"}],"name":"ERC20Validated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"beruRoyalties","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"creatorsRoyalties","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellerFunds","type":"uint256"}],"name":"FundsSended","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"MinBidSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"OfferApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"offerId","type":"uint256"}],"name":"OfferCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"hiddenId","type":"string"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"OfferCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"hiddenId","type":"string"}],"name":"OfferCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"hiddenId","type":"string"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"PaperOfferCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RoyaltiesSended","type":"event"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"approveOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedERC721","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedOffers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionWinners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beruRoyalies","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beruWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"},{"internalType":"uint256","name":"value_","type":"uint256"},{"internalType":"string","name":"id","type":"string"}],"name":"bidForAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"},{"internalType":"bool","name":"directBuy_","type":"bool"},{"internalType":"string","name":"hiddenId_","type":"string"}],"name":"buyOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"},{"internalType":"address","name":"buyer_","type":"address"},{"internalType":"bool","name":"directBuy_","type":"bool"},{"internalType":"string","name":"hiddenId_","type":"string"},{"internalType":"bytes32","name":"nonce_","type":"bytes32"},{"internalType":"bytes","name":"signature_","type":"bytes"}],"name":"buyWithPaper","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"isAuction_","type":"bool"},{"internalType":"uint48","name":"endTime_","type":"uint48"},{"internalType":"uint96","name":"minBid_","type":"uint96"},{"internalType":"uint96","name":"value_","type":"uint96"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"},{"internalType":"address[]","name":"collectionAddresses_","type":"address[]"},{"internalType":"address","name":"paymentToken_","type":"address"},{"internalType":"string","name":"hiddenId_","type":"string"}],"name":"createOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"encoded_","type":"uint256"}],"name":"decode","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"deprecateOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"eligibilityMethod","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"array_","type":"uint256[]"}],"name":"encode","outputs":[{"internalType":"uint256","name":"aux","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"who_","type":"address"},{"internalType":"address","name":"paymentToken_","type":"address"}],"name":"getActualBalance","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"getCollectionAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"getDecodedTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"getEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"getMinBid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"getValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"isAuction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"}],"name":"isValidERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"offersList","outputs":[{"internalType":"uint256","name":"info","type":"uint256"},{"internalType":"uint256","name":"tokenIds","type":"uint256"},{"internalType":"address","name":"paymentToken","type":"address"},{"internalType":"address","name":"seller","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refresh","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paperKey","type":"address"}],"name":"registerPaperKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"name":"setBeruRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"setBeruWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paperKeyManagerAddress","type":"address"}],"name":"setPaperKeyManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"},{"internalType":"address","name":"newWinner_","type":"address"}],"name":"setWinner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"validERC20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offerId_","type":"uint256"}],"name":"validateAuctionTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"bool","name":"validated_","type":"bool"}],"name":"validateERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc721_","type":"address"},{"internalType":"bool","name":"validated_","type":"bool"}],"name":"validateERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b50604051620041e2380380620041e28339810160408190526200003491620000e0565b600880546001600160a01b0319166001600160a01b038316908117909155604051632afc8b5b60e11b815260006004820181905291906355f916b690602401602060405180830381865afa15801562000091573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b79190620000e0565b600080546001600160a01b0319166001600160a01b039290921691909117905550620001129050565b600060208284031215620000f357600080fd5b81516001600160a01b03811681146200010b57600080fd5b9392505050565b6140c080620001226000396000f3fe6080604052600436106102045760003560e01c8063746f62da116101185780639c623683116100a0578063b003dd861161006f578063b003dd86146106c7578063bec02acc146106e7578063d171cd1f146106fd578063f5d40e9c1461071d578063f8ac93e81461073d57600080fd5b80639c623683146106375780639d5e0f6b14610657578063a5d7c10a14610687578063ab057b24146106a757600080fd5b80638704f2a3116100e75780638704f2a3146105945780639067b677146105b4578063920e3ef6146105d457806397fb9279146105e757806398a133d01461060757600080fd5b8063746f62da146104cd5780637f21d4981461050657806382afd23b1461052657806382b992d11461054657600080fd5b806341e2ddd81161019b5780635a6ababa1161016a5780635a6ababa1461040d57806360febc8c1461042d57806361a769001461044d5780636477b8621461046d5780636656d7361461048d57600080fd5b806341e2ddd814610397578063440d431e146103b757806344d9bc59146103ca5780634b1c9952146103f757600080fd5b8063300a0109116101d7578063300a01091461030a57806331a472b21461032a578063379cb5a81461034a57806338f081f81461036a57600080fd5b806308f33bc8146102095780630ff4c9161461028d57806329542a87146102bb5780632e7cea3b146102dd575b600080fd5b34801561021557600080fd5b506102596102243660046136d0565b600360208190526000918252604090912080546001820154928201546004909201549092916001600160a01b03908116911684565b6040805194855260208501939093526001600160a01b03918216928401929092521660608201526080015b60405180910390f35b34801561029957600080fd5b506102ad6102a83660046136d0565b610752565b604051908152602001610284565b3480156102c757600080fd5b506102db6102d6366004613727565b61077f565b005b3480156102e957600080fd5b506102fd6102f83660046136d0565b610880565b6040516102849190613760565b34801561031657600080fd5b506102db61032536600461385b565b61089e565b34801561033657600080fd5b506102db6103453660046136d0565b610a60565b34801561035657600080fd5b506102db6103653660046136d0565b610b49565b34801561037657600080fd5b5061038a6103853660046136d0565b610c5d565b60405161028491906138ab565b3480156103a357600080fd5b506102db6103b2366004613a0c565b610ccc565b6102db6103c5366004613ae8565b610e44565b3480156103d657600080fd5b506103ea6103e53660046136d0565b610fb3565b6040516102849190613b71565b34801561040357600080fd5b506102ad600a5481565b34801561041957600080fd5b506102db610428366004613b84565b611256565b34801561043957600080fd5b506102db610448366004613b84565b611341565b34801561045957600080fd5b506102fd6104683660046136d0565b611495565b34801561047957600080fd5b506102db610488366004613727565b611586565b34801561049957600080fd5b506104bd6104a8366004613b84565b60076020526000908152604090205460ff1681565b6040519015158152602001610284565b3480156104d957600080fd5b506104bd6104e8366004613b84565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561051257600080fd5b506102ad6105213660046136d0565b61167f565b34801561053257600080fd5b506104bd6105413660046136d0565b6116b2565b34801561055257600080fd5b5061057c6105613660046136d0565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610284565b3480156105a057600080fd5b506104bd6105af3660046136d0565b611708565b3480156105c057600080fd5b506102ad6105cf3660046136d0565b61173e565b6102db6105e2366004613ba1565b611775565b3480156105f357600080fd5b506104bd6106023660046136d0565b611910565b34801561061357600080fd5b506104bd610622366004613b84565b60066020526000908152604090205460ff1681565b34801561064357600080fd5b506102db610652366004613c71565b611963565b34801561066357600080fd5b506104bd6106723660046136d0565b60056020526000908152604090205460ff1681565b34801561069357600080fd5b506102db6106a23660046136d0565b611b38565b3480156106b357600080fd5b5060095461057c906001600160a01b031681565b3480156106d357600080fd5b506102ad6106e2366004613c96565b611c33565b3480156106f357600080fd5b506102ad60025481565b34801561070957600080fd5b506102ad610718366004613cd3565b611cc6565b34801561072957600080fd5b506102db610738366004613b84565b611d58565b34801561074957600080fd5b506102db611e17565b600081815260036020526040812054610779906c01431e0fae6d7217caa000000090613d17565b92915050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af11580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed9190613d2b565b6108125760405162461bcd60e51b815260040161080990613d48565b60405180910390fd5b6001600160a01b038216600081815260076020908152604091829020805460ff191685151590811790915582519384523391840191909152908201527fac558f7f1b991d3041da3d99df606555a86818181515e3c63f7494a886c8b1c4906060015b60405180910390a15050565b60008181526003602052604090206001015460609061077990611495565b826108a8816116b2565b6108c45760405162461bcd60e51b815260040161080990613d66565b600084815260056020526040902054849060ff1615156001148061096857506000805482825260036020526040918290206004908101549251633da1c0c360e01b81526001600160a01b0393841691810191909152911690633da1c0c3906024016020604051808303816000875af1158015610944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109689190613d2b565b61099d5760405162461bcd60e51b8152600401610809906020808252600490820152634d31303160e01b604082015260600190565b846109a781611708565b6109dc5760405162461bcd60e51b81526004016108099060208082526004908201526304d3131360e41b604082015260600190565b6109e68686611f45565b6109f08686611fd3565b6109fa8686612038565b6000868152600460205260409081902080546001600160a01b0319163390811790915590517f90a79438af598e17758907b92be3d0720d36c54a546dddf5d51449a6b71590ba91610a5091899089908990613d84565b60405180910390a1505050505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af1158015610aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace9190613d2b565b610aea5760405162461bcd60e51b815260040161080990613d48565b80610af4816116b2565b610b105760405162461bcd60e51b815260040161080990613d66565b610b198261211f565b6040518281527fc28b4aed030bfacc245c0501326e1beb8c0ef0d60e4edc21067fdeb52da2a7aa90602001610874565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015610b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb69190613dbb565b6001600160a01b0316336001600160a01b031614610be65760405162461bcd60e51b815260040161080990613dd8565b6103e8811115610c215760405162461bcd60e51b8152600401610809906020808252600490820152634d31303960e01b604082015260600190565b600a8190556040518181527f5e1be4f61873c5f31430ca05087ce5163449753ebf46ee14b8e73d5ca0fd616d906020015b60405180910390a150565b600081815260036020908152604091829020600201805483518184028101840190945280845260609392830182828015610cc057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ca2575b50505050509050919050565b610cdb888888888888886121a2565b6000610ce7858561234d565b905080610d0b576002546000908152600560205260409020805460ff191660011790555b6040518060a00160405280610d338b610d25576000610d28565b60015b60ff168b8b8b61253e565b8152602001610d4187611c33565b8152602001858152602001846001600160a01b03168152602001336001600160a01b031681525060036000600254815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190610dad929190613656565b5060608201516003820180546001600160a01b03199081166001600160a01b03938416179091556080909301516004909201805490931691161790556002546040517f749779d59ba16d7101daa300a293261d1f3e9fb8c21c94b3400676dff2853c7891610e1c918590613df6565b60405180910390a160028054906000610e3483613e25565b9190505550505050505050505050565b82610e4e816116b2565b610e6a5760405162461bcd60e51b815260040161080990613d66565b600084815260056020526040902054849060ff16151560011480610f0e57506000805482825260036020526040918290206004908101549251633da1c0c360e01b81526001600160a01b0393841691810191909152911690633da1c0c3906024016020604051808303816000875af1158015610eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0e9190613d2b565b610f435760405162461bcd60e51b8152600401610809906020808252600490820152634d31303160e01b604082015260600190565b610f4d85856125ff565b610f568561211f565b610f6885610f6387610752565b612854565b610f71856128ef565b7f3ee363331f5a31fd1065b3e3e953efc486b2e0219f8a0beb22ab1d403c7f0394858433604051610fa493929190613e3e565b60405180910390a15050505050565b606081610fbf816116b2565b610fdb5760405162461bcd60e51b815260040161080990613d66565b6000838152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561105557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611037575b505050918352505060038201546001600160a01b0390811660208301526004909201549091166040909101529050600061108e85610880565b905060005b82604001515181101561123d5782608001516001600160a01b0316836040015182815181106110c4576110c4613e6f565b60200260200101516001600160a01b0316636352211e8484815181106110ec576110ec613e6f565b60200260200101516040518263ffffffff1660e01b815260040161111291815260200190565b602060405180830381865afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111539190613dbb565b6001600160a01b0316146111795760405162461bcd60e51b815260040161080990613e85565b8260400151818151811061118f5761118f613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa1580156111eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120f9190613d2b565b61122b5760405162461bcd60e51b815260040161080990613ea3565b8061123581613e25565b915050611093565b5050604080516020810190915260008152949350505050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c39190613dbb565b6001600160a01b0316336001600160a01b0316146112f35760405162461bcd60e51b815260040161080990613dd8565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527fc6bbd7d74968be5628d4b58738837bf02a3770f9c5366f132bbf8524123ca0ea90602001610c52565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa15801561138a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ae9190613dbb565b6001600160a01b0316336001600160a01b0316146113de5760405162461bcd60e51b815260040161080990613dd8565b600154604051632210724360e11b81526001600160a01b03838116600483015290911690634420e486906024016020604051808303816000875af115801561142a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144e9190613d2b565b6114925760405162461bcd60e51b81526020600482015260156024820152744572726f72207265676973746572696e67206b657960581b6044820152606401610809565b50565b6060600066038d7ea4c680006114c47546bf5bb0385045767e0f0ef2e7aa1e517e454637d1dd604b1b85613ec1565b6114ce9190613d17565b90508067ffffffffffffffff8111156114e9576114e96137a4565b604051908082528060200260200182016040528015611512578160200160208202803683370190505b50915060005b8181101561157f5766038d7ea4c6800061153382600f613ed5565b61153e90600a613fd0565b6115489086613ec1565b6115529190613d17565b83828151811061156457611564613e6f565b602090810291909101015261157881613e25565b9050611518565b5050919050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f39190613dbb565b6001600160a01b0316336001600160a01b0316146116235760405162461bcd60e51b815260040161080990613dd8565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527f3a0328c228c4de35601eca18a96ae5ec86e27fa97d91d41de9993fb588338cea9101610874565b6000818152600360205260408120546c01431e0fae6d7217caa0000000906116a8908290613ec1565b6107799190613d17565b600081815260036020526040812054600a906116e890750e264589a4dcdab14c696963c7eed2dd19410e0b29f9604a1b90613ec1565b6116f29190613d17565b600114611700576000610779565b600192915050565b600081815260036020526040812054600a906116e8907502d4744eba92922375aeaead8e62f6f9050d02cf086560491b90613ec1565b60008181526003602052604081205466038d7ea4c68000906116a8907065f537c675815d9ccdfa7c534fbb224839603a1b90613ec1565b8661177f816116b2565b61179b5760405162461bcd60e51b815260040161080990613d66565b878787876040516020016117b29493929190613fdc565b60408051601f198184030181529082905280516020909101206001546303784b1960e61b835290918691869186916000916001600160a01b039091169063de12c6409061180990889088908890889060040161400e565b6020604051808303816000875af1158015611828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184c9190613d2b565b90508061189b5760405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f20766572696679207369676e61747572650000000000006044820152606401610809565b6118a68d8c8e612c1c565b6118af8d61211f565b6118bc8d610f638f610752565b6118c68d8d612e79565b7fbbccc1013329f1c90566ebc070eb4ce3e2ec7617aa3c5c46e8022117be4a76c48d8b8e6040516118f993929190613e3e565b60405180910390a150505050505050505050505050565b60008161191c81611708565b6119515760405162461bcd60e51b81526004016108099060208082526004908201526304d3131360e41b604082015260600190565b4261195b8461173e565b119392505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af11580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d19190613d2b565b6119ed5760405162461bcd60e51b815260040161080990613d48565b600082815260046020908152604080832054600392839052908320909101548291611a24916001600160a01b039182169116611cc6565b60008581526003602081905260409091200154611a4b9085906001600160a01b0316611cc6565b9150915081611a598561167f565b11611a8f5760405162461bcd60e51b8152600401610809906020808252600490820152634d31323960e01b604082015260600190565b80611a998561167f565b1115611ad05760405162461bcd60e51b81526004016108099060208082526004908201526304d3133360e41b604082015260600190565b60008481526004602090815260409182902080546001600160a01b0319166001600160a01b0387169081179091558251878152918201527f86a3d1ae2fcc062138c4a9c046aa437954430ac76396112c6c1aa34c35fa7b23910160405180910390a150505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af1158015611b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba69190613d2b565b611bc25760405162461bcd60e51b815260040161080990613d48565b80611bcc816116b2565b611be85760405162461bcd60e51b815260040161080990613d66565b60008281526005602052604090819020805460ff19166001179055517f6f78fd1caac12eab2d3b9b01e740cafd178d3caadcaffa76b103881a24f13501906108749084815260200190565b6000805b8251811015611c9657611c4b81600f613ed5565b611c5690600a613fd0565b838281518110611c6857611c68613e6f565b6020026020010151611c7a9190613ed5565b611c84908361404b565b9150611c8f81613e25565b9050611c37565b508151611cbc907546bf5bb0385045767e0f0ef2e7aa1e517e454637d1dd604b1b613ed5565b610779908261404b565b60006001600160a01b038216611ce757506001600160a01b03821631610779565b6040516370a0823160e01b81526001600160a01b0384811660048301528316906370a0823190602401602060405180830381865afa158015611d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d51919061405e565b9392505050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015611da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc59190613dbb565b6001600160a01b0316336001600160a01b031614611df55760405162461bcd60e51b815260040161080990613dd8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015611e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e849190613dbb565b6001600160a01b0316336001600160a01b031614611eb45760405162461bcd60e51b815260040161080990613dd8565b600854604051632afc8b5b60e11b8152600060048201819052916001600160a01b0316906355f916b690602401602060405180830381865afa158015611efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f229190613dbb565b600080546001600160a01b0319166001600160a01b039290921691909117905550565b600081118015611f5c575080611f5a8361167f565b105b611f915760405162461bcd60e51b8152600401610809906020808252600490820152634d31323160e01b604082015260600190565b611f9a82611910565b611fcf5760405162461bcd60e51b8152600401610809906020808252600490820152634d31303760e01b604082015260600190565b5050565b600082815260036020819052604082200154611ff99033906001600160a01b0316611cc6565b90508082106120335760405162461bcd60e51b8152600401610809906020808252600490820152634d31323360e01b604082015260600190565b505050565b60008281526003602052604090205461205f906c01431e0fae6d7217caa000000090613d17565b612076826c01431e0fae6d7217caa0000000613ed5565b6000848152600360205260409020546120a4907065f537c675815d9ccdfa7c534fbb224839603a1b90613ec1565b6120c2907065f537c675815d9ccdfa7c534fbb224839603a1b613ed5565b6120cc919061404b565b6120d6919061404b565b6000838152600360209081526040918290209290925580518481529182018390527f86780397f7caa7c8f95178b8088dece6299722a706b3acca977dd807d9b30f7b9101610874565b612128816116b2565b61215d5760405162461bcd60e51b81526004016108099060208082526004908201526309a6260760e31b604082015260600190565b60008181526003602052604090205461219090750e264589a4dcdab14c696963c7eed2dd19410e0b29f9604a1b90614077565b60009182526003602052604090912055565b81518351146121dc5760405162461bcd60e51b815260040161080990602080825260049082015263229c181b60e11b604082015260600190565b60068351106122165760405162461bcd60e51b8152600401610809906020808252600490820152634d31323760e01b604082015260600190565b6000846001600160601b0316116122585760405162461bcd60e51b8152600401610809906020808252600490820152632698981960e11b604082015260600190565b6001600160a01b03811660009081526006602052604090205460ff166122a95760405162461bcd60e51b8152600401610809906020808252600490820152632698981b60e11b604082015260600190565b8615612344576122bb42610e1061404b565b8665ffffffffffff16116122fa5760405162461bcd60e51b815260040161080990602080825260049082015263134c4ccd60e21b604082015260600190565b846001600160601b0316846001600160601b0316116123445760405162461bcd60e51b8152600401610809906020808252600490820152634d31303360e01b604082015260600190565b50505050505050565b6000805b825181101561253757336001600160a01b031683828151811061237657612376613e6f565b60200260200101516001600160a01b0316636352211e86848151811061239e5761239e613e6f565b60200260200101516040518263ffffffff1660e01b81526004016123c491815260200190565b602060405180830381865afa1580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124059190613dbb565b6001600160a01b03161461242b5760405162461bcd60e51b815260040161080990613e85565b82818151811061243d5761243d613e6f565b602090810291909101015160405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa158015612493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b79190613d2b565b6124d35760405162461bcd60e51b815260040161080990613ea3565b600760008483815181106124e9576124e9613e6f565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615801561251b575081155b1561252557600191505b8061252f81613e25565b915050612351565b5092915050565b6000816001600160601b0316836001600160601b03166c01431e0fae6d7217caa000000061256c9190613ed5565b61259265ffffffffffff87167065f537c675815d9ccdfa7c534fbb224839603a1b613ed5565b6125b5887502d4744eba92922375aeaead8e62f6f9050d02cf086560491b613ed5565b6125d890759ba4fcea157d659e4887874997430f8015cb9a7acdb3604a1b61404b565b6125e2919061404b565b6125ec919061404b565b6125f6919061404b565b95945050505050565b6000828152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561267957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161265b575b505050918352505060038201546001600160a01b03908116602083015260049092015490911660409091015290506126b083611708565b80156126ba575081155b1561274d576126c883611910565b156126fe5760405162461bcd60e51b8152600401610809906020808252600490820152634d31313160e01b604082015260600190565b6000838152600460205260409020546001600160a01b0316331461274d5760405162461bcd60e51b8152600401610809906020808252600490820152632698989960e11b604082015260600190565b60608101516001600160a01b03166127a05761276883610752565b3410156120335760405162461bcd60e51b815260040161080990602080825260049082015263134c4c4d60e21b604082015260600190565b6127a983610752565b6060820151604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa1580156127f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281d919061405e565b10156120335760405162461bcd60e51b8152600401610809906020808252600490820152634d31313560e01b604082015260600190565b600061286083836131ba565b9050600061286e848461323e565b905060008161287d8486614077565b6128879190614077565b6000868152600360205260409020600401549091506128b19086906001600160a01b031683613501565b60408051848152602081018490529081018290527fcfe457ea910ad7b996f6fb1065ddec0ea7fc6a16148fdf8fb437073ac4bfcd7f90606001610fa4565b6000818152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561296957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161294b575b505050918352505060038201546001600160a01b039081166020830152600490920154909116604090910152905060006129a283610880565b905060005b826040015151811015612c165782608001516001600160a01b0316836040015182815181106129d8576129d8613e6f565b60200260200101516001600160a01b0316636352211e848481518110612a0057612a00613e6f565b60200260200101516040518263ffffffff1660e01b8152600401612a2691815260200190565b602060405180830381865afa158015612a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a679190613dbb565b6001600160a01b031614612a8d5760405162461bcd60e51b815260040161080990613e85565b82604001518181518110612aa357612aa3613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa158015612aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b239190613d2b565b612b3f5760405162461bcd60e51b815260040161080990613ea3565b82604001518181518110612b5557612b55613e6f565b60200260200101516001600160a01b031663b88d4fde846080015133858581518110612b8357612b83613e6f565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152608060648201526000608482015260a401600060405180830381600087803b158015612beb57600080fd5b505af1158015612bff573d6000803e3d6000fd5b505050508080612c0e90613e25565b9150506129a7565b50505050565b6000838152600360209081526040808320815160a08101835281548152600182015481850152600282018054845181870281018701865281815292959394860193830182828015612c9657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c78575b505050918352505060038201546001600160a01b0390811660208301526004909201549091166040909101529050612ccd84611708565b8015612cd7575082155b15612d6d57612ce584611910565b15612d1b5760405162461bcd60e51b8152600401610809906020808252600490820152634d31313160e01b604082015260600190565b6000848152600460205260409020546001600160a01b03838116911614612d6d5760405162461bcd60e51b8152600401610809906020808252600490820152632698989960e11b604082015260600190565b60608101516001600160a01b0316612dc557612d8884610752565b341015612dc05760405162461bcd60e51b815260040161080990602080825260049082015263134c4c4d60e21b604082015260600190565b612c16565b612dce84610752565b6060820151604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015612e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e42919061405e565b1015612c165760405162461bcd60e51b8152600401610809906020808252600490820152634d31313560e01b604082015260600190565b6000828152600360209081526040808320815160a08101835281548152600182015481850152600282018054845181870281018701865281815292959394860193830182828015612ef357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612ed5575b505050918352505060038201546001600160a01b03908116602083015260049092015490911660409091015290506000612f2c84610880565b905060005b8260400151518110156131b35782608001516001600160a01b031683604001518281518110612f6257612f62613e6f565b60200260200101516001600160a01b0316636352211e848481518110612f8a57612f8a613e6f565b60200260200101516040518263ffffffff1660e01b8152600401612fb091815260200190565b602060405180830381865afa158015612fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff19190613dbb565b6001600160a01b0316146130175760405162461bcd60e51b815260040161080990613e85565b8260400151818151811061302d5761302d613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa158015613089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ad9190613d2b565b6130c95760405162461bcd60e51b815260040161080990613ea3565b826040015181815181106130df576130df613e6f565b60200260200101516001600160a01b031663b88d4fde84608001518685858151811061310d5761310d613e6f565b60200260200101516040518463ffffffff1660e01b815260040161316e939291906001600160a01b0393841681529190921660208201526040810191909152608060608201819052600490820152634d31333560e01b60a082015260c00190565b600060405180830381600087803b15801561318857600080fd5b505af115801561319c573d6000803e3d6000fd5b5050505080806131ab90613e25565b915050612f31565b5050505050565b60006103e8600a54836131cd9190613ed5565b6131d79190613ec1565b6009549091506131f29084906001600160a01b031683613501565b600954604080516001600160a01b039092168252602082018390527f7f16a2217b9c8f2f607c1b34d23b08768d256a767230d179b61c1c290095f832910160405180910390a192915050565b60008281526003602090815260408083206002018054825181850281018501909352808352849383018282801561329e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613280575b5050505050905060008151846132b49190613ec1565b905060005b82518110156134f85760008382815181106132d6576132d6613e6f565b602002602001015190506000816001600160a01b03166333df048e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613320573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613344919061405e565b11156134e55760006103e8826001600160a01b03166333df048e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561338d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b1919061405e565b6133bb9086613ed5565b6133c59190613ec1565b905061343388836001600160a01b031663d5f394886040518163ffffffff1660e01b8152600401602060405180830381865afa158015613409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061342d9190613dbb565b83613501565b61343d818761404b565b95507f7f16a2217b9c8f2f607c1b34d23b08768d256a767230d179b61c1c290095f832826001600160a01b031663d5f394886040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c29190613dbb565b604080516001600160a01b039092168252602082018490520160405180910390a1505b50806134f081613e25565b9150506132b9565b50505092915050565b600083815260036020819052604090912001546001600160a01b03166135ad576000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461356e576040519150601f19603f3d011682016040523d82523d6000602084013e613573565b606091505b5050905080612c165760405162461bcd60e51b8152600401610809906020808252600490820152634d31313760e01b604082015260600190565b600083815260036020819052604091829020015490516323b872dd60e01b81523360048201526001600160a01b03848116602483015260448201849052909116906323b872dd906064016020604051808303816000875af1158015613616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363a9190613d2b565b6120335760405162461bcd60e51b815260040161080990613d48565b8280548282559060005260206000209081019282156136ab579160200282015b828111156136ab57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613676565b506136b79291506136bb565b5090565b5b808211156136b757600081556001016136bc565b6000602082840312156136e257600080fd5b5035919050565b6001600160a01b038116811461149257600080fd5b8035613709816136e9565b919050565b801515811461149257600080fd5b80356137098161370e565b6000806040838503121561373a57600080fd5b8235613745816136e9565b915060208301356137558161370e565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156137985783518352928401929184019160010161377c565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137e3576137e36137a4565b604052919050565b600082601f8301126137fc57600080fd5b813567ffffffffffffffff811115613816576138166137a4565b613829601f8201601f19166020016137ba565b81815284602083860101111561383e57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561387057600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561389557600080fd5b6138a1868287016137eb565b9150509250925092565b6020808252825182820181905260009190848201906040850190845b818110156137985783516001600160a01b0316835292840192918401916001016138c7565b803565ffffffffffff8116811461370957600080fd5b80356001600160601b038116811461370957600080fd5b600067ffffffffffffffff821115613933576139336137a4565b5060051b60200190565b600082601f83011261394e57600080fd5b8135602061396361395e83613919565b6137ba565b82815260059290921b8401810191818101908684111561398257600080fd5b8286015b8481101561399d5780358352918301918301613986565b509695505050505050565b600082601f8301126139b957600080fd5b813560206139c961395e83613919565b82815260059290921b840181019181810190868411156139e857600080fd5b8286015b8481101561399d5780356139ff816136e9565b83529183019183016139ec565b600080600080600080600080610100898b031215613a2957600080fd5b613a328961371c565b9750613a4060208a016138ec565b9650613a4e60408a01613902565b9550613a5c60608a01613902565b9450608089013567ffffffffffffffff80821115613a7957600080fd5b613a858c838d0161393d565b955060a08b0135915080821115613a9b57600080fd5b613aa78c838d016139a8565b9450613ab560c08c016136fe565b935060e08b0135915080821115613acb57600080fd5b50613ad88b828c016137eb565b9150509295985092959890939650565b600080600060608486031215613afd57600080fd5b833592506020840135613b0f8161370e565b9150604084013567ffffffffffffffff81111561389557600080fd5b6000815180845260005b81811015613b5157602081850181015186830182015201613b35565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611d516020830184613b2b565b600060208284031215613b9657600080fd5b8135611d51816136e9565b600080600080600080600060c0888a031215613bbc57600080fd5b873596506020880135613bce816136e9565b95506040880135613bde8161370e565b9450606088013567ffffffffffffffff80821115613bfb57600080fd5b613c078b838c016137eb565b955060808a0135945060a08a0135915080821115613c2457600080fd5b818a0191508a601f830112613c3857600080fd5b813581811115613c4757600080fd5b8b6020828501011115613c5957600080fd5b60208301945080935050505092959891949750929550565b60008060408385031215613c8457600080fd5b823591506020830135613755816136e9565b600060208284031215613ca857600080fd5b813567ffffffffffffffff811115613cbf57600080fd5b613ccb8482850161393d565b949350505050565b60008060408385031215613ce657600080fd5b8235613cf1816136e9565b91506020830135613755816136e9565b634e487b7160e01b600052601260045260246000fd5b600082613d2657613d26613d01565b500690565b600060208284031215613d3d57600080fd5b8151611d518161370e565b60208082526004908201526304d3132360e41b604082015260600190565b6020808252600490820152634d31313360e01b604082015260600190565b60018060a01b0385168152836020820152826040820152608060608201526000613db16080830184613b2b565b9695505050505050565b600060208284031215613dcd57600080fd5b8151611d51816136e9565b6020808252600490820152634d31333360e01b604082015260600190565b828152604060208201526000613ccb6040830184613b2b565b634e487b7160e01b600052601160045260246000fd5b600060018201613e3757613e37613e0f565b5060010190565b838152606060208201526000613e576060830185613b2b565b905060018060a01b0383166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b6020808252600490820152634534313360e01b604082015260600190565b60208082526004908201526309a6262760e31b604082015260600190565b600082613ed057613ed0613d01565b500490565b808202811582820484141761077957610779613e0f565b600181815b80851115613f27578160001904821115613f0d57613f0d613e0f565b80851615613f1a57918102915b93841c9390800290613ef1565b509250929050565b600082613f3e57506001610779565b81613f4b57506000610779565b8160018114613f615760028114613f6b57613f87565b6001915050610779565b60ff841115613f7c57613f7c613e0f565b50506001821b610779565b5060208310610133831016604e8410600b8410161715613faa575081810a610779565b613fb48383613eec565b8060001904821115613fc857613fc8613e0f565b029392505050565b6000611d518383613f2f565b8481526001600160a01b03841660208201528215156040820152608060608201819052600090613db190830184613b2b565b84815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b8082018082111561077957610779613e0f565b60006020828403121561407057600080fd5b5051919050565b8181038181111561077957610779613e0f56fea26469706673582212208b92f701e8a7f0fa4fabb279648eb9ffa468792ed84782e9eaa72b93e25ed1a064736f6c634300081100330000000000000000000000002588965c3a09d0b50948ed2635e6e53ec7d790b9
Deployed Bytecode
0x6080604052600436106102045760003560e01c8063746f62da116101185780639c623683116100a0578063b003dd861161006f578063b003dd86146106c7578063bec02acc146106e7578063d171cd1f146106fd578063f5d40e9c1461071d578063f8ac93e81461073d57600080fd5b80639c623683146106375780639d5e0f6b14610657578063a5d7c10a14610687578063ab057b24146106a757600080fd5b80638704f2a3116100e75780638704f2a3146105945780639067b677146105b4578063920e3ef6146105d457806397fb9279146105e757806398a133d01461060757600080fd5b8063746f62da146104cd5780637f21d4981461050657806382afd23b1461052657806382b992d11461054657600080fd5b806341e2ddd81161019b5780635a6ababa1161016a5780635a6ababa1461040d57806360febc8c1461042d57806361a769001461044d5780636477b8621461046d5780636656d7361461048d57600080fd5b806341e2ddd814610397578063440d431e146103b757806344d9bc59146103ca5780634b1c9952146103f757600080fd5b8063300a0109116101d7578063300a01091461030a57806331a472b21461032a578063379cb5a81461034a57806338f081f81461036a57600080fd5b806308f33bc8146102095780630ff4c9161461028d57806329542a87146102bb5780632e7cea3b146102dd575b600080fd5b34801561021557600080fd5b506102596102243660046136d0565b600360208190526000918252604090912080546001820154928201546004909201549092916001600160a01b03908116911684565b6040805194855260208501939093526001600160a01b03918216928401929092521660608201526080015b60405180910390f35b34801561029957600080fd5b506102ad6102a83660046136d0565b610752565b604051908152602001610284565b3480156102c757600080fd5b506102db6102d6366004613727565b61077f565b005b3480156102e957600080fd5b506102fd6102f83660046136d0565b610880565b6040516102849190613760565b34801561031657600080fd5b506102db61032536600461385b565b61089e565b34801561033657600080fd5b506102db6103453660046136d0565b610a60565b34801561035657600080fd5b506102db6103653660046136d0565b610b49565b34801561037657600080fd5b5061038a6103853660046136d0565b610c5d565b60405161028491906138ab565b3480156103a357600080fd5b506102db6103b2366004613a0c565b610ccc565b6102db6103c5366004613ae8565b610e44565b3480156103d657600080fd5b506103ea6103e53660046136d0565b610fb3565b6040516102849190613b71565b34801561040357600080fd5b506102ad600a5481565b34801561041957600080fd5b506102db610428366004613b84565b611256565b34801561043957600080fd5b506102db610448366004613b84565b611341565b34801561045957600080fd5b506102fd6104683660046136d0565b611495565b34801561047957600080fd5b506102db610488366004613727565b611586565b34801561049957600080fd5b506104bd6104a8366004613b84565b60076020526000908152604090205460ff1681565b6040519015158152602001610284565b3480156104d957600080fd5b506104bd6104e8366004613b84565b6001600160a01b031660009081526006602052604090205460ff1690565b34801561051257600080fd5b506102ad6105213660046136d0565b61167f565b34801561053257600080fd5b506104bd6105413660046136d0565b6116b2565b34801561055257600080fd5b5061057c6105613660046136d0565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610284565b3480156105a057600080fd5b506104bd6105af3660046136d0565b611708565b3480156105c057600080fd5b506102ad6105cf3660046136d0565b61173e565b6102db6105e2366004613ba1565b611775565b3480156105f357600080fd5b506104bd6106023660046136d0565b611910565b34801561061357600080fd5b506104bd610622366004613b84565b60066020526000908152604090205460ff1681565b34801561064357600080fd5b506102db610652366004613c71565b611963565b34801561066357600080fd5b506104bd6106723660046136d0565b60056020526000908152604090205460ff1681565b34801561069357600080fd5b506102db6106a23660046136d0565b611b38565b3480156106b357600080fd5b5060095461057c906001600160a01b031681565b3480156106d357600080fd5b506102ad6106e2366004613c96565b611c33565b3480156106f357600080fd5b506102ad60025481565b34801561070957600080fd5b506102ad610718366004613cd3565b611cc6565b34801561072957600080fd5b506102db610738366004613b84565b611d58565b34801561074957600080fd5b506102db611e17565b600081815260036020526040812054610779906c01431e0fae6d7217caa000000090613d17565b92915050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af11580156107c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ed9190613d2b565b6108125760405162461bcd60e51b815260040161080990613d48565b60405180910390fd5b6001600160a01b038216600081815260076020908152604091829020805460ff191685151590811790915582519384523391840191909152908201527fac558f7f1b991d3041da3d99df606555a86818181515e3c63f7494a886c8b1c4906060015b60405180910390a15050565b60008181526003602052604090206001015460609061077990611495565b826108a8816116b2565b6108c45760405162461bcd60e51b815260040161080990613d66565b600084815260056020526040902054849060ff1615156001148061096857506000805482825260036020526040918290206004908101549251633da1c0c360e01b81526001600160a01b0393841691810191909152911690633da1c0c3906024016020604051808303816000875af1158015610944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109689190613d2b565b61099d5760405162461bcd60e51b8152600401610809906020808252600490820152634d31303160e01b604082015260600190565b846109a781611708565b6109dc5760405162461bcd60e51b81526004016108099060208082526004908201526304d3131360e41b604082015260600190565b6109e68686611f45565b6109f08686611fd3565b6109fa8686612038565b6000868152600460205260409081902080546001600160a01b0319163390811790915590517f90a79438af598e17758907b92be3d0720d36c54a546dddf5d51449a6b71590ba91610a5091899089908990613d84565b60405180910390a1505050505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af1158015610aaa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace9190613d2b565b610aea5760405162461bcd60e51b815260040161080990613d48565b80610af4816116b2565b610b105760405162461bcd60e51b815260040161080990613d66565b610b198261211f565b6040518281527fc28b4aed030bfacc245c0501326e1beb8c0ef0d60e4edc21067fdeb52da2a7aa90602001610874565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015610b92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb69190613dbb565b6001600160a01b0316336001600160a01b031614610be65760405162461bcd60e51b815260040161080990613dd8565b6103e8811115610c215760405162461bcd60e51b8152600401610809906020808252600490820152634d31303960e01b604082015260600190565b600a8190556040518181527f5e1be4f61873c5f31430ca05087ce5163449753ebf46ee14b8e73d5ca0fd616d906020015b60405180910390a150565b600081815260036020908152604091829020600201805483518184028101840190945280845260609392830182828015610cc057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610ca2575b50505050509050919050565b610cdb888888888888886121a2565b6000610ce7858561234d565b905080610d0b576002546000908152600560205260409020805460ff191660011790555b6040518060a00160405280610d338b610d25576000610d28565b60015b60ff168b8b8b61253e565b8152602001610d4187611c33565b8152602001858152602001846001600160a01b03168152602001336001600160a01b031681525060036000600254815260200190815260200160002060008201518160000155602082015181600101556040820151816002019080519060200190610dad929190613656565b5060608201516003820180546001600160a01b03199081166001600160a01b03938416179091556080909301516004909201805490931691161790556002546040517f749779d59ba16d7101daa300a293261d1f3e9fb8c21c94b3400676dff2853c7891610e1c918590613df6565b60405180910390a160028054906000610e3483613e25565b9190505550505050505050505050565b82610e4e816116b2565b610e6a5760405162461bcd60e51b815260040161080990613d66565b600084815260056020526040902054849060ff16151560011480610f0e57506000805482825260036020526040918290206004908101549251633da1c0c360e01b81526001600160a01b0393841691810191909152911690633da1c0c3906024016020604051808303816000875af1158015610eea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0e9190613d2b565b610f435760405162461bcd60e51b8152600401610809906020808252600490820152634d31303160e01b604082015260600190565b610f4d85856125ff565b610f568561211f565b610f6885610f6387610752565b612854565b610f71856128ef565b7f3ee363331f5a31fd1065b3e3e953efc486b2e0219f8a0beb22ab1d403c7f0394858433604051610fa493929190613e3e565b60405180910390a15050505050565b606081610fbf816116b2565b610fdb5760405162461bcd60e51b815260040161080990613d66565b6000838152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561105557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611037575b505050918352505060038201546001600160a01b0390811660208301526004909201549091166040909101529050600061108e85610880565b905060005b82604001515181101561123d5782608001516001600160a01b0316836040015182815181106110c4576110c4613e6f565b60200260200101516001600160a01b0316636352211e8484815181106110ec576110ec613e6f565b60200260200101516040518263ffffffff1660e01b815260040161111291815260200190565b602060405180830381865afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111539190613dbb565b6001600160a01b0316146111795760405162461bcd60e51b815260040161080990613e85565b8260400151818151811061118f5761118f613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa1580156111eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061120f9190613d2b565b61122b5760405162461bcd60e51b815260040161080990613ea3565b8061123581613e25565b915050611093565b5050604080516020810190915260008152949350505050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c39190613dbb565b6001600160a01b0316336001600160a01b0316146112f35760405162461bcd60e51b815260040161080990613dd8565b600980546001600160a01b0319166001600160a01b0383169081179091556040519081527fc6bbd7d74968be5628d4b58738837bf02a3770f9c5366f132bbf8524123ca0ea90602001610c52565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa15801561138a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ae9190613dbb565b6001600160a01b0316336001600160a01b0316146113de5760405162461bcd60e51b815260040161080990613dd8565b600154604051632210724360e11b81526001600160a01b03838116600483015290911690634420e486906024016020604051808303816000875af115801561142a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144e9190613d2b565b6114925760405162461bcd60e51b81526020600482015260156024820152744572726f72207265676973746572696e67206b657960581b6044820152606401610809565b50565b6060600066038d7ea4c680006114c47546bf5bb0385045767e0f0ef2e7aa1e517e454637d1dd604b1b85613ec1565b6114ce9190613d17565b90508067ffffffffffffffff8111156114e9576114e96137a4565b604051908082528060200260200182016040528015611512578160200160208202803683370190505b50915060005b8181101561157f5766038d7ea4c6800061153382600f613ed5565b61153e90600a613fd0565b6115489086613ec1565b6115529190613d17565b83828151811061156457611564613e6f565b602090810291909101015261157881613e25565b9050611518565b5050919050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f39190613dbb565b6001600160a01b0316336001600160a01b0316146116235760405162461bcd60e51b815260040161080990613dd8565b6001600160a01b038216600081815260066020908152604091829020805460ff19168515159081179091558251938452908301527f3a0328c228c4de35601eca18a96ae5ec86e27fa97d91d41de9993fb588338cea9101610874565b6000818152600360205260408120546c01431e0fae6d7217caa0000000906116a8908290613ec1565b6107799190613d17565b600081815260036020526040812054600a906116e890750e264589a4dcdab14c696963c7eed2dd19410e0b29f9604a1b90613ec1565b6116f29190613d17565b600114611700576000610779565b600192915050565b600081815260036020526040812054600a906116e8907502d4744eba92922375aeaead8e62f6f9050d02cf086560491b90613ec1565b60008181526003602052604081205466038d7ea4c68000906116a8907065f537c675815d9ccdfa7c534fbb224839603a1b90613ec1565b8661177f816116b2565b61179b5760405162461bcd60e51b815260040161080990613d66565b878787876040516020016117b29493929190613fdc565b60408051601f198184030181529082905280516020909101206001546303784b1960e61b835290918691869186916000916001600160a01b039091169063de12c6409061180990889088908890889060040161400e565b6020604051808303816000875af1158015611828573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184c9190613d2b565b90508061189b5760405162461bcd60e51b815260206004820152601a60248201527f4661696c656420746f20766572696679207369676e61747572650000000000006044820152606401610809565b6118a68d8c8e612c1c565b6118af8d61211f565b6118bc8d610f638f610752565b6118c68d8d612e79565b7fbbccc1013329f1c90566ebc070eb4ce3e2ec7617aa3c5c46e8022117be4a76c48d8b8e6040516118f993929190613e3e565b60405180910390a150505050505050505050505050565b60008161191c81611708565b6119515760405162461bcd60e51b81526004016108099060208082526004908201526304d3131360e41b604082015260600190565b4261195b8461173e565b119392505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af11580156119ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d19190613d2b565b6119ed5760405162461bcd60e51b815260040161080990613d48565b600082815260046020908152604080832054600392839052908320909101548291611a24916001600160a01b039182169116611cc6565b60008581526003602081905260409091200154611a4b9085906001600160a01b0316611cc6565b9150915081611a598561167f565b11611a8f5760405162461bcd60e51b8152600401610809906020808252600490820152634d31323960e01b604082015260600190565b80611a998561167f565b1115611ad05760405162461bcd60e51b81526004016108099060208082526004908201526304d3133360e41b604082015260600190565b60008481526004602090815260409182902080546001600160a01b0319166001600160a01b0387169081179091558251878152918201527f86a3d1ae2fcc062138c4a9c046aa437954430ac76396112c6c1aa34c35fa7b23910160405180910390a150505050565b600054604051637d379c9b60e11b81523360048201526001600160a01b039091169063fa6f3936906024016020604051808303816000875af1158015611b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba69190613d2b565b611bc25760405162461bcd60e51b815260040161080990613d48565b80611bcc816116b2565b611be85760405162461bcd60e51b815260040161080990613d66565b60008281526005602052604090819020805460ff19166001179055517f6f78fd1caac12eab2d3b9b01e740cafd178d3caadcaffa76b103881a24f13501906108749084815260200190565b6000805b8251811015611c9657611c4b81600f613ed5565b611c5690600a613fd0565b838281518110611c6857611c68613e6f565b6020026020010151611c7a9190613ed5565b611c84908361404b565b9150611c8f81613e25565b9050611c37565b508151611cbc907546bf5bb0385045767e0f0ef2e7aa1e517e454637d1dd604b1b613ed5565b610779908261404b565b60006001600160a01b038216611ce757506001600160a01b03821631610779565b6040516370a0823160e01b81526001600160a01b0384811660048301528316906370a0823190602401602060405180830381865afa158015611d2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d51919061405e565b9392505050565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015611da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dc59190613dbb565b6001600160a01b0316336001600160a01b031614611df55760405162461bcd60e51b815260040161080990613dd8565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600854604051632afc8b5b60e11b8152600360048201526001600160a01b03909116906355f916b690602401602060405180830381865afa158015611e60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e849190613dbb565b6001600160a01b0316336001600160a01b031614611eb45760405162461bcd60e51b815260040161080990613dd8565b600854604051632afc8b5b60e11b8152600060048201819052916001600160a01b0316906355f916b690602401602060405180830381865afa158015611efe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f229190613dbb565b600080546001600160a01b0319166001600160a01b039290921691909117905550565b600081118015611f5c575080611f5a8361167f565b105b611f915760405162461bcd60e51b8152600401610809906020808252600490820152634d31323160e01b604082015260600190565b611f9a82611910565b611fcf5760405162461bcd60e51b8152600401610809906020808252600490820152634d31303760e01b604082015260600190565b5050565b600082815260036020819052604082200154611ff99033906001600160a01b0316611cc6565b90508082106120335760405162461bcd60e51b8152600401610809906020808252600490820152634d31323360e01b604082015260600190565b505050565b60008281526003602052604090205461205f906c01431e0fae6d7217caa000000090613d17565b612076826c01431e0fae6d7217caa0000000613ed5565b6000848152600360205260409020546120a4907065f537c675815d9ccdfa7c534fbb224839603a1b90613ec1565b6120c2907065f537c675815d9ccdfa7c534fbb224839603a1b613ed5565b6120cc919061404b565b6120d6919061404b565b6000838152600360209081526040918290209290925580518481529182018390527f86780397f7caa7c8f95178b8088dece6299722a706b3acca977dd807d9b30f7b9101610874565b612128816116b2565b61215d5760405162461bcd60e51b81526004016108099060208082526004908201526309a6260760e31b604082015260600190565b60008181526003602052604090205461219090750e264589a4dcdab14c696963c7eed2dd19410e0b29f9604a1b90614077565b60009182526003602052604090912055565b81518351146121dc5760405162461bcd60e51b815260040161080990602080825260049082015263229c181b60e11b604082015260600190565b60068351106122165760405162461bcd60e51b8152600401610809906020808252600490820152634d31323760e01b604082015260600190565b6000846001600160601b0316116122585760405162461bcd60e51b8152600401610809906020808252600490820152632698981960e11b604082015260600190565b6001600160a01b03811660009081526006602052604090205460ff166122a95760405162461bcd60e51b8152600401610809906020808252600490820152632698981b60e11b604082015260600190565b8615612344576122bb42610e1061404b565b8665ffffffffffff16116122fa5760405162461bcd60e51b815260040161080990602080825260049082015263134c4ccd60e21b604082015260600190565b846001600160601b0316846001600160601b0316116123445760405162461bcd60e51b8152600401610809906020808252600490820152634d31303360e01b604082015260600190565b50505050505050565b6000805b825181101561253757336001600160a01b031683828151811061237657612376613e6f565b60200260200101516001600160a01b0316636352211e86848151811061239e5761239e613e6f565b60200260200101516040518263ffffffff1660e01b81526004016123c491815260200190565b602060405180830381865afa1580156123e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124059190613dbb565b6001600160a01b03161461242b5760405162461bcd60e51b815260040161080990613e85565b82818151811061243d5761243d613e6f565b602090810291909101015160405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c590604401602060405180830381865afa158015612493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b79190613d2b565b6124d35760405162461bcd60e51b815260040161080990613ea3565b600760008483815181106124e9576124e9613e6f565b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615801561251b575081155b1561252557600191505b8061252f81613e25565b915050612351565b5092915050565b6000816001600160601b0316836001600160601b03166c01431e0fae6d7217caa000000061256c9190613ed5565b61259265ffffffffffff87167065f537c675815d9ccdfa7c534fbb224839603a1b613ed5565b6125b5887502d4744eba92922375aeaead8e62f6f9050d02cf086560491b613ed5565b6125d890759ba4fcea157d659e4887874997430f8015cb9a7acdb3604a1b61404b565b6125e2919061404b565b6125ec919061404b565b6125f6919061404b565b95945050505050565b6000828152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561267957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161265b575b505050918352505060038201546001600160a01b03908116602083015260049092015490911660409091015290506126b083611708565b80156126ba575081155b1561274d576126c883611910565b156126fe5760405162461bcd60e51b8152600401610809906020808252600490820152634d31313160e01b604082015260600190565b6000838152600460205260409020546001600160a01b0316331461274d5760405162461bcd60e51b8152600401610809906020808252600490820152632698989960e11b604082015260600190565b60608101516001600160a01b03166127a05761276883610752565b3410156120335760405162461bcd60e51b815260040161080990602080825260049082015263134c4c4d60e21b604082015260600190565b6127a983610752565b6060820151604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa1580156127f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281d919061405e565b10156120335760405162461bcd60e51b8152600401610809906020808252600490820152634d31313560e01b604082015260600190565b600061286083836131ba565b9050600061286e848461323e565b905060008161287d8486614077565b6128879190614077565b6000868152600360205260409020600401549091506128b19086906001600160a01b031683613501565b60408051848152602081018490529081018290527fcfe457ea910ad7b996f6fb1065ddec0ea7fc6a16148fdf8fb437073ac4bfcd7f90606001610fa4565b6000818152600360209081526040808320815160a0810183528154815260018201548185015260028201805484518187028101870186528181529295939486019383018282801561296957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161294b575b505050918352505060038201546001600160a01b039081166020830152600490920154909116604090910152905060006129a283610880565b905060005b826040015151811015612c165782608001516001600160a01b0316836040015182815181106129d8576129d8613e6f565b60200260200101516001600160a01b0316636352211e848481518110612a0057612a00613e6f565b60200260200101516040518263ffffffff1660e01b8152600401612a2691815260200190565b602060405180830381865afa158015612a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a679190613dbb565b6001600160a01b031614612a8d5760405162461bcd60e51b815260040161080990613e85565b82604001518181518110612aa357612aa3613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa158015612aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b239190613d2b565b612b3f5760405162461bcd60e51b815260040161080990613ea3565b82604001518181518110612b5557612b55613e6f565b60200260200101516001600160a01b031663b88d4fde846080015133858581518110612b8357612b83613e6f565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152608060648201526000608482015260a401600060405180830381600087803b158015612beb57600080fd5b505af1158015612bff573d6000803e3d6000fd5b505050508080612c0e90613e25565b9150506129a7565b50505050565b6000838152600360209081526040808320815160a08101835281548152600182015481850152600282018054845181870281018701865281815292959394860193830182828015612c9657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c78575b505050918352505060038201546001600160a01b0390811660208301526004909201549091166040909101529050612ccd84611708565b8015612cd7575082155b15612d6d57612ce584611910565b15612d1b5760405162461bcd60e51b8152600401610809906020808252600490820152634d31313160e01b604082015260600190565b6000848152600460205260409020546001600160a01b03838116911614612d6d5760405162461bcd60e51b8152600401610809906020808252600490820152632698989960e11b604082015260600190565b60608101516001600160a01b0316612dc557612d8884610752565b341015612dc05760405162461bcd60e51b815260040161080990602080825260049082015263134c4c4d60e21b604082015260600190565b612c16565b612dce84610752565b6060820151604051636eb1769f60e11b81523360048201523060248201526001600160a01b039091169063dd62ed3e90604401602060405180830381865afa158015612e1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e42919061405e565b1015612c165760405162461bcd60e51b8152600401610809906020808252600490820152634d31313560e01b604082015260600190565b6000828152600360209081526040808320815160a08101835281548152600182015481850152600282018054845181870281018701865281815292959394860193830182828015612ef357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612ed5575b505050918352505060038201546001600160a01b03908116602083015260049092015490911660409091015290506000612f2c84610880565b905060005b8260400151518110156131b35782608001516001600160a01b031683604001518281518110612f6257612f62613e6f565b60200260200101516001600160a01b0316636352211e848481518110612f8a57612f8a613e6f565b60200260200101516040518263ffffffff1660e01b8152600401612fb091815260200190565b602060405180830381865afa158015612fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ff19190613dbb565b6001600160a01b0316146130175760405162461bcd60e51b815260040161080990613e85565b8260400151818151811061302d5761302d613e6f565b6020908102919091010151608084015160405163e985e9c560e01b81526001600160a01b03918216600482015230602482015291169063e985e9c590604401602060405180830381865afa158015613089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ad9190613d2b565b6130c95760405162461bcd60e51b815260040161080990613ea3565b826040015181815181106130df576130df613e6f565b60200260200101516001600160a01b031663b88d4fde84608001518685858151811061310d5761310d613e6f565b60200260200101516040518463ffffffff1660e01b815260040161316e939291906001600160a01b0393841681529190921660208201526040810191909152608060608201819052600490820152634d31333560e01b60a082015260c00190565b600060405180830381600087803b15801561318857600080fd5b505af115801561319c573d6000803e3d6000fd5b5050505080806131ab90613e25565b915050612f31565b5050505050565b60006103e8600a54836131cd9190613ed5565b6131d79190613ec1565b6009549091506131f29084906001600160a01b031683613501565b600954604080516001600160a01b039092168252602082018390527f7f16a2217b9c8f2f607c1b34d23b08768d256a767230d179b61c1c290095f832910160405180910390a192915050565b60008281526003602090815260408083206002018054825181850281018501909352808352849383018282801561329e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613280575b5050505050905060008151846132b49190613ec1565b905060005b82518110156134f85760008382815181106132d6576132d6613e6f565b602002602001015190506000816001600160a01b03166333df048e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613320573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613344919061405e565b11156134e55760006103e8826001600160a01b03166333df048e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561338d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b1919061405e565b6133bb9086613ed5565b6133c59190613ec1565b905061343388836001600160a01b031663d5f394886040518163ffffffff1660e01b8152600401602060405180830381865afa158015613409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061342d9190613dbb565b83613501565b61343d818761404b565b95507f7f16a2217b9c8f2f607c1b34d23b08768d256a767230d179b61c1c290095f832826001600160a01b031663d5f394886040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c29190613dbb565b604080516001600160a01b039092168252602082018490520160405180910390a1505b50806134f081613e25565b9150506132b9565b50505092915050565b600083815260036020819052604090912001546001600160a01b03166135ad576000826001600160a01b03168260405160006040518083038185875af1925050503d806000811461356e576040519150601f19603f3d011682016040523d82523d6000602084013e613573565b606091505b5050905080612c165760405162461bcd60e51b8152600401610809906020808252600490820152634d31313760e01b604082015260600190565b600083815260036020819052604091829020015490516323b872dd60e01b81523360048201526001600160a01b03848116602483015260448201849052909116906323b872dd906064016020604051808303816000875af1158015613616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363a9190613d2b565b6120335760405162461bcd60e51b815260040161080990613d48565b8280548282559060005260206000209081019282156136ab579160200282015b828111156136ab57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613676565b506136b79291506136bb565b5090565b5b808211156136b757600081556001016136bc565b6000602082840312156136e257600080fd5b5035919050565b6001600160a01b038116811461149257600080fd5b8035613709816136e9565b919050565b801515811461149257600080fd5b80356137098161370e565b6000806040838503121561373a57600080fd5b8235613745816136e9565b915060208301356137558161370e565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156137985783518352928401929184019160010161377c565b50909695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137e3576137e36137a4565b604052919050565b600082601f8301126137fc57600080fd5b813567ffffffffffffffff811115613816576138166137a4565b613829601f8201601f19166020016137ba565b81815284602083860101111561383e57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561387057600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561389557600080fd5b6138a1868287016137eb565b9150509250925092565b6020808252825182820181905260009190848201906040850190845b818110156137985783516001600160a01b0316835292840192918401916001016138c7565b803565ffffffffffff8116811461370957600080fd5b80356001600160601b038116811461370957600080fd5b600067ffffffffffffffff821115613933576139336137a4565b5060051b60200190565b600082601f83011261394e57600080fd5b8135602061396361395e83613919565b6137ba565b82815260059290921b8401810191818101908684111561398257600080fd5b8286015b8481101561399d5780358352918301918301613986565b509695505050505050565b600082601f8301126139b957600080fd5b813560206139c961395e83613919565b82815260059290921b840181019181810190868411156139e857600080fd5b8286015b8481101561399d5780356139ff816136e9565b83529183019183016139ec565b600080600080600080600080610100898b031215613a2957600080fd5b613a328961371c565b9750613a4060208a016138ec565b9650613a4e60408a01613902565b9550613a5c60608a01613902565b9450608089013567ffffffffffffffff80821115613a7957600080fd5b613a858c838d0161393d565b955060a08b0135915080821115613a9b57600080fd5b613aa78c838d016139a8565b9450613ab560c08c016136fe565b935060e08b0135915080821115613acb57600080fd5b50613ad88b828c016137eb565b9150509295985092959890939650565b600080600060608486031215613afd57600080fd5b833592506020840135613b0f8161370e565b9150604084013567ffffffffffffffff81111561389557600080fd5b6000815180845260005b81811015613b5157602081850181015186830182015201613b35565b506000602082860101526020601f19601f83011685010191505092915050565b602081526000611d516020830184613b2b565b600060208284031215613b9657600080fd5b8135611d51816136e9565b600080600080600080600060c0888a031215613bbc57600080fd5b873596506020880135613bce816136e9565b95506040880135613bde8161370e565b9450606088013567ffffffffffffffff80821115613bfb57600080fd5b613c078b838c016137eb565b955060808a0135945060a08a0135915080821115613c2457600080fd5b818a0191508a601f830112613c3857600080fd5b813581811115613c4757600080fd5b8b6020828501011115613c5957600080fd5b60208301945080935050505092959891949750929550565b60008060408385031215613c8457600080fd5b823591506020830135613755816136e9565b600060208284031215613ca857600080fd5b813567ffffffffffffffff811115613cbf57600080fd5b613ccb8482850161393d565b949350505050565b60008060408385031215613ce657600080fd5b8235613cf1816136e9565b91506020830135613755816136e9565b634e487b7160e01b600052601260045260246000fd5b600082613d2657613d26613d01565b500690565b600060208284031215613d3d57600080fd5b8151611d518161370e565b60208082526004908201526304d3132360e41b604082015260600190565b6020808252600490820152634d31313360e01b604082015260600190565b60018060a01b0385168152836020820152826040820152608060608201526000613db16080830184613b2b565b9695505050505050565b600060208284031215613dcd57600080fd5b8151611d51816136e9565b6020808252600490820152634d31333360e01b604082015260600190565b828152604060208201526000613ccb6040830184613b2b565b634e487b7160e01b600052601160045260246000fd5b600060018201613e3757613e37613e0f565b5060010190565b838152606060208201526000613e576060830185613b2b565b905060018060a01b0383166040830152949350505050565b634e487b7160e01b600052603260045260246000fd5b6020808252600490820152634534313360e01b604082015260600190565b60208082526004908201526309a6262760e31b604082015260600190565b600082613ed057613ed0613d01565b500490565b808202811582820484141761077957610779613e0f565b600181815b80851115613f27578160001904821115613f0d57613f0d613e0f565b80851615613f1a57918102915b93841c9390800290613ef1565b509250929050565b600082613f3e57506001610779565b81613f4b57506000610779565b8160018114613f615760028114613f6b57613f87565b6001915050610779565b60ff841115613f7c57613f7c613e0f565b50506001821b610779565b5060208310610133831016604e8410600b8410161715613faa575081810a610779565b613fb48383613eec565b8060001904821115613fc857613fc8613e0f565b029392505050565b6000611d518383613f2f565b8481526001600160a01b03841660208201528215156040820152608060608201819052600090613db190830184613b2b565b84815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b8082018082111561077957610779613e0f565b60006020828403121561407057600080fd5b5051919050565b8181038181111561077957610779613e0f56fea26469706673582212208b92f701e8a7f0fa4fabb279648eb9ffa468792ed84782e9eaa72b93e25ed1a064736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002588965c3a09d0b50948ed2635e6e53ec7d790b9
-----Decoded View---------------
Arg [0] : module_ (address): 0x2588965C3a09D0b50948Ed2635E6E53EC7D790b9
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002588965c3a09d0b50948ed2635e6e53ec7d790b9
Deployed Bytecode Sourcemap
2180:27475:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2506:43;;;;;;;;;;-1:-1:-1;2506:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2506:43:0;;;;;;;;;;;430:25:1;;;486:2;471:18;;464:34;;;;-1:-1:-1;;;;;572:15:1;;;552:18;;;545:43;;;;624:15;619:2;604:18;;597:43;417:3;402:19;2506:43:0;;;;;;;;27938:112;;;;;;;;;;-1:-1:-1;27938:112:0;;;;;:::i;:::-;;:::i;:::-;;;797:25:1;;;785:2;770:18;27938:112:0;651:177:1;23509:191:0;;;;;;;;;;-1:-1:-1;23509:191:0;;;;;:::i;:::-;;:::i;:::-;;28199:137;;;;;;;;;;-1:-1:-1;28199:137:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18237:396::-;;;;;;;;;;-1:-1:-1;18237:396:0;;;;;:::i;:::-;;:::i;24783:161::-;;;;;;;;;;-1:-1:-1;24783:161:0;;;;;:::i;:::-;;:::i;26374:174::-;;;;;;;;;;-1:-1:-1;26374:174:0;;;;;:::i;:::-;;:::i;29502:148::-;;;;;;;;;;-1:-1:-1;29502:148:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14104:785::-;;;;;;;;;;-1:-1:-1;14104:785:0;;;;;:::i;:::-;;:::i;16746:382::-;;;;;;:::i;:::-;;:::i;8487:517::-;;;;;;;;;;-1:-1:-1;8487:517:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3214:24::-;;;;;;;;;;;;;;;;26124:138;;;;;;;;;;-1:-1:-1;26124:138:0;;;;;:::i;:::-;;:::i;7917:157::-;;;;;;;;;;-1:-1:-1;7917:157:0;;;;;:::i;:::-;;:::i;22910:265::-;;;;;;;;;;-1:-1:-1;22910:265:0;;;;;:::i;:::-;;:::i;25105:172::-;;;;;;;;;;-1:-1:-1;25105:172:0;;;;;:::i;:::-;;:::i;2923:46::-;;;;;;;;;;-1:-1:-1;2923:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9172:14:1;;9165:22;9147:41;;9135:2;9120:18;2923:46:0;9007:187:1;28824:103:0;;;;;;;;;;-1:-1:-1;28824:103:0;;;;;:::i;:::-;-1:-1:-1;;;;;28903:18:0;28883:4;28903:18;;;:10;:18;;;;;;;;;28824:103;27679:122;;;;;;;;;;-1:-1:-1;27679:122:0;;;;;:::i;:::-;;:::i;26855:141::-;;;;;;;;;;-1:-1:-1;26855:141:0;;;;;:::i;:::-;;:::i;2608:49::-;;;;;;;;;;-1:-1:-1;2608:49:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2608:49:0;;;;;;-1:-1:-1;;;;;9363:32:1;;;9345:51;;9333:2;9318:18;2608:49:0;9199:203:1;27137:142:0;;;;;;;;;;-1:-1:-1;27137:142:0;;;;;:::i;:::-;;:::i;27418:123::-;;;;;;;;;;-1:-1:-1;27418:123:0;;;;;:::i;:::-;;:::i;11018:571::-;;;;;;:::i;:::-;;:::i;28492:155::-;;;;;;;;;;-1:-1:-1;28492:155:0;;;;;:::i;:::-;;:::i;2822:42::-;;;;;;;;;;-1:-1:-1;2822:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25477:539;;;;;;;;;;-1:-1:-1;25477:539:0;;;;;:::i;:::-;;:::i;2716:46::-;;;;;;;;;;-1:-1:-1;2716:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;23820:164;;;;;;;;;;-1:-1:-1;23820:164:0;;;;;:::i;:::-;;:::i;3123:25::-;;;;;;;;;;-1:-1:-1;3123:25:0;;;;-1:-1:-1;;;;;3123:25:0;;;22472:207;;;;;;;;;;-1:-1:-1;22472:207:0;;;;;:::i;:::-;;:::i;2430:26::-;;;;;;;;;;;;;;;;29135:241;;;;;;;;;;-1:-1:-1;29135:241:0;;;;;:::i;:::-;;:::i;8229:161::-;;;;;;;;;;-1:-1:-1;8229:161:0;;;;;:::i;:::-;;:::i;7449:136::-;;;;;;;;;;;;;:::i;27938:112::-;27992:4;28012:20;;;:10;:20;;;;;:25;:32;;28040:4;;28012:32;:::i;:::-;28005:39;27938:112;-1:-1:-1;;27938:112:0:o;23509:191::-;6403:13;;:37;;-1:-1:-1;;;6403:37:0;;6429:10;6403:37;;;9345:51:1;-1:-1:-1;;;;;6403:13:0;;;;:25;;9318:18:1;;6403:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6395:54;;;;-1:-1:-1;;;6395:54:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;23595:23:0;::::1;;::::0;;;:14:::1;:23;::::0;;;;;;;;:36;;-1:-1:-1;;23595:36:0::1;::::0;::::1;;::::0;;::::1;::::0;;;23643:51;;12743:34:1;;;23671:10:0::1;12793:18:1::0;;;12786:43;;;;12845:18;;;12838:50;23643:51:0::1;::::0;12693:2:1;12678:18;23643:51:0::1;;;;;;;;23509:191:::0;;:::o;28199:137::-;28300:20;;;;:10;:20;;;;;:29;;;28263:13;;28293:37;;:6;:37::i;18237:396::-;18336:8;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1;;;6256:35:0;;;;;;;:::i;:::-;5954:24:::1;::::0;;;:14:::1;:24;::::0;;;;;18365:8;;5954:24:::1;;:32;;:24:::0;:32:::1;::::0;5953:105:::1;;-1:-1:-1::0;6000:13:0::1;::::0;;6029:20;;;:10:::1;:20;::::0;;;;;;:27:::1;::::0;;::::1;::::0;6000:57;;-1:-1:-1;;;6000:57:0;;-1:-1:-1;;;;;6029:27:0;;::::1;6000:57:::0;;::::1;9345:51:1::0;;;;6000:13:0;::::1;::::0;:28:::1;::::0;9318:18:1;;6000:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5937:143;;;;-1:-1:-1::0;;;5937:143:0::1;;;;;;13433:2:1::0;13415:21;;;13472:1;13452:18;;;13445:29;-1:-1:-1;;;13505:2:1;13490:18;;13483:34;13549:2;13534:18;;13231:327;5937:143:0::1;18388:8:::2;6641:19;6651:8;6641:9;:19::i;:::-;6633:36;;;;-1:-1:-1::0;;;6633:36:0::2;;;;;;13765:2:1::0;13747:21;;;13804:1;13784:18;;;13777:29;-1:-1:-1;;;13837:2:1;13822:18;;13815:34;13881:2;13866:18;;13563:327;6633:36:0::2;18406::::3;18425:8;18435:6;18406:18;:36::i;:::-;18449:38;18470:8;18480:6;18449:20;:38::i;:::-;18494:27;18504:8;18514:6;18494:9;:27::i;:::-;18528:24;::::0;;;:14:::3;:24;::::0;;;;;;:37;;-1:-1:-1;;;;;;18528:37:0::3;18555:10;18528:37:::0;;::::3;::::0;;;18577:50;;::::3;::::0;::::3;::::0;18543:8;;18616:6;;18624:2;;18577:50:::3;:::i;:::-;;;;;;;;6087:1:::2;6298::::1;18237:396:::0;;;;:::o;24783:161::-;6403:13;;:37;;-1:-1:-1;;;6403:37:0;;6429:10;6403:37;;;9345:51:1;-1:-1:-1;;;;;6403:13:0;;;;:25;;9318:18:1;;6403:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6395:54;;;;-1:-1:-1;;;6395:54:0;;;;;;;:::i;:::-;24863:8:::1;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1::0;;;6256:35:0::1;;;;;;;:::i;:::-;24881:21:::2;24893:8;24881:11;:21::i;:::-;24914:24;::::0;797:25:1;;;24914:24:0::2;::::0;785:2:1;770:18;24914:24:0::2;651:177:1::0;26374:174:0;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;26467:4:::1;26459:6;:12;;26451:28;;;;-1:-1:-1::0;;;26451:28:0::1;;;;;;15341:2:1::0;15323:21;;;15380:1;15360:18;;;15353:29;-1:-1:-1;;;15413:2:1;15398:18;;15391:34;15457:2;15442:18;;15139:327;26451:28:0::1;26486:12;:21:::0;;;26519:23:::1;::::0;797:25:1;;;26519:23:0::1;::::0;785:2:1;770:18;26519:23:0::1;;;;;;;;26374:174:::0;:::o;29502:148::-;29604:20;;;;:10;:20;;;;;;;;;:40;;29597:47;;;;;;;;;;;;;;;;;29573:16;;29597:47;;;29604:40;29597:47;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29597:47:0;;;;;;;;;;;;;;;;;;;;;;;29502:148;;;:::o;14104:785::-;14364:108;14386:10;14398:8;14408:7;14417:6;14425:9;14436:20;14458:13;14364:21;:108::i;:::-;14479:16;14498:51;14517:9;14528:20;14498:18;:51::i;:::-;14479:70;;14561:11;14556:52;;14589:11;;14574:27;;;;:14;:27;;;;;:34;;-1:-1:-1;;14574:34:0;14604:4;14574:34;;;14556:52;14641:174;;;;;;;;14655:57;14666:10;:18;;14683:1;14666:18;;;14679:1;14666:18;14655:57;;14686:8;14696:7;14705:6;14655:10;:57::i;:::-;14641:174;;;;14721:17;14728:9;14721:6;:17::i;:::-;14641:174;;;;14747:20;14641:174;;;;14776:13;-1:-1:-1;;;;;14641:174:0;;;;;14798:10;-1:-1:-1;;;;;14641:174:0;;;;14615:10;:23;14626:11;;14615:23;;;;;;;;;;;:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;14615:200:0;;;;;;;;;-1:-1:-1;;;;;;14615:200:0;;;-1:-1:-1;;;;;14615:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;14840:11;;14827:36;;;;;;14853:9;;14827:36;:::i;:::-;;;;;;;;14870:11;:13;;;:11;:13;;;:::i;:::-;;;;;;14357:532;14104:785;;;;;;;;:::o;16746:382::-;16856:8;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1;;;6256:35:0;;;;;;;:::i;:::-;5954:24:::1;::::0;;;:14:::1;:24;::::0;;;;;16885:8;;5954:24:::1;;:32;;:24:::0;:32:::1;::::0;5953:105:::1;;-1:-1:-1::0;6000:13:0::1;::::0;;6029:20;;;:10:::1;:20;::::0;;;;;;:27:::1;::::0;;::::1;::::0;6000:57;;-1:-1:-1;;;6000:57:0;;-1:-1:-1;;;;;6029:27:0;;::::1;6000:57:::0;;::::1;9345:51:1::0;;;;6000:13:0;::::1;::::0;:28:::1;::::0;9318:18:1;;6000:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5937:143;;;;-1:-1:-1::0;;;5937:143:0::1;;;;;;13433:2:1::0;13415:21;;;13472:1;13452:18;;;13445:29;-1:-1:-1;;;13505:2:1;13490:18;;13483:34;13549:2;13534:18;;13231:327;5937:143:0::1;16902:40:::2;16921:8;16931:10;16902:18;:40::i;:::-;16949:21;16961:8;16949:11;:21::i;:::-;16977:40;16989:8;16998:18;17007:8;16998;:18::i;:::-;16977:11;:40::i;:::-;17034:28;17053:8;17034:18;:28::i;:::-;17074:48;17090:8;17100:9;17111:10;17074:48;;;;;;;;:::i;:::-;;;;;;;;6298:1:::1;16746:382:::0;;;;:::o;8487:517::-;8577:13;8546:8;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1;;;6256:35:0;;;;;;;:::i;:::-;8599:18:::1;8620:20:::0;;;:10:::1;:20;::::0;;;;;;;8599:41;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;8620:20;;8599:41;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;8599:41:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;;8599:41:0;;;-1:-1:-1;;8599:41:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;8599:41:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;8599:41:0::1;8672:28;8691:8:::0;8672:18:::1;:28::i;:::-;8647:53;;8712:9;8707:276;8727:5;:25;;;:32;8723:1;:36;8707:276;;;8845:5;:12;;;-1:-1:-1::0;;;;;8783:74:0::1;8791:5;:25;;;8817:1;8791:28;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;8783:45:0::1;;8829:8;8838:1;8829:11;;;;;;;;:::i;:::-;;;;;;;8783:58;;;;;;;;;;;;;797:25:1::0;;785:2;770:18;;651:177;8783:58:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8783:74:0::1;;8775:91;;;;-1:-1:-1::0;;;8775:91:0::1;;;;;;;:::i;:::-;8891:5;:25;;;8917:1;8891:28;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;8938:12:::1;::::0;::::1;::::0;8883:83:::1;::::0;-1:-1:-1;;;8883:83:0;;-1:-1:-1;;;;;17126:15:1;;;8883:83:0::1;::::0;::::1;17108:34:1::0;8960:4:0::1;17158:18:1::0;;;17151:43;8883:54:0;::::1;::::0;::::1;::::0;17043:18:1;;8883:83:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8875:100;;;;-1:-1:-1::0;;;8875:100:0::1;;;;;;;:::i;:::-;8761:3:::0;::::1;::::0;::::1;:::i;:::-;;;;8707:276;;;-1:-1:-1::0;;8989:9:0::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;8989:9:0;;;8487:517;-1:-1:-1;;;;8487:517:0:o;26124:138::-;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;26200:10:::1;:21:::0;;-1:-1:-1;;;;;;26200:21:0::1;-1:-1:-1::0;;;;;26200:21:0;::::1;::::0;;::::1;::::0;;;26233:23:::1;::::0;9345:51:1;;;26233:23:0::1;::::0;9333:2:1;9318:18;26233:23:0::1;9199:203:1::0;7917:157:0;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;8007:15:::1;::::0;:35:::1;::::0;-1:-1:-1;;;8007:35:0;;-1:-1:-1;;;;;9363:32:1;;;8007:35:0::1;::::0;::::1;9345:51:1::0;8007:15:0;;::::1;::::0;:24:::1;::::0;9318:18:1;;8007:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7999:69;;;::::0;-1:-1:-1;;;7999:69:0;;17739:2:1;7999:69:0::1;::::0;::::1;17721:21:1::0;17778:2;17758:18;;;17751:30;-1:-1:-1;;;17797:18:1;;;17790:51;17858:18;;7999:69:0::1;17537:345:1::0;7999:69:0::1;7917:157:::0;:::o;22910:265::-;22962:22;22992:11;23026:4;23007:15;-1:-1:-1;;;23007:8:0;:15;:::i;:::-;23006:24;;;;:::i;:::-;22992:38;;23059:6;23048:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23048:18:0;;23037:29;;23079:6;23074:96;23091:6;23087:1;:10;23074:96;;;23157:4;23146:6;:1;23150:2;23146:6;:::i;:::-;23139:14;;:2;:14;:::i;:::-;23127:27;;:8;:27;:::i;:::-;:34;;;;:::i;:::-;23112:8;23121:1;23112:11;;;;;;;;:::i;:::-;;;;;;;;;;:50;23099:3;;;:::i;:::-;;;23074:96;;;;22985:190;22910:265;;;:::o;25105:172::-;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25194:18:0;::::1;;::::0;;;:10:::1;:18;::::0;;;;;;;;:31;;-1:-1:-1;;25194:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;;25237:34;;19727:51:1;;;19794:18;;;19787:50;25237:34:0::1;::::0;19700:18:1;25237:34:0::1;19559:284:1::0;27679:122:0;27734:4;27755:20;;;:10;:20;;;;;:25;27791:4;;27755:32;;27791:4;;27755:32;:::i;:::-;27754:41;;;;:::i;26855:141::-;26909:4;26931:20;;;:10;:20;;;;;:25;26967:2;;26931:32;;-1:-1:-1;;;26959:4:0;26931:32;:::i;:::-;26930:39;;;;:::i;:::-;26974:1;26929:46;:61;;26985:5;26929:61;;;26978:4;26922:68;26855:141;-1:-1:-1;;26855:141:0:o;27137:142::-;27192:4;27214:20;;;:10;:20;;;;;:25;27250:2;;27214:32;;-1:-1:-1;;;27242:4:0;27214:32;:::i;27418:123::-;27474:4;27495:20;;;:10;:20;;;;;:25;27531:4;;27495:32;;-1:-1:-1;;;27523:4:0;27495:32;:::i;11018:571::-;11227:8;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1;;;6256:35:0;;;;;;;:::i;:::-;11273:8:::1;11283:6;11291:10;11303:9;11262:51;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;11262:51:0;;::::1;::::0;;;;;;;11252:62;;11262:51:::1;11252:62:::0;;::::1;::::0;7006:15:::1;::::0;-1:-1:-1;;;7006:49:0;;11252:62;;11316:6;;11324:10;;;;6991:12:::1;::::0;-1:-1:-1;;;;;7006:15:0;;::::1;::::0;:22:::1;::::0;:49:::1;::::0;11252:62;;11316:6;;11324:10;;;;7006:49:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6991:64;;7070:7;7062:46;;;::::0;-1:-1:-1;;;7062:46:0;;21064:2:1;7062:46:0::1;::::0;::::1;21046:21:1::0;21103:2;21083:18;;;21076:30;21142:28;21122:18;;;21115:56;21188:18;;7062:46:0::1;20862:350:1::0;7062:46:0::1;11346:53:::2;11370:8;11380:10;11392:6;11346:23;:53::i;:::-;11406:21;11418:8;11406:11;:21::i;:::-;11434:41;11446:8;11456:18;11465:8;11456;:18::i;11434:41::-;11482;11506:8;11516:6;11482:23;:41::i;:::-;11535:48;11555:8;11565:9;11576:6;11535:48;;;;;;;;:::i;:::-;;;;;;;;6984:138:::1;6298:1;;;;11018:571:::0;;;;;;;;:::o;28492:155::-;28583:4;28564:8;6641:19;6651:8;6641:9;:19::i;:::-;6633:36;;;;-1:-1:-1;;;6633:36:0;;;;;;13765:2:1;13747:21;;;13804:1;13784:18;;;13777:29;-1:-1:-1;;;13837:2:1;13822:18;;13815:34;13881:2;13866:18;;13563:327;6633:36:0;28626:15:::1;28603:20;28614:8;28603:10;:20::i;:::-;:38;::::0;28492:155;-1:-1:-1;;;28492:155:0:o;25477:539::-;6403:13;;:37;;-1:-1:-1;;;6403:37:0;;6429:10;6403:37;;;9345:51:1;-1:-1:-1;;;;;6403:13:0;;;;:25;;9318:18:1;;6403:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6395:54;;;;-1:-1:-1;;;6395:54:0;;;;;;;:::i;:::-;25563:24:::1;25653::::0;;;:14:::1;:24;::::0;;;;;;;;25679:10:::1;:20:::0;;;;;;;:33;;::::1;::::0;25563:24;;25636:77:::1;::::0;-1:-1:-1;;;;;25653:24:0;;::::1;::::0;25679:33:::1;25636:16;:77::i;:::-;25753:20;::::0;;;:10:::1;:20;::::0;;;;;;;:33:::1;::::0;25724:63:::1;::::0;25741:10;;-1:-1:-1;;;;;25753:33:0::1;25724:16;:63::i;:::-;25562:234;;;;25833:16;25811:19;25821:8;25811:9;:19::i;:::-;:38;25803:54;;;;-1:-1:-1::0;;;25803:54:0::1;;;;;;21419:2:1::0;21401:21;;;21458:1;21438:18;;;21431:29;-1:-1:-1;;;21491:2:1;21476:18;;21469:34;21535:2;21520:18;;21217:327;25803:54:0::1;25895:16;25872:19;25882:8;25872:9;:19::i;:::-;:39;;25864:55;;;;-1:-1:-1::0;;;25864:55:0::1;;;;;;21751:2:1::0;21733:21;;;21790:1;21770:18;;;21763:29;-1:-1:-1;;;21823:2:1;21808:18;;21801:34;21867:2;21852:18;;21549:327;25864:55:0::1;25926:24;::::0;;;:14:::1;:24;::::0;;;;;;;;:37;;-1:-1:-1;;;;;;25926:37:0::1;-1:-1:-1::0;;;;;25926:37:0;::::1;::::0;;::::1;::::0;;;25975:35;;22055:25:1;;;22096:18;;;22089:60;25975:35:0::1;::::0;22028:18:1;25975:35:0::1;;;;;;;25555:461;;25477:539:::0;;:::o;23820:164::-;6403:13;;:37;;-1:-1:-1;;;6403:37:0;;6429:10;6403:37;;;9345:51:1;-1:-1:-1;;;;;6403:13:0;;;;:25;;9318:18:1;;6403:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6395:54;;;;-1:-1:-1;;;6395:54:0;;;;;;;:::i;:::-;23895:8:::1;6264:18;6273:8;6264;:18::i;:::-;6256:35;;;;-1:-1:-1::0;;;6256:35:0::1;;;;;;;:::i;:::-;23912:24:::2;::::0;;;:14:::2;:24;::::0;;;;;;:31;;-1:-1:-1;;23912:31:0::2;23939:4;23912:31;::::0;;23955:23;::::2;::::0;::::2;::::0;23927:8;797:25:1;;785:2;770:18;;651:177;22472:207:0;22531:11;22556:6;22551:89;22568:6;:13;22564:1;:17;22551:89;;;22624:6;:1;22628:2;22624:6;:::i;:::-;22617:14;;:2;:14;:::i;:::-;22604:6;22611:1;22604:9;;;;;;;;:::i;:::-;;;;;;;:28;;;;:::i;:::-;22597:35;;;;:::i;:::-;;-1:-1:-1;22583:3:0;;;:::i;:::-;;;22551:89;;;-1:-1:-1;22653:13:0;;:20;;-1:-1:-1;;;22653:20:0;:::i;:::-;22646:27;;;;:::i;29135:241::-;29219:12;-1:-1:-1;;;;;29244:27:0;;29240:130;;-1:-1:-1;;;;;;29290:21:0;;;29240:130;;;29333:37;;-1:-1:-1;;;29333:37:0;;-1:-1:-1;;;;;9363:32:1;;;29333:37:0;;;9345:51:1;29333:31:0;;;;;9318:18:1;;29333:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29323:47;29135:241;-1:-1:-1;;;29135:241:0:o;8229:161::-;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;8325:15:::1;:59:::0;;-1:-1:-1;;;;;;8325:59:0::1;-1:-1:-1::0;;;;;8325:59:0;;;::::1;::::0;;;::::1;::::0;;8229:161::o;7449:136::-;6804:13;;:26;;-1:-1:-1;;;6804:26:0;;6828:1;6804:26;;;797:25:1;-1:-1:-1;;;;;6804:13:0;;;;:23;;770:18:1;;6804:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6790:40:0;:10;-1:-1:-1;;;;;6790:40:0;;6782:57;;;;-1:-1:-1;;;6782:57:0;;;;;;;:::i;:::-;7517:13:::1;::::0;:26:::1;::::0;-1:-1:-1;;;7517:26:0;;7501:13:::1;7517:26;::::0;::::1;797:25:1::0;;;7501:13:0;-1:-1:-1;;;;;7517:13:0::1;::::0;:23:::1;::::0;770:18:1;;7517:26:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7550:13;:29:::0;;-1:-1:-1;;;;;;7550:29:0::1;-1:-1:-1::0;;;;;7550:29:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;7449:136:0:o;17478:204::-;17579:1;17570:6;:10;17569:46;;;;;17608:6;17586:19;17596:8;17586:9;:19::i;:::-;:28;17569:46;17561:63;;;;-1:-1:-1;;;17561:63:0;;;;;;22871:2:1;22853:21;;;22910:1;22890:18;;;22883:29;-1:-1:-1;;;22943:2:1;22928:18;;22921:34;22987:2;22972:18;;22669:327;17561:63:0;17639:29;17659:8;17639:19;:29::i;:::-;17631:45;;;;-1:-1:-1;;;17631:45:0;;;;;;23203:2:1;23185:21;;;23242:1;23222:18;;;23215:29;-1:-1:-1;;;23275:2:1;23260:18;;23253:34;23319:2;23304:18;;23001:327;17631:45:0;17478:204;;:::o;17878:209::-;17963:12;18007:20;;;:10;:20;;;;;;;:33;;17978:63;;17995:10;;-1:-1:-1;;;;;18007:33:0;17978:16;:63::i;:::-;17963:78;;18065:7;18056:6;:16;18048:33;;;;-1:-1:-1;;;18048:33:0;;;;;;23535:2:1;23517:21;;;23574:1;23554:18;;;23547:29;-1:-1:-1;;;23607:2:1;23592:18;;23585:34;23651:2;23636:18;;23333:327;18048:33:0;17956:131;17878:209;;:::o;24433:229::-;24586:20;;;;:10;:20;;;;;:25;:32;;24614:4;;24586:32;:::i;:::-;24570:11;:4;24577;24570:11;:::i;:::-;24524:20;;;;:10;:20;;;;;:25;:32;;-1:-1:-1;;;24552:4:0;24524:32;:::i;:::-;24523:41;;-1:-1:-1;;;24523:41:0;:::i;:::-;24522:60;;;;:::i;:::-;:97;;;;:::i;:::-;24494:20;;;;:10;:20;;;;;;;;;:125;;;;24631:25;;23839::1;;;23880:18;;;23873:34;;;24631:25:0;;23812:18:1;24631:25:0;23665:248:1;24104:166:0;24165:18;24174:8;24165;:18::i;:::-;24157:34;;;;-1:-1:-1;;;24157:34:0;;;;;;24120:2:1;24102:21;;;24159:1;24139:18;;;24132:29;-1:-1:-1;;;24192:2:1;24177:18;;24170:34;24236:2;24221:18;;23918:327;24157:34:0;24226:20;;;;:10;:20;;;;;:25;:38;;-1:-1:-1;;;24255:8:0;24226:38;:::i;:::-;24198:20;;;;:10;:20;;;;;;:66;24104:166::o;12299:579::-;12577:20;:27;12557:9;:16;:47;12548:66;;;;-1:-1:-1;;;12548:66:0;;;;;;24585:2:1;24567:21;;;24624:1;24604:18;;;24597:29;-1:-1:-1;;;24657:2:1;24642:18;;24635:34;24701:2;24686:18;;24383:327;12548:66:0;12648:1;12629:9;:16;:20;12621:36;;;;-1:-1:-1;;;12621:36:0;;;;;;24917:2:1;24899:21;;;24956:1;24936:18;;;24929:29;-1:-1:-1;;;24989:2:1;24974:18;;24967:34;25033:2;25018:18;;24715:327;12621:36:0;12681:1;12672:6;-1:-1:-1;;;;;12672:10:0;;12664:27;;;;-1:-1:-1;;;12664:27:0;;;;;;25249:2:1;25231:21;;;25288:1;25268:18;;;25261:29;-1:-1:-1;;;25321:2:1;25306:18;;25299:34;25365:2;25350:18;;25047:327;12664:27:0;-1:-1:-1;;;;;28903:18:0;;28883:4;28903:18;;;:10;:18;;;;;;;;12698:44;;;;-1:-1:-1;;;12698:44:0;;;;;;25581:2:1;25563:21;;;25620:1;25600:18;;;25593:29;-1:-1:-1;;;25653:2:1;25638:18;;25631:34;25697:2;25682:18;;25379:327;12698:44:0;12753:10;12749:123;;;12792:22;:15;12810:4;12792:22;:::i;:::-;12781:8;:33;;;12773:49;;;;-1:-1:-1;;;12773:49:0;;;;;;25913:2:1;25895:21;;;25952:1;25932:18;;;25925:29;-1:-1:-1;;;25985:2:1;25970:18;;25963:34;26029:2;26014:18;;25711:327;12773:49:0;12848:7;-1:-1:-1;;;;;12839:16:0;:6;-1:-1:-1;;;;;12839:16:0;;12831:33;;;;-1:-1:-1;;;12831:33:0;;;;;;26245:2:1;26227:21;;;26284:1;26264:18;;;26257:29;-1:-1:-1;;;26317:2:1;26302:18;;26295:34;26361:2;26346:18;;26043:327;12831:33:0;12299:579;;;;;;;:::o;13156:474::-;13274:9;13297;13292:333;13312:20;:27;13308:1;:31;13292:333;;;13421:10;-1:-1:-1;;;;;13363:68:0;13371:20;13392:1;13371:23;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;13363:40:0;;13404:9;13414:1;13404:12;;;;;;;;:::i;:::-;;;;;;;13363:54;;;;;;;;;;;;;797:25:1;;785:2;770:18;;651:177;13363:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;13363:68:0;;13355:85;;;;-1:-1:-1;;;13355:85:0;;;;;;;:::i;:::-;13465:20;13486:1;13465:23;;;;;;;;:::i;:::-;;;;;;;;;;;13457:76;;-1:-1:-1;;;13457:76:0;;13507:10;13457:76;;;17108:34:1;13527:4:0;17158:18:1;;;17151:43;-1:-1:-1;;;;;13457:49:0;;;;;;17043:18:1;;13457:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13449:93;;;;-1:-1:-1;;;13449:93:0;;;;;;;:::i;:::-;13556:14;:39;13571:20;13592:1;13571:23;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;13556:39:0;;;;;;;;;;;-1:-1:-1;13556:39:0;;;;13555:40;:49;;;;;13600:4;13599:5;13555:49;13551:66;;;13613:4;13606:11;;13551:66;13341:3;;;;:::i;:::-;;;;13292:333;;;;13156:474;;;;:::o;21967:309::-;22097:16;22263:6;-1:-1:-1;;;;;22136:134:0;22240:4;-1:-1:-1;;;;;22235:10:0;22249:8;22235:23;;;;:::i;:::-;22203:27;:14;;;-1:-1:-1;;;22203:27:0;:::i;:::-;22175:23;:10;-1:-1:-1;;;22175:23:0;:::i;:::-;22136:63;;-1:-1:-1;;;22136:63:0;:::i;:::-;:95;;;;:::i;:::-;:123;;;;:::i;:::-;:134;;;;:::i;:::-;22122:148;21967:309;-1:-1:-1;;;;;21967:309:0:o;15260:539::-;15344:18;15365:20;;;:10;:20;;;;;;;;15344:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15365:20;;15344:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15344:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;15344:41:0;;;-1:-1:-1;;15344:41:0;;;;-1:-1:-1;;;;;15344:41:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15396:19:0;15406:8;15396:9;:19::i;:::-;:34;;;;;15420:10;15419:11;15396:34;15392:168;;;15450:29;15470:8;15450:19;:29::i;:::-;15449:30;15441:47;;;;-1:-1:-1;;;15441:47:0;;;;;;26577:2:1;26559:21;;;26616:1;26596:18;;;26589:29;-1:-1:-1;;;26649:2:1;26634:18;;26627:34;26693:2;26678:18;;26375:327;15441:47:0;15519:24;;;;:14;:24;;;;;;-1:-1:-1;;;;;15519:24:0;15505:10;:38;15497:55;;;;-1:-1:-1;;;15497:55:0;;;;;;26909:2:1;26891:21;;;26948:1;26928:18;;;26921:29;-1:-1:-1;;;26981:2:1;26966:18;;26959:34;27025:2;27010:18;;26707:327;15497:55:0;15570:18;;;;-1:-1:-1;;;;;15570:32:0;15566:228;;15634:18;15643:8;15634;:18::i;:::-;15621:9;:31;;15613:48;;;;-1:-1:-1;;;15613:48:0;;;;;;27241:2:1;27223:21;;;27280:1;27260:18;;;27253:29;-1:-1:-1;;;27313:2:1;27298:18;;27291:34;27357:2;27342:18;;27039:327;15566:228:0;15760:18;15769:8;15760;:18::i;:::-;15699;;;;15692:64;;-1:-1:-1;;;15692:64:0;;15729:10;15692:64;;;17108:34:1;15749:4:0;17158:18:1;;;17151:43;-1:-1:-1;;;;;15692:36:0;;;;;;17043:18:1;;15692:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:86;;15684:102;;;;-1:-1:-1;;;15684:102:0;;;;;;27573:2:1;27555:21;;;27612:1;27592:18;;;27585:29;-1:-1:-1;;;27645:2:1;27630:18;;27623:34;27689:2;27674:18;;27371:327;20955:446:0;21027:23;21053:37;21074:8;21083:6;21053:20;:37::i;:::-;21027:63;;21097:27;21127:41;21152:8;21161:6;21127:24;:41::i;:::-;21097:71;-1:-1:-1;21175:21:0;21097:71;21199:24;21208:15;21199:6;:24;:::i;:::-;:46;;;;:::i;:::-;21273:20;;;;:10;:20;;;;;:27;;;21175:70;;-1:-1:-1;21252:65:0;;21263:8;;-1:-1:-1;;;;;21273:27:0;21175:70;21252:10;:65::i;:::-;21329:66;;;27905:25:1;;;27961:2;27946:18;;27939:34;;;27989:18;;;27982:34;;;21329:66:0;;27893:2:1;27878:18;21329:66:0;27703:319:1;15912:575:0;15975:18;15996:20;;;:10;:20;;;;;;;;15975:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15996:20;;15975:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15975:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;15975:41:0;;;-1:-1:-1;;15975:41:0;;;;-1:-1:-1;;;;;15975:41:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15975:41:0;16054:28;16073:8;16054:18;:28::i;:::-;16023:59;;16094:9;16089:393;16113:5;:25;;;:32;16109:1;:36;16089:393;;;16234:5;:12;;;-1:-1:-1;;;;;16169:77:0;16177:5;:25;;;16203:1;16177:28;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;16169:45:0;;16215:11;16227:1;16215:14;;;;;;;;:::i;:::-;;;;;;;16169:61;;;;;;;;;;;;;797:25:1;;785:2;770:18;;651:177;16169:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;16169:77:0;;16161:95;;;;-1:-1:-1;;;16161:95:0;;;;;;;:::i;:::-;16281:5;:25;;;16307:1;16281:28;;;;;;;;:::i;:::-;;;;;;;;;;;16328:12;;;;16273:83;;-1:-1:-1;;;16273:83:0;;-1:-1:-1;;;;;17126:15:1;;;16273:83:0;;;17108:34:1;16350:4:0;17158:18:1;;;17151:43;16273:54:0;;;;;17043:18:1;;16273:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16265:100;;;;-1:-1:-1;;;16265:100:0;;;;;;;:::i;:::-;16382:5;:25;;;16408:1;16382:28;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;16374:54:0;;16429:5;:12;;;16443:10;16455:11;16467:1;16455:14;;;;;;;;:::i;:::-;;;;;;;;;;;16374:100;;-1:-1:-1;;;;;;16374:100:0;;;;;;;-1:-1:-1;;;;;28350:15:1;;;16374:100:0;;;28332:34:1;28402:15;;;;28382:18;;;28375:43;28434:18;;;28427:34;28497:3;28477:18;;;28470:31;-1:-1:-1;28517:19:1;;;28510:30;28557:19;;16374:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16147:3;;;;;:::i;:::-;;;;16089:393;;;;15968:519;;15912:575;:::o;9259:556::-;9364:18;9385:20;;;:10;:20;;;;;;;;9364:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9385:20;;9364:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9364:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;9364:41:0;;;-1:-1:-1;;9364:41:0;;;;-1:-1:-1;;;;;9364:41:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9416:19:0;9426:8;9416:9;:19::i;:::-;:34;;;;;9440:10;9439:11;9416:34;9412:164;;;9470:29;9490:8;9470:19;:29::i;:::-;9469:30;9461:47;;;;-1:-1:-1;;;9461:47:0;;;;;;26577:2:1;26559:21;;;26616:1;26596:18;;;26589:29;-1:-1:-1;;;26649:2:1;26634:18;;26627:34;26693:2;26678:18;;26375:327;9461:47:0;9535:24;;;;:14;:24;;;;;;-1:-1:-1;;;;;9525:34:0;;;9535:24;;9525:34;9517:51;;;;-1:-1:-1;;;9517:51:0;;;;;;26909:2:1;26891:21;;;26948:1;26928:18;;;26921:29;-1:-1:-1;;;26981:2:1;26966:18;;26959:34;27025:2;27010:18;;26707:327;9517:51:0;9586:18;;;;-1:-1:-1;;;;;9586:32:0;9582:228;;9650:18;9659:8;9650;:18::i;:::-;9637:9;:31;;9629:48;;;;-1:-1:-1;;;9629:48:0;;;;;;27241:2:1;27223:21;;;27280:1;27260:18;;;27253:29;-1:-1:-1;;;27313:2:1;27298:18;;27291:34;27357:2;27342:18;;27039:327;9629:48:0;9582:228;;;9776:18;9785:8;9776;:18::i;:::-;9715;;;;9708:64;;-1:-1:-1;;;9708:64:0;;9745:10;9708:64;;;17108:34:1;9765:4:0;17158:18:1;;;17151:43;-1:-1:-1;;;;;9708:36:0;;;;;;17043:18:1;;9708:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:86;;9700:102;;;;-1:-1:-1;;;9700:102:0;;;;;;27573:2:1;27555:21;;;27612:1;27592:18;;;27585:29;-1:-1:-1;;;27645:2:1;27630:18;;27623:34;27689:2;27674:18;;27371:327;9995:596:0;10079:18;10100:20;;;:10;:20;;;;;;;;10079:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10100:20;;10079:41;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10079:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;;10079:41:0;;;-1:-1:-1;;10079:41:0;;;;-1:-1:-1;;;;;10079:41:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10079:41:0;10158:28;10177:8;10158:18;:28::i;:::-;10127:59;;10198:9;10193:393;10217:5;:25;;;:32;10213:1;:36;10193:393;;;10338:5;:12;;;-1:-1:-1;;;;;10273:77:0;10281:5;:25;;;10307:1;10281:28;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;10273:45:0;;10319:11;10331:1;10319:14;;;;;;;;:::i;:::-;;;;;;;10273:61;;;;;;;;;;;;;797:25:1;;785:2;770:18;;651:177;10273:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;10273:77:0;;10265:95;;;;-1:-1:-1;;;10265:95:0;;;;;;;:::i;:::-;10385:5;:25;;;10411:1;10385:28;;;;;;;;:::i;:::-;;;;;;;;;;;10432:12;;;;10377:83;;-1:-1:-1;;;10377:83:0;;-1:-1:-1;;;;;17126:15:1;;;10377:83:0;;;17108:34:1;10454:4:0;17158:18:1;;;17151:43;10377:54:0;;;;;17043:18:1;;10377:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10369:100;;;;-1:-1:-1;;;10369:100:0;;;;;;;:::i;:::-;10486:5;:25;;;10512:1;10486:28;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;10478:54:0;;10533:5;:12;;;10547:6;10555:11;10567:1;10555:14;;;;;;;;:::i;:::-;;;;;;;10478:100;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28910:15:1;;;28892:34;;28962:15;;;;28957:2;28942:18;;28935:43;29009:2;28994:18;;28987:34;;;;29057:3;29052:2;29037:18;;29030:31;;;29098:1;29077:19;;;29070:30;-1:-1:-1;;;28872:3:1;29116:19;;29109:35;29176:3;29161:19;;28587:599;10478:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10251:3;;;;;:::i;:::-;;;;10193:393;;;;10072:519;;9995:596;;:::o;19598:248::-;19681:14;19737:4;19722:12;;19713:6;:21;;;;:::i;:::-;:28;;;;:::i;:::-;19776:10;;19704:37;;-1:-1:-1;19756:38:0;;19767:8;;-1:-1:-1;;;;;19776:10:0;19704:37;19756:10;:38::i;:::-;19822:10;;19806:34;;;-1:-1:-1;;;;;19822:10:0;;;29365:51:1;;29447:2;29432:18;;29425:34;;;19806::0;;29338:18:1;19806:34:0;;;;;;;19598:248;;;;:::o;20085:656::-;20172:18;20237:20;;;:10;:20;;;;;;;;:40;;20199:78;;;;;;;;;;;;;;;;;20172:18;;20199:78;;20237:40;20199:78;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20199:78:0;;;;;;;;;;;;;;;;;;;;;;;20284:11;20307:18;:25;20298:6;:34;;;;:::i;:::-;20284:48;;20343:6;20339:397;20359:18;:25;20355:1;:29;20339:397;;;20402:13;20426:18;20445:1;20426:21;;;;;;;;:::i;:::-;;;;;;;20402:46;;20486:1;20463:5;-1:-1:-1;;;;;20463:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:24;20459:270;;;20502:18;20551:4;20529:5;-1:-1:-1;;;;;20529:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20523:26;;:3;:26;:::i;:::-;:32;;;;:::i;:::-;20502:53;;20568:49;20579:8;20588:5;-1:-1:-1;;;;;20588:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20606:10;20568;:49::i;:::-;20630:24;20644:10;20630:24;;:::i;:::-;;;20672:45;20688:5;-1:-1:-1;;;;;20688:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20672:45;;;-1:-1:-1;;;;;29383:32:1;;;29365:51;;29447:2;29432:18;;29425:34;;;29338:18;20672:45:0;;;;;;;20489:240;20459:270;-1:-1:-1;20386:3:0;;;;:::i;:::-;;;;20339:397;;;;20192:549;;20085:656;;;;:::o;18987:404::-;19118:1;19073:20;;;:10;:20;;;;;;;;:33;;-1:-1:-1;;;;;19073:33:0;19069:317;;19132:12;19158:3;-1:-1:-1;;;;;19150:17:0;19176:6;19150:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19131:57;;;19205:7;19197:24;;;;-1:-1:-1;;;19197:24:0;;;;;;29882:2:1;29864:21;;;29921:1;29901:18;;;29894:29;-1:-1:-1;;;29954:2:1;29939:18;;29932:34;29998:2;29983:18;;29680:327;19069:317:0;19261:20;;;;:10;:20;;;;;;;;;:33;;19254:115;;-1:-1:-1;;;19254:115:0;;19319:10;19254:115;;;30252:34:1;-1:-1:-1;;;;;30322:15:1;;;30302:18;;;30295:43;30354:18;;;30347:34;;;19261:33:0;;;;19254:54;;30187:18:1;;19254:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19244:134;;;;-1:-1:-1;;;19244:134:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:180:1;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;833:131::-;-1:-1:-1;;;;;908:31:1;;898:42;;888:70;;954:1;951;944:12;969:134;1037:20;;1066:31;1037:20;1066:31;:::i;:::-;969:134;;;:::o;1108:118::-;1194:5;1187:13;1180:21;1173:5;1170:32;1160:60;;1216:1;1213;1206:12;1231:128;1296:20;;1325:28;1296:20;1325:28;:::i;1364:382::-;1429:6;1437;1490:2;1478:9;1469:7;1465:23;1461:32;1458:52;;;1506:1;1503;1496:12;1458:52;1545:9;1532:23;1564:31;1589:5;1564:31;:::i;:::-;1614:5;-1:-1:-1;1671:2:1;1656:18;;1643:32;1684:30;1643:32;1684:30;:::i;:::-;1733:7;1723:17;;;1364:382;;;;;:::o;1751:632::-;1922:2;1974:21;;;2044:13;;1947:18;;;2066:22;;;1893:4;;1922:2;2145:15;;;;2119:2;2104:18;;;1893:4;2188:169;2202:6;2199:1;2196:13;2188:169;;;2263:13;;2251:26;;2332:15;;;;2297:12;;;;2224:1;2217:9;2188:169;;;-1:-1:-1;2374:3:1;;1751:632;-1:-1:-1;;;;;;1751:632:1:o;2388:127::-;2449:10;2444:3;2440:20;2437:1;2430:31;2480:4;2477:1;2470:15;2504:4;2501:1;2494:15;2520:275;2591:2;2585:9;2656:2;2637:13;;-1:-1:-1;;2633:27:1;2621:40;;2691:18;2676:34;;2712:22;;;2673:62;2670:88;;;2738:18;;:::i;:::-;2774:2;2767:22;2520:275;;-1:-1:-1;2520:275:1:o;2800:531::-;2843:5;2896:3;2889:4;2881:6;2877:17;2873:27;2863:55;;2914:1;2911;2904:12;2863:55;2950:6;2937:20;2976:18;2972:2;2969:26;2966:52;;;2998:18;;:::i;:::-;3042:55;3085:2;3066:13;;-1:-1:-1;;3062:27:1;3091:4;3058:38;3042:55;:::i;:::-;3122:2;3113:7;3106:19;3168:3;3161:4;3156:2;3148:6;3144:15;3140:26;3137:35;3134:55;;;3185:1;3182;3175:12;3134:55;3250:2;3243:4;3235:6;3231:17;3224:4;3215:7;3211:18;3198:55;3298:1;3273:16;;;3291:4;3269:27;3262:38;;;;3277:7;2800:531;-1:-1:-1;;;2800:531:1:o;3336:458::-;3423:6;3431;3439;3492:2;3480:9;3471:7;3467:23;3463:32;3460:52;;;3508:1;3505;3498:12;3460:52;3544:9;3531:23;3521:33;;3601:2;3590:9;3586:18;3573:32;3563:42;;3656:2;3645:9;3641:18;3628:32;3683:18;3675:6;3672:30;3669:50;;;3715:1;3712;3705:12;3669:50;3738;3780:7;3771:6;3760:9;3756:22;3738:50;:::i;:::-;3728:60;;;3336:458;;;;;:::o;3799:658::-;3970:2;4022:21;;;4092:13;;3995:18;;;4114:22;;;3941:4;;3970:2;4193:15;;;;4167:2;4152:18;;;3941:4;4236:195;4250:6;4247:1;4244:13;4236:195;;;4315:13;;-1:-1:-1;;;;;4311:39:1;4299:52;;4406:15;;;;4371:12;;;;4347:1;4265:9;4236:195;;4462:167;4529:20;;4589:14;4578:26;;4568:37;;4558:65;;4619:1;4616;4609:12;4634:179;4701:20;;-1:-1:-1;;;;;4750:38:1;;4740:49;;4730:77;;4803:1;4800;4793:12;4818:183;4878:4;4911:18;4903:6;4900:30;4897:56;;;4933:18;;:::i;:::-;-1:-1:-1;4978:1:1;4974:14;4990:4;4970:25;;4818:183::o;5006:662::-;5060:5;5113:3;5106:4;5098:6;5094:17;5090:27;5080:55;;5131:1;5128;5121:12;5080:55;5167:6;5154:20;5193:4;5217:60;5233:43;5273:2;5233:43;:::i;:::-;5217:60;:::i;:::-;5311:15;;;5397:1;5393:10;;;;5381:23;;5377:32;;;5342:12;;;;5421:15;;;5418:35;;;5449:1;5446;5439:12;5418:35;5485:2;5477:6;5473:15;5497:142;5513:6;5508:3;5505:15;5497:142;;;5579:17;;5567:30;;5617:12;;;;5530;;5497:142;;;-1:-1:-1;5657:5:1;5006:662;-1:-1:-1;;;;;;5006:662:1:o;5673:737::-;5727:5;5780:3;5773:4;5765:6;5761:17;5757:27;5747:55;;5798:1;5795;5788:12;5747:55;5834:6;5821:20;5860:4;5884:60;5900:43;5940:2;5900:43;:::i;5884:60::-;5978:15;;;6064:1;6060:10;;;;6048:23;;6044:32;;;6009:12;;;;6088:15;;;6085:35;;;6116:1;6113;6106:12;6085:35;6152:2;6144:6;6140:15;6164:217;6180:6;6175:3;6172:15;6164:217;;;6260:3;6247:17;6277:31;6302:5;6277:31;:::i;:::-;6321:18;;6359:12;;;;6197;;6164:217;;6415:1158;6591:6;6599;6607;6615;6623;6631;6639;6647;6700:3;6688:9;6679:7;6675:23;6671:33;6668:53;;;6717:1;6714;6707:12;6668:53;6740:26;6756:9;6740:26;:::i;:::-;6730:36;;6785:37;6818:2;6807:9;6803:18;6785:37;:::i;:::-;6775:47;;6841:37;6874:2;6863:9;6859:18;6841:37;:::i;:::-;6831:47;;6897:37;6930:2;6919:9;6915:18;6897:37;:::i;:::-;6887:47;;6985:3;6974:9;6970:19;6957:33;7009:18;7050:2;7042:6;7039:14;7036:34;;;7066:1;7063;7056:12;7036:34;7089:61;7142:7;7133:6;7122:9;7118:22;7089:61;:::i;:::-;7079:71;;7203:3;7192:9;7188:19;7175:33;7159:49;;7233:2;7223:8;7220:16;7217:36;;;7249:1;7246;7239:12;7217:36;7272:63;7327:7;7316:8;7305:9;7301:24;7272:63;:::i;:::-;7262:73;;7354:39;7388:3;7377:9;7373:19;7354:39;:::i;:::-;7344:49;;7446:3;7435:9;7431:19;7418:33;7402:49;;7476:2;7466:8;7463:16;7460:36;;;7492:1;7489;7482:12;7460:36;;7515:52;7559:7;7548:8;7537:9;7533:24;7515:52;:::i;:::-;7505:62;;;6415:1158;;;;;;;;;;;:::o;7578:519::-;7662:6;7670;7678;7731:2;7719:9;7710:7;7706:23;7702:32;7699:52;;;7747:1;7744;7737:12;7699:52;7783:9;7770:23;7760:33;;7843:2;7832:9;7828:18;7815:32;7856:28;7878:5;7856:28;:::i;:::-;7903:5;-1:-1:-1;7959:2:1;7944:18;;7931:32;7986:18;7975:30;;7972:50;;;8018:1;8015;8008:12;8102:423;8144:3;8182:5;8176:12;8209:6;8204:3;8197:19;8234:1;8244:162;8258:6;8255:1;8252:13;8244:162;;;8320:4;8376:13;;;8372:22;;8366:29;8348:11;;;8344:20;;8337:59;8273:12;8244:162;;;8248:3;8451:1;8444:4;8435:6;8430:3;8426:16;8422:27;8415:38;8514:4;8507:2;8503:7;8498:2;8490:6;8486:15;8482:29;8477:3;8473:39;8469:50;8462:57;;;8102:423;;;;:::o;8530:220::-;8679:2;8668:9;8661:21;8642:4;8699:45;8740:2;8729:9;8725:18;8717:6;8699:45;:::i;8755:247::-;8814:6;8867:2;8855:9;8846:7;8842:23;8838:32;8835:52;;;8883:1;8880;8873:12;8835:52;8922:9;8909:23;8941:31;8966:5;8941:31;:::i;9407:1200::-;9529:6;9537;9545;9553;9561;9569;9577;9630:3;9618:9;9609:7;9605:23;9601:33;9598:53;;;9647:1;9644;9637:12;9598:53;9683:9;9670:23;9660:33;;9743:2;9732:9;9728:18;9715:32;9756:31;9781:5;9756:31;:::i;:::-;9806:5;-1:-1:-1;9863:2:1;9848:18;;9835:32;9876:30;9835:32;9876:30;:::i;:::-;9925:7;-1:-1:-1;9983:2:1;9968:18;;9955:32;10006:18;10036:14;;;10033:34;;;10063:1;10060;10053:12;10033:34;10086:50;10128:7;10119:6;10108:9;10104:22;10086:50;:::i;:::-;10076:60;;10183:3;10172:9;10168:19;10155:33;10145:43;;10241:3;10230:9;10226:19;10213:33;10197:49;;10271:2;10261:8;10258:16;10255:36;;;10287:1;10284;10277:12;10255:36;10325:8;10314:9;10310:24;10300:34;;10372:7;10365:4;10361:2;10357:13;10353:27;10343:55;;10394:1;10391;10384:12;10343:55;10434:2;10421:16;10460:2;10452:6;10449:14;10446:34;;;10476:1;10473;10466:12;10446:34;10521:7;10516:2;10507:6;10503:2;10499:15;10495:24;10492:37;10489:57;;;10542:1;10539;10532:12;10489:57;10573:2;10569;10565:11;10555:21;;10595:6;10585:16;;;;;9407:1200;;;;;;;;;;:::o;10612:315::-;10680:6;10688;10741:2;10729:9;10720:7;10716:23;10712:32;10709:52;;;10757:1;10754;10747:12;10709:52;10793:9;10780:23;10770:33;;10853:2;10842:9;10838:18;10825:32;10866:31;10891:5;10866:31;:::i;10932:348::-;11016:6;11069:2;11057:9;11048:7;11044:23;11040:32;11037:52;;;11085:1;11082;11075:12;11037:52;11125:9;11112:23;11158:18;11150:6;11147:30;11144:50;;;11190:1;11187;11180:12;11144:50;11213:61;11266:7;11257:6;11246:9;11242:22;11213:61;:::i;:::-;11203:71;10932:348;-1:-1:-1;;;;10932:348:1:o;11285:388::-;11353:6;11361;11414:2;11402:9;11393:7;11389:23;11385:32;11382:52;;;11430:1;11427;11420:12;11382:52;11469:9;11456:23;11488:31;11513:5;11488:31;:::i;:::-;11538:5;-1:-1:-1;11595:2:1;11580:18;;11567:32;11608:33;11567:32;11608:33;:::i;11678:127::-;11739:10;11734:3;11730:20;11727:1;11720:31;11770:4;11767:1;11760:15;11794:4;11791:1;11784:15;11810:112;11842:1;11868;11858:35;;11873:18;;:::i;:::-;-1:-1:-1;11907:9:1;;11810:112::o;11927:245::-;11994:6;12047:2;12035:9;12026:7;12022:23;12018:32;12015:52;;;12063:1;12060;12053:12;12015:52;12095:9;12089:16;12114:28;12136:5;12114:28;:::i;12177:327::-;12379:2;12361:21;;;12418:1;12398:18;;;12391:29;-1:-1:-1;;;12451:2:1;12436:18;;12429:34;12495:2;12480:18;;12177:327::o;12899:::-;13101:2;13083:21;;;13140:1;13120:18;;;13113:29;-1:-1:-1;;;13173:2:1;13158:18;;13151:34;13217:2;13202:18;;12899:327::o;13895:461::-;14157:1;14153;14148:3;14144:11;14140:19;14132:6;14128:32;14117:9;14110:51;14197:6;14192:2;14181:9;14177:18;14170:34;14240:6;14235:2;14224:9;14220:18;14213:34;14283:3;14278:2;14267:9;14263:18;14256:31;14091:4;14304:46;14345:3;14334:9;14330:19;14322:6;14304:46;:::i;:::-;14296:54;13895:461;-1:-1:-1;;;;;;13895:461:1:o;14551:251::-;14621:6;14674:2;14662:9;14653:7;14649:23;14645:32;14642:52;;;14690:1;14687;14680:12;14642:52;14722:9;14716:16;14741:31;14766:5;14741:31;:::i;14807:327::-;15009:2;14991:21;;;15048:1;15028:18;;;15021:29;-1:-1:-1;;;15081:2:1;15066:18;;15059:34;15125:2;15110:18;;14807:327::o;15471:291::-;15648:6;15637:9;15630:25;15691:2;15686;15675:9;15671:18;15664:30;15611:4;15711:45;15752:2;15741:9;15737:18;15729:6;15711:45;:::i;15767:127::-;15828:10;15823:3;15819:20;15816:1;15809:31;15859:4;15856:1;15849:15;15883:4;15880:1;15873:15;15899:135;15938:3;15959:17;;;15956:43;;15979:18;;:::i;:::-;-1:-1:-1;16026:1:1;16015:13;;15899:135::o;16039:388::-;16244:6;16233:9;16226:25;16287:2;16282;16271:9;16267:18;16260:30;16207:4;16307:45;16348:2;16337:9;16333:18;16325:6;16307:45;:::i;:::-;16299:53;;16417:1;16413;16408:3;16404:11;16400:19;16392:6;16388:32;16383:2;16372:9;16368:18;16361:60;16039:388;;;;;;:::o;16432:127::-;16493:10;16488:3;16484:20;16481:1;16474:31;16524:4;16521:1;16514:15;16548:4;16545:1;16538:15;16564:327;16766:2;16748:21;;;16805:1;16785:18;;;16778:29;-1:-1:-1;;;16838:2:1;16823:18;;16816:34;16882:2;16867:18;;16564:327::o;17205:::-;17407:2;17389:21;;;17446:1;17426:18;;;17419:29;-1:-1:-1;;;17479:2:1;17464:18;;17457:34;17523:2;17508:18;;17205:327::o;17887:120::-;17927:1;17953;17943:35;;17958:18;;:::i;:::-;-1:-1:-1;17992:9:1;;17887:120::o;18012:168::-;18085:9;;;18116;;18133:15;;;18127:22;;18113:37;18103:71;;18154:18;;:::i;18185:422::-;18274:1;18317:5;18274:1;18331:270;18352:7;18342:8;18339:21;18331:270;;;18411:4;18407:1;18403:6;18399:17;18393:4;18390:27;18387:53;;;18420:18;;:::i;:::-;18470:7;18460:8;18456:22;18453:55;;;18490:16;;;;18453:55;18569:22;;;;18529:15;;;;18331:270;;;18335:3;18185:422;;;;;:::o;18612:806::-;18661:5;18691:8;18681:80;;-1:-1:-1;18732:1:1;18746:5;;18681:80;18780:4;18770:76;;-1:-1:-1;18817:1:1;18831:5;;18770:76;18862:4;18880:1;18875:59;;;;18948:1;18943:130;;;;18855:218;;18875:59;18905:1;18896:10;;18919:5;;;18943:130;18980:3;18970:8;18967:17;18964:43;;;18987:18;;:::i;:::-;-1:-1:-1;;19043:1:1;19029:16;;19058:5;;18855:218;;19157:2;19147:8;19144:16;19138:3;19132:4;19129:13;19125:36;19119:2;19109:8;19106:16;19101:2;19095:4;19092:12;19088:35;19085:77;19082:159;;;-1:-1:-1;19194:19:1;;;19226:5;;19082:159;19273:34;19298:8;19292:4;19273:34;:::i;:::-;19343:6;19339:1;19335:6;19331:19;19322:7;19319:32;19316:58;;;19354:18;;:::i;:::-;19392:20;;18612:806;-1:-1:-1;;;18612:806:1:o;19423:131::-;19483:5;19512:36;19539:8;19533:4;19512:36;:::i;19848:471::-;20057:25;;;-1:-1:-1;;;;;20118:32:1;;20113:2;20098:18;;20091:60;20194:14;;20187:22;20182:2;20167:18;;20160:50;20246:3;20241:2;20226:18;;20219:31;;;-1:-1:-1;;20267:46:1;;20293:19;;20285:6;20267:46;:::i;20324:533::-;20537:6;20526:9;20519:25;20580:6;20575:2;20564:9;20560:18;20553:34;20623:2;20618;20607:9;20603:18;20596:30;20662:6;20657:2;20646:9;20642:18;20635:34;20720:6;20712;20706:3;20695:9;20691:19;20678:49;20777:1;20747:22;;;20771:3;20743:32;;;20736:43;;;;20840:2;20819:15;;;-1:-1:-1;;20815:29:1;20800:45;20796:55;;20324:533;-1:-1:-1;;;20324:533:1:o;22160:125::-;22225:9;;;22246:10;;;22243:36;;;22259:18;;:::i;22290:184::-;22360:6;22413:2;22401:9;22392:7;22388:23;22384:32;22381:52;;;22429:1;22426;22419:12;22381:52;-1:-1:-1;22452:16:1;;22290:184;-1:-1:-1;22290:184:1:o;24250:128::-;24317:9;;;24338:11;;;24335:37;;;24352:18;;:::i
Swarm Source
ipfs://8b92f701e8a7f0fa4fabb279648eb9ffa468792ed84782e9eaa72b93e25ed1a0
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.