Latest 25 from a total of 654 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Mint And Sell721 | 406885483 | 3 days ago | IN | 0 ETH | 0.00000513 | ||||
| Mint And Sell721 | 398731990 | 27 days ago | IN | 0 ETH | 0.00000552 | ||||
| Mint And Sell721 | 396079141 | 35 days ago | IN | 0 ETH | 0.00000515 | ||||
| Mint And Sell721 | 396079001 | 35 days ago | IN | 0 ETH | 0.00000584 | ||||
| Mint And Sell721 | 394925517 | 38 days ago | IN | 0 ETH | 0.000006 | ||||
| Mint And Sell721 | 394577483 | 39 days ago | IN | 0 ETH | 0.00000949 | ||||
| Mint And Sell721 | 392274398 | 46 days ago | IN | 0 ETH | 0.00001174 | ||||
| Mint And Sell721 | 391363468 | 48 days ago | IN | 0 ETH | 0.00001246 | ||||
| Mint And Sell721 | 391161350 | 49 days ago | IN | 0 ETH | 0.00001247 | ||||
| Mint And Sell721 | 391161202 | 49 days ago | IN | 0 ETH | 0.00000514 | ||||
| Mint And Sell721 | 391161113 | 49 days ago | IN | 0 ETH | 0.00004141 | ||||
| Mint And Sell721 | 391161100 | 49 days ago | IN | 0 ETH | 0.00000946 | ||||
| Mint And Sell721 | 391160991 | 49 days ago | IN | 0 ETH | 0.00002345 | ||||
| Mint And Sell721 | 391106236 | 49 days ago | IN | 0 ETH | 0.00000795 | ||||
| Mint And Sell721 | 391106167 | 49 days ago | IN | 0 ETH | 0.00001946 | ||||
| Mint And Sell721 | 391105805 | 49 days ago | IN | 0 ETH | 0.00000846 | ||||
| Mint And Sell721 | 390983849 | 49 days ago | IN | 0 ETH | 0.00000519 | ||||
| Mint And Sell721 | 390983270 | 49 days ago | IN | 0 ETH | 0.00000797 | ||||
| Mint And Sell721 | 390980515 | 49 days ago | IN | 0 ETH | 0.00001544 | ||||
| Mint And Sell721 | 390977236 | 49 days ago | IN | 0 ETH | 0.00000845 | ||||
| Mint And Sell721 | 390976303 | 49 days ago | IN | 0 ETH | 0.00000584 | ||||
| Mint And Sell721 | 390780993 | 50 days ago | IN | 0 ETH | 0.00000584 | ||||
| Mint And Sell721 | 390780776 | 50 days ago | IN | 0 ETH | 0.00000797 | ||||
| Mint And Sell721 | 390780563 | 50 days ago | IN | 0 ETH | 0.00000948 | ||||
| Mint And Sell721 | 390780409 | 50 days ago | IN | 0 ETH | 0.00000795 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 334342386 | 213 days ago | 0.00000001 ETH | ||||
| 334342386 | 213 days ago | 0.00000001 ETH | ||||
| 334342386 | 213 days ago | 0.00000561 ETH | ||||
| 289584084 | 344 days ago | 0.00000041 ETH | ||||
| 289584084 | 344 days ago | 0.00000041 ETH | ||||
| 289584084 | 344 days ago | 0.00013748 ETH | ||||
| 289575562 | 344 days ago | 0.00001797 ETH | ||||
| 289575562 | 344 days ago | 0.00001797 ETH | ||||
| 289575562 | 344 days ago | 0.00600903 ETH | ||||
| 284623336 | 358 days ago | 0.0000071 ETH | ||||
| 284623336 | 358 days ago | 0.0000071 ETH | ||||
| 284623336 | 358 days ago | 0.00237678 ETH | ||||
| 242437918 | 481 days ago | 0.00000524 ETH | ||||
| 242437918 | 481 days ago | 0.00000524 ETH | ||||
| 242437918 | 481 days ago | 0.00175323 ETH | ||||
| 242425652 | 481 days ago | 0.00000913 ETH | ||||
| 242425652 | 481 days ago | 0.00000913 ETH | ||||
| 242425652 | 481 days ago | 0.00305494 ETH | ||||
| 242415572 | 481 days ago | 0.00001739 ETH | ||||
| 242415572 | 481 days ago | 0.00001739 ETH | ||||
| 242415572 | 481 days ago | 0.00581572 ETH | ||||
| 52558386 | 1060 days ago | 0 ETH | ||||
| 52558386 | 1060 days ago | 0 ETH | ||||
| 52558386 | 1060 days ago | 0 ETH | ||||
| 52558386 | 1060 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
NFTXMarketplaceZap
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/**
*Submitted for verification at Arbiscan.io on 2022-05-14
*/
// Sources flattened with hardhat v2.8.2 https://hardhat.org
// File contracts/solidity/interface/INFTXEligibility.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface INFTXEligibility {
// Read functions.
function name() external pure returns (string memory);
function finalized() external view returns (bool);
function targetAsset() external pure returns (address);
function checkAllEligible(uint256[] calldata tokenIds)
external
view
returns (bool);
function checkEligible(uint256[] calldata tokenIds)
external
view
returns (bool[] memory);
function checkAllIneligible(uint256[] calldata tokenIds)
external
view
returns (bool);
function checkIsEligible(uint256 tokenId) external view returns (bool);
// Write functions.
function __NFTXEligibility_init_bytes(bytes calldata configData) external;
function beforeMintHook(uint256[] calldata tokenIds) external;
function afterMintHook(uint256[] calldata tokenIds) external;
function beforeRedeemHook(uint256[] calldata tokenIds) external;
function afterRedeemHook(uint256[] calldata tokenIds) external;
}
// File contracts/solidity/token/IERC20Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20Upgradeable {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File contracts/solidity/proxy/IBeacon.sol
pragma solidity ^0.8.0;
/**
* @dev This is the interface that {BeaconProxy} expects of its beacon.
*/
interface IBeacon {
/**
* @dev Must return an address that can be used as a delegate call target.
*
* {BeaconProxy} will check that this address is a contract.
*/
function childImplementation() external view returns (address);
function upgradeChildTo(address newImplementation) external;
}
// File contracts/solidity/interface/INFTXVaultFactory.sol
pragma solidity ^0.8.0;
interface INFTXVaultFactory is IBeacon {
// Read functions.
function numVaults() external view returns (uint256);
function zapContract() external view returns (address);
function feeDistributor() external view returns (address);
function eligibilityManager() external view returns (address);
function vault(uint256 vaultId) external view returns (address);
function allVaults() external view returns (address[] memory);
function vaultsForAsset(address asset) external view returns (address[] memory);
function isLocked(uint256 id) external view returns (bool);
function excludedFromFees(address addr) external view returns (bool);
function factoryMintFee() external view returns (uint64);
function factoryRandomRedeemFee() external view returns (uint64);
function factoryTargetRedeemFee() external view returns (uint64);
function factoryRandomSwapFee() external view returns (uint64);
function factoryTargetSwapFee() external view returns (uint64);
function vaultFees(uint256 vaultId) external view returns (uint256, uint256, uint256, uint256, uint256);
event NewFeeDistributor(address oldDistributor, address newDistributor);
event NewZapContract(address oldZap, address newZap);
event FeeExclusion(address feeExcluded, bool excluded);
event NewEligibilityManager(address oldEligManager, address newEligManager);
event NewVault(uint256 indexed vaultId, address vaultAddress, address assetAddress);
event UpdateVaultFees(uint256 vaultId, uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee);
event DisableVaultFees(uint256 vaultId);
event UpdateFactoryFees(uint256 mintFee, uint256 randomRedeemFee, uint256 targetRedeemFee, uint256 randomSwapFee, uint256 targetSwapFee);
// Write functions.
function __NFTXVaultFactory_init(address _vaultImpl, address _feeDistributor) external;
function createVault(
string calldata name,
string calldata symbol,
address _assetAddress,
bool is1155,
bool allowAllItems
) external returns (uint256);
function setFeeDistributor(address _feeDistributor) external;
function setEligibilityManager(address _eligibilityManager) external;
function setZapContract(address _zapContract) external;
function setFeeExclusion(address _excludedAddr, bool excluded) external;
function setFactoryFees(
uint256 mintFee,
uint256 randomRedeemFee,
uint256 targetRedeemFee,
uint256 randomSwapFee,
uint256 targetSwapFee
) external;
function setVaultFees(
uint256 vaultId,
uint256 mintFee,
uint256 randomRedeemFee,
uint256 targetRedeemFee,
uint256 randomSwapFee,
uint256 targetSwapFee
) external;
function disableVaultFees(uint256 vaultId) external;
}
// File contracts/solidity/interface/INFTXVault.sol
pragma solidity ^0.8.0;
interface INFTXVault is IERC20Upgradeable {
function manager() external view returns (address);
function assetAddress() external view returns (address);
function vaultFactory() external view returns (INFTXVaultFactory);
function eligibilityStorage() external view returns (INFTXEligibility);
function is1155() external view returns (bool);
function allowAllItems() external view returns (bool);
function enableMint() external view returns (bool);
function enableRandomRedeem() external view returns (bool);
function enableTargetRedeem() external view returns (bool);
function enableRandomSwap() external view returns (bool);
function enableTargetSwap() external view returns (bool);
function vaultId() external view returns (uint256);
function nftIdAt(uint256 holdingsIndex) external view returns (uint256);
function allHoldings() external view returns (uint256[] memory);
function totalHoldings() external view returns (uint256);
function mintFee() external view returns (uint256);
function randomRedeemFee() external view returns (uint256);
function targetRedeemFee() external view returns (uint256);
function randomSwapFee() external view returns (uint256);
function targetSwapFee() external view returns (uint256);
function vaultFees() external view returns (uint256, uint256, uint256, uint256, uint256);
event VaultInit(
uint256 indexed vaultId,
address assetAddress,
bool is1155,
bool allowAllItems
);
event ManagerSet(address manager);
event EligibilityDeployed(uint256 moduleIndex, address eligibilityAddr);
// event CustomEligibilityDeployed(address eligibilityAddr);
event EnableMintUpdated(bool enabled);
event EnableRandomRedeemUpdated(bool enabled);
event EnableTargetRedeemUpdated(bool enabled);
event EnableRandomSwapUpdated(bool enabled);
event EnableTargetSwapUpdated(bool enabled);
event Minted(uint256[] nftIds, uint256[] amounts, address to);
event Redeemed(uint256[] nftIds, uint256[] specificIds, address to);
event Swapped(
uint256[] nftIds,
uint256[] amounts,
uint256[] specificIds,
uint256[] redeemedIds,
address to
);
function __NFTXVault_init(
string calldata _name,
string calldata _symbol,
address _assetAddress,
bool _is1155,
bool _allowAllItems
) external;
function finalizeVault() external;
function setVaultMetadata(
string memory name_,
string memory symbol_
) external;
function setVaultFeatures(
bool _enableMint,
bool _enableRandomRedeem,
bool _enableTargetRedeem,
bool _enableRandomSwap,
bool _enableTargetSwap
) external;
function setFees(
uint256 _mintFee,
uint256 _randomRedeemFee,
uint256 _targetRedeemFee,
uint256 _randomSwapFee,
uint256 _targetSwapFee
) external;
function disableVaultFees() external;
// This function allows for an easy setup of any eligibility module contract from the EligibilityManager.
// It takes in ABI encoded parameters for the desired module. This is to make sure they can all follow
// a similar interface.
function deployEligibilityStorage(
uint256 moduleIndex,
bytes calldata initData
) external returns (address);
// The manager has control over options like fees and features
function setManager(address _manager) external;
function mint(
uint256[] calldata tokenIds,
uint256[] calldata amounts /* ignored for ERC721 vaults */
) external returns (uint256);
function mintTo(
uint256[] calldata tokenIds,
uint256[] calldata amounts, /* ignored for ERC721 vaults */
address to
) external returns (uint256);
function redeem(uint256 amount, uint256[] calldata specificIds)
external
returns (uint256[] calldata);
function redeemTo(
uint256 amount,
uint256[] calldata specificIds,
address to
) external returns (uint256[] calldata);
function swap(
uint256[] calldata tokenIds,
uint256[] calldata amounts, /* ignored for ERC721 vaults */
uint256[] calldata specificIds
) external returns (uint256[] calldata);
function swapTo(
uint256[] calldata tokenIds,
uint256[] calldata amounts, /* ignored for ERC721 vaults */
uint256[] calldata specificIds,
address to
) external returns (uint256[] calldata);
function allValidNFTs(uint256[] calldata tokenIds)
external
view
returns (bool);
}
// File contracts/solidity/interface/INFTXFeeDistributor.sol
pragma solidity ^0.8.0;
interface INFTXFeeDistributor {
struct FeeReceiver {
uint256 allocPoint;
address receiver;
bool isContract;
}
function nftxVaultFactory() external returns (address);
function lpStaking() external returns (address);
function treasury() external returns (address);
function defaultTreasuryAlloc() external returns (uint256);
function defaultLPAlloc() external returns (uint256);
function allocTotal(uint256 vaultId) external returns (uint256);
function specificTreasuryAlloc(uint256 vaultId) external returns (uint256);
// Write functions.
function __FeeDistributor__init__(address _lpStaking, address _treasury) external;
function rescueTokens(address token) external;
function distribute(uint256 vaultId) external;
function addReceiver(uint256 _vaultId, uint256 _allocPoint, address _receiver, bool _isContract) external;
function initializeVaultReceivers(uint256 _vaultId) external;
function changeMultipleReceiverAlloc(
uint256[] memory _vaultIds,
uint256[] memory _receiverIdxs,
uint256[] memory allocPoints
) external;
function changeMultipleReceiverAddress(
uint256[] memory _vaultIds,
uint256[] memory _receiverIdxs,
address[] memory addresses,
bool[] memory isContracts
) external;
function changeReceiverAlloc(uint256 _vaultId, uint256 _idx, uint256 _allocPoint) external;
function changeReceiverAddress(uint256 _vaultId, uint256 _idx, address _address, bool _isContract) external;
function removeReceiver(uint256 _vaultId, uint256 _receiverIdx) external;
// Configuration functions.
function setTreasuryAddress(address _treasury) external;
function setDefaultTreasuryAlloc(uint256 _allocPoint) external;
function setSpecificTreasuryAlloc(uint256 _vaultId, uint256 _allocPoint) external;
function setLPStakingAddress(address _lpStaking) external;
function setNFTXVaultFactory(address _factory) external;
function setDefaultLPAlloc(uint256 _allocPoint) external;
}
// File contracts/solidity/interface/INFTXLPStaking.sol
pragma solidity ^0.8.0;
interface INFTXLPStaking {
function nftxVaultFactory() external view returns (address);
function rewardDistTokenImpl() external view returns (address);
function stakingTokenProvider() external view returns (address);
function vaultToken(address _stakingToken) external view returns (address);
function stakingToken(address _vaultToken) external view returns (address);
function rewardDistributionToken(uint256 vaultId) external view returns (address);
function newRewardDistributionToken(uint256 vaultId) external view returns (address);
function oldRewardDistributionToken(uint256 vaultId) external view returns (address);
function unusedRewardDistributionToken(uint256 vaultId) external view returns (address);
function rewardDistributionTokenAddr(address stakedToken, address rewardToken) external view returns (address);
// Write functions.
function __NFTXLPStaking__init(address _stakingTokenProvider) external;
function setNFTXVaultFactory(address newFactory) external;
function setStakingTokenProvider(address newProvider) external;
function addPoolForVault(uint256 vaultId) external;
function updatePoolForVault(uint256 vaultId) external;
function updatePoolForVaults(uint256[] calldata vaultId) external;
function receiveRewards(uint256 vaultId, uint256 amount) external returns (bool);
function deposit(uint256 vaultId, uint256 amount) external;
function timelockDepositFor(uint256 vaultId, address account, uint256 amount, uint256 timelockLength) external;
function exit(uint256 vaultId, uint256 amount) external;
function rescue(uint256 vaultId) external;
function withdraw(uint256 vaultId, uint256 amount) external;
function claimRewards(uint256 vaultId) external;
}
// File contracts/solidity/interface/IUniswapV2Router01.sol
pragma solidity ^0.8.0;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountToken, uint256 amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountA, uint256 amountB);
function removeLiquidityETHWithPermit(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountToken, uint256 amountETH);
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function quote(uint256 amountA, uint256 reserveA, uint256 reserveB)
external
pure
returns (uint256 amountB);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountOut);
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountIn);
function getAmountsOut(uint256 amountIn, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path)
external
view
returns (uint256[] memory amounts);
}
// File contracts/solidity/interface/IERC165Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165Upgradeable {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File contracts/solidity/token/IERC1155Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Required interface of an ERC1155 compliant contract, as defined in the
* https://eips.ethereum.org/EIPS/eip-1155[EIP].
*
* _Available since v3.1._
*/
interface IERC1155Upgradeable is IERC165Upgradeable {
/**
* @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
*/
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
/**
* @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
* transfers.
*/
event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);
/**
* @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
* `approved`.
*/
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
/**
* @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
*
* If an {URI} event was emitted for `id`, the standard
* https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
* returned by {IERC1155MetadataURI-uri}.
*/
event URI(string value, uint256 indexed id);
/**
* @dev Returns the amount of tokens of token type `id` owned by `account`.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function balanceOf(address account, uint256 id) external view returns (uint256);
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
*
* Requirements:
*
* - `accounts` and `ids` must have the same length.
*/
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);
/**
* @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
*
* Emits an {ApprovalForAll} event.
*
* Requirements:
*
* - `operator` cannot be the caller.
*/
function setApprovalForAll(address operator, bool approved) external;
/**
* @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
*
* See {setApprovalForAll}.
*/
function isApprovedForAll(address account, address operator) external view returns (bool);
/**
* @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
*
* Emits a {TransferSingle} event.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
* - `from` must have a balance of tokens of type `id` of at least `amount`.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
* acceptance magic value.
*/
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
/**
* @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
*
* Emits a {TransferBatch} event.
*
* Requirements:
*
* - `ids` and `amounts` must have the same length.
* - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
* acceptance magic value.
*/
function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}
// File contracts/solidity/token/IERC721ReceiverUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721ReceiverUpgradeable {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
// File contracts/solidity/token/ERC721HolderUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC721Receiver} interface.
*
* Accepts all token transfers.
* Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
*/
contract ERC721HolderUpgradeable is IERC721ReceiverUpgradeable {
/**
* @dev See {IERC721Receiver-onERC721Received}.
*
* Always returns `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address,
address,
uint256,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
}
// File contracts/solidity/token/IERC1155ReceiverUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev _Available since v3.1._
*/
interface IERC1155ReceiverUpgradeable is IERC165Upgradeable {
/**
@dev Handles the receipt of a single ERC1155 token type. This function is
called at the end of a `safeTransferFrom` after the balance has been updated.
To accept the transfer, this must return
`bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
(i.e. 0xf23a6e61, or its own function selector).
@param operator The address which initiated the transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param id The ID of the token being transferred
@param value The amount of tokens being transferred
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
)
external
returns(bytes4);
/**
@dev Handles the receipt of a multiple ERC1155 token types. This function
is called at the end of a `safeBatchTransferFrom` after the balances have
been updated. To accept the transfer(s), this must return
`bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
(i.e. 0xbc197c81, or its own function selector).
@param operator The address which initiated the batch transfer (i.e. msg.sender)
@param from The address which previously owned the token
@param ids An array containing ids of each token being transferred (order and length must match values array)
@param values An array containing amounts of each token being transferred (order and length must match ids array)
@param data Additional data with no specified format
@return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
)
external
returns(bytes4);
}
// File contracts/solidity/util/ERC165Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165Upgradeable is IERC165Upgradeable {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165Upgradeable).interfaceId;
}
}
// File contracts/solidity/token/ERC1155ReceiverUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev _Available since v3.1._
*/
abstract contract ERC1155ReceiverUpgradeable is ERC165Upgradeable, IERC1155ReceiverUpgradeable {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {
return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId
|| super.supportsInterface(interfaceId);
}
}
// File contracts/solidity/token/ERC1155HolderUpgradeable.sol
pragma solidity ^0.8.0;
/**
* @dev _Available since v3.1._
*/
abstract contract ERC1155HolderUpgradeable is ERC1155ReceiverUpgradeable {
function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}
// File contracts/solidity/util/Address.sol
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File contracts/solidity/util/SafeERC20Upgradeable.sol
pragma solidity ^0.8.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20Upgradeable {
using Address for address;
function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File contracts/solidity/NFTXMarketplaceZap.sol
pragma solidity ^0.8.0;
// Authors: @0xKiwi_.
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
function balanceOf(address to) external view returns (uint256);
}
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(msg.sender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == msg.sender, "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
contract NFTXMarketplaceZap is Ownable, ReentrancyGuard, ERC721HolderUpgradeable, ERC1155HolderUpgradeable {
using SafeERC20Upgradeable for IERC20Upgradeable;
IWETH public immutable WETH;
INFTXLPStaking public immutable lpStaking;
INFTXVaultFactory public immutable nftxFactory;
IUniswapV2Router01 public immutable sushiRouter;
uint256 constant BASE = 1e18;
event Buy(uint256 count, uint256 ethSpent, address to);
event Sell(uint256 count, uint256 ethReceived, address to);
event Swap(uint256 count, uint256 ethSpent, address to);
constructor(address _nftxFactory, address _sushiRouter) Ownable() ReentrancyGuard() {
nftxFactory = INFTXVaultFactory(_nftxFactory);
lpStaking = INFTXLPStaking(INFTXFeeDistributor(INFTXVaultFactory(_nftxFactory).feeDistributor()).lpStaking());
sushiRouter = IUniswapV2Router01(_sushiRouter);
WETH = IWETH(IUniswapV2Router01(_sushiRouter).WETH());
IERC20Upgradeable(address(IUniswapV2Router01(_sushiRouter).WETH())).safeApprove(_sushiRouter, type(uint256).max);
}
function mintAndSell721(
uint256 vaultId,
uint256[] calldata ids,
uint256 minEthOut,
address[] calldata path,
address to
) external nonReentrant {
require(to != address(0) && to != address(this));
require(ids.length != 0);
(address vault, uint256 vaultBalance) = _mint721(vaultId, ids);
uint256[] memory amounts = _sellVaultTokenETH(vault, minEthOut, vaultBalance, path, to);
emit Sell(ids.length, amounts[amounts.length-1], to);
}
function mintAndSell721WETH(
uint256 vaultId,
uint256[] calldata ids,
uint256 minWethOut,
address[] calldata path,
address to
) external nonReentrant {
require(to != address(0) && to != address(this));
require(ids.length != 0);
(address vault, uint256 vaultBalance) = _mint721(vaultId, ids);
uint256[] memory amounts = _sellVaultTokenWETH(vault, minWethOut, vaultBalance, path, to);
emit Sell(ids.length, amounts[amounts.length-1], to);
}
function buyAndSwap721(
uint256 vaultId,
uint256[] calldata idsIn,
uint256[] calldata specificIds,
address[] calldata path,
address to
) external payable nonReentrant {
require(to != address(0) && to != address(this));
require(idsIn.length != 0);
WETH.deposit{value: msg.value}();
INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId));
uint256 redeemFees = (vault.targetSwapFee() * specificIds.length) + (
vault.randomSwapFee() * (idsIn.length - specificIds.length)
);
uint256[] memory amounts = _buyVaultToken(redeemFees, msg.value, path);
_swap721(vaultId, idsIn, specificIds, to);
emit Swap(idsIn.length, amounts[0], to);
// Return extras.
uint256 remaining = WETH.balanceOf(address(this));
WETH.withdraw(remaining);
(bool success, ) = payable(to).call{value: remaining}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function buyAndSwap721WETH(
uint256 vaultId,
uint256[] calldata idsIn,
uint256[] calldata specificIds,
uint256 maxWethIn,
address[] calldata path,
address to
) external nonReentrant {
require(to != address(0) && to != address(this));
require(idsIn.length != 0);
IERC20Upgradeable(address(WETH)).safeTransferFrom(msg.sender, address(this), maxWethIn);
INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId));
uint256 redeemFees = (vault.targetSwapFee() * specificIds.length) + (
vault.randomSwapFee() * (idsIn.length - specificIds.length)
);
uint256[] memory amounts = _buyVaultToken(redeemFees, maxWethIn, path);
_swap721(vaultId, idsIn, specificIds, to);
emit Swap(idsIn.length, amounts[0], to);
// Return extras.
uint256 remaining = WETH.balanceOf(address(this));
if (remaining != 0) {
WETH.transfer(to, remaining);
}
}
function buyAndSwap1155(
uint256 vaultId,
uint256[] calldata idsIn,
uint256[] calldata amounts,
uint256[] calldata specificIds,
address[] calldata path,
address to
) external payable nonReentrant {
require(to != address(0) && to != address(this));
uint256 length = idsIn.length;
require(length != 0);
WETH.deposit{value: msg.value}();
uint256 count;
for (uint256 i; i < length; ++i) {
uint256 amount = amounts[i];
require(amount > 0, "Transferring < 1");
count += amount;
}
INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId));
uint256 redeemFees = (vault.targetSwapFee() * specificIds.length) + (
vault.randomSwapFee() * (count - specificIds.length)
);
uint256[] memory swapAmounts = _buyVaultToken(redeemFees, msg.value, path);
_swap1155(vaultId, idsIn, amounts, specificIds, to);
emit Swap(count, swapAmounts[0], to);
// Return extras.
uint256 remaining = WETH.balanceOf(address(this));
WETH.withdraw(remaining);
(bool success, ) = payable(to).call{value: remaining}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function buyAndSwap1155WETH(
uint256 vaultId,
uint256[] calldata idsIn,
uint256[] calldata amounts,
uint256[] calldata specificIds,
uint256 maxWethIn,
address[] calldata path,
address to
) external payable nonReentrant {
require(to != address(0) && to != address(this));
require(idsIn.length != 0);
uint256 count;
for (uint256 i = 0; i < idsIn.length; i++) {
uint256 amount = amounts[i];
require(amount > 0, "Transferring < 1");
count += amount;
}
INFTXVault vault = INFTXVault(nftxFactory.vault(vaultId));
uint256 redeemFees = (vault.targetSwapFee() * specificIds.length) + (
vault.randomSwapFee() * (count - specificIds.length)
);
IERC20Upgradeable(address(WETH)).safeTransferFrom(msg.sender, address(this), maxWethIn);
uint256[] memory swapAmounts = _buyVaultToken(redeemFees, maxWethIn, path);
_swap1155(vaultId, idsIn, amounts, specificIds, to);
emit Swap(count, swapAmounts[0], to);
// Return extras.
uint256 remaining = WETH.balanceOf(address(this));
WETH.transfer(to, remaining);
}
function buyAndRedeem(
uint256 vaultId,
uint256 amount,
uint256[] calldata specificIds,
address[] calldata path,
address to
) external payable nonReentrant {
require(to != address(0) && to != address(this));
require(amount != 0);
WETH.deposit{value: msg.value}();
(, uint256 randomRedeemFee, uint256 targetRedeemFee, ,) = nftxFactory.vaultFees(vaultId);
uint256 totalFee = (targetRedeemFee * specificIds.length) + (
randomRedeemFee * (amount - specificIds.length)
);
uint256[] memory amounts = _buyVaultToken((amount*BASE)+totalFee, msg.value, path);
_redeem(vaultId, amount, specificIds, to);
emit Buy(amount, amounts[0], to);
uint256 remaining = WETH.balanceOf(address(this));
if (remaining != 0) {
WETH.withdraw(remaining);
(bool success, ) = payable(to).call{value: remaining}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
}
function buyAndRedeemWETH(
uint256 vaultId,
uint256 amount,
uint256[] calldata specificIds,
uint256 maxWethIn,
address[] calldata path,
address to
) external nonReentrant {
require(to != address(0) && to != address(this));
require(amount != 0);
uint256 totalFee;
{
(, uint256 randomRedeemFee, uint256 targetRedeemFee, ,) = nftxFactory.vaultFees(vaultId);
totalFee = (targetRedeemFee * specificIds.length) + (
randomRedeemFee * (amount - specificIds.length)
);
}
IERC20Upgradeable(address(WETH)).safeTransferFrom(msg.sender, address(this), maxWethIn);
uint256[] memory amounts = _buyVaultToken((amount*BASE) + totalFee, maxWethIn, path);
_redeem(vaultId, amount, specificIds, to);
emit Buy(amount, amounts[0], to);
uint256 remaining = WETH.balanceOf(address(this));
if (remaining != 0) {
WETH.transfer(to, remaining);
}
}
function mintAndSell1155(
uint256 vaultId,
uint256[] calldata ids,
uint256[] calldata amounts,
uint256 minWethOut,
address[] calldata path,
address to
) external nonReentrant {
require(to != address(0) && to != address(this));
require(ids.length != 0);
(address vault, uint256 vaultTokenBalance) = _mint1155(vaultId, ids, amounts);
uint256[] memory uniAmounts = _sellVaultTokenETH(vault, minWethOut, vaultTokenBalance, path, to);
uint256 count;
uint256 length = ids.length;
for (uint256 i; i < length; ++i) {
count += amounts[i];
}
emit Sell(count, uniAmounts[uniAmounts.length-1], to);
}
function mintAndSell1155WETH(
uint256 vaultId,
uint256[] calldata ids,
uint256[] calldata amounts,
uint256 minWethOut,
address[] calldata path,
address to
) external nonReentrant {
require(to != address(0) && to != address(this));
require(ids.length != 0);
(address vault, uint256 vaultTokenBalance) = _mint1155(vaultId, ids, amounts);
_sellVaultTokenWETH(vault, minWethOut, vaultTokenBalance, path, to);
uint256 count;
uint256 length = ids.length;
for (uint256 i; i < length; ++i) {
count += amounts[i];
}
emit Sell(count, amounts[amounts.length-1], to);
}
function _mint721(
uint256 vaultId,
uint256[] memory ids
) internal returns (address, uint256) {
address vault = nftxFactory.vault(vaultId);
// Transfer tokens to zap and mint to NFTX.
address assetAddress = INFTXVault(vault).assetAddress();
uint256 length = ids.length;
for (uint256 i; i < length; ++i) {
transferFromERC721(assetAddress, ids[i], vault);
approveERC721(assetAddress, vault, ids[i]);
}
uint256[] memory emptyIds;
INFTXVault(vault).mint(ids, emptyIds);
uint256 count = ids.length;
uint256 balance = (count * BASE) - (count * INFTXVault(vault).mintFee());
return (vault, balance);
}
function _swap721(
uint256 vaultId,
uint256[] memory idsIn,
uint256[] memory idsOut,
address to
) internal returns (address) {
address vault = nftxFactory.vault(vaultId);
// Transfer tokens to zap and mint to NFTX.
address assetAddress = INFTXVault(vault).assetAddress();
uint256 length = idsIn.length;
for (uint256 i; i < length; ++i) {
transferFromERC721(assetAddress, idsIn[i], vault);
approveERC721(assetAddress, vault, idsIn[i]);
}
uint256[] memory emptyIds;
INFTXVault(vault).swapTo(idsIn, emptyIds, idsOut, to);
return (vault);
}
function _swap1155(
uint256 vaultId,
uint256[] memory idsIn,
uint256[] memory amounts,
uint256[] memory idsOut,
address to
) internal returns (address) {
address vault = nftxFactory.vault(vaultId);
// Transfer tokens to zap and mint to NFTX.
address assetAddress = INFTXVault(vault).assetAddress();
IERC1155Upgradeable(assetAddress).safeBatchTransferFrom(msg.sender, address(this), idsIn, amounts, "");
IERC1155Upgradeable(assetAddress).setApprovalForAll(vault, true);
INFTXVault(vault).swapTo(idsIn, amounts, idsOut, to);
return (vault);
}
function _redeem(
uint256 vaultId,
uint256 amount,
uint256[] memory specificIds,
address to
) internal {
address vault = nftxFactory.vault(vaultId);
INFTXVault(vault).redeemTo(amount, specificIds, to);
}
function _mint1155(
uint256 vaultId,
uint256[] memory ids,
uint256[] memory amounts
) internal returns (address, uint256) {
address vault = nftxFactory.vault(vaultId);
require(vault != address(0), "NFTXZap: Vault does not exist");
// Transfer tokens to zap and mint to NFTX.
address assetAddress = INFTXVault(vault).assetAddress();
IERC1155Upgradeable(assetAddress).safeBatchTransferFrom(msg.sender, address(this), ids, amounts, "");
IERC1155Upgradeable(assetAddress).setApprovalForAll(vault, true);
uint256 count = INFTXVault(vault).mint(ids, amounts);
uint256 balance = (count * BASE) - (INFTXVault(vault).mintFee()*count);
return (vault, balance);
}
function _buyVaultToken(
uint256 minTokenOut,
uint256 maxWethIn,
address[] calldata path
) internal returns (uint256[] memory) {
uint256[] memory amounts = sushiRouter.swapTokensForExactTokens(
minTokenOut,
maxWethIn,
path,
address(this),
block.timestamp
);
return amounts;
}
function _sellVaultTokenWETH(
address vault,
uint256 minWethOut,
uint256 maxTokenIn,
address[] calldata path,
address to
) internal returns (uint256[] memory) {
IERC20Upgradeable(vault).safeApprove(address(sushiRouter), maxTokenIn);
uint256[] memory amounts = sushiRouter.swapExactTokensForTokens(
maxTokenIn,
minWethOut,
path,
to,
block.timestamp
);
return amounts;
}
function _sellVaultTokenETH(
address vault,
uint256 minEthOut,
uint256 maxTokenIn,
address[] calldata path,
address to
) internal returns (uint256[] memory) {
IERC20Upgradeable(vault).safeApprove(address(sushiRouter), maxTokenIn);
uint256[] memory amounts = sushiRouter.swapExactTokensForETH(
maxTokenIn,
minEthOut,
path,
to,
block.timestamp
);
return amounts;
}
function transferFromERC721(address assetAddr, uint256 tokenId, address to) internal virtual {
address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;
address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB;
bytes memory data;
if (assetAddr == kitties) {
// Cryptokitties.
data = abi.encodeWithSignature("transferFrom(address,address,uint256)", msg.sender, to, tokenId);
} else if (assetAddr == punks) {
// CryptoPunks.
// Fix here for frontrun attack. Added in v1.0.2.
bytes memory punkIndexToAddress = abi.encodeWithSignature("punkIndexToAddress(uint256)", tokenId);
(bool checkSuccess, bytes memory result) = address(assetAddr).staticcall(punkIndexToAddress);
(address nftOwner) = abi.decode(result, (address));
require(checkSuccess && nftOwner == msg.sender, "Not the NFT owner");
data = abi.encodeWithSignature("buyPunk(uint256)", tokenId);
} else {
// Default.
// We push to the vault to avoid an unneeded transfer.
data = abi.encodeWithSignature("safeTransferFrom(address,address,uint256)", msg.sender, to, tokenId);
}
(bool success, bytes memory resultData) = address(assetAddr).call(data);
require(success, string(resultData));
}
function approveERC721(address assetAddr, address to, uint256 tokenId) internal virtual {
address kitties = 0x06012c8cf97BEaD5deAe237070F9587f8E7A266d;
address punks = 0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB;
bytes memory data;
if (assetAddr == kitties) {
// // Cryptokitties.
// data = abi.encodeWithSignature("approve(address,uint256)", to, tokenId);
// No longer needed to approve with pushing.
return;
} else if (assetAddr == punks) {
// CryptoPunks.
data = abi.encodeWithSignature("offerPunkForSaleToAddress(uint256,uint256,address)", tokenId, 0, to);
} else {
// No longer needed to approve with pushing.
return;
}
(bool success, bytes memory resultData) = address(assetAddr).call(data);
require(success, string(resultData));
}
// calculates the CREATE2 address for a pair without making any external calls
function pairFor(address tokenA, address tokenB) internal view returns (address pair) {
(address token0, address token1) = sortTokens(tokenA, tokenB);
pair = address(uint160(uint256(keccak256(abi.encodePacked(
hex'ff',
sushiRouter.factory(),
keccak256(abi.encodePacked(token0, token1)),
hex'e18a34eb0e04b04f7a0ac29a6e80748dca96319b42c54d679cb821dca90c6303' // init code hash
)))));
}
// returns sorted token addresses, used to handle return values from pairs sorted in this order
function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES');
(token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS');
}
function rescue(address token) external onlyOwner {
if (token == address(0)) {
(bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
require(success, "Address: unable to send value, recipient may have reverted");
} else {
IERC20Upgradeable(token).safeTransfer(msg.sender, IERC20Upgradeable(token).balanceOf(address(this)));
}
}
receive() external payable {
require(msg.sender == address(WETH), "Only WETH");
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_nftxFactory","type":"address"},{"internalType":"address","name":"_sushiRouter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethSpent","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Sell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"count","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethSpent","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndRedeem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"uint256","name":"maxWethIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndRedeemWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"idsIn","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndSwap1155","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"idsIn","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"uint256","name":"maxWethIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndSwap1155WETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"idsIn","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndSwap721","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"idsIn","type":"uint256[]"},{"internalType":"uint256[]","name":"specificIds","type":"uint256[]"},{"internalType":"uint256","name":"maxWethIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"buyAndSwap721WETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lpStaking","outputs":[{"internalType":"contract INFTXLPStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minWethOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintAndSell1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"minWethOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintAndSell1155WETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minEthOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintAndSell721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vaultId","type":"uint256"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256","name":"minWethOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"mintAndSell721WETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nftxFactory","outputs":[{"internalType":"contract INFTXVaultFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiRouter","outputs":[{"internalType":"contract IUniswapV2Router01","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6101006040523480156200001257600080fd5b5060405162005b1d38038062005b1d8339810160408190526200003591620006f5565b62000040336200029e565b600180556001600160601b0319606083901b1660c05260408051630d43e8ad60e01b815290516001600160a01b03841691630d43e8ad916004808301926020929190829003018186803b1580156200009757600080fd5b505afa158015620000ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d29190620006d8565b6001600160a01b0316639bf1401c6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200010d57600080fd5b505af115801562000122573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001489190620006d8565b6001600160601b0319606091821b811660a0529082901b1660e052604080516315ab88c960e31b815290516001600160a01b0383169163ad5c4648916004808301926020929190829003018186803b158015620001a457600080fd5b505afa158015620001b9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001df9190620006d8565b6001600160a01b03166080816001600160a01b031660601b815250506200029681600019836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200023d57600080fd5b505afa15801562000252573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002789190620006d8565b6001600160a01b0316620002ee60201b62002e89179092919060201c565b5050620007ed565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8015806200037c5750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b1580156200033f57600080fd5b505afa15801562000354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200037a91906200074e565b155b620003f45760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084015b60405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200044c9185916200045116565b505050565b6000620004ad826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200052f60201b6200301e179092919060201c565b8051909150156200044c5780806020019051810190620004ce91906200072c565b6200044c5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401620003eb565b60606200054084846000856200054a565b90505b9392505050565b606082471015620005ad5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401620003eb565b843b620005fd5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401620003eb565b600080866001600160a01b031685876040516200061b919062000767565b60006040518083038185875af1925050503d80600081146200065a576040519150601f19603f3d011682016040523d82523d6000602084013e6200065f565b606091505b509092509050620006728282866200067d565b979650505050505050565b606083156200068e57508162000543565b8251156200069f5782518084602001fd5b8160405162461bcd60e51b8152600401620003eb919062000785565b80516001600160a01b0381168114620006d357600080fd5b919050565b600060208284031215620006ea578081fd5b6200054382620006bb565b6000806040838503121562000708578081fd5b6200071383620006bb565b91506200072360208401620006bb565b90509250929050565b6000602082840312156200073e578081fd5b8151801515811462000543578182fd5b60006020828403121562000760578081fd5b5051919050565b600082516200077b818460208701620007ba565b9190910192915050565b6020815260008251806020840152620007a6816040850160208701620007ba565b601f01601f19169190910160400192915050565b60005b83811015620007d7578181015183820152602001620007bd565b83811115620007e7576000848401525b50505050565b60805160601c60a05160601c60c05160601c60e05160601c6151f5620009286000396000818161038b0152818161331b015281816133730152818161345801528181613b7f0152613bd701526000818161033f015281816108b701528181610dac015281816112b20152818161187e01528181611dda015281816123800152818161303e0152818161352f01528181613795015281816138e40152613c1d01526000610445015260008181610189015281816104b901528181610a5201528181610bd901528181610c8401528181610e8c01528181610fab0152818161105b015281816111790152818161159f0152818161163a015281816117f501528181611b2501528181611bc001528181611d990152818161209001528181612140015281816122d30152818161252801526125c801526151f56000f3fe6080604052600436106101795760003560e01c80637fc82484116100cb578063a02716171161007f578063bc197c8111610059578063bc197c81146104db578063f23a6e6114610520578063f2fde38b1461056557600080fd5b8063a027161714610467578063ab3a412114610487578063ad5c4648146104a757600080fd5b80638da5cb5b116100b05780638da5cb5b146103f5578063929bf3d3146104135780639bf1401c1461043357600080fd5b80637fc82484146103c2578063839006f2146103d557600080fd5b806357e836dc1161012d5780635ee50f88116101075780635ee50f881461032d5780636d13582c14610379578063715018a6146103ad57600080fd5b806357e836dc146102e757806358fbdd0a146102fa5780635d8117a61461030d57600080fd5b8063150b7a021161015e578063150b7a021461025757806342c4ccaa146102b45780634447d888146102c757600080fd5b806301ffc9a7146102025780630956642b1461023757600080fd5b366101fd57336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101fb5760405162461bcd60e51b815260206004820152600960248201527f4f6e6c792057455448000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561020e57600080fd5b5061022261021d36600461495b565b610585565b60405190151581526020015b60405180910390f35b34801561024357600080fd5b506101fb610252366004614cca565b6105ee565b34801561026357600080fd5b5061029b6102723660046147d7565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b0319909116815260200161022e565b6101fb6102c2366004614b27565b610762565b3480156102d357600080fd5b506101fb6102e2366004614dc1565b610d19565b6101fb6102f5366004614a4e565b6110ea565b6101fb61030836600461499b565b611767565b34801561031957600080fd5b506101fb610328366004614c0e565b611d00565b34801561033957600080fd5b506103617f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161022e565b34801561038557600080fd5b506103617f000000000000000000000000000000000000000000000000000000000000000081565b3480156103b957600080fd5b506101fb6121d0565b6101fb6103d0366004614d5e565b612245565b3480156103e157600080fd5b506101fb6103f03660046146f5565b612709565b34801561040157600080fd5b506000546001600160a01b0316610361565b34801561041f57600080fd5b506101fb61042e366004614cca565b6128d3565b34801561043f57600080fd5b506103617f000000000000000000000000000000000000000000000000000000000000000081565b34801561047357600080fd5b506101fb610482366004614c0e565b6129b3565b34801561049357600080fd5b506101fb6104a2366004614c0e565b612ba3565b3480156104b357600080fd5b506103617f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e757600080fd5b5061029b6104f636600461472d565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561052c57600080fd5b5061029b61053b366004614841565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561057157600080fd5b506101fb6105803660046146f5565b612d9b565b60006001600160e01b031982167f4e2312e00000000000000000000000000000000000000000000000000000000014806105e857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b600260015414156106415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061066757506001600160a01b0381163014155b61067057600080fd5b8461067a57600080fd5b6000806106ba8989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061303792505050565b9150915060006106ce83888489898961330a565b90507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d818989905082600184516107049190615120565b8151811061072257634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a15050600180555050505050505050565b600260015414156107b55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906107db57506001600160a01b0381163014155b6107e457600080fd5b886107ee57600080fd5b6000805b8a8110156108955760008a8a8381811061081c57634e487b7160e01b600052603260045260246000fd5b905060200201359050600081116108755760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657272696e67203c20310000000000000000000000000000000060448201526064016101f2565b61087f81846150e9565b925050808061088d90615163565b9150506107f2565b506040516340d1b7db60e11b8152600481018d90526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906381a36fb69060240160206040518083038186803b1580156108f957600080fd5b505afa15801561090d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109319190614711565b9050600061093f8884615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561097857600080fd5b505afa15801561098c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b09190614983565b6109ba9190615101565b89899050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109f757600080fd5b505afa158015610a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2f9190614983565b610a399190615101565b610a4391906150e9565b9050610a7a6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308a613414565b6000610a8882898989613452565b9050610b4d8f8f8f80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e8e80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508d8d808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c925061350c915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8482600081518110610b9157634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610c2357600080fd5b505afa158015610c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5b9190614983565b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b158015610cca57600080fd5b505af1158015610cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d02919061493b565b505060018055505050505050505050505050505050565b60026001541415610d6c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590610d9257506001600160a01b0381163014155b610d9b57600080fd5b86610da557600080fd5b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663220613798c6040518263ffffffff1660e01b8152600401610df891815260200190565b60a06040518083038186803b158015610e1057600080fd5b505afa158015610e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e489190614e4d565b509194509250610e5c91508990508b615120565b610e669083615101565b610e708983615101565b610e7a91906150e9565b9250610eb49150506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333088613414565b6000610ede82610ecc670de0b6b3a76400008c615101565b610ed691906150e9565b878787613452565b9050610f208a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061377c915050565b7ff7735c8cb2a65788ca663fc8415b7c6a66cd6847d58346d8334e8d52a599d3df8982600081518110610f6357634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0386169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610ff557600080fd5b505afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190614983565b905080156110d95760405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d7919061493b565b505b505060018055505050505050505050565b6002600154141561113d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061116357506001600160a01b0381163014155b61116c57600080fd5b878061117757600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156111d257600080fd5b505af11580156111e6573d6000803e3d6000fd5b50505050506000805b828110156112905760008a8a8381811061121957634e487b7160e01b600052603260045260246000fd5b905060200201359050600081116112725760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657272696e67203c20310000000000000000000000000000000060448201526064016101f2565b61127c81846150e9565b9250508061128990615163565b90506111ef565b506040516340d1b7db60e11b8152600481018d90526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906381a36fb69060240160206040518083038186803b1580156112f457600080fd5b505afa158015611308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c9190614711565b9050600061133a8884615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561137357600080fd5b505afa158015611387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ab9190614983565b6113b59190615101565b89899050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113f257600080fd5b505afa158015611406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142a9190614983565b6114349190615101565b61143e91906150e9565b9050600061144e82348a8a613452565b90506115138f8f8f80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e8e80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508d8d808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508d925061350c915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b848260008151811061155757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0389169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b1580156115e957600080fd5b505afa1580156115fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116219190614983565b604051632e1a7d4d60e01b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561168657600080fd5b505af115801561169a573d6000803e3d6000fd5b505050506000876001600160a01b03168260405160006040518083038185875af1925050503d80600081146116eb576040519150601f19603f3d011682016040523d82523d6000602084013e6116f0565b606091505b5050905080610d025760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b600260015414156117ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906117e057506001600160a01b0381163014155b6117e957600080fd5b856117f357600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561184e57600080fd5b505af1158015611862573d6000803e3d6000fd5b50506040516340d1b7db60e11b8152600481018c9052600093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692506381a36fb6915060240160206040518083038186803b1580156118ca57600080fd5b505afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119029190614711565b905060006119108689615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561194957600080fd5b505afa15801561195d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119819190614983565b61198b9190615101565b87879050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119c857600080fd5b505afa1580156119dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a009190614983565b611a0a9190615101565b611a1491906150e9565b90506000611a2482348888613452565b9050611a968b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508a92506138c1915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8a8a905082600081518110611add57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015611b6f57600080fd5b505afa158015611b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba79190614983565b604051632e1a7d4d60e01b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611c0c57600080fd5b505af1158015611c20573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611c71576040519150601f19603f3d011682016040523d82523d6000602084013e611c76565b606091505b5050905080611ced5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b5050600180555050505050505050505050565b60026001541415611d535760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590611d7957506001600160a01b0381163014155b611d8257600080fd5b86611d8c57600080fd5b611dc16001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087613414565b6040516340d1b7db60e11b8152600481018a90526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b158015611e2457600080fd5b505afa158015611e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5c9190614711565b90506000611e6a878a615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea357600080fd5b505afa158015611eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edb9190614983565b611ee59190615101565b88889050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2257600080fd5b505afa158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a9190614983565b611f649190615101565b611f6e91906150e9565b90506000611f7e82888888613452565b90506120018c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a92506138c1915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8b8b90508260008151811061204857634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b1580156120da57600080fd5b505afa1580156120ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121129190614983565b90508015611ced5760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561218457600080fd5b505af1158015612198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bc919061493b565b505050600180555050505050505050505050565b336121e36000546001600160a01b031690565b6001600160a01b0316146122395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6122436000613ad6565b565b600260015414156122985760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906122be57506001600160a01b0381163014155b6122c757600080fd5b856122d157600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561232c57600080fd5b505af1158015612340573d6000803e3d6000fd5b50506040517f22061379000000000000000000000000000000000000000000000000000000008152600481018b9052600093508392506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016915063220613799060240160a06040518083038186803b1580156123c357600080fd5b505afa1580156123d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fb9190614e4d565b509194509250600091506124119050878a615120565b61241b9084615101565b6124258884615101565b61242f91906150e9565b9050600061245b82612449670de0b6b3a76400008d615101565b61245391906150e9565b348989613452565b905061249d8b8b8b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925061377c915050565b7ff7735c8cb2a65788ca663fc8415b7c6a66cd6847d58346d8334e8d52a599d3df8a826000815181106124e057634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561257257600080fd5b505afa158015612586573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125aa9190614983565b905080156126f757604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561261457600080fd5b505af1158015612628573d6000803e3d6000fd5b505050506000866001600160a01b03168260405160006040518083038185875af1925050503d8060008114612679576040519150601f19603f3d011682016040523d82523d6000602084013e61267e565b606091505b50509050806126f55760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b505b50506001805550505050505050505050565b3361271c6000546001600160a01b031690565b6001600160a01b0316146127725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6001600160a01b03811661284257604051600090339047908381818185875af1925050503d80600081146127c2576040519150601f19603f3d011682016040523d82523d6000602084013e6127c7565b606091505b505090508061283e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b5050565b6040516370a0823160e01b81523060048201526128d09033906001600160a01b038416906370a082319060240160206040518083038186803b15801561288757600080fd5b505afa15801561289b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bf9190614983565b6001600160a01b0384169190613b3e565b50565b600260015414156129265760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061294c57506001600160a01b0381163014155b61295557600080fd5b8461295f57600080fd5b60008061299f8989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061303792505050565b9150915060006106ce838884898989613b6e565b60026001541415612a065760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590612a2c57506001600160a01b0381163014155b612a3557600080fd5b86612a3f57600080fd5b600080612ab08b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d918291850190849080828437600092019190915250613c1692505050565b91509150612ac2828783888888613b6e565b50600089815b81811015612b14578a8a82818110612af057634e487b7160e01b600052603260045260246000fd5b9050602002013583612b0291906150e9565b9250612b0d81615163565b9050612ac8565b507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d81828b8b612b44600182615120565b818110612b6157634e487b7160e01b600052603260045260246000fd5b604080519485526020918202939093013590840152506001600160a01b0388169082015260600160405180910390a15050600180555050505050505050505050565b60026001541415612bf65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590612c1c57506001600160a01b0381163014155b612c2557600080fd5b86612c2f57600080fd5b600080612ca08b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d918291850190849080828437600092019190915250613c1692505050565b915091506000612cb483888489898961330a565b905060008a815b81811015612d07578b8b82818110612ce357634e487b7160e01b600052603260045260246000fd5b9050602002013583612cf591906150e9565b9250612d0081615163565b9050612cbb565b507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d81828460018651612d399190615120565b81518110612d5757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0389169082015260600160405180910390a1505060018055505050505050505050505050565b33612dae6000546001600160a01b031690565b6001600160a01b031614612e045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6001600160a01b038116612e805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101f2565b6128d081613ad6565b801580612f2b57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015612ef157600080fd5b505afa158015612f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f299190614983565b155b612f9d5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016101f2565b6040516001600160a01b0383166024820152604481018290526130199084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f7c565b505050565b606061302d8484600085614061565b90505b9392505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166381a36fb6866040518263ffffffff1660e01b815260040161308a91815260200190565b60206040518083038186803b1580156130a257600080fd5b505afa1580156130b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130da9190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561311757600080fd5b505afa15801561312b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314f9190614711565b855190915060005b818110156131d3576131918388838151811061318357634e487b7160e01b600052603260045260246000fd5b6020026020010151866141a0565b6131c383858984815181106131b657634e487b7160e01b600052603260045260246000fd5b60200260200101516144d0565b6131cc81615163565b9050613157565b50604051630f57464360e21b81526060906001600160a01b03851690633d5d190c90613205908a908590600401614f3a565b602060405180830381600087803b15801561321f57600080fd5b505af1158015613233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132579190614983565b506000875190506000856001600160a01b03166313966db56040518163ffffffff1660e01b815260040160206040518083038186803b15801561329957600080fd5b505afa1580156132ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d19190614983565b6132db9083615101565b6132ed670de0b6b3a764000084615101565b6132f79190615120565b95975094955050505050505b9250929050565b60606133406001600160a01b0388167f000000000000000000000000000000000000000000000000000000000000000087612e89565b6040517f18cbafe50000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906318cbafe5906133b29089908b908a908a908a904290600401615021565b600060405180830381600087803b1580156133cc57600080fd5b505af11580156133e0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261340891908101906148a8565b98975050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905261344c9085906323b872dd60e01b90608401612fe2565b50505050565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638803dbee8787878730426040518763ffffffff1660e01b81526004016134ac96959493929190615021565b600060405180830381600087803b1580156134c657600080fd5b505af11580156134da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261350291908101906148a8565b9695505050505050565b6040516340d1b7db60e11b81526004810186905260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906381a36fb69060240160206040518083038186803b15801561357157600080fd5b505afa158015613585573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a99190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135e657600080fd5b505afa1580156135fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361e9190614711565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d69061365390339030908c908c90600401614ee2565b600060405180830381600087803b15801561366d57600080fd5b505af1158015613681573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b1580156136cf57600080fd5b505af11580156136e3573d6000803e3d6000fd5b5050604051632321420560e21b81526001600160a01b0385169250638c8508149150613719908a908a908a908a90600401614f68565b600060405180830381600087803b15801561373357600080fd5b505af1158015613747573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261376f91908101906148a8565b5090979650505050505050565b6040516340d1b7db60e11b8152600481018590526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906381a36fb69060240160206040518083038186803b1580156137df57600080fd5b505afa1580156137f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138179190614711565b6040517f9d54def60000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690639d54def69061386390879087908790600401614fef565b600060405180830381600087803b15801561387d57600080fd5b505af1158015613891573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138b991908101906148a8565b505050505050565b6040516340d1b7db60e11b81526004810185905260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906381a36fb69060240160206040518083038186803b15801561392657600080fd5b505afa15801561393a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061395e9190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561399b57600080fd5b505afa1580156139af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d39190614711565b865190915060005b81811015613a3c57613a078389838151811061318357634e487b7160e01b600052603260045260246000fd5b613a2c83858a84815181106131b657634e487b7160e01b600052603260045260246000fd5b613a3581615163565b90506139db565b50604051632321420560e21b81526060906001600160a01b03851690638c85081490613a72908b9085908c908c90600401614f68565b600060405180830381600087803b158015613a8c57600080fd5b505af1158015613aa0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ac891908101906148a8565b509298975050505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03831660248201526044810182905261301990849063a9059cbb60e01b90606401612fe2565b6060613ba46001600160a01b0388167f000000000000000000000000000000000000000000000000000000000000000087612e89565b6040517f38ed17390000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906338ed1739906133b29089908b908a908a908a904290600401615021565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166381a36fb6876040518263ffffffff1660e01b8152600401613c6991815260200190565b60206040518083038186803b158015613c8157600080fd5b505afa158015613c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cb99190614711565b90506001600160a01b038116613d115760405162461bcd60e51b815260206004820152601d60248201527f4e4654585a61703a205661756c7420646f6573206e6f7420657869737400000060448201526064016101f2565b6000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d4c57600080fd5b505afa158015613d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d849190614711565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d690613db990339030908b908b90600401614ee2565b600060405180830381600087803b158015613dd357600080fd5b505af1158015613de7573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b158015613e3557600080fd5b505af1158015613e49573d6000803e3d6000fd5b5050604051630f57464360e21b8152600092506001600160a01b0385169150633d5d190c90613e7e908a908a90600401614f3a565b602060405180830381600087803b158015613e9857600080fd5b505af1158015613eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ed09190614983565b9050600081846001600160a01b03166313966db56040518163ffffffff1660e01b815260040160206040518083038186803b158015613f0e57600080fd5b505afa158015613f22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f469190614983565b613f509190615101565b613f62670de0b6b3a764000084615101565b613f6c9190615120565b9399939850929650505050505050565b6000613fd1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661301e9092919063ffffffff16565b8051909150156130195780806020019051810190613fef919061493b565b6130195760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101f2565b6060824710156140d95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101f2565b843b6141275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101f2565b600080866001600160a01b031685876040516141439190614ec6565b60006040518083038185875af1925050503d8060008114614180576040519150601f19603f3d011682016040523d82523d6000602084013e614185565b606091505b509150915061419582828661459c565b979650505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415614230576040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b1790529050614443565b816001600160a01b0316866001600160a01b031614156143db5760008560405160240161425f91815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b038a16906142c1908590614ec6565b600060405180830381855afa9150503d80600081146142fc576040519150601f19603f3d011682016040523d82523d6000602084013e614301565b606091505b509150915060008180602001905181019061431c9190614711565b905082801561433357506001600160a01b03811633145b61437f5760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e657200000000000000000000000000000060448201526064016101f2565b604051602481018a905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe980000000000000000000000000000000000000000000000000000000017905294506144439350505050565b6040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03167f42842e0e0000000000000000000000000000000000000000000000000000000017905290505b600080876001600160a01b03168360405161445e9190614ec6565b6000604051808303816000865af19150503d806000811461449b576040519150601f19603f3d011682016040523d82523d6000602084013e6144a0565b606091505b50915091508181906144c55760405162461bcd60e51b81526004016101f29190614fbc565b505050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b03861683141561451557505050505050565b816001600160a01b0316866001600160a01b031614156138b95760405160248101859052600060448201526001600160a01b038616606482015260840160408051601f198184030181529190526020810180516001600160e01b03167fbf31196f000000000000000000000000000000000000000000000000000000001790529050614443565b606083156145ab575081613030565b8251156145bb5782518084602001fd5b8160405162461bcd60e51b81526004016101f29190614fbc565b80356145e0816151aa565b919050565b60008083601f8401126145f6578182fd5b50813567ffffffffffffffff81111561460d578182fd5b6020830191508360208260051b850101111561330357600080fd5b600082601f830112614638578081fd5b8135602061464d614648836150c5565b615094565b80838252828201915082860187848660051b890101111561466c578586fd5b855b8581101561376f5781358452928401929084019060010161466e565b600082601f83011261469a578081fd5b813567ffffffffffffffff8111156146b4576146b4615194565b6146c7601f8201601f1916602001615094565b8181528460208386010111156146db578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215614706578081fd5b8135613030816151aa565b600060208284031215614722578081fd5b8151613030816151aa565b600080600080600060a08688031215614744578081fd5b853561474f816151aa565b9450602086013561475f816151aa565b9350604086013567ffffffffffffffff8082111561477b578283fd5b61478789838a01614628565b9450606088013591508082111561479c578283fd5b6147a889838a01614628565b935060808801359150808211156147bd578283fd5b506147ca8882890161468a565b9150509295509295909350565b600080600080608085870312156147ec578384fd5b84356147f7816151aa565b93506020850135614807816151aa565b925060408501359150606085013567ffffffffffffffff811115614829578182fd5b6148358782880161468a565b91505092959194509250565b600080600080600060a08688031215614858578081fd5b8535614863816151aa565b94506020860135614873816151aa565b93506040860135925060608601359150608086013567ffffffffffffffff81111561489c578182fd5b6147ca8882890161468a565b600060208083850312156148ba578182fd5b825167ffffffffffffffff8111156148d0578283fd5b8301601f810185136148e0578283fd5b80516148ee614648826150c5565b80828252848201915084840188868560051b870101111561490d578687fd5b8694505b8385101561492f578051835260019490940193918501918501614911565b50979650505050505050565b60006020828403121561494c578081fd5b81518015158114613030578182fd5b60006020828403121561496c578081fd5b81356001600160e01b031981168114613030578182fd5b600060208284031215614994578081fd5b5051919050565b60008060008060008060008060a0898b0312156149b6578586fd5b88359750602089013567ffffffffffffffff808211156149d4578788fd5b6149e08c838d016145e5565b909950975060408b01359150808211156149f8578485fd5b614a048c838d016145e5565b909750955060608b0135915080821115614a1c578485fd5b50614a298b828c016145e5565b9094509250506080890135614a3d816151aa565b809150509295985092959890939650565b60008060008060008060008060008060c08b8d031215614a6c578384fd5b8a35995060208b013567ffffffffffffffff80821115614a8a578586fd5b614a968e838f016145e5565b909b50995060408d0135915080821115614aae578586fd5b614aba8e838f016145e5565b909950975060608d0135915080821115614ad2578586fd5b614ade8e838f016145e5565b909750955060808d0135915080821115614af6578384fd5b50614b038d828e016145e5565b9094509250614b16905060a08c016145d5565b90509295989b9194979a5092959850565b600080600080600080600080600080600060e08c8e031215614b47578485fd5b8b359a5067ffffffffffffffff8060208e01351115614b64578586fd5b614b748e60208f01358f016145e5565b909b50995060408d0135811015614b89578586fd5b614b998e60408f01358f016145e5565b909950975060608d0135811015614bae578586fd5b614bbe8e60608f01358f016145e5565b909750955060808d0135945060a08d0135811015614bda578182fd5b50614beb8d60a08e01358e016145e5565b9093509150614bfc60c08d016145d5565b90509295989b509295989b9093969950565b600080600080600080600080600060c08a8c031215614c2b578283fd5b8935985060208a013567ffffffffffffffff80821115614c49578485fd5b614c558d838e016145e5565b909a50985060408c0135915080821115614c6d578485fd5b614c798d838e016145e5565b909850965060608c0135955060808c0135915080821115614c98578485fd5b50614ca58c828d016145e5565b90945092505060a08a0135614cb9816151aa565b809150509295985092959850929598565b600080600080600080600060a0888a031215614ce4578081fd5b87359650602088013567ffffffffffffffff80821115614d02578283fd5b614d0e8b838c016145e5565b909850965060408a0135955060608a0135915080821115614d2d578283fd5b50614d3a8a828b016145e5565b9094509250506080880135614d4e816151aa565b8091505092959891949750929550565b600080600080600080600060a0888a031215614d78578081fd5b8735965060208801359550604088013567ffffffffffffffff80821115614d9d578283fd5b614da98b838c016145e5565b909750955060608a0135915080821115614d2d578283fd5b60008060008060008060008060c0898b031215614ddc578182fd5b8835975060208901359650604089013567ffffffffffffffff80821115614e01578384fd5b614e0d8c838d016145e5565b909850965060608b0135955060808b0135915080821115614e2c578384fd5b50614e398b828c016145e5565b90945092505060a0890135614a3d816151aa565b600080600080600060a08688031215614e64578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6000815180845260208085019450808401835b83811015614ebb57815187529582019590820190600101614e9f565b509495945050505050565b60008251614ed8818460208701615137565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a06040830152614f0e60a0830185614e8c565b8281036060840152614f208185614e8c565b838103608090940193909352508152602001949350505050565b604081526000614f4d6040830185614e8c565b8281036020840152614f5f8185614e8c565b95945050505050565b608081526000614f7b6080830187614e8c565b8281036020840152614f8d8187614e8c565b90508281036040840152614fa18186614e8c565b9150506001600160a01b038316606083015295945050505050565b6020815260008251806020840152614fdb816040850160208701615137565b601f01601f19169190910160400192915050565b8381526060602082015260006150086060830185614e8c565b90506001600160a01b0383166040830152949350505050565b868152602080820187905260a0604083018190528201859052600090869060c08401835b88811015615073578335615058816151aa565b6001600160a01b031682529282019290820190600101615045565b506001600160a01b0396909616606085015250505060800152949350505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156150bd576150bd615194565b604052919050565b600067ffffffffffffffff8211156150df576150df615194565b5060051b60200190565b600082198211156150fc576150fc61517e565b500190565b600081600019048311821515161561511b5761511b61517e565b500290565b6000828210156151325761513261517e565b500390565b60005b8381101561515257818101518382015260200161513a565b8381111561344c5750506000910152565b60006000198214156151775761517761517e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146128d057600080fdfea2646970667358221220c014f43baa5d7fbb85db9f4e5587bbb8c3d457a56e7a6c72b775dff3912ec9a764736f6c63430008040033000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b47997506
Deployed Bytecode
0x6080604052600436106101795760003560e01c80637fc82484116100cb578063a02716171161007f578063bc197c8111610059578063bc197c81146104db578063f23a6e6114610520578063f2fde38b1461056557600080fd5b8063a027161714610467578063ab3a412114610487578063ad5c4648146104a757600080fd5b80638da5cb5b116100b05780638da5cb5b146103f5578063929bf3d3146104135780639bf1401c1461043357600080fd5b80637fc82484146103c2578063839006f2146103d557600080fd5b806357e836dc1161012d5780635ee50f88116101075780635ee50f881461032d5780636d13582c14610379578063715018a6146103ad57600080fd5b806357e836dc146102e757806358fbdd0a146102fa5780635d8117a61461030d57600080fd5b8063150b7a021161015e578063150b7a021461025757806342c4ccaa146102b45780634447d888146102c757600080fd5b806301ffc9a7146102025780630956642b1461023757600080fd5b366101fd57336001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab116146101fb5760405162461bcd60e51b815260206004820152600960248201527f4f6e6c792057455448000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b005b600080fd5b34801561020e57600080fd5b5061022261021d36600461495b565b610585565b60405190151581526020015b60405180910390f35b34801561024357600080fd5b506101fb610252366004614cca565b6105ee565b34801561026357600080fd5b5061029b6102723660046147d7565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040516001600160e01b0319909116815260200161022e565b6101fb6102c2366004614b27565b610762565b3480156102d357600080fd5b506101fb6102e2366004614dc1565b610d19565b6101fb6102f5366004614a4e565b6110ea565b6101fb61030836600461499b565b611767565b34801561031957600080fd5b506101fb610328366004614c0e565b611d00565b34801561033957600080fd5b506103617f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c81565b6040516001600160a01b03909116815260200161022e565b34801561038557600080fd5b506103617f0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b4799750681565b3480156103b957600080fd5b506101fb6121d0565b6101fb6103d0366004614d5e565b612245565b3480156103e157600080fd5b506101fb6103f03660046146f5565b612709565b34801561040157600080fd5b506000546001600160a01b0316610361565b34801561041f57600080fd5b506101fb61042e366004614cca565b6128d3565b34801561043f57600080fd5b506103617f0000000000000000000000005326a720f76cfbdfe9e18fa618c3a3f7abdf393481565b34801561047357600080fd5b506101fb610482366004614c0e565b6129b3565b34801561049357600080fd5b506101fb6104a2366004614c0e565b612ba3565b3480156104b357600080fd5b506103617f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab181565b3480156104e757600080fd5b5061029b6104f636600461472d565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561052c57600080fd5b5061029b61053b366004614841565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561057157600080fd5b506101fb6105803660046146f5565b612d9b565b60006001600160e01b031982167f4e2312e00000000000000000000000000000000000000000000000000000000014806105e857507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b600260015414156106415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061066757506001600160a01b0381163014155b61067057600080fd5b8461067a57600080fd5b6000806106ba8989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061303792505050565b9150915060006106ce83888489898961330a565b90507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d818989905082600184516107049190615120565b8151811061072257634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a15050600180555050505050505050565b600260015414156107b55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906107db57506001600160a01b0381163014155b6107e457600080fd5b886107ee57600080fd5b6000805b8a8110156108955760008a8a8381811061081c57634e487b7160e01b600052603260045260246000fd5b905060200201359050600081116108755760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657272696e67203c20310000000000000000000000000000000060448201526064016101f2565b61087f81846150e9565b925050808061088d90615163565b9150506107f2565b506040516340d1b7db60e11b8152600481018d90526000906001600160a01b037f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c16906381a36fb69060240160206040518083038186803b1580156108f957600080fd5b505afa15801561090d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109319190614711565b9050600061093f8884615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561097857600080fd5b505afa15801561098c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b09190614983565b6109ba9190615101565b89899050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109f757600080fd5b505afa158015610a0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a2f9190614983565b610a399190615101565b610a4391906150e9565b9050610a7a6001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab11633308a613414565b6000610a8882898989613452565b9050610b4d8f8f8f80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e8e80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508d8d808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c925061350c915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8482600081518110610b9157634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b0316906370a082319060240160206040518083038186803b158015610c2357600080fd5b505afa158015610c37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5b9190614983565b60405163a9059cbb60e01b81526001600160a01b038881166004830152602482018390529192507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab19091169063a9059cbb90604401602060405180830381600087803b158015610cca57600080fd5b505af1158015610cde573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d02919061493b565b505060018055505050505050505050505050505050565b60026001541415610d6c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590610d9257506001600160a01b0381163014155b610d9b57600080fd5b86610da557600080fd5b60008060007f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c6001600160a01b031663220613798c6040518263ffffffff1660e01b8152600401610df891815260200190565b60a06040518083038186803b158015610e1057600080fd5b505afa158015610e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e489190614e4d565b509194509250610e5c91508990508b615120565b610e669083615101565b610e708983615101565b610e7a91906150e9565b9250610eb49150506001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab116333088613414565b6000610ede82610ecc670de0b6b3a76400008c615101565b610ed691906150e9565b878787613452565b9050610f208a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525089925061377c915050565b7ff7735c8cb2a65788ca663fc8415b7c6a66cd6847d58346d8334e8d52a599d3df8982600081518110610f6357634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0386169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b0316906370a082319060240160206040518083038186803b158015610ff557600080fd5b505afa158015611009573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102d9190614983565b905080156110d95760405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390527f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1169063a9059cbb90604401602060405180830381600087803b15801561109f57600080fd5b505af11580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d7919061493b565b505b505060018055505050505050505050565b6002600154141561113d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061116357506001600160a01b0381163014155b61116c57600080fd5b878061117757600080fd5b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156111d257600080fd5b505af11580156111e6573d6000803e3d6000fd5b50505050506000805b828110156112905760008a8a8381811061121957634e487b7160e01b600052603260045260246000fd5b905060200201359050600081116112725760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657272696e67203c20310000000000000000000000000000000060448201526064016101f2565b61127c81846150e9565b9250508061128990615163565b90506111ef565b506040516340d1b7db60e11b8152600481018d90526000906001600160a01b037f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c16906381a36fb69060240160206040518083038186803b1580156112f457600080fd5b505afa158015611308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c9190614711565b9050600061133a8884615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561137357600080fd5b505afa158015611387573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ab9190614983565b6113b59190615101565b89899050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113f257600080fd5b505afa158015611406573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142a9190614983565b6114349190615101565b61143e91906150e9565b9050600061144e82348a8a613452565b90506115138f8f8f80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508e8e80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508d8d808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508d925061350c915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b848260008151811061155757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0389169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b0316906370a082319060240160206040518083038186803b1580156115e957600080fd5b505afa1580156115fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116219190614983565b604051632e1a7d4d60e01b8152600481018290529091507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561168657600080fd5b505af115801561169a573d6000803e3d6000fd5b505050506000876001600160a01b03168260405160006040518083038185875af1925050503d80600081146116eb576040519150601f19603f3d011682016040523d82523d6000602084013e6116f0565b606091505b5050905080610d025760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b600260015414156117ba5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906117e057506001600160a01b0381163014155b6117e957600080fd5b856117f357600080fd5b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561184e57600080fd5b505af1158015611862573d6000803e3d6000fd5b50506040516340d1b7db60e11b8152600481018c9052600093507f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c6001600160a01b031692506381a36fb6915060240160206040518083038186803b1580156118ca57600080fd5b505afa1580156118de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119029190614711565b905060006119108689615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b15801561194957600080fd5b505afa15801561195d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119819190614983565b61198b9190615101565b87879050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119c857600080fd5b505afa1580156119dc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a009190614983565b611a0a9190615101565b611a1491906150e9565b90506000611a2482348888613452565b9050611a968b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d9182918501908490808284376000920191909152508a92506138c1915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8a8a905082600081518110611add57634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b0316906370a082319060240160206040518083038186803b158015611b6f57600080fd5b505afa158015611b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba79190614983565b604051632e1a7d4d60e01b8152600481018290529091507f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611c0c57600080fd5b505af1158015611c20573d6000803e3d6000fd5b505050506000856001600160a01b03168260405160006040518083038185875af1925050503d8060008114611c71576040519150601f19603f3d011682016040523d82523d6000602084013e611c76565b606091505b5050905080611ced5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b5050600180555050505050505050505050565b60026001541415611d535760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590611d7957506001600160a01b0381163014155b611d8257600080fd5b86611d8c57600080fd5b611dc16001600160a01b037f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab116333087613414565b6040516340d1b7db60e11b8152600481018a90526000907f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c6001600160a01b0316906381a36fb69060240160206040518083038186803b158015611e2457600080fd5b505afa158015611e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5c9190614711565b90506000611e6a878a615120565b826001600160a01b031663d53f62176040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea357600080fd5b505afa158015611eb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611edb9190614983565b611ee59190615101565b88889050836001600160a01b03166335dca76c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2257600080fd5b505afa158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a9190614983565b611f649190615101565b611f6e91906150e9565b90506000611f7e82888888613452565b90506120018c8c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508a92506138c1915050565b507f7af2bc3f8ec800c569b6555feaf16589d96a9d04a49d1645fd456d75fa0b372b8b8b90508260008151811061204857634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0387169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b0316906370a082319060240160206040518083038186803b1580156120da57600080fd5b505afa1580156120ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121129190614983565b90508015611ced5760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390527f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1169063a9059cbb90604401602060405180830381600087803b15801561218457600080fd5b505af1158015612198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121bc919061493b565b505050600180555050505050505050505050565b336121e36000546001600160a01b031690565b6001600160a01b0316146122395760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6122436000613ad6565b565b600260015414156122985760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b038116158015906122be57506001600160a01b0381163014155b6122c757600080fd5b856122d157600080fd5b7f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561232c57600080fd5b505af1158015612340573d6000803e3d6000fd5b50506040517f22061379000000000000000000000000000000000000000000000000000000008152600481018b9052600093508392506001600160a01b037f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c16915063220613799060240160a06040518083038186803b1580156123c357600080fd5b505afa1580156123d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123fb9190614e4d565b509194509250600091506124119050878a615120565b61241b9084615101565b6124258884615101565b61242f91906150e9565b9050600061245b82612449670de0b6b3a76400008d615101565b61245391906150e9565b348989613452565b905061249d8b8b8b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b925061377c915050565b7ff7735c8cb2a65788ca663fc8415b7c6a66cd6847d58346d8334e8d52a599d3df8a826000815181106124e057634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0388169082015260600160405180910390a16040516370a0823160e01b81523060048201526000907f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b0316906370a082319060240160206040518083038186803b15801561257257600080fd5b505afa158015612586573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125aa9190614983565b905080156126f757604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab16001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561261457600080fd5b505af1158015612628573d6000803e3d6000fd5b505050506000866001600160a01b03168260405160006040518083038185875af1925050503d8060008114612679576040519150601f19603f3d011682016040523d82523d6000602084013e61267e565b606091505b50509050806126f55760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b505b50506001805550505050505050505050565b3361271c6000546001600160a01b031690565b6001600160a01b0316146127725760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6001600160a01b03811661284257604051600090339047908381818185875af1925050503d80600081146127c2576040519150601f19603f3d011682016040523d82523d6000602084013e6127c7565b606091505b505090508061283e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016101f2565b5050565b6040516370a0823160e01b81523060048201526128d09033906001600160a01b038416906370a082319060240160206040518083038186803b15801561288757600080fd5b505afa15801561289b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bf9190614983565b6001600160a01b0384169190613b3e565b50565b600260015414156129265760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b0381161580159061294c57506001600160a01b0381163014155b61295557600080fd5b8461295f57600080fd5b60008061299f8989898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061303792505050565b9150915060006106ce838884898989613b6e565b60026001541415612a065760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590612a2c57506001600160a01b0381163014155b612a3557600080fd5b86612a3f57600080fd5b600080612ab08b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d918291850190849080828437600092019190915250613c1692505050565b91509150612ac2828783888888613b6e565b50600089815b81811015612b14578a8a82818110612af057634e487b7160e01b600052603260045260246000fd5b9050602002013583612b0291906150e9565b9250612b0d81615163565b9050612ac8565b507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d81828b8b612b44600182615120565b818110612b6157634e487b7160e01b600052603260045260246000fd5b604080519485526020918202939093013590840152506001600160a01b0388169082015260600160405180910390a15050600180555050505050505050505050565b60026001541415612bf65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016101f2565b60026001556001600160a01b03811615801590612c1c57506001600160a01b0381163014155b612c2557600080fd5b86612c2f57600080fd5b600080612ca08b8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808f0282810182019093528e82529093508e92508d918291850190849080828437600092019190915250613c1692505050565b915091506000612cb483888489898961330a565b905060008a815b81811015612d07578b8b82818110612ce357634e487b7160e01b600052603260045260246000fd5b9050602002013583612cf591906150e9565b9250612d0081615163565b9050612cbb565b507f1cdb5ee3c47e1a706ac452b89698e5e3f2ff4f835ca72dde8936d0f4fcf37d81828460018651612d399190615120565b81518110612d5757634e487b7160e01b600052603260045260246000fd5b60209081029190910181015160408051938452918301526001600160a01b0389169082015260600160405180910390a1505060018055505050505050505050505050565b33612dae6000546001600160a01b031690565b6001600160a01b031614612e045760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101f2565b6001600160a01b038116612e805760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101f2565b6128d081613ad6565b801580612f2b57506040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03838116602483015284169063dd62ed3e9060440160206040518083038186803b158015612ef157600080fd5b505afa158015612f05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f299190614983565b155b612f9d5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e63650000000000000000000060648201526084016101f2565b6040516001600160a01b0383166024820152604481018290526130199084907f095ea7b300000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613f7c565b505050565b606061302d8484600085614061565b90505b9392505050565b60008060007f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c6001600160a01b03166381a36fb6866040518263ffffffff1660e01b815260040161308a91815260200190565b60206040518083038186803b1580156130a257600080fd5b505afa1580156130b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130da9190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561311757600080fd5b505afa15801561312b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314f9190614711565b855190915060005b818110156131d3576131918388838151811061318357634e487b7160e01b600052603260045260246000fd5b6020026020010151866141a0565b6131c383858984815181106131b657634e487b7160e01b600052603260045260246000fd5b60200260200101516144d0565b6131cc81615163565b9050613157565b50604051630f57464360e21b81526060906001600160a01b03851690633d5d190c90613205908a908590600401614f3a565b602060405180830381600087803b15801561321f57600080fd5b505af1158015613233573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132579190614983565b506000875190506000856001600160a01b03166313966db56040518163ffffffff1660e01b815260040160206040518083038186803b15801561329957600080fd5b505afa1580156132ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d19190614983565b6132db9083615101565b6132ed670de0b6b3a764000084615101565b6132f79190615120565b95975094955050505050505b9250929050565b60606133406001600160a01b0388167f0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b4799750687612e89565b6040517f18cbafe50000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b4799750616906318cbafe5906133b29089908b908a908a908a904290600401615021565b600060405180830381600087803b1580156133cc57600080fd5b505af11580156133e0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261340891908101906148a8565b98975050505050505050565b6040516001600160a01b038085166024830152831660448201526064810182905261344c9085906323b872dd60e01b90608401612fe2565b50505050565b606060007f0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b479975066001600160a01b0316638803dbee8787878730426040518763ffffffff1660e01b81526004016134ac96959493929190615021565b600060405180830381600087803b1580156134c657600080fd5b505af11580156134da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261350291908101906148a8565b9695505050505050565b6040516340d1b7db60e11b81526004810186905260009081906001600160a01b037f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c16906381a36fb69060240160206040518083038186803b15801561357157600080fd5b505afa158015613585573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135a99190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135e657600080fd5b505afa1580156135fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361e9190614711565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d69061365390339030908c908c90600401614ee2565b600060405180830381600087803b15801561366d57600080fd5b505af1158015613681573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b1580156136cf57600080fd5b505af11580156136e3573d6000803e3d6000fd5b5050604051632321420560e21b81526001600160a01b0385169250638c8508149150613719908a908a908a908a90600401614f68565b600060405180830381600087803b15801561373357600080fd5b505af1158015613747573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261376f91908101906148a8565b5090979650505050505050565b6040516340d1b7db60e11b8152600481018590526000907f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c6001600160a01b0316906381a36fb69060240160206040518083038186803b1580156137df57600080fd5b505afa1580156137f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138179190614711565b6040517f9d54def60000000000000000000000000000000000000000000000000000000081529091506001600160a01b03821690639d54def69061386390879087908790600401614fef565b600060405180830381600087803b15801561387d57600080fd5b505af1158015613891573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138b991908101906148a8565b505050505050565b6040516340d1b7db60e11b81526004810185905260009081906001600160a01b037f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c16906381a36fb69060240160206040518083038186803b15801561392657600080fd5b505afa15801561393a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061395e9190614711565b90506000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561399b57600080fd5b505afa1580156139af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139d39190614711565b865190915060005b81811015613a3c57613a078389838151811061318357634e487b7160e01b600052603260045260246000fd5b613a2c83858a84815181106131b657634e487b7160e01b600052603260045260246000fd5b613a3581615163565b90506139db565b50604051632321420560e21b81526060906001600160a01b03851690638c85081490613a72908b9085908c908c90600401614f68565b600060405180830381600087803b158015613a8c57600080fd5b505af1158015613aa0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ac891908101906148a8565b509298975050505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b03831660248201526044810182905261301990849063a9059cbb60e01b90606401612fe2565b6060613ba46001600160a01b0388167f0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b4799750687612e89565b6040517f38ed17390000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b4799750616906338ed1739906133b29089908b908a908a908a904290600401615021565b60008060007f000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c6001600160a01b03166381a36fb6876040518263ffffffff1660e01b8152600401613c6991815260200190565b60206040518083038186803b158015613c8157600080fd5b505afa158015613c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cb99190614711565b90506001600160a01b038116613d115760405162461bcd60e51b815260206004820152601d60248201527f4e4654585a61703a205661756c7420646f6573206e6f7420657869737400000060448201526064016101f2565b6000816001600160a01b0316631ba46cfd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613d4c57600080fd5b505afa158015613d60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d849190614711565b604051631759616b60e11b81529091506001600160a01b03821690632eb2c2d690613db990339030908b908b90600401614ee2565b600060405180830381600087803b158015613dd357600080fd5b505af1158015613de7573d6000803e3d6000fd5b505060405163a22cb46560e01b81526001600160a01b038581166004830152600160248301528416925063a22cb4659150604401600060405180830381600087803b158015613e3557600080fd5b505af1158015613e49573d6000803e3d6000fd5b5050604051630f57464360e21b8152600092506001600160a01b0385169150633d5d190c90613e7e908a908a90600401614f3a565b602060405180830381600087803b158015613e9857600080fd5b505af1158015613eac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ed09190614983565b9050600081846001600160a01b03166313966db56040518163ffffffff1660e01b815260040160206040518083038186803b158015613f0e57600080fd5b505afa158015613f22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f469190614983565b613f509190615101565b613f62670de0b6b3a764000084615101565b613f6c9190615120565b9399939850929650505050505050565b6000613fd1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661301e9092919063ffffffff16565b8051909150156130195780806020019051810190613fef919061493b565b6130195760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016101f2565b6060824710156140d95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016101f2565b843b6141275760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016101f2565b600080866001600160a01b031685876040516141439190614ec6565b60006040518083038185875af1925050503d8060008114614180576040519150601f19603f3d011682016040523d82523d6000602084013e614185565b606091505b509150915061419582828661459c565b979650505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b038616831415614230576040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b1790529050614443565b816001600160a01b0316866001600160a01b031614156143db5760008560405160240161425f91815260200190565b60408051601f198184030181529181526020820180516001600160e01b03167f58178168000000000000000000000000000000000000000000000000000000001790525190915060009081906001600160a01b038a16906142c1908590614ec6565b600060405180830381855afa9150503d80600081146142fc576040519150601f19603f3d011682016040523d82523d6000602084013e614301565b606091505b509150915060008180602001905181019061431c9190614711565b905082801561433357506001600160a01b03811633145b61437f5760405162461bcd60e51b815260206004820152601160248201527f4e6f7420746865204e4654206f776e657200000000000000000000000000000060448201526064016101f2565b604051602481018a905260440160408051601f198184030181529190526020810180516001600160e01b03167f8264fe980000000000000000000000000000000000000000000000000000000017905294506144439350505050565b6040513360248201526001600160a01b03851660448201526064810186905260840160408051601f198184030181529190526020810180516001600160e01b03167f42842e0e0000000000000000000000000000000000000000000000000000000017905290505b600080876001600160a01b03168360405161445e9190614ec6565b6000604051808303816000865af19150503d806000811461449b576040519150601f19603f3d011682016040523d82523d6000602084013e6144a0565b606091505b50915091508181906144c55760405162461bcd60e51b81526004016101f29190614fbc565b505050505050505050565b7306012c8cf97bead5deae237070f9587f8e7a266d73b47e3cd837ddf8e4c57f05d70ab865de6e193bbb60606001600160a01b03861683141561451557505050505050565b816001600160a01b0316866001600160a01b031614156138b95760405160248101859052600060448201526001600160a01b038616606482015260840160408051601f198184030181529190526020810180516001600160e01b03167fbf31196f000000000000000000000000000000000000000000000000000000001790529050614443565b606083156145ab575081613030565b8251156145bb5782518084602001fd5b8160405162461bcd60e51b81526004016101f29190614fbc565b80356145e0816151aa565b919050565b60008083601f8401126145f6578182fd5b50813567ffffffffffffffff81111561460d578182fd5b6020830191508360208260051b850101111561330357600080fd5b600082601f830112614638578081fd5b8135602061464d614648836150c5565b615094565b80838252828201915082860187848660051b890101111561466c578586fd5b855b8581101561376f5781358452928401929084019060010161466e565b600082601f83011261469a578081fd5b813567ffffffffffffffff8111156146b4576146b4615194565b6146c7601f8201601f1916602001615094565b8181528460208386010111156146db578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215614706578081fd5b8135613030816151aa565b600060208284031215614722578081fd5b8151613030816151aa565b600080600080600060a08688031215614744578081fd5b853561474f816151aa565b9450602086013561475f816151aa565b9350604086013567ffffffffffffffff8082111561477b578283fd5b61478789838a01614628565b9450606088013591508082111561479c578283fd5b6147a889838a01614628565b935060808801359150808211156147bd578283fd5b506147ca8882890161468a565b9150509295509295909350565b600080600080608085870312156147ec578384fd5b84356147f7816151aa565b93506020850135614807816151aa565b925060408501359150606085013567ffffffffffffffff811115614829578182fd5b6148358782880161468a565b91505092959194509250565b600080600080600060a08688031215614858578081fd5b8535614863816151aa565b94506020860135614873816151aa565b93506040860135925060608601359150608086013567ffffffffffffffff81111561489c578182fd5b6147ca8882890161468a565b600060208083850312156148ba578182fd5b825167ffffffffffffffff8111156148d0578283fd5b8301601f810185136148e0578283fd5b80516148ee614648826150c5565b80828252848201915084840188868560051b870101111561490d578687fd5b8694505b8385101561492f578051835260019490940193918501918501614911565b50979650505050505050565b60006020828403121561494c578081fd5b81518015158114613030578182fd5b60006020828403121561496c578081fd5b81356001600160e01b031981168114613030578182fd5b600060208284031215614994578081fd5b5051919050565b60008060008060008060008060a0898b0312156149b6578586fd5b88359750602089013567ffffffffffffffff808211156149d4578788fd5b6149e08c838d016145e5565b909950975060408b01359150808211156149f8578485fd5b614a048c838d016145e5565b909750955060608b0135915080821115614a1c578485fd5b50614a298b828c016145e5565b9094509250506080890135614a3d816151aa565b809150509295985092959890939650565b60008060008060008060008060008060c08b8d031215614a6c578384fd5b8a35995060208b013567ffffffffffffffff80821115614a8a578586fd5b614a968e838f016145e5565b909b50995060408d0135915080821115614aae578586fd5b614aba8e838f016145e5565b909950975060608d0135915080821115614ad2578586fd5b614ade8e838f016145e5565b909750955060808d0135915080821115614af6578384fd5b50614b038d828e016145e5565b9094509250614b16905060a08c016145d5565b90509295989b9194979a5092959850565b600080600080600080600080600080600060e08c8e031215614b47578485fd5b8b359a5067ffffffffffffffff8060208e01351115614b64578586fd5b614b748e60208f01358f016145e5565b909b50995060408d0135811015614b89578586fd5b614b998e60408f01358f016145e5565b909950975060608d0135811015614bae578586fd5b614bbe8e60608f01358f016145e5565b909750955060808d0135945060a08d0135811015614bda578182fd5b50614beb8d60a08e01358e016145e5565b9093509150614bfc60c08d016145d5565b90509295989b509295989b9093969950565b600080600080600080600080600060c08a8c031215614c2b578283fd5b8935985060208a013567ffffffffffffffff80821115614c49578485fd5b614c558d838e016145e5565b909a50985060408c0135915080821115614c6d578485fd5b614c798d838e016145e5565b909850965060608c0135955060808c0135915080821115614c98578485fd5b50614ca58c828d016145e5565b90945092505060a08a0135614cb9816151aa565b809150509295985092959850929598565b600080600080600080600060a0888a031215614ce4578081fd5b87359650602088013567ffffffffffffffff80821115614d02578283fd5b614d0e8b838c016145e5565b909850965060408a0135955060608a0135915080821115614d2d578283fd5b50614d3a8a828b016145e5565b9094509250506080880135614d4e816151aa565b8091505092959891949750929550565b600080600080600080600060a0888a031215614d78578081fd5b8735965060208801359550604088013567ffffffffffffffff80821115614d9d578283fd5b614da98b838c016145e5565b909750955060608a0135915080821115614d2d578283fd5b60008060008060008060008060c0898b031215614ddc578182fd5b8835975060208901359650604089013567ffffffffffffffff80821115614e01578384fd5b614e0d8c838d016145e5565b909850965060608b0135955060808b0135915080821115614e2c578384fd5b50614e398b828c016145e5565b90945092505060a0890135614a3d816151aa565b600080600080600060a08688031215614e64578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6000815180845260208085019450808401835b83811015614ebb57815187529582019590820190600101614e9f565b509495945050505050565b60008251614ed8818460208701615137565b9190910192915050565b60006001600160a01b03808716835280861660208401525060a06040830152614f0e60a0830185614e8c565b8281036060840152614f208185614e8c565b838103608090940193909352508152602001949350505050565b604081526000614f4d6040830185614e8c565b8281036020840152614f5f8185614e8c565b95945050505050565b608081526000614f7b6080830187614e8c565b8281036020840152614f8d8187614e8c565b90508281036040840152614fa18186614e8c565b9150506001600160a01b038316606083015295945050505050565b6020815260008251806020840152614fdb816040850160208701615137565b601f01601f19169190910160400192915050565b8381526060602082015260006150086060830185614e8c565b90506001600160a01b0383166040830152949350505050565b868152602080820187905260a0604083018190528201859052600090869060c08401835b88811015615073578335615058816151aa565b6001600160a01b031682529282019290820190600101615045565b506001600160a01b0396909616606085015250505060800152949350505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156150bd576150bd615194565b604052919050565b600067ffffffffffffffff8211156150df576150df615194565b5060051b60200190565b600082198211156150fc576150fc61517e565b500190565b600081600019048311821515161561511b5761511b61517e565b500290565b6000828210156151325761513261517e565b500390565b60005b8381101561515257818101518382015260200161513a565b8381111561344c5750506000910152565b60006000198214156151775761517761517e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146128d057600080fdfea2646970667358221220c014f43baa5d7fbb85db9f4e5587bbb8c3d457a56e7a6c72b775dff3912ec9a764736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b47997506
-----Decoded View---------------
Arg [0] : _nftxFactory (address): 0xE77b89FEc41A7b7dC74eb33602e82F0672FbB33C
Arg [1] : _sushiRouter (address): 0x1b02dA8Cb0d097eB8D57A175b88c7D8b47997506
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e77b89fec41a7b7dc74eb33602e82f0672fbb33c
Arg [1] : 0000000000000000000000001b02da8cb0d097eb8d57a175b88c7d8b47997506
Deployed Bytecode Sourcemap
48956:17544:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66450:10;-1:-1:-1;;;;;66472:4:0;66450:27;;66442:49;;;;-1:-1:-1;;;66442:49:0;;23877:2:1;66442:49:0;;;23859:21:1;23916:1;23896:18;;;23889:29;23954:11;23934:18;;;23927:39;23983:18;;66442:49:0;;;;;;;;;48956:17544;;;;;31008:269;;;;;;;;;;-1:-1:-1;31008:269:0;;;;;:::i;:::-;;:::i;:::-;;;21587:14:1;;21580:22;21562:41;;21550:2;21535:18;31008:269:0;;;;;;;;50024:490;;;;;;;;;;-1:-1:-1;50024:490:0;;;;;:::i;:::-;;:::i;27008:207::-;;;;;;;;;;-1:-1:-1;27008:207:0;;;;;:::i;:::-;27177:30;27008:207;;;;;;;;;;-1:-1:-1;;;;;;21776:79:1;;;21758:98;;21746:2;21731:18;27008:207:0;21713:149:1;54201:1150:0;;;;;;:::i;:::-;;:::i;56359:954::-;;;;;;;;;;-1:-1:-1;56359:954:0;;;;;:::i;:::-;;:::i;52964:1231::-;;;;;;:::i;:::-;;:::i;51023:981::-;;;;;;:::i;:::-;;:::i;52010:948::-;;;;;;;;;;-1:-1:-1;52010:948:0;;;;;:::i;:::-;;:::i;49204:46::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17820:55:1;;;17802:74;;17790:2;17775:18;49204:46:0;17757:125:1;49255:47:0;;;;;;;;;;;;;;;48327:94;;;;;;;;;;;;;:::i;55357:996::-;;;;;;:::i;:::-;;:::i;66011:391::-;;;;;;;;;;-1:-1:-1;66011:391:0;;;;;:::i;:::-;;:::i;47678:87::-;;;;;;;;;;-1:-1:-1;47724:7:0;47751:6;-1:-1:-1;;;;;47751:6:0;47678:87;;50520:497;;;;;;;;;;-1:-1:-1;50520:497:0;;;;;:::i;:::-;;:::i;49158:41::-;;;;;;;;;;;;;;;58008:652;;;;;;;;;;-1:-1:-1;58008:652:0;;;;;:::i;:::-;;:::i;57319:683::-;;;;;;;;;;-1:-1:-1;57319:683:0;;;;;:::i;:::-;;:::i;49125:27::-;;;;;;;;;;;;;;;31688:203;;;;;;;;;;-1:-1:-1;31688:203:0;;;;;:::i;:::-;31847:36;31688:203;;;;;;;;31505:175;;;;;;;;;;-1:-1:-1;31505:175:0;;;;;:::i;:::-;31641:31;31505:175;;;;;;;;48576:192;;;;;;;;;;-1:-1:-1;48576:192:0;;;;;:::i;:::-;;:::i;31008:269::-;31132:4;-1:-1:-1;;;;;;31156:60:0;;31171:45;31156:60;;:113;;-1:-1:-1;30646:36:0;-1:-1:-1;;;;;;30631:51:0;;;31233:36;31149:120;31008:269;-1:-1:-1;;31008:269:0:o;50024:490::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;50215:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;50235:19:0;::::1;50249:4;50235:19;;50215:39;50207:48;;;::::0;::::1;;50270:15:::0;50262:24:::1;;;::::0;::::1;;50294:13;50309:20:::0;50333:22:::1;50342:7;50351:3;;50333:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;50333:8:0::1;::::0;-1:-1:-1;;;50333:22:0:i:1;:::-;50293:62;;;;50362:24;50389:60;50408:5;50415:9;50426:12;50440:4;;50446:2;50389:18;:60::i;:::-;50362:87;;50461:47;50466:3;;:10;;50478:7;50501:1;50486:7;:14;:16;;;;:::i;:::-;50478:25;;;;;;-1:-1:-1::0;;;50478:25:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;50461:47:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;50461:47:0::1;;;;;;;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;50024:490:0:o;54201:1150::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;54478:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;54498:19:0;::::1;54512:4;54498:19;;54478:39;54470:48;;;::::0;::::1;;54533:17:::0;54525:26:::1;;;::::0;::::1;;54558:13;::::0;54578:165:::1;54598:16:::0;;::::1;54578:165;;;54632:14;54649:7;;54657:1;54649:10;;;;;-1:-1:-1::0;;;54649:10:0::1;;;;;;;;;;;;;;;54632:27;;54687:1;54678:6;:10;54670:39;;;::::0;-1:-1:-1;;;54670:39:0;;26125:2:1;54670:39:0::1;::::0;::::1;26107:21:1::0;26164:2;26144:18;;;26137:30;26203:18;26183;;;26176:46;26239:18;;54670:39:0::1;26097:166:1::0;54670:39:0::1;54720:15;54729:6:::0;54720:15;::::1;:::i;:::-;;;54578:165;54616:3;;;;;:::i;:::-;;;;54578:165;;;-1:-1:-1::0;54779:26:0::1;::::0;-1:-1:-1;;;54779:26:0;;::::1;::::0;::::1;27954:25:1::0;;;54749:16:0::1;::::0;-1:-1:-1;;;;;54779:11:0::1;:17;::::0;::::1;::::0;27927:18:1;;54779:26:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54749:57:::0;-1:-1:-1;54813:18:0::1;54917:26;54925:11:::0;54917:5;:26:::1;:::i;:::-;54892:5;-1:-1:-1::0;;;;;54892:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;54859:11;;:18;;54835:5;-1:-1:-1::0;;;;;54835:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;54834:117;;;;:::i;:::-;54813:138:::0;-1:-1:-1;54958:87:0::1;-1:-1:-1::0;;;;;54984:4:0::1;54958:49;55008:10;55028:4;55035:9:::0;54958:49:::1;:87::i;:::-;55052:28;55083:43;55098:10;55110:9;55121:4;;55083:14;:43::i;:::-;55052:74;;55133:51;55143:7;55152:5;;55133:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55159:7;;55133:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55168:11;;55133:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;55181:2:0;;-1:-1:-1;55133:9:0::1;::::0;-1:-1:-1;;55133:51:0:i:1;:::-;;55198:31;55203:5;55210:11;55222:1;55210:14;;;;;;-1:-1:-1::0;;;55210:14:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;55198:31:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;55198:31:0::1;;;;;;;55281:29;::::0;-1:-1:-1;;;55281:29:0;;55304:4:::1;55281:29;::::0;::::1;17802:74:1::0;55261:17:0::1;::::0;55281:4:::1;-1:-1:-1::0;;;;;55281:14:0::1;::::0;::::1;::::0;17775:18:1;;55281:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55317:28;::::0;-1:-1:-1;;;55317:28:0;;-1:-1:-1;;;;;20046:55:1;;;55317:28:0::1;::::0;::::1;20028:74:1::0;20118:18;;;20111:34;;;55261:49:0;;-1:-1:-1;55317:4:0::1;:13:::0;;::::1;::::0;::::1;::::0;20001:18:1;;55317:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;;;;;;54201:1150:0:o;56359:954::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;56581:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;56601:19:0;::::1;56615:4;56601:19;;56581:39;56573:48;;;::::0;::::1;;56636:11:::0;56628:20:::1;;;::::0;::::1;;56655:16;56688:23:::0;56713::::1;56743:11;-1:-1:-1::0;;;;;56743:21:0::1;;56765:7;56743:30;;;;;;;;;;;;;27954:25:1::0;;27942:2;27927:18;;27909:76;56743:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;56685:88:0;;-1:-1:-1;56685:88:0;-1:-1:-1;56864:27:0::1;::::0;-1:-1:-1;56873:11:0;;-1:-1:-1;56864:6:0;:27:::1;:::i;:::-;56845:47;::::0;:15;:47:::1;:::i;:::-;56794:36;56812:11:::0;56794:15;:36:::1;:::i;:::-;56793:106;;;;:::i;:::-;56782:117:::0;-1:-1:-1;56913:87:0::1;::::0;-1:-1:-1;;;;;;;56939:4:0::1;56913:49;56963:10;56983:4;56990:9:::0;56913:49:::1;:87::i;:::-;57007:24;57034:57;57065:8:::0;57050:11:::1;49333:4;57050:6:::0;:11:::1;:::i;:::-;57049:24;;;;:::i;:::-;57075:9;57086:4;;57034:14;:57::i;:::-;57007:84;;57098:41;57106:7;57115:6;57123:11;;57098:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;57136:2:0;;-1:-1:-1;57098:7:0::1;::::0;-1:-1:-1;;57098:41:0:i:1;:::-;57151:27;57155:6;57163:7;57171:1;57163:10;;;;;;-1:-1:-1::0;;;57163:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;57151:27:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;57151:27:0::1;;;;;;;57207:29;::::0;-1:-1:-1;;;57207:29:0;;57230:4:::1;57207:29;::::0;::::1;17802:74:1::0;57187:17:0::1;::::0;57207:4:::1;-1:-1:-1::0;;;;;57207:14:0::1;::::0;::::1;::::0;17775:18:1;;57207:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57187:49:::0;-1:-1:-1;57247:14:0;;57243:65:::1;;57272:28;::::0;-1:-1:-1;;;57272:28:0;;-1:-1:-1;;;;;20046:55:1;;;57272:28:0::1;::::0;::::1;20028:74:1::0;20118:18;;;20111:34;;;57272:4:0::1;:13;::::0;::::1;::::0;20001:18:1;;57272:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57243:65;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;56359:954:0:o;52964:1231::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;53212:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;53232:19:0;::::1;53246:4;53232:19;;53212:39;53204:48;;;::::0;::::1;;53276:5:::0;53303:11;53295:20:::1;;;::::0;::::1;;53322:4;-1:-1:-1::0;;;;;53322:12:0::1;;53342:9;53322:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;53361:13;53386:9:::0;53381:155:::1;53401:6;53397:1;:10;53381:155;;;53425:14;53442:7;;53450:1;53442:10;;;;;-1:-1:-1::0;;;53442:10:0::1;;;;;;;;;;;;;;;53425:27;;53480:1;53471:6;:10;53463:39;;;::::0;-1:-1:-1;;;53463:39:0;;26125:2:1;53463:39:0::1;::::0;::::1;26107:21:1::0;26164:2;26144:18;;;26137:30;26203:18;26183;;;26176:46;26239:18;;53463:39:0::1;26097:166:1::0;53463:39:0::1;53513:15;53522:6:::0;53513:15;::::1;:::i;:::-;;;53381:155;53409:3;;;;:::i;:::-;;;53381:155;;;-1:-1:-1::0;53572:26:0::1;::::0;-1:-1:-1;;;53572:26:0;;::::1;::::0;::::1;27954:25:1::0;;;53542:16:0::1;::::0;-1:-1:-1;;;;;53572:11:0::1;:17;::::0;::::1;::::0;27927:18:1;;53572:26:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53542:57:::0;-1:-1:-1;53606:18:0::1;53710:26;53718:11:::0;53710:5;:26:::1;:::i;:::-;53685:5;-1:-1:-1::0;;;;;53685:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;53652:11;;:18;;53628:5;-1:-1:-1::0;;;;;53628:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;53627:117;;;;:::i;:::-;53606:138;;53751:28;53782:43;53797:10;53809:9;53820:4;;53782:14;:43::i;:::-;53751:74;;53832:51;53842:7;53851:5;;53832:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53858:7;;53832:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53867:11;;53832:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;53880:2:0;;-1:-1:-1;53832:9:0::1;::::0;-1:-1:-1;;53832:51:0:i:1;:::-;;53897:31;53902:5;53909:11;53921:1;53909:14;;;;;;-1:-1:-1::0;;;53909:14:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;53897:31:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;53897:31:0::1;;;;;;;53980:29;::::0;-1:-1:-1;;;53980:29:0;;54003:4:::1;53980:29;::::0;::::1;17802:74:1::0;53960:17:0::1;::::0;53980:4:::1;-1:-1:-1::0;;;;;53980:14:0::1;::::0;::::1;::::0;17775:18:1;;53980:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54016:24;::::0;-1:-1:-1;;;54016:24:0;;::::1;::::0;::::1;27954:25:1::0;;;53960:49:0;;-1:-1:-1;54016:4:0::1;-1:-1:-1::0;;;;;54016:13:0::1;::::0;::::1;::::0;27927:18:1;;54016:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;54048:12;54074:2;-1:-1:-1::0;;;;;54066:16:0::1;54090:9;54066:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54047:57;;;54119:7;54111:78;;;::::0;-1:-1:-1;;;54111:78:0;;24214:2:1;54111:78:0::1;::::0;::::1;24196:21:1::0;24253:2;24233:18;;;24226:30;24292:34;24272:18;;;24265:62;24363:28;24343:18;;;24336:56;24409:19;;54111:78:0::1;24186:248:1::0;51023:981:0;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;51236:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;51256:19:0;::::1;51270:4;51256:19;;51236:39;51228:48;;;::::0;::::1;;51291:17:::0;51283:26:::1;;;::::0;::::1;;51316:4;-1:-1:-1::0;;;;;51316:12:0::1;;51336:9;51316:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;51385:26:0::1;::::0;-1:-1:-1;;;51385:26:0;;::::1;::::0;::::1;27954:25:1::0;;;51355:16:0::1;::::0;-1:-1:-1;51385:11:0::1;-1:-1:-1::0;;;;;51385:17:0::1;::::0;-1:-1:-1;51385:17:0::1;::::0;-1:-1:-1;27927:18:1;;51385:26:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51355:57:::0;-1:-1:-1;51419:18:0::1;51523:33;51538:11:::0;51523:5;:33:::1;:::i;:::-;51498:5;-1:-1:-1::0;;;;;51498:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;51465:11;;:18;;51441:5;-1:-1:-1::0;;;;;51441:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;51440:124;;;;:::i;:::-;51419:145;;51571:24;51598:43;51613:10;51625:9;51636:4;;51598:14;:43::i;:::-;51571:70;;51648:41;51657:7;51666:5;;51648:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;51648:41:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;51673:11:0;;-1:-1:-1;51673:11:0;;;;51648:41;::::1;::::0;51673:11;;51648:41;51673:11;51648:41;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;51686:2:0;;-1:-1:-1;51648:8:0::1;::::0;-1:-1:-1;;51648:41:0:i:1;:::-;;51703:34;51708:5;;:12;;51722:7;51730:1;51722:10;;;;;;-1:-1:-1::0;;;51722:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;51703:34:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;51703:34:0::1;;;;;;;51789:29;::::0;-1:-1:-1;;;51789:29:0;;51812:4:::1;51789:29;::::0;::::1;17802:74:1::0;51769:17:0::1;::::0;51789:4:::1;-1:-1:-1::0;;;;;51789:14:0::1;::::0;::::1;::::0;17775:18:1;;51789:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51825:24;::::0;-1:-1:-1;;;51825:24:0;;::::1;::::0;::::1;27954:25:1::0;;;51769:49:0;;-1:-1:-1;51825:4:0::1;-1:-1:-1::0;;;;;51825:13:0::1;::::0;::::1;::::0;27927:18:1;;51825:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;51857:12;51883:2;-1:-1:-1::0;;;;;51875:16:0::1;51899:9;51875:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51856:57;;;51928:7;51920:78;;;::::0;-1:-1:-1;;;51920:78:0;;24214:2:1;51920:78:0::1;::::0;::::1;24196:21:1::0;24253:2;24233:18;;;24226:30;24292:34;24272:18;;;24265:62;24363:28;24343:18;;;24336:56;24409:19;;51920:78:0::1;24186:248:1::0;51920:78:0::1;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;;51023:981:0:o;52010:948::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;52244:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;52264:19:0;::::1;52278:4;52264:19;;52244:39;52236:48;;;::::0;::::1;;52299:17:::0;52291:26:::1;;;::::0;::::1;;52324:87;-1:-1:-1::0;;;;;52350:4:0::1;52324:49;52374:10;52394:4;52401:9:::0;52324:49:::1;:87::i;:::-;52448:26;::::0;-1:-1:-1;;;52448:26:0;;::::1;::::0;::::1;27954:25:1::0;;;52418:16:0::1;::::0;52448:11:::1;-1:-1:-1::0;;;;;52448:17:0::1;::::0;::::1;::::0;27927:18:1;;52448:26:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52418:57:::0;-1:-1:-1;52482:18:0::1;52586:33;52601:11:::0;52586:5;:33:::1;:::i;:::-;52561:5;-1:-1:-1::0;;;;;52561:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;52528:11;;:18;;52504:5;-1:-1:-1::0;;;;;52504:19:0::1;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;;;:::i;:::-;52503:124;;;;:::i;:::-;52482:145;;52634:24;52661:43;52676:10;52688:9;52699:4;;52661:14;:43::i;:::-;52634:70;;52711:41;52720:7;52729:5;;52711:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52736:11;;52711:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;52749:2:0;;-1:-1:-1;52711:8:0::1;::::0;-1:-1:-1;;52711:41:0:i:1;:::-;;52766:34;52771:5;;:12;;52785:7;52793:1;52785:10;;;;;;-1:-1:-1::0;;;52785:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;52766:34:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;52766:34:0::1;;;;;;;52852:29;::::0;-1:-1:-1;;;52852:29:0;;52875:4:::1;52852:29;::::0;::::1;17802:74:1::0;52832:17:0::1;::::0;52852:4:::1;-1:-1:-1::0;;;;;52852:14:0::1;::::0;::::1;::::0;17775:18:1;;52852:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52832:49:::0;-1:-1:-1;52892:14:0;;52888:65:::1;;52917:28;::::0;-1:-1:-1;;;52917:28:0;;-1:-1:-1;;;;;20046:55:1;;;52917:28:0::1;::::0;::::1;20028:74:1::0;20118:18;;;20111:34;;;52917:4:0::1;:13;::::0;::::1;::::0;20001:18:1;;52917:28:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;;52010:948:0:o;48327:94::-;47909:10;47898:7;47724;47751:6;-1:-1:-1;;;;;47751:6:0;;47678:87;47898:7;-1:-1:-1;;;;;47898:21:0;;47890:66;;;;-1:-1:-1;;;47890:66:0;;25048:2:1;47890:66:0;;;25030:21:1;;;25067:18;;;25060:30;25126:34;25106:18;;;25099:62;25178:18;;47890:66:0;25020:182:1;47890:66:0;48392:21:::1;48410:1;48392:9;:21::i;:::-;48327:94::o:0;55357:996::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;55558:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;55578:19:0;::::1;55592:4;55578:19;;55558:39;55550:48;;;::::0;::::1;;55613:11:::0;55605:20:::1;;;::::0;::::1;;55632:4;-1:-1:-1::0;;;;;55632:12:0::1;;55652:9;55632:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;55729:30:0::1;::::0;;;;::::1;::::0;::::1;27954:25:1::0;;;55674:23:0::1;::::0;-1:-1:-1;55674:23:0;;-1:-1:-1;;;;;;55729:11:0::1;:21;::::0;-1:-1:-1;55729:21:0::1;::::0;27927:18:1;;55729:30:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;55671:88:0;;-1:-1:-1;55671:88:0;-1:-1:-1;55766:16:0::1;::::0;-1:-1:-1;55856:27:0::1;::::0;-1:-1:-1;55865:11:0;55856:6;:27:::1;:::i;:::-;55837:47;::::0;:15;:47:::1;:::i;:::-;55786:36;55804:11:::0;55786:15;:36:::1;:::i;:::-;55785:106;;;;:::i;:::-;55766:125:::0;-1:-1:-1;55898:24:0::1;55925:55;55766:125:::0;55941:11:::1;49333:4;55941:6:::0;:11:::1;:::i;:::-;55940:22;;;;:::i;:::-;55964:9;55975:4;;55925:14;:55::i;:::-;55898:82;;55987:41;55995:7;56004:6;56012:11;;55987:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;56025:2:0;;-1:-1:-1;55987:7:0::1;::::0;-1:-1:-1;;55987:41:0:i:1;:::-;56042:27;56046:6;56054:7;56062:1;56054:10;;;;;;-1:-1:-1::0;;;56054:10:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;56042:27:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;56042:27:0::1;;;;;;;56098:29;::::0;-1:-1:-1;;;56098:29:0;;56121:4:::1;56098:29;::::0;::::1;17802:74:1::0;56078:17:0::1;::::0;56098:4:::1;-1:-1:-1::0;;;;;56098:14:0::1;::::0;::::1;::::0;17775:18:1;;56098:29:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56078:49:::0;-1:-1:-1;56138:14:0;;56134:214:::1;;56163:24;::::0;-1:-1:-1;;;56163:24:0;;::::1;::::0;::::1;27954:25:1::0;;;56163:4:0::1;-1:-1:-1::0;;;;;56163:13:0::1;::::0;::::1;::::0;27927:18:1;;56163:24:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56197:12;56223:2;-1:-1:-1::0;;;;;56215:16:0::1;56239:9;56215:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56196:57;;;56270:7;56262:78;;;::::0;-1:-1:-1;;;56262:78:0;;24214:2:1;56262:78:0::1;::::0;::::1;24196:21:1::0;24253:2;24233:18;;;24226:30;24292:34;24272:18;;;24265:62;24363:28;24343:18;;;24336:56;24409:19;;56262:78:0::1;24186:248:1::0;56262:78:0::1;56134:214;;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;55357:996:0:o;66011:391::-;47909:10;47898:7;47724;47751:6;-1:-1:-1;;;;;47751:6:0;;47678:87;47898:7;-1:-1:-1;;;;;47898:21:0;;47890:66;;;;-1:-1:-1;;;47890:66:0;;25048:2:1;47890:66:0;;;25030:21:1;;;25067:18;;;25060:30;25126:34;25106:18;;;25099:62;25178:18;;47890:66:0;25020:182:1;47890:66:0;-1:-1:-1;;;;;66072:19:0;::::1;66068:329;;66121:58;::::0;66103:12:::1;::::0;66129:10:::1;::::0;66153:21:::1;::::0;66103:12;66121:58;66103:12;66121:58;66153:21;66129:10;66121:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66102:77;;;66196:7;66188:78;;;::::0;-1:-1:-1;;;66188:78:0;;24214:2:1;66188:78:0::1;::::0;::::1;24196:21:1::0;24253:2;24233:18;;;24226:30;24292:34;24272:18;;;24265:62;24363:28;24343:18;;;24336:56;24409:19;;66188:78:0::1;24186:248:1::0;66188:78:0::1;66068:329;66011:391:::0;:::o;66068:329::-:1;66339:49;::::0;-1:-1:-1;;;66339:49:0;;66382:4:::1;66339:49;::::0;::::1;17802:74:1::0;66289:100:0::1;::::0;66327:10:::1;::::0;-1:-1:-1;;;;;66339:34:0;::::1;::::0;::::1;::::0;17775:18:1;;66339:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;66289:37:0;::::1;::::0;:100;:37:::1;:100::i;:::-;66011:391:::0;:::o;50520:497::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;50716:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;50736:19:0;::::1;50750:4;50736:19;;50716:39;50708:48;;;::::0;::::1;;50771:15:::0;50763:24:::1;;;::::0;::::1;;50795:13;50810:20:::0;50834:22:::1;50843:7;50852:3;;50834:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;50834:8:0::1;::::0;-1:-1:-1;;;50834:22:0:i:1;:::-;50794:62;;;;50863:24;50890:62;50910:5;50917:10;50929:12;50943:4;;50949:2;50890:19;:62::i;58008:652::-:0;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;58238:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;58258:19:0;::::1;58272:4;58258:19;;58238:39;58230:48;;;::::0;::::1;;58293:15:::0;58285:24:::1;;;::::0;::::1;;58317:13;58332:25:::0;58361:32:::1;58371:7;58380:3;;58361:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;58361:32:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;58385:7:0;;-1:-1:-1;58385:7:0;;;;58361:32;::::1;::::0;58385:7;;58361:32;58385:7;58361:32;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;58361:9:0::1;::::0;-1:-1:-1;;;58361:32:0:i:1;:::-;58316:77;;;;58400:67;58420:5;58427:10;58439:17;58458:4;;58464:2;58400:19;:67::i;:::-;-1:-1:-1::0;58476:13:0::1;58513:3:::0;58476:13;58530:71:::1;58550:6;58546:1;:10;58530:71;;;58583:7;;58591:1;58583:10;;;;;-1:-1:-1::0;;;58583:10:0::1;;;;;;;;;;;;;;;58574:19;;;;;:::i;:::-;::::0;-1:-1:-1;58558:3:0::1;::::0;::::1;:::i;:::-;;;58530:71;;;-1:-1:-1::0;58612:42:0::1;58617:5:::0;58624:7;;58632:16:::1;58647:1;58624:7:::0;58632:16:::1;:::i;:::-;58624:25;;;;;-1:-1:-1::0;;;58624:25:0::1;;;;;;;;;58612:42;::::0;;29039:25:1;;;58624::0::1;::::0;;::::1;::::0;;;::::1;;29080:18:1::0;;;29073:34;-1:-1:-1;;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;58612:42:0::1;;;;;;;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;;58008:652:0:o;57319:683::-;45836:1;46432:7;;:19;;46424:63;;;;-1:-1:-1;;;46424:63:0;;26881:2:1;46424:63:0;;;26863:21:1;26920:2;26900:18;;;26893:30;26959:33;26939:18;;;26932:61;27010:18;;46424:63:0;26853:181:1;46424:63:0;45836:1;46565:7;:18;-1:-1:-1;;;;;57545:16:0;::::1;::::0;;::::1;::::0;:39:::1;;-1:-1:-1::0;;;;;;57565:19:0;::::1;57579:4;57565:19;;57545:39;57537:48;;;::::0;::::1;;57600:15:::0;57592:24:::1;;;::::0;::::1;;57624:13;57639:25:::0;57668:32:::1;57678:7;57687:3;;57668:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;57668:32:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;57692:7:0;;-1:-1:-1;57692:7:0;;;;57668:32;::::1;::::0;57692:7;;57668:32;57692:7;57668:32;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;57668:9:0::1;::::0;-1:-1:-1;;;57668:32:0:i:1;:::-;57623:77;;;;57707:27;57737:66;57756:5;57763:10;57775:17;57794:4;;57800:2;57737:18;:66::i;:::-;57707:96:::0;-1:-1:-1;57812:13:0::1;57849:3:::0;57812:13;57866:71:::1;57886:6;57882:1;:10;57866:71;;;57919:7;;57927:1;57919:10;;;;;-1:-1:-1::0;;;57919:10:0::1;;;;;;;;;;;;;;;57910:19;;;;;:::i;:::-;::::0;-1:-1:-1;57894:3:0::1;::::0;::::1;:::i;:::-;;;57866:71;;;;57948:48;57953:5;57960:10;57989:1;57971:10;:17;:19;;;;:::i;:::-;57960:31;;;;;;-1:-1:-1::0;;;57960:31:0::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;57948:48:::1;::::0;;29039:25:1;;;29080:18;;;29073:34;-1:-1:-1;;;;;29143:55:1;;29123:18;;;29116:83;29027:2;29012:18;57948:48:0::1;;;;;;;-1:-1:-1::0;;45792:1:0;46744:22;;-1:-1:-1;;;;;;;;;;;;57319:683:0:o;48576:192::-;47909:10;47898:7;47724;47751:6;-1:-1:-1;;;;;47751:6:0;;47678:87;47898:7;-1:-1:-1;;;;;47898:21:0;;47890:66;;;;-1:-1:-1;;;47890:66:0;;25048:2:1;47890:66:0;;;25030:21:1;;;25067:18;;;25060:30;25126:34;25106:18;;;25099:62;25178:18;;47890:66:0;25020:182:1;47890:66:0;-1:-1:-1;;;;;48665:22:0;::::1;48657:73;;;::::0;-1:-1:-1;;;48657:73:0;;23470:2:1;48657:73:0::1;::::0;::::1;23452:21:1::0;23509:2;23489:18;;;23482:30;23548:34;23528:18;;;23521:62;23619:8;23599:18;;;23592:36;23645:19;;48657:73:0::1;23442:228:1::0;48657:73:0::1;48741:19;48751:8;48741:9;:19::i;41231:633::-:0;41612:10;;;41611:62;;-1:-1:-1;41628:39:0;;;;;41652:4;41628:39;;;18122:34:1;-1:-1:-1;;;;;18192:15:1;;;18172:18;;;18165:43;41628:15:0;;;;;18034:18:1;;41628:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;41611:62;41603:152;;;;-1:-1:-1;;;41603:152:0;;27241:2:1;41603:152:0;;;27223:21:1;27280:2;27260:18;;;27253:30;27319:34;27299:18;;;27292:62;27390:24;27370:18;;;27363:52;27432:19;;41603:152:0;27213:244:1;41603:152:0;41793:62;;-1:-1:-1;;;;;20046:55:1;;41793:62:0;;;20028:74:1;20118:18;;;20111:34;;;41766:90:0;;41786:5;;41816:22;;20001:18:1;;41793:62:0;;;;-1:-1:-1;;41793:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;41793:62:0;-1:-1:-1;;;;;;41793:62:0;;;;;;;;;;41766:19;:90::i;:::-;41231:633;;;:::o;35577:195::-;35680:12;35712:52;35734:6;35742:4;35748:1;35751:12;35712:21;:52::i;:::-;35705:59;;35577:195;;;;;;:::o;58666:690::-;58757:7;58766;58782:13;58798:11;-1:-1:-1;;;;;58798:17:0;;58816:7;58798:26;;;;;;;;;;;;;27954:25:1;;27942:2;27927:18;;27909:76;58798:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58782:42;;58882:20;58916:5;-1:-1:-1;;;;;58905:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58961:10;;58882:55;;-1:-1:-1;58944:14:0;58978:148;58998:6;58994:1;:10;58978:148;;;59020:47;59039:12;59053:3;59057:1;59053:6;;;;;;-1:-1:-1;;;59053:6:0;;;;;;;;;;;;;;;59061:5;59020:18;:47::i;:::-;59076:42;59090:12;59104:5;59111:3;59115:1;59111:6;;;;;;-1:-1:-1;;;59111:6:0;;;;;;;;;;;;;;;59076:13;:42::i;:::-;59006:3;;;:::i;:::-;;;58978:148;;;-1:-1:-1;59164:37:0;;-1:-1:-1;;;59164:37:0;;59132:25;;-1:-1:-1;;;;;59164:22:0;;;;;:37;;59187:3;;59132:25;;59164:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59208:13;59224:3;:10;59208:26;;59241:15;59296:5;-1:-1:-1;;;;;59285:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59277:35;;:5;:35;:::i;:::-;59260:12;49333:4;59260:5;:12;:::i;:::-;59259:54;;;;:::i;:::-;59335:5;;-1:-1:-1;59241:72:0;;-1:-1:-1;;;;;;58666:690:0;;;;;;:::o;62421:454::-;62591:16;62616:70;-1:-1:-1;;;;;62616:36:0;;62661:11;62675:10;62616:36;:70::i;:::-;62720:126;;;;;62693:24;;-1:-1:-1;;;;;62720:11:0;:33;;;;:126;;62762:10;;62781:9;;62799:4;;;;62813:2;;62824:15;;62720:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;62720:126:0;;;;;;;;;;;;:::i;:::-;62693:153;62421:454;-1:-1:-1;;;;;;;;62421:454:0:o;40746:216::-;40885:68;;-1:-1:-1;;;;;19420:15:1;;;40885:68:0;;;19402:34:1;19472:15;;19452:18;;;19445:43;19504:18;;;19497:34;;;40858:96:0;;40878:5;;-1:-1:-1;;;40908:27:0;19314:18:1;;40885:68:0;19296:241:1;40858:96:0;40746:216;;;;:::o;61600:351::-;61729:16;61754:24;61781:11;-1:-1:-1;;;;;61781:36:0;;61826:11;61846:9;61864:4;;61886;61900:15;61781:141;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61781:141:0;;;;;;;;;;;;:::i;:::-;61754:168;61600:351;-1:-1:-1;;;;;;61600:351:0:o;59998:615::-;60202:26;;-1:-1:-1;;;60202:26:0;;;;;27954:25:1;;;60170:7:0;;;;-1:-1:-1;;;;;60202:11:0;:17;;;;27927:18:1;;60202:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60186:42;;60286:20;60320:5;-1:-1:-1;;;;;60309:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60348:102;;-1:-1:-1;;;60348:102:0;;60286:55;;-1:-1:-1;;;;;;60348:55:0;;;;;:102;;60404:10;;60424:4;;60431:5;;60438:7;;60348:102;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60457:64:0;;-1:-1:-1;;;60457:64:0;;-1:-1:-1;;;;;19728:55:1;;;60457:64:0;;;19710:74:1;60516:4:0;19800:18:1;;;19793:50;60457:51:0;;;-1:-1:-1;60457:51:0;;-1:-1:-1;19683:18:1;;60457:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60528:52:0;;-1:-1:-1;;;60528:52:0;;-1:-1:-1;;;;;60528:24:0;;;-1:-1:-1;60528:24:0;;-1:-1:-1;60528:52:0;;60553:5;;60560:7;;60569:6;;60577:2;;60528:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60528:52:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;60601:5:0;;59998:615;-1:-1:-1;;;;;;;59998:615:0:o;60619:240::-;60769:26;;-1:-1:-1;;;60769:26:0;;;;;27954:25:1;;;60753:13:0;;60769:11;-1:-1:-1;;;;;60769:17:0;;;;27927:18:1;;60769:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60802:51;;;;;60753:42;;-1:-1:-1;;;;;;60802:26:0;;;;;:51;;60829:6;;60837:11;;60850:2;;60802:51;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60802:51:0;;;;;;;;;;;;:::i;:::-;;60619:240;;;;;:::o;59362:630::-;59534:26;;-1:-1:-1;;;59534:26:0;;;;;27954:25:1;;;59502:7:0;;;;-1:-1:-1;;;;;59534:11:0;:17;;;;27927:18:1;;59534:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59518:42;;59618:20;59652:5;-1:-1:-1;;;;;59641:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59697:12;;59618:55;;-1:-1:-1;59680:14:0;59716:152;59736:6;59732:1;:10;59716:152;;;59758:49;59777:12;59791:5;59797:1;59791:8;;;;;;-1:-1:-1;;;59791:8:0;;;;;;;;59758:49;59816:44;59830:12;59844:5;59851;59857:1;59851:8;;;;;;-1:-1:-1;;;59851:8:0;;;;;;;;59816:44;59744:3;;;:::i;:::-;;;59716:152;;;-1:-1:-1;59906:53:0;;-1:-1:-1;;;59906:53:0;;59874:25;;-1:-1:-1;;;;;59906:24:0;;;;;:53;;59931:5;;59874:25;;59948:6;;59956:2;;59906:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59906:53:0;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59980:5:0;;59362:630;-1:-1:-1;;;;;;;;59362:630:0:o;48776:173::-;48832:16;48851:6;;-1:-1:-1;;;;;48868:17:0;;;;;;;;;;48901:40;;48851:6;;;;;;;48901:40;;48832:16;48901:40;48776:173;;:::o;40550:188::-;40671:58;;-1:-1:-1;;;;;20046:55:1;;40671:58:0;;;20028:74:1;20118:18;;;20111:34;;;40644:86:0;;40664:5;;-1:-1:-1;;;40694:23:0;20001:18:1;;40671:58:0;19983:168:1;61955:460:0;62127:16;62152:70;-1:-1:-1;;;;;62152:36:0;;62197:11;62211:10;62152:36;:70::i;:::-;62256:130;;;;;62229:24;;-1:-1:-1;;;;;62256:11:0;:36;;;;:130;;62301:10;;62320;;62339:4;;;;62353:2;;62364:15;;62256:130;;;:::i;60865:729::-;60988:7;60997;61013:13;61029:11;-1:-1:-1;;;;;61029:17:0;;61047:7;61029:26;;;;;;;;;;;;;27954:25:1;;27942:2;27927:18;;27909:76;61029:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61013:42;-1:-1:-1;;;;;;61070:19:0;;61062:61;;;;-1:-1:-1;;;61062:61:0;;25409:2:1;61062:61:0;;;25391:21:1;25448:2;25428:18;;;25421:30;25487:31;25467:18;;;25460:59;25536:18;;61062:61:0;25381:179:1;61062:61:0;61181:20;61215:5;-1:-1:-1;;;;;61204:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61243:100;;-1:-1:-1;;;61243:100:0;;61181:55;;-1:-1:-1;;;;;;61243:55:0;;;;;:100;;61299:10;;61319:4;;61326:3;;61331:7;;61243:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61350:64:0;;-1:-1:-1;;;61350:64:0;;-1:-1:-1;;;;;19728:55:1;;;61350:64:0;;;19710:74:1;61409:4:0;19800:18:1;;;19793:50;61350:51:0;;;-1:-1:-1;61350:51:0;;-1:-1:-1;19683:18:1;;61350:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61439:36:0;;-1:-1:-1;;;61439:36:0;;61423:13;;-1:-1:-1;;;;;;61439:22:0;;;-1:-1:-1;61439:22:0;;:36;;61462:3;;61467:7;;61439:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61423:52;;61482:15;61546:5;61529;-1:-1:-1;;;;;61518:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;;;:::i;:::-;61501:12;49333:4;61501:5;:12;:::i;:::-;61500:52;;;;:::i;:::-;61573:5;;;;-1:-1:-1;60865:729:0;;-1:-1:-1;;;;;;;60865:729:0:o;43039:772::-;43474:23;43500:69;43528:4;43500:69;;;;;;;;;;;;;;;;;43508:5;-1:-1:-1;;;;;43500:27:0;;;:69;;;;;:::i;:::-;43584:17;;43474:95;;-1:-1:-1;43584:21:0;43580:224;;43726:10;43715:30;;;;;;;;;;;;:::i;:::-;43707:85;;;;-1:-1:-1;;;43707:85:0;;26470:2:1;43707:85:0;;;26452:21:1;26509:2;26489:18;;;26482:30;26548:34;26528:18;;;26521:62;26619:12;26599:18;;;26592:40;26649:19;;43707:85:0;26442:232:1;36629:530:0;36756:12;36814:5;36789:21;:30;;36781:81;;;;-1:-1:-1;;;36781:81:0;;24641:2:1;36781:81:0;;;24623:21:1;24680:2;24660:18;;;24653:30;24719:34;24699:18;;;24692:62;24790:8;24770:18;;;24763:36;24816:19;;36781:81:0;24613:228:1;36781:81:0;33026:20;;36873:60;;;;-1:-1:-1;;;36873:60:0;;25767:2:1;36873:60:0;;;25749:21:1;25806:2;25786:18;;;25779:30;25845:31;25825:18;;;25818:59;25894:18;;36873:60:0;25739:179:1;36873:60:0;37007:12;37021:23;37048:6;-1:-1:-1;;;;;37048:11:0;37068:5;37076:4;37048:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37006:75;;;;37099:52;37117:7;37126:10;37138:12;37099:17;:52::i;:::-;37092:59;36629:530;-1:-1:-1;;;;;;;36629:530:0:o;62881:1303::-;62999:42;63064;63113:17;-1:-1:-1;;;;;63141:20:0;;;;63137:921;;;63208:89;;63273:10;63208:89;;;19402:34:1;-1:-1:-1;;;;;19472:15:1;;19452:18;;;19445:43;19504:18;;;19497:34;;;19314:18;;63208:89:0;;;-1:-1:-1;;63208:89:0;;;;;;;;;;;;;;-1:-1:-1;;;;;63208:89:0;-1:-1:-1;;;63208:89:0;;;;-1:-1:-1;63137:921:0;;;63328:5;-1:-1:-1;;;;;63315:18:0;:9;-1:-1:-1;;;;;63315:18:0;;63311:747;;;63430:31;63519:7;63464:63;;;;;;27954:25:1;;27942:2;27927:18;;27909:76;63464:63:0;;;;-1:-1:-1;;63464:63:0;;;;;;;;;;;;;;-1:-1:-1;;;;;63464:63:0;;;;;63581:49;63464:63;;-1:-1:-1;;;;;;;;;;63581:29:0;;;:49;;63464:63;;63581:49;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63538:92;;;;63642:16;63673:6;63662:29;;;;;;;;;;;;:::i;:::-;63641:50;;63710:12;:38;;;;-1:-1:-1;;;;;;63726:22:0;;63738:10;63726:22;63710:38;63702:68;;;;-1:-1:-1;;;63702:68:0;;27664:2:1;63702:68:0;;;27646:21:1;27703:2;27683:18;;;27676:30;27742:19;27722:18;;;27715:47;27779:18;;63702:68:0;27636:167:1;63702:68:0;63788:52;;;;;27954:25:1;;;27927:18;;63788:52:0;;;-1:-1:-1;;63788:52:0;;;;;;;;;;;;;;-1:-1:-1;;;;;63788:52:0;;;;;;-1:-1:-1;63311:747:0;;-1:-1:-1;;;;63311:747:0;;63957:93;;64026:10;63957:93;;;19402:34:1;-1:-1:-1;;;;;19472:15:1;;19452:18;;;19445:43;19504:18;;;19497:34;;;19314:18;;63957:93:0;;;-1:-1:-1;;63957:93:0;;;;;;;;;;;;;;-1:-1:-1;;;;;63957:93:0;;;;;;-1:-1:-1;63311:747:0;64065:12;64079:23;64114:9;-1:-1:-1;;;;;64106:23:0;64130:4;64106:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64064:71;;;;64150:7;64166:10;64142:36;;;;;-1:-1:-1;;;64142:36:0;;;;;;;;:::i;:::-;;62881:1303;;;;;;;;:::o;64190:852::-;64303:42;64368;64417:17;-1:-1:-1;;;;;64445:20:0;;;;64441:475;;;64647:7;;;64190:852;;;:::o;64441:475::-;64684:5;-1:-1:-1;;;;;64671:18:0;:9;-1:-1:-1;;;;;64671:18:0;;64667:249;;;64734:93;;;;;28655:25:1;;;64821:1:0;28696:18:1;;;28689:45;-1:-1:-1;;;;;28770:55:1;;28750:18;;;28743:83;28628:18;;64734:93:0;;;-1:-1:-1;;64734:93:0;;;;;;;;;;;;;;-1:-1:-1;;;;;64734:93:0;;;;;;-1:-1:-1;64667:249:0;;39169:742;39284:12;39313:7;39309:595;;;-1:-1:-1;39344:10:0;39337:17;;39309:595;39458:17;;:21;39454:439;;39721:10;39715:17;39782:15;39769:10;39765:2;39761:19;39754:44;39669:148;39864:12;39857:20;;-1:-1:-1;;;39857:20:0;;;;;;;;:::i;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;63:85;;;:::o;153:395::-;216:8;226:6;280:3;273:4;265:6;261:17;257:27;247:2;;305:8;295;288:26;247:2;-1:-1:-1;335:20:1;;378:18;367:30;;364:2;;;417:8;407;400:26;364:2;461:4;453:6;449:17;437:29;;521:3;514:4;504:6;501:1;497:14;489:6;485:27;481:38;478:47;475:2;;;538:1;535;528:12;553:693;607:5;660:3;653:4;645:6;641:17;637:27;627:2;;682:5;675;668:20;627:2;722:6;709:20;748:4;772:60;788:43;828:2;788:43;:::i;:::-;772:60;:::i;:::-;854:3;878:2;873:3;866:15;906:2;901:3;897:12;890:19;;941:2;933:6;929:15;993:3;988:2;982;979:1;975:10;967:6;963:23;959:32;956:41;953:2;;;1014:5;1007;1000:20;953:2;1040:5;1054:163;1068:2;1065:1;1062:9;1054:163;;;1125:17;;1113:30;;1163:12;;;;1195;;;;1086:1;1079:9;1054:163;;1251:550;1293:5;1346:3;1339:4;1331:6;1327:17;1323:27;1313:2;;1368:5;1361;1354:20;1313:2;1408:6;1395:20;1434:18;1430:2;1427:26;1424:2;;;1456:18;;:::i;:::-;1500:55;1543:2;1524:13;;-1:-1:-1;;1520:27:1;1549:4;1516:38;1500:55;:::i;:::-;1580:2;1571:7;1564:19;1626:3;1619:4;1614:2;1606:6;1602:15;1598:26;1595:35;1592:2;;;1647:5;1640;1633:20;1592:2;1716;1709:4;1701:6;1697:17;1690:4;1681:7;1677:18;1664:55;1739:16;;;1757:4;1735:27;1728:42;;;;1743:7;1303:498;-1:-1:-1;;1303:498:1:o;1806:257::-;1865:6;1918:2;1906:9;1897:7;1893:23;1889:32;1886:2;;;1939:6;1931;1924:22;1886:2;1983:9;1970:23;2002:31;2027:5;2002:31;:::i;2068:261::-;2138:6;2191:2;2179:9;2170:7;2166:23;2162:32;2159:2;;;2212:6;2204;2197:22;2159:2;2249:9;2243:16;2268:31;2293:5;2268:31;:::i;2608:1111::-;2762:6;2770;2778;2786;2794;2847:3;2835:9;2826:7;2822:23;2818:33;2815:2;;;2869:6;2861;2854:22;2815:2;2913:9;2900:23;2932:31;2957:5;2932:31;:::i;:::-;2982:5;-1:-1:-1;3039:2:1;3024:18;;3011:32;3052:33;3011:32;3052:33;:::i;:::-;3104:7;-1:-1:-1;3162:2:1;3147:18;;3134:32;3185:18;3215:14;;;3212:2;;;3247:6;3239;3232:22;3212:2;3275:61;3328:7;3319:6;3308:9;3304:22;3275:61;:::i;:::-;3265:71;;3389:2;3378:9;3374:18;3361:32;3345:48;;3418:2;3408:8;3405:16;3402:2;;;3439:6;3431;3424:22;3402:2;3467:63;3522:7;3511:8;3500:9;3496:24;3467:63;:::i;:::-;3457:73;;3583:3;3572:9;3568:19;3555:33;3539:49;;3613:2;3603:8;3600:16;3597:2;;;3634:6;3626;3619:22;3597:2;;3662:51;3705:7;3694:8;3683:9;3679:24;3662:51;:::i;:::-;3652:61;;;2805:914;;;;;;;;:::o;3724:685::-;3819:6;3827;3835;3843;3896:3;3884:9;3875:7;3871:23;3867:33;3864:2;;;3918:6;3910;3903:22;3864:2;3962:9;3949:23;3981:31;4006:5;3981:31;:::i;:::-;4031:5;-1:-1:-1;4088:2:1;4073:18;;4060:32;4101:33;4060:32;4101:33;:::i;:::-;4153:7;-1:-1:-1;4207:2:1;4192:18;;4179:32;;-1:-1:-1;4262:2:1;4247:18;;4234:32;4289:18;4278:30;;4275:2;;;4326:6;4318;4311:22;4275:2;4354:49;4395:7;4386:6;4375:9;4371:22;4354:49;:::i;:::-;4344:59;;;3854:555;;;;;;;:::o;4414:754::-;4518:6;4526;4534;4542;4550;4603:3;4591:9;4582:7;4578:23;4574:33;4571:2;;;4625:6;4617;4610:22;4571:2;4669:9;4656:23;4688:31;4713:5;4688:31;:::i;:::-;4738:5;-1:-1:-1;4795:2:1;4780:18;;4767:32;4808:33;4767:32;4808:33;:::i;:::-;4860:7;-1:-1:-1;4914:2:1;4899:18;;4886:32;;-1:-1:-1;4965:2:1;4950:18;;4937:32;;-1:-1:-1;5020:3:1;5005:19;;4992:33;5048:18;5037:30;;5034:2;;;5085:6;5077;5070:22;5034:2;5113:49;5154:7;5145:6;5134:9;5130:22;5113:49;:::i;5173:937::-;5268:6;5299:2;5342;5330:9;5321:7;5317:23;5313:32;5310:2;;;5363:6;5355;5348:22;5310:2;5401:9;5395:16;5434:18;5426:6;5423:30;5420:2;;;5471:6;5463;5456:22;5420:2;5499:22;;5552:4;5544:13;;5540:27;-1:-1:-1;5530:2:1;;5586:6;5578;5571:22;5530:2;5620;5614:9;5643:60;5659:43;5699:2;5659:43;:::i;5643:60::-;5725:3;5749:2;5744:3;5737:15;5777:2;5772:3;5768:12;5761:19;;5808:2;5804;5800:11;5856:7;5851:2;5845;5842:1;5838:10;5834:2;5830:19;5826:28;5823:41;5820:2;;;5882:6;5874;5867:22;5820:2;5909:6;5900:15;;5924:156;5938:2;5935:1;5932:9;5924:156;;;5995:10;;5983:23;;5956:1;5949:9;;;;;6026:12;;;;6058;;5924:156;;;-1:-1:-1;6099:5:1;5279:831;-1:-1:-1;;;;;;;5279:831:1:o;6115:297::-;6182:6;6235:2;6223:9;6214:7;6210:23;6206:32;6203:2;;;6256:6;6248;6241:22;6203:2;6293:9;6287:16;6346:5;6339:13;6332:21;6325:5;6322:32;6312:2;;6373:6;6365;6358:22;6417:352;6475:6;6528:2;6516:9;6507:7;6503:23;6499:32;6496:2;;;6549:6;6541;6534:22;6496:2;6593:9;6580:23;-1:-1:-1;;;;;;6636:5:1;6632:78;6625:5;6622:89;6612:2;;6730:6;6722;6715:22;6774:194;6844:6;6897:2;6885:9;6876:7;6872:23;6868:32;6865:2;;;6918:6;6910;6903:22;6865:2;-1:-1:-1;6946:16:1;;6855:113;-1:-1:-1;6855:113:1:o;6973:1333::-;7149:6;7157;7165;7173;7181;7189;7197;7205;7258:3;7246:9;7237:7;7233:23;7229:33;7226:2;;;7280:6;7272;7265:22;7226:2;7321:9;7308:23;7298:33;;7382:2;7371:9;7367:18;7354:32;7405:18;7446:2;7438:6;7435:14;7432:2;;;7467:6;7459;7452:22;7432:2;7511:70;7573:7;7564:6;7553:9;7549:22;7511:70;:::i;:::-;7600:8;;-1:-1:-1;7485:96:1;-1:-1:-1;7688:2:1;7673:18;;7660:32;;-1:-1:-1;7704:16:1;;;7701:2;;;7738:6;7730;7723:22;7701:2;7782:72;7846:7;7835:8;7824:9;7820:24;7782:72;:::i;:::-;7873:8;;-1:-1:-1;7756:98:1;-1:-1:-1;7961:2:1;7946:18;;7933:32;;-1:-1:-1;7977:16:1;;;7974:2;;;8011:6;8003;7996:22;7974:2;;8055:72;8119:7;8108:8;8097:9;8093:24;8055:72;:::i;:::-;8146:8;;-1:-1:-1;8029:98:1;-1:-1:-1;;8231:3:1;8216:19;;8203:33;8245:31;8203:33;8245:31;:::i;:::-;8295:5;8285:15;;;7216:1090;;;;;;;;;;;:::o;8311:1598::-;8523:6;8531;8539;8547;8555;8563;8571;8579;8587;8595;8648:3;8636:9;8627:7;8623:23;8619:33;8616:2;;;8670:6;8662;8655:22;8616:2;8711:9;8698:23;8688:33;;8772:2;8761:9;8757:18;8744:32;8795:18;8836:2;8828:6;8825:14;8822:2;;;8857:6;8849;8842:22;8822:2;8901:70;8963:7;8954:6;8943:9;8939:22;8901:70;:::i;:::-;8990:8;;-1:-1:-1;8875:96:1;-1:-1:-1;9078:2:1;9063:18;;9050:32;;-1:-1:-1;9094:16:1;;;9091:2;;;9128:6;9120;9113:22;9091:2;9172:72;9236:7;9225:8;9214:9;9210:24;9172:72;:::i;:::-;9263:8;;-1:-1:-1;9146:98:1;-1:-1:-1;9351:2:1;9336:18;;9323:32;;-1:-1:-1;9367:16:1;;;9364:2;;;9401:6;9393;9386:22;9364:2;9445:72;9509:7;9498:8;9487:9;9483:24;9445:72;:::i;:::-;9536:8;;-1:-1:-1;9419:98:1;-1:-1:-1;9624:3:1;9609:19;;9596:33;;-1:-1:-1;9641:16:1;;;9638:2;;;9675:6;9667;9660:22;9638:2;;9719:72;9783:7;9772:8;9761:9;9757:24;9719:72;:::i;:::-;9810:8;;-1:-1:-1;9693:98:1;-1:-1:-1;9864:39:1;;-1:-1:-1;9898:3:1;9883:19;;9864:39;:::i;:::-;9854:49;;8606:1303;;;;;;;;;;;;;:::o;9914:1642::-;10135:6;10143;10151;10159;10167;10175;10183;10191;10199;10207;10215:7;10269:3;10257:9;10248:7;10244:23;10240:33;10237:2;;;10291:6;10283;10276:22;10237:2;10332:9;10319:23;10309:33;;10361:18;10428:2;10422;10411:9;10407:18;10394:32;10391:40;10388:2;;;10449:6;10441;10434:22;10388:2;10493:96;10581:7;10574:2;10563:9;10559:18;10546:32;10535:9;10531:48;10493:96;:::i;:::-;10608:8;;-1:-1:-1;10635:8:1;-1:-1:-1;10686:2:1;10671:18;;10658:32;10655:40;-1:-1:-1;10652:2:1;;;10713:6;10705;10698:22;10652:2;10757:96;10845:7;10838:2;10827:9;10823:18;10810:32;10799:9;10795:48;10757:96;:::i;:::-;10872:8;;-1:-1:-1;10899:8:1;-1:-1:-1;10950:2:1;10935:18;;10922:32;10919:40;-1:-1:-1;10916:2:1;;;10977:6;10969;10962:22;10916:2;11021:96;11109:7;11102:2;11091:9;11087:18;11074:32;11063:9;11059:48;11021:96;:::i;:::-;11136:8;;-1:-1:-1;11163:8:1;-1:-1:-1;11218:3:1;11203:19;;11190:33;;-1:-1:-1;11266:3:1;11251:19;;11238:33;11235:41;-1:-1:-1;11232:2:1;;;11295:7;11286;11279:24;11232:2;;11340:97;11429:7;11421:3;11410:9;11406:19;11393:33;11382:9;11378:49;11340:97;:::i;:::-;11456:8;;-1:-1:-1;11483:8:1;-1:-1:-1;11511:39:1;11545:3;11530:19;;11511:39;:::i;:::-;11500:50;;10227:1329;;;;;;;;;;;;;;:::o;11561:1402::-;11746:6;11754;11762;11770;11778;11786;11794;11802;11810;11863:3;11851:9;11842:7;11838:23;11834:33;11831:2;;;11885:6;11877;11870:22;11831:2;11926:9;11913:23;11903:33;;11987:2;11976:9;11972:18;11959:32;12010:18;12051:2;12043:6;12040:14;12037:2;;;12072:6;12064;12057:22;12037:2;12116:70;12178:7;12169:6;12158:9;12154:22;12116:70;:::i;:::-;12205:8;;-1:-1:-1;12090:96:1;-1:-1:-1;12293:2:1;12278:18;;12265:32;;-1:-1:-1;12309:16:1;;;12306:2;;;12343:6;12335;12328:22;12306:2;12387:72;12451:7;12440:8;12429:9;12425:24;12387:72;:::i;:::-;12478:8;;-1:-1:-1;12361:98:1;-1:-1:-1;12560:2:1;12545:18;;12532:32;;-1:-1:-1;12617:3:1;12602:19;;12589:33;;-1:-1:-1;12634:16:1;;;12631:2;;;12668:6;12660;12653:22;12631:2;;12712:72;12776:7;12765:8;12754:9;12750:24;12712:72;:::i;:::-;12803:8;;-1:-1:-1;12686:98:1;-1:-1:-1;;12888:3:1;12873:19;;12860:33;12902:31;12860:33;12902:31;:::i;:::-;12952:5;12942:15;;;11821:1142;;;;;;;;;;;:::o;12968:1076::-;13117:6;13125;13133;13141;13149;13157;13165;13218:3;13206:9;13197:7;13193:23;13189:33;13186:2;;;13240:6;13232;13225:22;13186:2;13281:9;13268:23;13258:33;;13342:2;13331:9;13327:18;13314:32;13365:18;13406:2;13398:6;13395:14;13392:2;;;13427:6;13419;13412:22;13392:2;13471:70;13533:7;13524:6;13513:9;13509:22;13471:70;:::i;:::-;13560:8;;-1:-1:-1;13445:96:1;-1:-1:-1;13642:2:1;13627:18;;13614:32;;-1:-1:-1;13699:2:1;13684:18;;13671:32;;-1:-1:-1;13715:16:1;;;13712:2;;;13749:6;13741;13734:22;13712:2;;13793:72;13857:7;13846:8;13835:9;13831:24;13793:72;:::i;:::-;13884:8;;-1:-1:-1;13767:98:1;-1:-1:-1;;13969:3:1;13954:19;;13941:33;13983:31;13941:33;13983:31;:::i;:::-;14033:5;14023:15;;;13176:868;;;;;;;;;;:::o;14049:1076::-;14198:6;14206;14214;14222;14230;14238;14246;14299:3;14287:9;14278:7;14274:23;14270:33;14267:2;;;14321:6;14313;14306:22;14267:2;14362:9;14349:23;14339:33;;14419:2;14408:9;14404:18;14391:32;14381:42;;14474:2;14463:9;14459:18;14446:32;14497:18;14538:2;14530:6;14527:14;14524:2;;;14559:6;14551;14544:22;14524:2;14603:70;14665:7;14656:6;14645:9;14641:22;14603:70;:::i;:::-;14692:8;;-1:-1:-1;14577:96:1;-1:-1:-1;14780:2:1;14765:18;;14752:32;;-1:-1:-1;14796:16:1;;;14793:2;;;14830:6;14822;14815:22;15130:1145;15288:6;15296;15304;15312;15320;15328;15336;15344;15397:3;15385:9;15376:7;15372:23;15368:33;15365:2;;;15419:6;15411;15404:22;15365:2;15460:9;15447:23;15437:33;;15517:2;15506:9;15502:18;15489:32;15479:42;;15572:2;15561:9;15557:18;15544:32;15595:18;15636:2;15628:6;15625:14;15622:2;;;15657:6;15649;15642:22;15622:2;15701:70;15763:7;15754:6;15743:9;15739:22;15701:70;:::i;:::-;15790:8;;-1:-1:-1;15675:96:1;-1:-1:-1;15872:2:1;15857:18;;15844:32;;-1:-1:-1;15929:3:1;15914:19;;15901:33;;-1:-1:-1;15946:16:1;;;15943:2;;;15980:6;15972;15965:22;15943:2;;16024:72;16088:7;16077:8;16066:9;16062:24;16024:72;:::i;:::-;16115:8;;-1:-1:-1;15998:98:1;-1:-1:-1;;16200:3:1;16185:19;;16172:33;16214:31;16172:33;16214:31;:::i;16280:440::-;16386:6;16394;16402;16410;16418;16471:3;16459:9;16450:7;16446:23;16442:33;16439:2;;;16493:6;16485;16478:22;16439:2;-1:-1:-1;;16521:16:1;;16577:2;16562:18;;16556:25;16621:2;16606:18;;16600:25;16665:2;16650:18;;16644:25;16709:3;16694:19;;;16688:26;16521:16;;16556:25;;-1:-1:-1;16600:25:1;16644;-1:-1:-1;16688:26:1;;-1:-1:-1;16429:291:1;-1:-1:-1;16429:291:1:o;16725:437::-;16778:3;16816:5;16810:12;16843:6;16838:3;16831:19;16869:4;16898:2;16893:3;16889:12;16882:19;;16935:2;16928:5;16924:14;16956:3;16968:169;16982:6;16979:1;16976:13;16968:169;;;17043:13;;17031:26;;17077:12;;;;17112:15;;;;17004:1;16997:9;16968:169;;;-1:-1:-1;17153:3:1;;16786:376;-1:-1:-1;;;;;16786:376:1:o;17167:274::-;17296:3;17334:6;17328:13;17350:53;17396:6;17391:3;17384:4;17376:6;17372:17;17350:53;:::i;:::-;17419:16;;;;;17304:137;-1:-1:-1;;17304:137:1:o;18219:915::-;18595:4;-1:-1:-1;;;;;18705:2:1;18697:6;18693:15;18682:9;18675:34;18757:2;18749:6;18745:15;18740:2;18729:9;18725:18;18718:43;;18797:3;18792:2;18781:9;18777:18;18770:31;18824:57;18876:3;18865:9;18861:19;18853:6;18824:57;:::i;:::-;18929:9;18921:6;18917:22;18912:2;18901:9;18897:18;18890:50;18963:44;19000:6;18992;18963:44;:::i;:::-;19044:22;;;19038:3;19023:19;;;19016:51;;;;-1:-1:-1;19076:20:1;;19125:2;19113:15;;18604:530;-1:-1:-1;;;;18604:530:1:o;20156:465::-;20413:2;20402:9;20395:21;20376:4;20439:56;20491:2;20480:9;20476:18;20468:6;20439:56;:::i;:::-;20543:9;20535:6;20531:22;20526:2;20515:9;20511:18;20504:50;20571:44;20608:6;20600;20571:44;:::i;:::-;20563:52;20385:236;-1:-1:-1;;;;;20385:236:1:o;20626:791::-;20989:3;20978:9;20971:22;20952:4;21016:57;21068:3;21057:9;21053:19;21045:6;21016:57;:::i;:::-;21121:9;21113:6;21109:22;21104:2;21093:9;21089:18;21082:50;21155:44;21192:6;21184;21155:44;:::i;:::-;21141:58;;21247:9;21239:6;21235:22;21230:2;21219:9;21215:18;21208:50;21275:44;21312:6;21304;21275:44;:::i;:::-;21267:52;;;-1:-1:-1;;;;;21359:6:1;21355:55;21350:2;21339:9;21335:18;21328:83;20961:456;;;;;;;:::o;22880:383::-;23029:2;23018:9;23011:21;22992:4;23061:6;23055:13;23104:6;23099:2;23088:9;23084:18;23077:34;23120:66;23179:6;23174:2;23163:9;23159:18;23154:2;23146:6;23142:15;23120:66;:::i;:::-;23247:2;23226:15;-1:-1:-1;;23222:29:1;23207:45;;;;23254:2;23203:54;;23001:262;-1:-1:-1;;23001:262:1:o;27990:452::-;28225:6;28214:9;28207:25;28268:2;28263;28252:9;28248:18;28241:30;28188:4;28288:56;28340:2;28329:9;28325:18;28317:6;28288:56;:::i;:::-;28280:64;;-1:-1:-1;;;;;28384:6:1;28380:55;28375:2;28364:9;28360:18;28353:83;28197:245;;;;;;:::o;29210:1068::-;29535:25;;;29579:2;29597:18;;;29590:34;;;29522:3;29655:2;29640:18;;29633:31;;;29507:19;;29699:22;;;29474:4;;29779:6;;29752:3;29737:19;;29474:4;29816:300;29830:6;29827:1;29824:13;29816:300;;;29905:6;29892:20;29925:31;29950:5;29925:31;:::i;:::-;-1:-1:-1;;;;;29981:54:1;29969:67;;30091:15;;;;30056:12;;;;29852:1;29845:9;29816:300;;;-1:-1:-1;;;;;;30172:55:1;;;;30167:2;30152:18;;30145:83;-1:-1:-1;;;30259:3:1;30244:19;30237:35;30133:3;29483:795;-1:-1:-1;;;;29483:795:1:o;30283:275::-;30354:2;30348:9;30419:2;30400:13;;-1:-1:-1;;30396:27:1;30384:40;;30454:18;30439:34;;30475:22;;;30436:62;30433:2;;;30501:18;;:::i;:::-;30537:2;30530:22;30328:230;;-1:-1:-1;30328:230:1:o;30563:183::-;30623:4;30656:18;30648:6;30645:30;30642:2;;;30678:18;;:::i;:::-;-1:-1:-1;30723:1:1;30719:14;30735:4;30715:25;;30632:114::o;30751:128::-;30791:3;30822:1;30818:6;30815:1;30812:13;30809:2;;;30828:18;;:::i;:::-;-1:-1:-1;30864:9:1;;30799:80::o;30884:168::-;30924:7;30990:1;30986;30982:6;30978:14;30975:1;30972:21;30967:1;30960:9;30953:17;30949:45;30946:2;;;30997:18;;:::i;:::-;-1:-1:-1;31037:9:1;;30936:116::o;31057:125::-;31097:4;31125:1;31122;31119:8;31116:2;;;31130:18;;:::i;:::-;-1:-1:-1;31167:9:1;;31106:76::o;31187:258::-;31259:1;31269:113;31283:6;31280:1;31277:13;31269:113;;;31359:11;;;31353:18;31340:11;;;31333:39;31305:2;31298:10;31269:113;;;31400:6;31397:1;31394:13;31391:2;;;-1:-1:-1;;31435:1:1;31417:16;;31410:27;31240:205::o;31450:135::-;31489:3;-1:-1:-1;;31510:17:1;;31507:2;;;31530:18;;:::i;:::-;-1:-1:-1;31577:1:1;31566:13;;31497:88::o;31590:184::-;-1:-1:-1;;;31639:1:1;31632:88;31739:4;31736:1;31729:15;31763:4;31760:1;31753:15;31779:184;-1:-1:-1;;;31828:1:1;31821:88;31928:4;31925:1;31918:15;31952:4;31949:1;31942:15;31968:154;-1:-1:-1;;;;;32047:5:1;32043:54;32036:5;32033:65;32023:2;;32112:1;32109;32102:12
Swarm Source
ipfs://c014f43baa5d7fbb85db9f4e5587bbb8c3d457a56e7a6c72b775dff3912ec9a7
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 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.