Source Code
Overview
FRAX Balance | FXTL Balance
0 FRAX | 0 FXTL
FRAX Value
$0.00
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PricePairMarket
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/**
*Submitted for verification at fraxscan.com on 2024-02-28
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.23;
// This interface defines basic ERC20 token functionalities, including transfer and balance queries.
interface IERC20 {
/**
* @dev Transfers a specified amount of tokens from one address to another.
* @param from The address from which tokens are transferred.
* @param to The address to which tokens are transferred.
* @param amount The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation was successful.
*/
function transferFrom(address from, address to, uint amount) external returns (bool);
/**
* @dev Transfers a specified amount of tokens to a specified address.
* @param to The address to which tokens are transferred.
* @param amount The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation was successful.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the token balance of a specified address.
* @param account The address whose token balance will be retrieved.
* @return The number of tokens held by the given address.
*/
function balanceOf(address account) external view returns (uint);
}
// This interface defines a function for getting the latest price answer from an oracle.
interface IAggregator {
/**
* @dev Returns the latest price answer.
* @return int256 The latest price.
*/
function latestAnswer() external view returns (int256);
}
contract PricePairMarket {
// Data structure for storing information about currency pair oracles.
uint private currencyPairCount;
// Data structure for storing information about metal pair oracles.
uint private metalPairCount;
// Mapping storing addresses of oracles for default trading tokens.
mapping(address => address) private defaultTradingTokenOracles;
// Variable storing the address of the current default trading token.
address private defaultTradingToken;
// Address of the contract owner.
address private owner;
// Variable to store a safe block number.
uint256 private safeBlock;
// Counter for tracking the number of transactions.
uint256 private transactionCounter;
// Mapping of transaction IDs to their corresponding PurchaseTransaction details.
mapping(uint256 => PurchaseTransaction) private transactions;
// Variable to store the sell fee percentage.
uint256 private sellFee;
// Mapping to store price pairs and their corresponding oracle details.
mapping(string => PricePair) private pricePairs;
// Tracks if the initial setup of the contract has been completed.
// Ensures that setup logic is executed only once.
bool private isSetup;
// Represents the paused state of the contract.
// When true, certain functions of the contract are disabled.
bool private _paused;
// Stores the block number at which the contract was setup.
uint private setupBlock;
// Flag to prevent reentrant calls.
bool private locked;
// A variable returning the current name of the contract.
string private contractName;
// Event emitted when the oracle for the default trading token is added or updated
event DefaultTradingTokenOracleUpdated(address tokenAddress, address oracleAddress);
// Event emitted when a new price pair is added
event PricePairAdded(string pairSymbol, string assetOne, string assetTwo, address oracleAddress, string classId, bytes32 dataHash);
// Event emitted when the default token is deposited by the owner
event DefaultTokenDepositedByOwner(address indexed owner, uint256 amount);
// Event emitted when the default token is withdrawn by the owner
event DefaultTokenWithdrawnByOwner(address indexed owner, uint256 amount);
// Event emitted when a price pair is removed
event PricePairRemoved(string pairSymbol, string classId);
// Event emitted when the setup of the contract is completed.
event SetupCompleted(address indexed owner, uint setupBlock);
// Event emitted when the sell fee is changed.
// @param newSellFee The new sell fee percentage.
event SellFeeChanged(uint256 newSellFee);
/**
* @dev Modifier to ensure that only the contract's owner can call a function.
* It checks if the caller is the owner of the contract before proceeding with the function execution.
*/
modifier onlyOwner() {
require(msg.sender == owner, "Caller is not the owner");
_;
}
/**
* @dev Modifier to validate if a given pair symbol and class ID are valid.
* It checks if the provided pair symbol exists and matches the provided class ID.
* @param pairSymbol The symbol of the price pair to be checked.
* @param classId The class ID to be validated against the pair.
*/
modifier onlyValidPair(string memory pairSymbol, string memory classId) {
PricePair memory pair = pricePairs[pairSymbol];
require(
keccak256(bytes(pair.classId)) == keccak256(bytes(classId)),
"Invalid pair or class ID"
);
_;
}
/**
* @dev Modifier to prevent a contract from calling itself, directly or indirectly.
*/
modifier nonReentrant() {
require(!locked, "Reentrant call");
locked = true;
_;
locked = false;
}
/**
* @dev Modifier to ensure a function is called only once during the contract's lifetime.
*/
modifier setupOnce() {
require(!isSetup, "Setup already called!");
_;
isSetup = true;
}
/**
* @dev Modifier that allows function execution only when the contract is not paused.
* It checks if the contract is not paused before allowing the function to proceed.
*/
modifier whenNotPaused() {
require(!_paused, "Contract is paused"); // Checks if the contract is not paused
_; // Continues execution of the modified function
}
/**
* @dev Modifier that allows function execution only when the contract is paused.
*/
modifier whenPaused() {
require(_paused, "Contract is not paused"); // Checks if the contract is paused
_; // Continues execution of the modified function
}
/**
* @dev Sets up initial configuration of the contract.
* This function can only be called once.
* It initializes the owner and setupBlock variables.
*/
function setup() public setupOnce {
owner = msg.sender;
setupBlock = block.number;
emit SetupCompleted(owner, setupBlock);
}
/**
* @dev Function to pause the contract.
* This function can only be called by the contract's admin.
* It sets the contract state to paused.
*/
function pause() public onlyOwner whenNotPaused {
_paused = true; // Sets the contract state to paused
}
/**
* @dev Function to resume the contract's operations.
* This function can only be called by the contract's admin.
* It sets the contract state to not paused.
*/
function unpause() public onlyOwner whenPaused {
_paused = false; // Sets the contract state to not paused
}
/**
* @dev Returns the count of currency pairs available for trading.
* @return uint The count of currency pairs.
*/
function getCurrencyPairCount() public view returns (uint) {
return currencyPairCount;
}
/**
* @dev Returns the count of metal pairs available for trading.
* @return uint The count of metal pairs.
*/
function getMetalPairCount() public view returns (uint) {
return metalPairCount;
}
/**
* @dev Returns the oracle address for a given trading token.
* @param token The address of the trading token.
* @return address The oracle address associated with the given token.
*/
function getDefaultTradingTokenOracle(address token) public view returns (address) {
return defaultTradingTokenOracles[token];
}
/**
* @dev Returns the default trading token address.
* @return address The address of the default trading token.
*/
function getDefaultTradingToken() public view returns (address) {
return defaultTradingToken;
}
/**
* @dev Returns the owner address of the contract.
* @return address The address of the current owner.
*/
function getOwner() public view returns (address) {
return owner;
}
/**
* @dev Returns the boolean status indicating if the contract setup is completed.
* @return True if setup is completed, false otherwise.
*/
function getIsSetup() public view returns (bool) {
return isSetup;
}
/**
* @dev Returns the safe block number for reference in transactions.
* @return uint256 The safe block number.
*/
function getSafeBlockNumber() public view returns (uint256) {
return safeBlock;
}
/**
* @dev Returns the total number of transactions processed by the contract.
* @return uint256 The count of transactions.
*/
function getTransactionCounter() public view returns (uint256) {
return transactionCounter;
}
/**
* @dev Returns the fee percentage for selling transactions.
* @return uint256 The fee percentage for sell transactions.
*/
function getSellFee() public view returns (uint256) {
return sellFee;
}
/**
* @dev Retrieves basic details of a transaction.
* @param transactionId The unique identifier of the transaction.
* @return Tuple containing transaction ID, buyer address, block number, timestamp, pair symbol, and active status.
*/
function getBasicTransactionDetails(uint256 transactionId) public view returns (
uint256, address, uint256, uint256, string memory, bool
) {
PurchaseTransaction storage transaction = transactions[transactionId];
string memory pairSymbolMemory = transaction.pairSymbol;
return (
transaction.transactionId,
transaction.buyer,
transaction.blockNumber,
transaction.timestamp,
pairSymbolMemory,
transaction.isActive
);
}
/**
* @dev Retrieves price details of a transaction.
* @param transactionId The unique identifier of the transaction.
* @return pairPriceInUSD The pair price in USD.
* @return tokenPriceInUSD The token price in USD.
* @return pairSymbol The symbol of the pair.
*/
function getPriceDetails(uint256 transactionId) public view returns (
int256 pairPriceInUSD, int256 tokenPriceInUSD, string memory pairSymbol
) {
PurchaseTransaction storage transaction = transactions[transactionId];
return (
transaction.pairPriceInUSD,
transaction.tokenPriceInUSD,
transaction.pairSymbol
);
}
/**
* @dev Retrieves specific details of a transaction.
* @param transactionId The unique identifier of the transaction.
* @return classId The class ID of the transaction.
* @return amountPurchased The amount of the asset purchased in the transaction.
* @return purchaseBlockNumber The block number at which the purchase occurred.
*/
function getTransactionSpecificDetails(uint256 transactionId) public view returns (
string memory classId, uint256 amountPurchased, uint256 purchaseBlockNumber
) {
PurchaseTransaction storage transaction = transactions[transactionId];
return (
transaction.classId,
transaction.amountPurchased,
transaction.purchaseBlockNumber
);
}
/**
* @dev Retrieves the name of this contract.
* @return The name of the contract as a string.
*/
function getContractName() public view returns (string memory) {
return contractName;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function isPaused() public view returns (bool) {
return _paused;
}
/**
* @dev Sets a new name for the contract.
* @param _name The new name to be set.
*/
function setContractName(string calldata _name) public onlyOwner whenNotPaused {
require(keccak256(bytes(_name)) != keccak256(bytes(contractName)), "New name must be different from the current name"); // Checks if the new name is different from the current one
contractName = _name;
}
/**
* @dev Sets or updates the oracle for the default trading token.
* Can only be called by the contract owner.
* @param tokenAddress The address of the trading token.
* @param oracleAddress The address of the oracle for the trading token.
*/
function setDefaultTradingToken(address tokenAddress, address oracleAddress) public onlyOwner {
require(tokenAddress != address(0), "Token address cannot be zero");
require(oracleAddress != address(0), "Oracle address cannot be zero");
defaultTradingTokenOracles[tokenAddress] = oracleAddress;
defaultTradingToken = tokenAddress;
emit DefaultTradingTokenOracleUpdated(tokenAddress, oracleAddress);
}
/**
* @dev Sets the sell fee percentage for the contract.
* @param _sellFee The percentage of the sell fee, represented as a whole number (e.g., 10000 for 10%).
* Requirements:
* - `_sellFee` must not exceed 333333 (33.333%).
* - Only the owner of the contract can call this function.
* Emits a `SellFeeChanged` event upon successfully setting the sell fee.
*/
function setSellFee(uint256 _sellFee) public onlyOwner {
require(_sellFee <= 333333, "Sell fee cannot be more than 33,333%");
sellFee = _sellFee;
emit SellFeeChanged(_sellFee);
}
// Represents a pair of assets with related data.
struct PricePair {
string pairSymbol; // Symbol of the pair.
string assetOne; // First asset in the pair.
string assetTwo; // Second asset in the pair.
address oracleAddress; // Address of the price oracle for this pair.
string classId; // Class identifier of the pair.
bytes32 dataHash; // Hash of the pair data for verification and integrity.
}
/**
* @dev Adds a new price pair to the contract.
* @param pairSymbol Unique symbol representing the pair.
* @param assetOne Name of the first asset in the pair.
* @param assetTwo Name of the second asset in the pair.
* @param oracleAddress Address of the oracle providing price data for the pair.
* @param isCurrencyPair Boolean indicating if the pair is a currency pair.
* Requirements:
* - `oracleAddress` cannot be the zero address.
* - `pairSymbol` must be in a valid format.
* - Only the owner of the contract can call this function.
* Emits a `PricePairAdded` event upon successfully adding a new price pair.
*/
function addPricePair(string memory pairSymbol, string memory assetOne, string memory assetTwo, address oracleAddress, bool isCurrencyPair) public onlyOwner {
require(oracleAddress != address(0), "Oracle address cannot be zero");
require(isValidPairSymbol(pairSymbol), "Invalid pair symbol format");
string memory classId;
if (isCurrencyPair) {
classId = string(abi.encodePacked("A", uintToString(++currencyPairCount)));
} else {
classId = string(abi.encodePacked("B", uintToString(++metalPairCount)));
}
// Generowanie hasha danych
bytes32 dataHash = keccak256(abi.encodePacked(pairSymbol, assetOne, assetTwo, oracleAddress, isCurrencyPair, classId));
pricePairs[pairSymbol] = PricePair(pairSymbol, assetOne, assetTwo, oracleAddress, classId, dataHash);
emit PricePairAdded(pairSymbol, assetOne, assetTwo, oracleAddress, classId, dataHash);
}
/**
* @dev Removes a price pair from the contract.
* @param pairSymbol Symbol of the pair to remove.
* @param classId Class identifier of the pair.
* @param assetOne Name of the first asset in the pair.
* @param assetTwo Name of the second asset in the pair.
* Requirements:
* - The pair must exist in the contract.
* - `pairSymbol` must be in a valid format.
* - The assets in the pair must match the provided `assetOne` and `assetTwo`.
* - Only the owner of the contract can call this function.
* Emits a `PricePairRemoved` event upon successfully removing a price pair.
*/
function removePricePair(string memory pairSymbol, string memory classId, string memory assetOne, string memory assetTwo) public onlyOwner {
require(pricePairs[pairSymbol].oracleAddress != address(0), "Price pair does not exist");
require(isValidPairSymbol(pairSymbol), "Invalid pair symbol format");
require(keccak256(abi.encodePacked(pricePairs[pairSymbol].assetOne)) == keccak256(abi.encodePacked(assetOne)), "Asset One does not match");
require(keccak256(abi.encodePacked(pricePairs[pairSymbol].assetTwo)) == keccak256(abi.encodePacked(assetTwo)), "Asset Two does not match");
delete pricePairs[pairSymbol];
emit PricePairRemoved(pairSymbol, classId);
}
// Represents a purchase transaction with related data.
struct PurchaseTransaction {
uint256 transactionId; // Unique identifier of the transaction.
address buyer; // Address of the buyer.
uint256 blockNumber; // Block number when the transaction was created.
uint256 timestamp; // Timestamp when the transaction was created.
int256 pairPriceInUSD; // Price of the pair in USD at the time of purchase.
int256 tokenPriceInUSD; // Price of the token in USD at the time of purchase.
string pairSymbol; // Symbol of the pair involved in the transaction.
string classId; // Class identifier of the pair.
uint256 amountPurchased; // Amount of the pair purchased.
bool isActive; // Flag indicating if the transaction is active.
uint256 purchaseBlockNumber; // Block number when the purchase was made.
}
// Emitted when a purchase transaction is completed.
event PurchaseCompleted(
uint256 indexed transactionId,
address indexed buyer,
string pairSymbol,
string classId,
uint256 amountPurchased,
uint256 blockNumber,
uint256 timestamp,
bool isActive
);
/**
* @dev Function to handle token purchases.
* Allows users to purchase tokens with a specified pair symbol, class ID, and token amount.
* The purchase amount is calculated based on the provided token amount, pair price, and token price.
* The transaction details are recorded in the transactions mapping.
* Emits a PurchaseCompleted event upon successful purchase.
* @param pairSymbol The symbol of the trading pair.
* @param classId The class ID for the purchase.
* @param tokenAmount The amount of tokens to purchase.
*/
function purchase(string memory pairSymbol, string memory classId, uint256 tokenAmount) public whenNotPaused nonReentrant {
require(defaultTradingToken != address(0), "Default trading token not set");
require(defaultTradingTokenOracles[defaultTradingToken] != address(0), "Oracle for default trading token not set");
IAggregator tokenOracle = IAggregator(defaultTradingTokenOracles[defaultTradingToken]);
int256 tokenPriceInUSD = tokenOracle.latestAnswer();
require(tokenPriceInUSD > 0, "Invalid price for default trading token");
int256 pairPriceInUSD = getPrice(pairSymbol);
require(pairPriceInUSD > 0, "Invalid price for selected pair");
uint256 purchaseAmount = (uint256(tokenPriceInUSD) * tokenAmount) / uint256(pairPriceInUSD);
require(purchaseAmount > 0, "Purchase amount must be greater than zero");
IERC20 token = IERC20(defaultTradingToken);
require(token.balanceOf(msg.sender) >= tokenAmount, "Insufficient token balance");
require(token.transferFrom(msg.sender, address(this), tokenAmount), "Token transfer failed");
uint256 newTransactionId = ++transactionCounter;
transactions[newTransactionId] = PurchaseTransaction({
transactionId: newTransactionId,
buyer: msg.sender,
blockNumber: block.number,
timestamp: block.timestamp,
pairPriceInUSD: pairPriceInUSD,
tokenPriceInUSD: tokenPriceInUSD,
pairSymbol: pairSymbol,
classId: classId,
amountPurchased: purchaseAmount,
isActive: true,
purchaseBlockNumber: block.number
});
emit PurchaseCompleted(
newTransactionId,
msg.sender,
pairSymbol,
classId,
purchaseAmount,
block.number,
block.timestamp,
true
);
}
/**
* @dev Event emitted upon completing a token sale.
* Records details of a sale transaction including the transaction ID, seller's address,
* amount sold, gross amount, net amount, block number, timestamp, and whether it's a profit.
*/
event SaleCompleted(
uint256 transactionId,
address seller,
uint256 amountSold,
uint256 grossAmount,
uint256 netAmount,
uint256 blockNumber,
uint256 timestamp,
bool isProfit
);
/**
* @dev Function to allow users to sell tokens from a specific purchase transaction.
* This function is used to sell tokens that were previously purchased through the `purchase` function.
* It calculates the current value of the tokens based on the current pair price and the amount purchased.
* If the current value is greater than the purchase value, the user realizes a profit, and fees are applied.
* If there's no profit, the user receives the current value of the tokens.
* After the sale, the transaction status is updated to inactive, preventing further sales.
* Emits a SaleCompleted event to record the details of the sale, including the transaction ID, seller's address,
* amount sold, gross amount, net amount, block number, timestamp, and whether it's a profit.
*
* @param transactionId The unique identifier of the purchase transaction from which tokens are being sold.
*
* Requirements:
* - The transaction must be active.
* - The caller must be the original buyer of the transaction.
* - The sale must occur within a certain block limit to prevent potential abuse.
*
* Emits a SaleCompleted event upon successful sale.
*/
function sell(uint256 transactionId) public whenNotPaused nonReentrant {
PurchaseTransaction storage transaction = transactions[transactionId];
require(transaction.isActive, "Transaction is not active");
require(transaction.buyer == msg.sender, "You are not the owner of this transaction");
require(block.number <= transaction.purchaseBlockNumber + safeBlock, "Sale block limit exceeded");
int256 currentPairPriceInUSD = getPrice(transaction.pairSymbol);
uint256 currentValue = uint256(currentPairPriceInUSD) * transaction.amountPurchased;
uint256 purchaseValue = uint256(transaction.pairPriceInUSD) * transaction.amountPurchased;
uint256 grossAmount = currentValue;
uint256 netAmount;
bool isProfit = currentValue > purchaseValue;
if (isProfit) {
uint256 profit = currentValue - purchaseValue;
uint256 fee = profit * sellFee / 1000000;
netAmount = profit - fee;
} else {
netAmount = currentValue; // In case of no profit, only the current value is returned.
}
IERC20 token = IERC20(defaultTradingToken);
require(token.balanceOf(address(this)) >= netAmount, "Insufficient contract balance");
require(token.transfer(msg.sender, netAmount), "Transfer failed");
transaction.isActive = false;
emit SaleCompleted(
transactionId,
msg.sender,
transaction.amountPurchased,
grossAmount,
netAmount,
block.number,
block.timestamp,
isProfit
);
}
/**
* @dev Allows the owner to deposit the default trading token into the contract.
* @param amount The amount of the token to be deposited.
*/
function depositDefaultTradingToken(uint256 amount) public onlyOwner {
require(defaultTradingToken != address(0), "Default trading token not set");
IERC20 token = IERC20(defaultTradingToken);
require(token.transferFrom(msg.sender, address(this), amount), "Transfer failed");
emit DefaultTokenDepositedByOwner(msg.sender, amount);
}
/**
* @dev Allows the owner to withdraw the default trading token from the contract.
* @param amount The amount of the token to be withdrawn.
*/
function withdrawDefaultTradingToken(uint256 amount) public onlyOwner {
require(defaultTradingToken != address(0), "Default trading token not set");
IERC20 token = IERC20(defaultTradingToken);
uint256 contractBalance = token.balanceOf(address(this));
require(contractBalance >= amount, "Insufficient funds in the contract");
require(token.transfer(msg.sender, amount), "Transfer failed");
emit DefaultTokenWithdrawnByOwner(msg.sender, amount);
}
/**
* @dev Function to get the latest price from an Oracle for a given price pair.
* @param pair The symbol of the price pair (e.g., "ETH/USD").
* @return The latest price as an int256.
*/
function getPrice(string memory pair) public view returns (int256) {
PricePair memory pricePair = pricePairs[pair];
require(pricePair.oracleAddress != address(0), "Oracle not set for this pair");
IAggregator oracle = IAggregator(pricePair.oracleAddress);
int256 price = oracle.latestAnswer();
require(price != 0, "Price cannot be zero");
return price;
}
/**
* @dev Function to get the latest price for a class identifier.
* @param classId The class identifier to search for.
* @return The latest price as an int256.
*/
function getPriceByClassId(string memory classId) public view returns (int256) {
for (uint i = 0; i < currencyPairCount + metalPairCount; i++) {
PricePair storage pricePair = pricePairs[uintToString(i)];
if (keccak256(bytes(pricePair.classId)) == keccak256(bytes(classId))) {
return getPrice(pricePair.pairSymbol);
}
}
revert("Class ID not found");
}
/**
* @dev Helper function to check if a pair symbol is in a valid format.
* @param symbol The symbol to be validated.
* @return A boolean indicating whether the symbol is valid.
*/
function isValidPairSymbol(string memory symbol) private pure returns (bool) {
bytes memory symbolBytes = bytes(symbol);
bool slashFound = false;
for(uint i = 0; i < symbolBytes.length; i++) {
if(symbolBytes[i] == "/") {
if(slashFound || i == 0 || i == symbolBytes.length - 1) {
return false;
}
slashFound = true;
}
}
return slashFound;
}
/**
* @dev Helper function to convert a uint256 to a string.
* @param v The uint256 value to be converted.
* @return str The string representation of the input value.
*/
function uintToString(uint v) private pure returns (string memory str) {
if (v == 0) {
return "0";
}
uint j = v;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len;
while (v != 0) {
k = k-1;
uint8 temp = (48 + uint8(v - v / 10 * 10));
bytes1 b1 = bytes1(temp);
bstr[k] = b1;
v /= 10;
}
return string(bstr);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DefaultTokenDepositedByOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DefaultTokenWithdrawnByOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"oracleAddress","type":"address"}],"name":"DefaultTradingTokenOracleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"pairSymbol","type":"string"},{"indexed":false,"internalType":"string","name":"assetOne","type":"string"},{"indexed":false,"internalType":"string","name":"assetTwo","type":"string"},{"indexed":false,"internalType":"address","name":"oracleAddress","type":"address"},{"indexed":false,"internalType":"string","name":"classId","type":"string"},{"indexed":false,"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"PricePairAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"pairSymbol","type":"string"},{"indexed":false,"internalType":"string","name":"classId","type":"string"}],"name":"PricePairRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"string","name":"pairSymbol","type":"string"},{"indexed":false,"internalType":"string","name":"classId","type":"string"},{"indexed":false,"internalType":"uint256","name":"amountPurchased","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"PurchaseCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transactionId","type":"uint256"},{"indexed":false,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"grossAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"netAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isProfit","type":"bool"}],"name":"SaleCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSellFee","type":"uint256"}],"name":"SellFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"setupBlock","type":"uint256"}],"name":"SetupCompleted","type":"event"},{"inputs":[{"internalType":"string","name":"pairSymbol","type":"string"},{"internalType":"string","name":"assetOne","type":"string"},{"internalType":"string","name":"assetTwo","type":"string"},{"internalType":"address","name":"oracleAddress","type":"address"},{"internalType":"bool","name":"isCurrencyPair","type":"bool"}],"name":"addPricePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositDefaultTradingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getBasicTransactionDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrencyPairCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDefaultTradingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDefaultTradingTokenOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsSetup","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMetalPairCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"pair","type":"string"}],"name":"getPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"classId","type":"string"}],"name":"getPriceByClassId","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getPriceDetails","outputs":[{"internalType":"int256","name":"pairPriceInUSD","type":"int256"},{"internalType":"int256","name":"tokenPriceInUSD","type":"int256"},{"internalType":"string","name":"pairSymbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSafeBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getTransactionSpecificDetails","outputs":[{"internalType":"string","name":"classId","type":"string"},{"internalType":"uint256","name":"amountPurchased","type":"uint256"},{"internalType":"uint256","name":"purchaseBlockNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pairSymbol","type":"string"},{"internalType":"string","name":"classId","type":"string"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"pairSymbol","type":"string"},{"internalType":"string","name":"classId","type":"string"},{"internalType":"string","name":"assetOne","type":"string"},{"internalType":"string","name":"assetTwo","type":"string"}],"name":"removePricePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"setContractName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"oracleAddress","type":"address"}],"name":"setDefaultTradingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellFee","type":"uint256"}],"name":"setSellFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawDefaultTradingToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561000f575f80fd5b50612f918061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806382dccbb3116100f3578063ba0bba4011610093578063e4849b321161006e578063e4849b3214610371578063eaf92c5214610384578063f0ed2e80146103af578063f5f5ba72146103d1575f80fd5b8063ba0bba4014610343578063c9efe4351461034b578063d7fdc6641461035e575f80fd5b80638b4cee08116100ce5780638b4cee08146102f65780638dcdd021146103095780639f40d0cd1461031c578063b187bd2614610333575f80fd5b806382dccbb3146102d55780638456cb59146102dd578063893d20e8146102e5575f80fd5b80633fd5376b1161015e5780637a7c3c39116101395780637a7c3c39146102685780637d73001f1461028d5780637dc851e5146102a05780638292da7a146102b3575f80fd5b80633fd5376b14610228578063524f38891461024d5780636b49bac714610260575f80fd5b8063289af0d811610199578063289af0d8146101fa57806329c1a991146102115780632dd1b86b146102185780633f4ba83a14610220575f80fd5b80630b5ee006146101bf5780631da58d17146101d4578063288ba926146101e7575b5f80fd5b6101d26101cd3660046124f8565b6103e6565b005b6101d26101e2366004612564565b6104e8565b6101d26101f5366004612618565b6106c9565b6008545b6040519081526020015b60405180910390f35b5f546101fe565b6006546101fe565b6101d2610c9b565b6003546001600160a01b03165b6040516001600160a01b039091168152602001610208565b6101fe61025b366004612680565b610d22565b6001546101fe565b61027b610276366004612564565b6110c5565b604051610208969594939291906126ff565b6101d261029b366004612746565b6111ac565b6101d26102ae366004612807565b6114cf565b6102c66102c1366004612564565b61161d565b60405161020893929190612838565b6005546101fe565b6101d26116db565b6004546001600160a01b0316610235565b6101d2610304366004612564565b61173e565b6101d2610317366004612869565b611802565b600a5460ff165b6040519015158152602001610208565b600a54610100900460ff16610323565b6101d2611aa6565b6101fe610359366004612680565b611b4e565b6101d261036c366004612564565b611c8f565b6101d261037f366004612564565b611db0565b610235610392366004612910565b6001600160a01b039081165f908152600260205260409020541690565b6103c26103bd366004612564565b6121b4565b60405161020893929190612930565b6103d9612272565b6040516102089190612957565b6004546001600160a01b031633146104195760405162461bcd60e51b815260040161041090612969565b60405180910390fd5b600a54610100900460ff16156104415760405162461bcd60e51b8152600401610410906129a0565b600d6040516104509190612a73565b60405180910390208282604051610468929190612a7e565b6040518091039020036104d65760405162461bcd60e51b815260206004820152603060248201527f4e6577206e616d65206d75737420626520646966666572656e742066726f6d2060448201526f7468652063757272656e74206e616d6560801b6064820152608401610410565b600d6104e3828483612ad8565b505050565b6004546001600160a01b031633146105125760405162461bcd60e51b815260040161041090612969565b6003546001600160a01b031661053a5760405162461bcd60e51b815260040161041090612b92565b6003546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa158015610584573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a89190612bc9565b9050828110156106055760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e742066756e647320696e2074686520636f6e74726160448201526118dd60f21b6064820152608401610410565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0383169063a9059cbb906044016020604051808303815f875af115801561064f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106739190612be0565b61068f5760405162461bcd60e51b815260040161041090612bfb565b60405183815233907f438a789ddecb040a37bde559b416983cda42b06c5b3ea44d10c0178046a16ecf9060200160405180910390a2505050565b600a54610100900460ff16156106f15760405162461bcd60e51b8152600401610410906129a0565b600c5460ff16156107355760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b6044820152606401610410565b600c805460ff191660011790556003546001600160a01b031661076a5760405162461bcd60e51b815260040161041090612b92565b6003546001600160a01b039081165f90815260026020526040902054166107e45760405162461bcd60e51b815260206004820152602860248201527f4f7261636c6520666f722064656661756c742074726164696e6720746f6b656e604482015267081b9bdd081cd95d60c21b6064820152608401610410565b6003546001600160a01b039081165f9081526002602090815260408083205481516350d25bcd60e01b8152915194169384926350d25bcd92600480820193918290030181865afa15801561083a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190612bc9565b90505f81136108bf5760405162461bcd60e51b815260206004820152602760248201527f496e76616c696420707269636520666f722064656661756c742074726164696e60448201526633903a37b5b2b760c91b6064820152608401610410565b5f6108c986610d22565b90505f811361091a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420707269636520666f722073656c65637465642070616972006044820152606401610410565b5f816109268685612c38565b6109309190612c55565b90505f81116109935760405162461bcd60e51b815260206004820152602960248201527f507572636861736520616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610410565b6003546040516370a0823160e01b81523360048201526001600160a01b0390911690869082906370a0823190602401602060405180830381865afa1580156109dd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a019190612bc9565b1015610a4f5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e63650000000000006044820152606401610410565b6040516323b872dd60e01b8152336004820152306024820152604481018790526001600160a01b038216906323b872dd906064016020604051808303815f875af1158015610a9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac39190612be0565b610b075760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610410565b5f60065f8154610b1690612c74565b9190508190559050604051806101600160405280828152602001336001600160a01b031681526020014381526020014281526020018581526020018681526020018a81526020018981526020018481526020016001151581526020014381525060075f8381526020019081526020015f205f820151815f01556020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006019081610bf89190612c8c565b5060e08201516007820190610c0d9082612c8c565b50610100820151600882015561012082015160098201805460ff191691151591909117905561014090910151600a90910155604051339082907fc9c04abe172ba045c614afb1a489fff180f9a1df4082d2a4927e0cc95cf5e20e90610c7e908d908d90899043904290600190612d4c565b60405180910390a35050600c805460ff1916905550505050505050565b6004546001600160a01b03163314610cc55760405162461bcd60e51b815260040161041090612969565b600a54610100900460ff16610d155760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9858dd081a5cc81b9bdd081c185d5cd95960521b6044820152606401610410565b600a805461ff0019169055565b5f80600983604051610d349190612d98565b90815260200160405180910390206040518060c00160405290815f82018054610d5c906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610d88906129cc565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b50505050508152602001600182018054610dec906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e18906129cc565b8015610e635780601f10610e3a57610100808354040283529160200191610e63565b820191905f5260205f20905b815481529060010190602001808311610e4657829003601f168201915b50505050508152602001600282018054610e7c906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea8906129cc565b8015610ef35780601f10610eca57610100808354040283529160200191610ef3565b820191905f5260205f20905b815481529060010190602001808311610ed657829003601f168201915b505050918352505060038201546001600160a01b03166020820152600482018054604090920191610f23906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4f906129cc565b8015610f9a5780601f10610f7157610100808354040283529160200191610f9a565b820191905f5260205f20905b815481529060010190602001808311610f7d57829003601f168201915b50505091835250506005919091015460209091015260608101519091506001600160a01b031661100c5760405162461bcd60e51b815260206004820152601c60248201527f4f7261636c65206e6f742073657420666f7220746869732070616972000000006044820152606401610410565b5f816060015190505f816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611051573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110759190612bc9565b9050805f036110bd5760405162461bcd60e51b815260206004820152601460248201527350726963652063616e6e6f74206265207a65726f60601b6044820152606401610410565b949350505050565b5f805f8060605f8060075f8981526020019081526020015f2090505f8160060180546110f0906129cc565b80601f016020809104026020016040519081016040528092919081815260200182805461111c906129cc565b80156111675780601f1061113e57610100808354040283529160200191611167565b820191905f5260205f20905b81548152906001019060200180831161114a57829003601f168201915b50508554600187015460028801546003890154600990990154929e506001600160a01b039091169c509a509598509296505060ff909316935050505091939550919395565b6004546001600160a01b031633146111d65760405162461bcd60e51b815260040161041090612969565b5f6001600160a01b03166009856040516111f09190612d98565b908152604051908190036020019020600301546001600160a01b0316036112595760405162461bcd60e51b815260206004820152601960248201527f5072696365207061697220646f6573206e6f74206578697374000000000000006044820152606401610410565b61126284612302565b6112ae5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420706169722073796d626f6c20666f726d61740000000000006044820152606401610410565b816040516020016112bf9190612d98565b604051602081830303815290604052805190602001206009856040516112e59190612d98565b90815260200160405180910390206001016040516020016113069190612a73565b60405160208183030381529060405280519060200120146113695760405162461bcd60e51b815260206004820152601860248201527f4173736574204f6e6520646f6573206e6f74206d6174636800000000000000006044820152606401610410565b8060405160200161137a9190612d98565b604051602081830303815290604052805190602001206009856040516113a09190612d98565b90815260200160405180910390206002016040516020016113c19190612a73565b60405160208183030381529060405280519060200120146114245760405162461bcd60e51b815260206004820152601860248201527f41737365742054776f20646f6573206e6f74206d6174636800000000000000006044820152606401610410565b6009846040516114349190612d98565b9081526040519081900360200190205f61144e82826124a6565b61145b600183015f6124a6565b611468600283015f6124a6565b6003820180546001600160a01b0319169055611487600483015f6124a6565b600582015f905550507f808831ae6b7023bffeefbcfadc3d8f525d82a2a215124f019a0c85ede1d0958884846040516114c1929190612db3565b60405180910390a150505050565b6004546001600160a01b031633146114f95760405162461bcd60e51b815260040161041090612969565b6001600160a01b03821661154f5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616464726573732063616e6e6f74206265207a65726f000000006044820152606401610410565b6001600160a01b0381166115a55760405162461bcd60e51b815260206004820152601d60248201527f4f7261636c6520616464726573732063616e6e6f74206265207a65726f0000006044820152606401610410565b6001600160a01b038281165f8181526002602090815260409182902080546001600160a01b0319908116958716958617909155600380549091168417905581519283528201929092527fe3221c1fb11e1e628cffc07406d7a01ba973ccb9b0a072bfee6fa81885503730910160405180910390a15050565b60605f805f60075f8681526020019081526020015f20905080600701816008015482600a015482805461164f906129cc565b80601f016020809104026020016040519081016040528092919081815260200182805461167b906129cc565b80156116c65780601f1061169d576101008083540402835291602001916116c6565b820191905f5260205f20905b8154815290600101906020018083116116a957829003601f168201915b50505050509250935093509350509193909250565b6004546001600160a01b031633146117055760405162461bcd60e51b815260040161041090612969565b600a54610100900460ff161561172d5760405162461bcd60e51b8152600401610410906129a0565b600a805461ff001916610100179055565b6004546001600160a01b031633146117685760405162461bcd60e51b815260040161041090612969565b620516158111156117c75760405162461bcd60e51b8152602060048201526024808201527f53656c6c206665652063616e6e6f74206265206d6f7265207468616e2033332c6044820152633333332560e01b6064820152608401610410565b60088190556040518181527f18fd0e62c6c2ddcb9f523a495dfb8337adc6d1c2cfac842b112d49d7e69a10319060200160405180910390a150565b6004546001600160a01b0316331461182c5760405162461bcd60e51b815260040161041090612969565b6001600160a01b0382166118825760405162461bcd60e51b815260206004820152601d60248201527f4f7261636c6520616464726573732063616e6e6f74206265207a65726f0000006044820152606401610410565b61188b85612302565b6118d75760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420706169722073796d626f6c20666f726d61740000000000006044820152606401610410565b6060811561191f576118f95f8081546118ef90612c74565b9182905550612380565b6040516020016119099190612dd7565b6040516020818303038152906040529050611952565b61193060015f81546118ef90612c74565b6040516020016119409190612dff565b60405160208183030381529060405290505b5f86868686868660405160200161196e96959493929190612e1a565b6040516020818303038152906040528051906020012090506040518060c00160405280888152602001878152602001868152602001856001600160a01b03168152602001838152602001828152506009886040516119cc9190612d98565b908152604051908190036020019020815181906119e99082612c8c565b50602082015160018201906119fe9082612c8c565b5060408201516002820190611a139082612c8c565b5060608201516003820180546001600160a01b0319166001600160a01b0390921691909117905560808201516004820190611a4e9082612c8c565b5060a082015181600501559050507f48c10220a820dc38d7fdcbdb6fb08a378782327e9c59d5d943ed496d2ecdd1e4878787878686604051611a9596959493929190612e99565b60405180910390a150505050505050565b600a5460ff1615611af15760405162461bcd60e51b8152602060048201526015602482015274536574757020616c72656164792063616c6c65642160581b6044820152606401610410565b600480546001600160a01b0319163390811790915543600b8190556040519081527f9e4bd02b115dd3cb5ad86085de76fc3f2d3f9ea0b557c054c2d9cbdce10390139060200160405180910390a2600a805460ff19166001179055565b5f805b6001545f54611b609190612f08565b811015611c51575f6009611b7383612380565b604051611b809190612d98565b90815260200160405180910390209050838051906020012081600401604051611ba99190612a73565b604051809103902003611c48576110bd815f018054611bc7906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf3906129cc565b8015611c3e5780601f10611c1557610100808354040283529160200191611c3e565b820191905f5260205f20905b815481529060010190602001808311611c2157829003601f168201915b5050505050610d22565b50600101611b51565b5060405162461bcd60e51b815260206004820152601260248201527110db185cdcc81251081b9bdd08199bdd5b9960721b6044820152606401610410565b6004546001600160a01b03163314611cb95760405162461bcd60e51b815260040161041090612969565b6003546001600160a01b0316611ce15760405162461bcd60e51b815260040161041090612b92565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b039091169081906323b872dd906064016020604051808303815f875af1158015611d37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d5b9190612be0565b611d775760405162461bcd60e51b815260040161041090612bfb565b60405182815233907f253960ffd8f7153d1c32bebbc91c25fb77e4b85a0d19b07f9190701168cbadc59060200160405180910390a25050565b600a54610100900460ff1615611dd85760405162461bcd60e51b8152600401610410906129a0565b600c5460ff1615611e1c5760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b6044820152606401610410565b600c805460ff191660011790555f818152600760205260409020600981015460ff16611e8a5760405162461bcd60e51b815260206004820152601960248201527f5472616e73616374696f6e206973206e6f7420616374697665000000000000006044820152606401610410565b60018101546001600160a01b03163314611ef85760405162461bcd60e51b815260206004820152602960248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320747260448201526830b739b0b1ba34b7b760b91b6064820152608401610410565b60055481600a0154611f0a9190612f08565b431115611f595760405162461bcd60e51b815260206004820152601960248201527f53616c6520626c6f636b206c696d6974206578636565646564000000000000006044820152606401610410565b5f611f6c826006018054611bc7906129cc565b90505f826008015482611f7f9190612c38565b90505f83600801548460040154611f969190612c38565b9050815f8282118015611fe2575f611fae8587612f1b565b90505f620f424060085483611fc39190612c38565b611fcd9190612c55565b9050611fd98183612f1b565b93505050611fe6565b8491505b6003546040516370a0823160e01b81523060048201526001600160a01b0390911690839082906370a0823190602401602060405180830381865afa158015612030573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120549190612bc9565b10156120a25760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e63650000006044820152606401610410565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0382169063a9059cbb906044016020604051808303815f875af11580156120ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121109190612be0565b61212c5760405162461bcd60e51b815260040161041090612bfb565b60098801805460ff191690556008880154604080518b81523360208201528082019290925260608201869052608082018590524360a08301524260c083015283151560e0830152517f5893c27a8801ce724730bd7e99ddb200433f4e24b21dde876bb167b323cffa7b918190036101000190a15050600c805460ff1916905550505050505050565b5f8060605f60075f8681526020019081526020015f20905080600401548160050154826006018080546121e6906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054612212906129cc565b801561225d5780601f106122345761010080835404028352916020019161225d565b820191905f5260205f20905b81548152906001019060200180831161224057829003601f168201915b50505050509050935093509350509193909250565b6060600d8054612281906129cc565b80601f01602080910402602001604051908101604052809291908181526020018280546122ad906129cc565b80156122f85780601f106122cf576101008083540402835291602001916122f8565b820191905f5260205f20905b8154815290600101906020018083116122db57829003601f168201915b5050505050905090565b5f8181805b82518110156123785782818151811061232257612322612f2e565b01602001516001600160f81b031916602f60f81b03612370578180612345575080155b8061235c5750600183516123599190612f1b565b81145b1561236b57505f949350505050565b600191505b600101612307565b509392505050565b6060815f036123a65750506040805180820190915260018152600360fc1b602082015290565b815f5b81156123cf57806123b981612c74565b91506123c89050600a83612c55565b91506123a9565b5f8167ffffffffffffffff8111156123e9576123e961257b565b6040519080825280601f01601f191660200182016040528015612413576020820181803683370190505b509050815b851561249d57612429600182612f1b565b90505f612437600a88612c55565b61244290600a612c38565b61244c9088612f1b565b612457906030612f42565b90505f8160f81b90508084848151811061247357612473612f2e565b60200101906001600160f81b03191690815f1a905350612494600a89612c55565b97505050612418565b50949350505050565b5080546124b2906129cc565b5f825580601f106124c1575050565b601f0160209004905f5260205f20908101906124dd91906124e0565b50565b5b808211156124f4575f81556001016124e1565b5090565b5f8060208385031215612509575f80fd5b823567ffffffffffffffff80821115612520575f80fd5b818501915085601f830112612533575f80fd5b813581811115612541575f80fd5b866020828501011115612552575f80fd5b60209290920196919550909350505050565b5f60208284031215612574575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261259e575f80fd5b813567ffffffffffffffff808211156125b9576125b961257b565b604051601f8301601f19908116603f011681019082821181831017156125e1576125e161257b565b816040528381528660208588010111156125f9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f6060848603121561262a575f80fd5b833567ffffffffffffffff80821115612641575f80fd5b61264d8783880161258f565b94506020860135915080821115612662575f80fd5b5061266f8682870161258f565b925050604084013590509250925092565b5f60208284031215612690575f80fd5b813567ffffffffffffffff8111156126a6575f80fd5b6110bd8482850161258f565b5f5b838110156126cc5781810151838201526020016126b4565b50505f910152565b5f81518084526126eb8160208601602086016126b2565b601f01601f19169290920160200192915050565b86815260018060a01b038616602082015284604082015283606082015260c060808201525f61273160c08301856126d4565b905082151560a0830152979650505050505050565b5f805f8060808587031215612759575f80fd5b843567ffffffffffffffff80821115612770575f80fd5b61277c8883890161258f565b95506020870135915080821115612791575f80fd5b61279d8883890161258f565b945060408701359150808211156127b2575f80fd5b6127be8883890161258f565b935060608701359150808211156127d3575f80fd5b506127e08782880161258f565b91505092959194509250565b80356001600160a01b0381168114612802575f80fd5b919050565b5f8060408385031215612818575f80fd5b612821836127ec565b915061282f602084016127ec565b90509250929050565b606081525f61284a60608301866126d4565b60208301949094525060400152919050565b80151581146124dd575f80fd5b5f805f805f60a0868803121561287d575f80fd5b853567ffffffffffffffff80821115612894575f80fd5b6128a089838a0161258f565b965060208801359150808211156128b5575f80fd5b6128c189838a0161258f565b955060408801359150808211156128d6575f80fd5b506128e38882890161258f565b9350506128f2606087016127ec565b915060808601356129028161285c565b809150509295509295909350565b5f60208284031215612920575f80fd5b612929826127ec565b9392505050565b838152826020820152606060408201525f61294e60608301846126d4565b95945050505050565b602081525f61292960208301846126d4565b60208082526017908201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b600181811c908216806129e057607f821691505b6020821081036129fe57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8154612a10816129cc565b60018281168015612a285760018114612a3d57612a69565b60ff1984168752821515830287019450612a69565b855f526020805f205f5b85811015612a605781548a820152908401908201612a47565b50505082870194505b5050505092915050565b5f6129298284612a04565b818382375f9101908152919050565b601f8211156104e357805f5260205f20601f840160051c81016020851015612ab25750805b601f840160051c820191505b81811015612ad1575f8155600101612abe565b5050505050565b67ffffffffffffffff831115612af057612af061257b565b612b0483612afe83546129cc565b83612a8d565b5f601f841160018114612b35575f8515612b1e5750838201355b5f19600387901b1c1916600186901b178355612ad1565b5f83815260208120601f198716915b82811015612b645786850135825560209485019460019092019101612b44565b5086821015612b80575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6020808252601d908201527f44656661756c742074726164696e6720746f6b656e206e6f7420736574000000604082015260600190565b5f60208284031215612bd9575f80fd5b5051919050565b5f60208284031215612bf0575f80fd5b81516129298161285c565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417612c4f57612c4f612c24565b92915050565b5f82612c6f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201612c8557612c85612c24565b5060010190565b815167ffffffffffffffff811115612ca657612ca661257b565b612cba81612cb484546129cc565b84612a8d565b602080601f831160018114612ced575f8415612cd65750858301515b5f19600386901b1c1916600185901b178555612d44565b5f85815260208120601f198616915b82811015612d1b57888601518255948401946001909101908401612cfc565b5085821015612d3857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60c081525f612d5e60c08301896126d4565b8281036020840152612d7081896126d4565b91505085604083015284606083015283608083015282151560a0830152979650505050505050565b5f8251612da98184602087016126b2565b9190910192915050565b604081525f612dc560408301856126d4565b828103602084015261294e81856126d4565b604160f81b81525f8251612df28160018501602087016126b2565b9190910160010192915050565b602160f91b81525f8251612df28160018501602087016126b2565b5f8751612e2b818460208c016126b2565b875190830190612e3f818360208c016126b2565b8751910190612e52818360208b016126b2565b606087901b6bffffffffffffffffffffffff1916910190815284151560f81b60148201528351612e898160158401602088016126b2565b0160150198975050505050505050565b60c081525f612eab60c08301896126d4565b8281036020840152612ebd81896126d4565b90508281036040840152612ed181886126d4565b6001600160a01b038716606085015283810360808501529050612ef481866126d4565b9150508260a0830152979650505050505050565b80820180821115612c4f57612c4f612c24565b81810381811115612c4f57612c4f612c24565b634e487b7160e01b5f52603260045260245ffd5b60ff8181168382160190811115612c4f57612c4f612c2456fea264697066735822122025b29a9bb1a2961038620ab46e33832c9fe74b2b94cf02493616ebc00e52a7e264736f6c63430008170033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806382dccbb3116100f3578063ba0bba4011610093578063e4849b321161006e578063e4849b3214610371578063eaf92c5214610384578063f0ed2e80146103af578063f5f5ba72146103d1575f80fd5b8063ba0bba4014610343578063c9efe4351461034b578063d7fdc6641461035e575f80fd5b80638b4cee08116100ce5780638b4cee08146102f65780638dcdd021146103095780639f40d0cd1461031c578063b187bd2614610333575f80fd5b806382dccbb3146102d55780638456cb59146102dd578063893d20e8146102e5575f80fd5b80633fd5376b1161015e5780637a7c3c39116101395780637a7c3c39146102685780637d73001f1461028d5780637dc851e5146102a05780638292da7a146102b3575f80fd5b80633fd5376b14610228578063524f38891461024d5780636b49bac714610260575f80fd5b8063289af0d811610199578063289af0d8146101fa57806329c1a991146102115780632dd1b86b146102185780633f4ba83a14610220575f80fd5b80630b5ee006146101bf5780631da58d17146101d4578063288ba926146101e7575b5f80fd5b6101d26101cd3660046124f8565b6103e6565b005b6101d26101e2366004612564565b6104e8565b6101d26101f5366004612618565b6106c9565b6008545b6040519081526020015b60405180910390f35b5f546101fe565b6006546101fe565b6101d2610c9b565b6003546001600160a01b03165b6040516001600160a01b039091168152602001610208565b6101fe61025b366004612680565b610d22565b6001546101fe565b61027b610276366004612564565b6110c5565b604051610208969594939291906126ff565b6101d261029b366004612746565b6111ac565b6101d26102ae366004612807565b6114cf565b6102c66102c1366004612564565b61161d565b60405161020893929190612838565b6005546101fe565b6101d26116db565b6004546001600160a01b0316610235565b6101d2610304366004612564565b61173e565b6101d2610317366004612869565b611802565b600a5460ff165b6040519015158152602001610208565b600a54610100900460ff16610323565b6101d2611aa6565b6101fe610359366004612680565b611b4e565b6101d261036c366004612564565b611c8f565b6101d261037f366004612564565b611db0565b610235610392366004612910565b6001600160a01b039081165f908152600260205260409020541690565b6103c26103bd366004612564565b6121b4565b60405161020893929190612930565b6103d9612272565b6040516102089190612957565b6004546001600160a01b031633146104195760405162461bcd60e51b815260040161041090612969565b60405180910390fd5b600a54610100900460ff16156104415760405162461bcd60e51b8152600401610410906129a0565b600d6040516104509190612a73565b60405180910390208282604051610468929190612a7e565b6040518091039020036104d65760405162461bcd60e51b815260206004820152603060248201527f4e6577206e616d65206d75737420626520646966666572656e742066726f6d2060448201526f7468652063757272656e74206e616d6560801b6064820152608401610410565b600d6104e3828483612ad8565b505050565b6004546001600160a01b031633146105125760405162461bcd60e51b815260040161041090612969565b6003546001600160a01b031661053a5760405162461bcd60e51b815260040161041090612b92565b6003546040516370a0823160e01b81523060048201526001600160a01b03909116905f9082906370a0823190602401602060405180830381865afa158015610584573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105a89190612bc9565b9050828110156106055760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e742066756e647320696e2074686520636f6e74726160448201526118dd60f21b6064820152608401610410565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0383169063a9059cbb906044016020604051808303815f875af115801561064f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106739190612be0565b61068f5760405162461bcd60e51b815260040161041090612bfb565b60405183815233907f438a789ddecb040a37bde559b416983cda42b06c5b3ea44d10c0178046a16ecf9060200160405180910390a2505050565b600a54610100900460ff16156106f15760405162461bcd60e51b8152600401610410906129a0565b600c5460ff16156107355760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b6044820152606401610410565b600c805460ff191660011790556003546001600160a01b031661076a5760405162461bcd60e51b815260040161041090612b92565b6003546001600160a01b039081165f90815260026020526040902054166107e45760405162461bcd60e51b815260206004820152602860248201527f4f7261636c6520666f722064656661756c742074726164696e6720746f6b656e604482015267081b9bdd081cd95d60c21b6064820152608401610410565b6003546001600160a01b039081165f9081526002602090815260408083205481516350d25bcd60e01b8152915194169384926350d25bcd92600480820193918290030181865afa15801561083a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085e9190612bc9565b90505f81136108bf5760405162461bcd60e51b815260206004820152602760248201527f496e76616c696420707269636520666f722064656661756c742074726164696e60448201526633903a37b5b2b760c91b6064820152608401610410565b5f6108c986610d22565b90505f811361091a5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c696420707269636520666f722073656c65637465642070616972006044820152606401610410565b5f816109268685612c38565b6109309190612c55565b90505f81116109935760405162461bcd60e51b815260206004820152602960248201527f507572636861736520616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610410565b6003546040516370a0823160e01b81523360048201526001600160a01b0390911690869082906370a0823190602401602060405180830381865afa1580156109dd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a019190612bc9565b1015610a4f5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420746f6b656e2062616c616e63650000000000006044820152606401610410565b6040516323b872dd60e01b8152336004820152306024820152604481018790526001600160a01b038216906323b872dd906064016020604051808303815f875af1158015610a9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac39190612be0565b610b075760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610410565b5f60065f8154610b1690612c74565b9190508190559050604051806101600160405280828152602001336001600160a01b031681526020014381526020014281526020018581526020018681526020018a81526020018981526020018481526020016001151581526020014381525060075f8381526020019081526020015f205f820151815f01556020820151816001015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006019081610bf89190612c8c565b5060e08201516007820190610c0d9082612c8c565b50610100820151600882015561012082015160098201805460ff191691151591909117905561014090910151600a90910155604051339082907fc9c04abe172ba045c614afb1a489fff180f9a1df4082d2a4927e0cc95cf5e20e90610c7e908d908d90899043904290600190612d4c565b60405180910390a35050600c805460ff1916905550505050505050565b6004546001600160a01b03163314610cc55760405162461bcd60e51b815260040161041090612969565b600a54610100900460ff16610d155760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9858dd081a5cc81b9bdd081c185d5cd95960521b6044820152606401610410565b600a805461ff0019169055565b5f80600983604051610d349190612d98565b90815260200160405180910390206040518060c00160405290815f82018054610d5c906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610d88906129cc565b8015610dd35780601f10610daa57610100808354040283529160200191610dd3565b820191905f5260205f20905b815481529060010190602001808311610db657829003601f168201915b50505050508152602001600182018054610dec906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610e18906129cc565b8015610e635780601f10610e3a57610100808354040283529160200191610e63565b820191905f5260205f20905b815481529060010190602001808311610e4657829003601f168201915b50505050508152602001600282018054610e7c906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea8906129cc565b8015610ef35780601f10610eca57610100808354040283529160200191610ef3565b820191905f5260205f20905b815481529060010190602001808311610ed657829003601f168201915b505050918352505060038201546001600160a01b03166020820152600482018054604090920191610f23906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4f906129cc565b8015610f9a5780601f10610f7157610100808354040283529160200191610f9a565b820191905f5260205f20905b815481529060010190602001808311610f7d57829003601f168201915b50505091835250506005919091015460209091015260608101519091506001600160a01b031661100c5760405162461bcd60e51b815260206004820152601c60248201527f4f7261636c65206e6f742073657420666f7220746869732070616972000000006044820152606401610410565b5f816060015190505f816001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611051573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110759190612bc9565b9050805f036110bd5760405162461bcd60e51b815260206004820152601460248201527350726963652063616e6e6f74206265207a65726f60601b6044820152606401610410565b949350505050565b5f805f8060605f8060075f8981526020019081526020015f2090505f8160060180546110f0906129cc565b80601f016020809104026020016040519081016040528092919081815260200182805461111c906129cc565b80156111675780601f1061113e57610100808354040283529160200191611167565b820191905f5260205f20905b81548152906001019060200180831161114a57829003601f168201915b50508554600187015460028801546003890154600990990154929e506001600160a01b039091169c509a509598509296505060ff909316935050505091939550919395565b6004546001600160a01b031633146111d65760405162461bcd60e51b815260040161041090612969565b5f6001600160a01b03166009856040516111f09190612d98565b908152604051908190036020019020600301546001600160a01b0316036112595760405162461bcd60e51b815260206004820152601960248201527f5072696365207061697220646f6573206e6f74206578697374000000000000006044820152606401610410565b61126284612302565b6112ae5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420706169722073796d626f6c20666f726d61740000000000006044820152606401610410565b816040516020016112bf9190612d98565b604051602081830303815290604052805190602001206009856040516112e59190612d98565b90815260200160405180910390206001016040516020016113069190612a73565b60405160208183030381529060405280519060200120146113695760405162461bcd60e51b815260206004820152601860248201527f4173736574204f6e6520646f6573206e6f74206d6174636800000000000000006044820152606401610410565b8060405160200161137a9190612d98565b604051602081830303815290604052805190602001206009856040516113a09190612d98565b90815260200160405180910390206002016040516020016113c19190612a73565b60405160208183030381529060405280519060200120146114245760405162461bcd60e51b815260206004820152601860248201527f41737365742054776f20646f6573206e6f74206d6174636800000000000000006044820152606401610410565b6009846040516114349190612d98565b9081526040519081900360200190205f61144e82826124a6565b61145b600183015f6124a6565b611468600283015f6124a6565b6003820180546001600160a01b0319169055611487600483015f6124a6565b600582015f905550507f808831ae6b7023bffeefbcfadc3d8f525d82a2a215124f019a0c85ede1d0958884846040516114c1929190612db3565b60405180910390a150505050565b6004546001600160a01b031633146114f95760405162461bcd60e51b815260040161041090612969565b6001600160a01b03821661154f5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e20616464726573732063616e6e6f74206265207a65726f000000006044820152606401610410565b6001600160a01b0381166115a55760405162461bcd60e51b815260206004820152601d60248201527f4f7261636c6520616464726573732063616e6e6f74206265207a65726f0000006044820152606401610410565b6001600160a01b038281165f8181526002602090815260409182902080546001600160a01b0319908116958716958617909155600380549091168417905581519283528201929092527fe3221c1fb11e1e628cffc07406d7a01ba973ccb9b0a072bfee6fa81885503730910160405180910390a15050565b60605f805f60075f8681526020019081526020015f20905080600701816008015482600a015482805461164f906129cc565b80601f016020809104026020016040519081016040528092919081815260200182805461167b906129cc565b80156116c65780601f1061169d576101008083540402835291602001916116c6565b820191905f5260205f20905b8154815290600101906020018083116116a957829003601f168201915b50505050509250935093509350509193909250565b6004546001600160a01b031633146117055760405162461bcd60e51b815260040161041090612969565b600a54610100900460ff161561172d5760405162461bcd60e51b8152600401610410906129a0565b600a805461ff001916610100179055565b6004546001600160a01b031633146117685760405162461bcd60e51b815260040161041090612969565b620516158111156117c75760405162461bcd60e51b8152602060048201526024808201527f53656c6c206665652063616e6e6f74206265206d6f7265207468616e2033332c6044820152633333332560e01b6064820152608401610410565b60088190556040518181527f18fd0e62c6c2ddcb9f523a495dfb8337adc6d1c2cfac842b112d49d7e69a10319060200160405180910390a150565b6004546001600160a01b0316331461182c5760405162461bcd60e51b815260040161041090612969565b6001600160a01b0382166118825760405162461bcd60e51b815260206004820152601d60248201527f4f7261636c6520616464726573732063616e6e6f74206265207a65726f0000006044820152606401610410565b61188b85612302565b6118d75760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420706169722073796d626f6c20666f726d61740000000000006044820152606401610410565b6060811561191f576118f95f8081546118ef90612c74565b9182905550612380565b6040516020016119099190612dd7565b6040516020818303038152906040529050611952565b61193060015f81546118ef90612c74565b6040516020016119409190612dff565b60405160208183030381529060405290505b5f86868686868660405160200161196e96959493929190612e1a565b6040516020818303038152906040528051906020012090506040518060c00160405280888152602001878152602001868152602001856001600160a01b03168152602001838152602001828152506009886040516119cc9190612d98565b908152604051908190036020019020815181906119e99082612c8c565b50602082015160018201906119fe9082612c8c565b5060408201516002820190611a139082612c8c565b5060608201516003820180546001600160a01b0319166001600160a01b0390921691909117905560808201516004820190611a4e9082612c8c565b5060a082015181600501559050507f48c10220a820dc38d7fdcbdb6fb08a378782327e9c59d5d943ed496d2ecdd1e4878787878686604051611a9596959493929190612e99565b60405180910390a150505050505050565b600a5460ff1615611af15760405162461bcd60e51b8152602060048201526015602482015274536574757020616c72656164792063616c6c65642160581b6044820152606401610410565b600480546001600160a01b0319163390811790915543600b8190556040519081527f9e4bd02b115dd3cb5ad86085de76fc3f2d3f9ea0b557c054c2d9cbdce10390139060200160405180910390a2600a805460ff19166001179055565b5f805b6001545f54611b609190612f08565b811015611c51575f6009611b7383612380565b604051611b809190612d98565b90815260200160405180910390209050838051906020012081600401604051611ba99190612a73565b604051809103902003611c48576110bd815f018054611bc7906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611bf3906129cc565b8015611c3e5780601f10611c1557610100808354040283529160200191611c3e565b820191905f5260205f20905b815481529060010190602001808311611c2157829003601f168201915b5050505050610d22565b50600101611b51565b5060405162461bcd60e51b815260206004820152601260248201527110db185cdcc81251081b9bdd08199bdd5b9960721b6044820152606401610410565b6004546001600160a01b03163314611cb95760405162461bcd60e51b815260040161041090612969565b6003546001600160a01b0316611ce15760405162461bcd60e51b815260040161041090612b92565b6003546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b039091169081906323b872dd906064016020604051808303815f875af1158015611d37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d5b9190612be0565b611d775760405162461bcd60e51b815260040161041090612bfb565b60405182815233907f253960ffd8f7153d1c32bebbc91c25fb77e4b85a0d19b07f9190701168cbadc59060200160405180910390a25050565b600a54610100900460ff1615611dd85760405162461bcd60e51b8152600401610410906129a0565b600c5460ff1615611e1c5760405162461bcd60e51b815260206004820152600e60248201526d1499595b9d1c985b9d0818d85b1b60921b6044820152606401610410565b600c805460ff191660011790555f818152600760205260409020600981015460ff16611e8a5760405162461bcd60e51b815260206004820152601960248201527f5472616e73616374696f6e206973206e6f7420616374697665000000000000006044820152606401610410565b60018101546001600160a01b03163314611ef85760405162461bcd60e51b815260206004820152602960248201527f596f7520617265206e6f7420746865206f776e6572206f66207468697320747260448201526830b739b0b1ba34b7b760b91b6064820152608401610410565b60055481600a0154611f0a9190612f08565b431115611f595760405162461bcd60e51b815260206004820152601960248201527f53616c6520626c6f636b206c696d6974206578636565646564000000000000006044820152606401610410565b5f611f6c826006018054611bc7906129cc565b90505f826008015482611f7f9190612c38565b90505f83600801548460040154611f969190612c38565b9050815f8282118015611fe2575f611fae8587612f1b565b90505f620f424060085483611fc39190612c38565b611fcd9190612c55565b9050611fd98183612f1b565b93505050611fe6565b8491505b6003546040516370a0823160e01b81523060048201526001600160a01b0390911690839082906370a0823190602401602060405180830381865afa158015612030573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120549190612bc9565b10156120a25760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e63650000006044820152606401610410565b60405163a9059cbb60e01b8152336004820152602481018490526001600160a01b0382169063a9059cbb906044016020604051808303815f875af11580156120ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121109190612be0565b61212c5760405162461bcd60e51b815260040161041090612bfb565b60098801805460ff191690556008880154604080518b81523360208201528082019290925260608201869052608082018590524360a08301524260c083015283151560e0830152517f5893c27a8801ce724730bd7e99ddb200433f4e24b21dde876bb167b323cffa7b918190036101000190a15050600c805460ff1916905550505050505050565b5f8060605f60075f8681526020019081526020015f20905080600401548160050154826006018080546121e6906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054612212906129cc565b801561225d5780601f106122345761010080835404028352916020019161225d565b820191905f5260205f20905b81548152906001019060200180831161224057829003601f168201915b50505050509050935093509350509193909250565b6060600d8054612281906129cc565b80601f01602080910402602001604051908101604052809291908181526020018280546122ad906129cc565b80156122f85780601f106122cf576101008083540402835291602001916122f8565b820191905f5260205f20905b8154815290600101906020018083116122db57829003601f168201915b5050505050905090565b5f8181805b82518110156123785782818151811061232257612322612f2e565b01602001516001600160f81b031916602f60f81b03612370578180612345575080155b8061235c5750600183516123599190612f1b565b81145b1561236b57505f949350505050565b600191505b600101612307565b509392505050565b6060815f036123a65750506040805180820190915260018152600360fc1b602082015290565b815f5b81156123cf57806123b981612c74565b91506123c89050600a83612c55565b91506123a9565b5f8167ffffffffffffffff8111156123e9576123e961257b565b6040519080825280601f01601f191660200182016040528015612413576020820181803683370190505b509050815b851561249d57612429600182612f1b565b90505f612437600a88612c55565b61244290600a612c38565b61244c9088612f1b565b612457906030612f42565b90505f8160f81b90508084848151811061247357612473612f2e565b60200101906001600160f81b03191690815f1a905350612494600a89612c55565b97505050612418565b50949350505050565b5080546124b2906129cc565b5f825580601f106124c1575050565b601f0160209004905f5260205f20908101906124dd91906124e0565b50565b5b808211156124f4575f81556001016124e1565b5090565b5f8060208385031215612509575f80fd5b823567ffffffffffffffff80821115612520575f80fd5b818501915085601f830112612533575f80fd5b813581811115612541575f80fd5b866020828501011115612552575f80fd5b60209290920196919550909350505050565b5f60208284031215612574575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f83011261259e575f80fd5b813567ffffffffffffffff808211156125b9576125b961257b565b604051601f8301601f19908116603f011681019082821181831017156125e1576125e161257b565b816040528381528660208588010111156125f9575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f6060848603121561262a575f80fd5b833567ffffffffffffffff80821115612641575f80fd5b61264d8783880161258f565b94506020860135915080821115612662575f80fd5b5061266f8682870161258f565b925050604084013590509250925092565b5f60208284031215612690575f80fd5b813567ffffffffffffffff8111156126a6575f80fd5b6110bd8482850161258f565b5f5b838110156126cc5781810151838201526020016126b4565b50505f910152565b5f81518084526126eb8160208601602086016126b2565b601f01601f19169290920160200192915050565b86815260018060a01b038616602082015284604082015283606082015260c060808201525f61273160c08301856126d4565b905082151560a0830152979650505050505050565b5f805f8060808587031215612759575f80fd5b843567ffffffffffffffff80821115612770575f80fd5b61277c8883890161258f565b95506020870135915080821115612791575f80fd5b61279d8883890161258f565b945060408701359150808211156127b2575f80fd5b6127be8883890161258f565b935060608701359150808211156127d3575f80fd5b506127e08782880161258f565b91505092959194509250565b80356001600160a01b0381168114612802575f80fd5b919050565b5f8060408385031215612818575f80fd5b612821836127ec565b915061282f602084016127ec565b90509250929050565b606081525f61284a60608301866126d4565b60208301949094525060400152919050565b80151581146124dd575f80fd5b5f805f805f60a0868803121561287d575f80fd5b853567ffffffffffffffff80821115612894575f80fd5b6128a089838a0161258f565b965060208801359150808211156128b5575f80fd5b6128c189838a0161258f565b955060408801359150808211156128d6575f80fd5b506128e38882890161258f565b9350506128f2606087016127ec565b915060808601356129028161285c565b809150509295509295909350565b5f60208284031215612920575f80fd5b612929826127ec565b9392505050565b838152826020820152606060408201525f61294e60608301846126d4565b95945050505050565b602081525f61292960208301846126d4565b60208082526017908201527f43616c6c6572206973206e6f7420746865206f776e6572000000000000000000604082015260600190565b60208082526012908201527110dbdb9d1c9858dd081a5cc81c185d5cd95960721b604082015260600190565b600181811c908216806129e057607f821691505b6020821081036129fe57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f8154612a10816129cc565b60018281168015612a285760018114612a3d57612a69565b60ff1984168752821515830287019450612a69565b855f526020805f205f5b85811015612a605781548a820152908401908201612a47565b50505082870194505b5050505092915050565b5f6129298284612a04565b818382375f9101908152919050565b601f8211156104e357805f5260205f20601f840160051c81016020851015612ab25750805b601f840160051c820191505b81811015612ad1575f8155600101612abe565b5050505050565b67ffffffffffffffff831115612af057612af061257b565b612b0483612afe83546129cc565b83612a8d565b5f601f841160018114612b35575f8515612b1e5750838201355b5f19600387901b1c1916600186901b178355612ad1565b5f83815260208120601f198716915b82811015612b645786850135825560209485019460019092019101612b44565b5086821015612b80575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6020808252601d908201527f44656661756c742074726164696e6720746f6b656e206e6f7420736574000000604082015260600190565b5f60208284031215612bd9575f80fd5b5051919050565b5f60208284031215612bf0575f80fd5b81516129298161285c565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417612c4f57612c4f612c24565b92915050565b5f82612c6f57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201612c8557612c85612c24565b5060010190565b815167ffffffffffffffff811115612ca657612ca661257b565b612cba81612cb484546129cc565b84612a8d565b602080601f831160018114612ced575f8415612cd65750858301515b5f19600386901b1c1916600185901b178555612d44565b5f85815260208120601f198616915b82811015612d1b57888601518255948401946001909101908401612cfc565b5085821015612d3857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60c081525f612d5e60c08301896126d4565b8281036020840152612d7081896126d4565b91505085604083015284606083015283608083015282151560a0830152979650505050505050565b5f8251612da98184602087016126b2565b9190910192915050565b604081525f612dc560408301856126d4565b828103602084015261294e81856126d4565b604160f81b81525f8251612df28160018501602087016126b2565b9190910160010192915050565b602160f91b81525f8251612df28160018501602087016126b2565b5f8751612e2b818460208c016126b2565b875190830190612e3f818360208c016126b2565b8751910190612e52818360208b016126b2565b606087901b6bffffffffffffffffffffffff1916910190815284151560f81b60148201528351612e898160158401602088016126b2565b0160150198975050505050505050565b60c081525f612eab60c08301896126d4565b8281036020840152612ebd81896126d4565b90508281036040840152612ed181886126d4565b6001600160a01b038716606085015283810360808501529050612ef481866126d4565b9150508260a0830152979650505050505050565b80820180821115612c4f57612c4f612c24565b81810381811115612c4f57612c4f612c24565b634e487b7160e01b5f52603260045260245ffd5b60ff8181168382160190811115612c4f57612c4f612c2456fea264697066735822122025b29a9bb1a2961038620ab46e33832c9fe74b2b94cf02493616ebc00e52a7e264736f6c63430008170033
Deployed Bytecode Sourcemap
1607:27604:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12700:307;;;;;;:::i;:::-;;:::i;:::-;;25937:518;;;;;;:::i;:::-;;:::i;19738:1991::-;;;;;;:::i;:::-;;:::i;9751:85::-;9821:7;;9751:85;;;2414:25:1;;;2402:2;2387:18;9751:85:0;;;;;;;;7646:102;7699:4;7723:17;7646:102;;9486:107;9567:18;;9486:107;;7376:122;;;:::i;8500:109::-;8582:19;;-1:-1:-1;;;;;8582:19:0;8500:109;;;-1:-1:-1;;;;;2614:32:1;;;2596:51;;2584:2;2569:18;8500:109:0;2450:203:1;26681:412:0;;;;;;:::i;:::-;;:::i;7890:96::-;7964:14;;7890:96;;10109:552;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;17173:722::-;;;;;;:::i;:::-;;:::i;13294:451::-;;;;;;:::i;:::-;;:::i;11754:417::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;9233:95::-;9311:9;;9233:95;;7057:118;;;:::i;8749:81::-;8817:5;;-1:-1:-1;;;;;8817:5:0;8749:81;;14160:210;;;;;;:::i;:::-;;:::i;15542:970::-;;;;;;:::i;:::-;;:::i;9004:82::-;9071:7;;;;9004:82;;;7316:14:1;;7309:22;7291:41;;7279:2;7264:18;9004:82:0;7151:187:1;12502:80:0;12567:7;;;;;;;12502:80;;6718:156;;;:::i;27295:438::-;;;;;;:::i;:::-;;:::i;25377:384::-;;;;;;:::i;:::-;;:::i;23523:1679::-;;;;;;:::i;:::-;;:::i;8210:142::-;;;;;;:::i;:::-;-1:-1:-1;;;;;8311:33:0;;;8284:7;8311:33;;;:26;:33;;;;;;;;8210:142;10974:397;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;12301:101::-;;;:::i;:::-;;;;;;;:::i;12700:307::-;4670:5;;-1:-1:-1;;;;;4670:5:0;4656:10;:19;4648:55;;;;-1:-1:-1;;;4648:55:0;;;;;;;:::i;:::-;;;;;;;;;6095:7:::1;::::0;::::1;::::0;::::1;;;6094:8;6086:39;;;;-1:-1:-1::0;;;6086:39:0::1;;;;;;;:::i;:::-;12841:12:::2;12825:30;;;;;;:::i;:::-;;;;;;;;12814:5;;12798:23;;;;;;;:::i;:::-;;;;;;;;:57:::0;12790:118:::2;;;::::0;-1:-1:-1;;;12790:118:0;;10751:2:1;12790:118:0::2;::::0;::::2;10733:21:1::0;10790:2;10770:18;;;10763:30;10829:34;10809:18;;;10802:62;-1:-1:-1;;;10880:18:1;;;10873:46;10936:19;;12790:118:0::2;10549:412:1::0;12790:118:0::2;12979:12;:20;12994:5:::0;;12979:12;:20:::2;:::i;:::-;;12700:307:::0;;:::o;25937:518::-;4670:5;;-1:-1:-1;;;;;4670:5:0;4656:10;:19;4648:55;;;;-1:-1:-1;;;4648:55:0;;;;;;;:::i;:::-;26026:19:::1;::::0;-1:-1:-1;;;;;26026:19:0::1;26018:75;;;;-1:-1:-1::0;;;26018:75:0::1;;;;;;;:::i;:::-;26128:19;::::0;26185:30:::1;::::0;-1:-1:-1;;;26185:30:0;;26209:4:::1;26185:30;::::0;::::1;2596:51:1::0;-1:-1:-1;;;;;26128:19:0;;::::1;::::0;26106:12:::1;::::0;26128:19;;26185:15:::1;::::0;2569:18:1;;26185:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26159:56;;26253:6;26234:15;:25;;26226:72;;;::::0;-1:-1:-1;;;26226:72:0;;13615:2:1;26226:72:0::1;::::0;::::1;13597:21:1::0;13654:2;13634:18;;;13627:30;13693:34;13673:18;;;13666:62;-1:-1:-1;;;13744:18:1;;;13737:32;13786:19;;26226:72:0::1;13413:398:1::0;26226:72:0::1;26327:34;::::0;-1:-1:-1;;;26327:34:0;;26342:10:::1;26327:34;::::0;::::1;13990:51:1::0;14057:18;;;14050:34;;;-1:-1:-1;;;;;26327:14:0;::::1;::::0;::::1;::::0;13963:18:1;;26327:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26319:62;;;;-1:-1:-1::0;;;26319:62:0::1;;;;;;;:::i;:::-;26399:48;::::0;2414:25:1;;;26428:10:0::1;::::0;26399:48:::1;::::0;2402:2:1;2387:18;26399:48:0::1;;;;;;;26007:448;;25937:518:::0;:::o;19738:1991::-;6095:7;;;;;;;6094:8;6086:39;;;;-1:-1:-1;;;6086:39:0;;;;;;;:::i;:::-;5510:6:::1;::::0;::::1;;5509:7;5501:34;;;::::0;-1:-1:-1;;;5501:34:0;;14891:2:1;5501:34:0::1;::::0;::::1;14873:21:1::0;14930:2;14910:18;;;14903:30;-1:-1:-1;;;14949:18:1;;;14942:44;15003:18;;5501:34:0::1;14689:338:1::0;5501:34:0::1;5546:6;:13:::0;;-1:-1:-1;;5546:13:0::1;5555:4;5546:13;::::0;;19879:19:::2;::::0;-1:-1:-1;;;;;19879:19:0::2;19871:75;;;;-1:-1:-1::0;;;19871:75:0::2;;;;;;;:::i;:::-;19992:19;::::0;-1:-1:-1;;;;;19992:19:0;;::::2;20024:1;19965:47:::0;;;:26:::2;:47;::::0;;;;;::::2;19957:114;;;::::0;-1:-1:-1;;;19957:114:0;;15234:2:1;19957:114:0::2;::::0;::::2;15216:21:1::0;15273:2;15253:18;;;15246:30;15312:34;15292:18;;;15285:62;-1:-1:-1;;;15363:18:1;;;15356:38;15411:19;;19957:114:0::2;15032:404:1::0;19957:114:0::2;20157:19;::::0;-1:-1:-1;;;;;20157:19:0;;::::2;20092:23;20130:47:::0;;;:26:::2;:47;::::0;;;;;;;;20214:26;;-1:-1:-1;;;20214:26:0;;;;20130:47;::::2;::::0;;;20214:24:::2;::::0;:26:::2;::::0;;::::2;::::0;;;;;;;20130:47;20214:26:::2;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20189:51;;20277:1;20259:15;:19;20251:71;;;::::0;-1:-1:-1;;;20251:71:0;;15831:2:1;20251:71:0::2;::::0;::::2;15813:21:1::0;15870:2;15850:18;;;15843:30;15909:34;15889:18;;;15882:62;-1:-1:-1;;;15960:18:1;;;15953:37;16007:19;;20251:71:0::2;15629:403:1::0;20251:71:0::2;20335:21;20359:20;20368:10;20359:8;:20::i;:::-;20335:44;;20415:1;20398:14;:18;20390:62;;;::::0;-1:-1:-1;;;20390:62:0;;16239:2:1;20390:62:0::2;::::0;::::2;16221:21:1::0;16278:2;16258:18;;;16251:30;16317:33;16297:18;;;16290:61;16368:18;;20390:62:0::2;16037:355:1::0;20390:62:0::2;20465:22;20541:14:::0;20491:38:::2;20518:11:::0;20499:15;20491:38:::2;:::i;:::-;20490:66;;;;:::i;:::-;20465:91;;20592:1;20575:14;:18;20567:72;;;::::0;-1:-1:-1;;;20567:72:0;;17126:2:1;20567:72:0::2;::::0;::::2;17108:21:1::0;17165:2;17145:18;;;17138:30;17204:34;17184:18;;;17177:62;-1:-1:-1;;;17255:18:1;;;17248:39;17304:19;;20567:72:0::2;16924:405:1::0;20567:72:0::2;20674:19;::::0;20713:27:::2;::::0;-1:-1:-1;;;20713:27:0;;20729:10:::2;20713:27;::::0;::::2;2596:51:1::0;-1:-1:-1;;;;;20674:19:0;;::::2;::::0;20744:11;;20674:19;;20713:15:::2;::::0;2569:18:1;;20713:27:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:42;;20705:81;;;::::0;-1:-1:-1;;;20705:81:0;;17536:2:1;20705:81:0::2;::::0;::::2;17518:21:1::0;17575:2;17555:18;;;17548:30;17614:28;17594:18;;;17587:56;17660:18;;20705:81:0::2;17334:350:1::0;20705:81:0::2;20805:58;::::0;-1:-1:-1;;;20805:58:0;;20824:10:::2;20805:58;::::0;::::2;17929:34:1::0;20844:4:0::2;17979:18:1::0;;;17972:43;18031:18;;;18024:34;;;-1:-1:-1;;;;;20805:18:0;::::2;::::0;::::2;::::0;17864::1;;20805:58:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20797:92;;;::::0;-1:-1:-1;;;20797:92:0;;18271:2:1;20797:92:0::2;::::0;::::2;18253:21:1::0;18310:2;18290:18;;;18283:30;-1:-1:-1;;;18329:18:1;;;18322:51;18390:18;;20797:92:0::2;18069:345:1::0;20797:92:0::2;20902:24;20931:18;;20929:20;;;;;:::i;:::-;;;;;;;20902:47;;20993:474;;;;;;;;21043:16;20993:474;;;;21081:10;-1:-1:-1::0;;;;;20993:474:0::2;;;;;21119:12;20993:474;;;;21157:15;20993:474;;;;21203:14;20993:474;;;;21249:15;20993:474;;;;21291:10;20993:474;;;;21325:7;20993:474;;;;21364:14;20993:474;;;;21403:4;20993:474;;;;;;21443:12;20993:474;;::::0;20960:12:::2;:30;20973:16;20960:30;;;;;;;;;;;:507;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;20960:507:0::2;;;;;-1:-1:-1::0;;;;;20960:507:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;20960:507:0::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;:::i;:::-;-1:-1:-1::0;20960:507:0::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;-1:-1:-1;;20960:507:0::2;::::0;::::2;;::::0;;;::::2;::::0;;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;21485:236:::2;::::0;21548:10:::2;::::0;21517:16;;21485:236:::2;::::0;::::2;::::0;21573:10;;21598:7;;21620:14;;21649:12:::2;::::0;21676:15:::2;::::0;-1:-1:-1;;21485:236:0::2;:::i;:::-;;;;;;;;-1:-1:-1::0;;5582:6:0::1;:14:::0;;-1:-1:-1;;5582:14:0::1;::::0;;-1:-1:-1;;;;;;;19738:1991:0:o;7376:122::-;4670:5;;-1:-1:-1;;;;;4670:5:0;4656:10;:19;4648:55;;;;-1:-1:-1;;;4648:55:0;;;;;;;:::i;:::-;6388:7:::1;::::0;::::1;::::0;::::1;;;6380:42;;;::::0;-1:-1:-1;;;6380:42:0;;20800:2:1;6380:42:0::1;::::0;::::1;20782:21:1::0;20839:2;20819:18;;;20812:30;-1:-1:-1;;;20858:18:1;;;20851:52;20920:18;;6380:42:0::1;20598:346:1::0;6380:42:0::1;7434:7:::2;:15:::0;;-1:-1:-1;;7434:15:0::2;::::0;;7376:122::o;26681:412::-;26740:6;26759:26;26788:10;26799:4;26788:16;;;;;;:::i;:::-;;;;;;;;;;;;;26759:45;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26759:45:0;;;-1:-1:-1;;26759:45:0;;;;-1:-1:-1;;;;;26759:45:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26759:45:0;;;-1:-1:-1;;26759:45:0;;;;;;;;;;;26823:23;;;;26759:45;;-1:-1:-1;;;;;;26823:37:0;26815:78;;;;-1:-1:-1;;;26815:78:0;;21445:2:1;26815:78:0;;;21427:21:1;21484:2;21464:18;;;21457:30;21523;21503:18;;;21496:58;21571:18;;26815:78:0;21243:352:1;26815:78:0;26904:18;26937:9;:23;;;26904:57;;26972:12;26987:6;-1:-1:-1;;;;;26987:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26972:36;;27027:5;27036:1;27027:10;27019:43;;;;-1:-1:-1;;;27019:43:0;;21802:2:1;27019:43:0;;;21784:21:1;21841:2;21821:18;;;21814:30;-1:-1:-1;;;21860:18:1;;;21853:50;21920:18;;27019:43:0;21600:344:1;27019:43:0;27080:5;26681:412;-1:-1:-1;;;;26681:412:0:o;10109:552::-;10199:7;10208;10217;10226;10235:13;10250:4;10273:39;10315:12;:27;10328:13;10315:27;;;;;;;;;;;10273:69;;10355:30;10388:11;:22;;10355:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10445:25:0;;10485:17;;;;10517:23;;;;10555:21;;;;10622:20;;;;;10445:25;;-1:-1:-1;;;;;;10485:17:0;;;;-1:-1:-1;10517:23:0;-1:-1:-1;10555:21:0;;-1:-1:-1;10355:55:0;;-1:-1:-1;;10622:20:0;;;;;-1:-1:-1;;;;10109:552:0;;;;;;;:::o;17173:722::-;4670:5;;-1:-1:-1;;;;;4670:5:0;4656:10;:19;4648:55;;;;-1:-1:-1;;;4648:55:0;;;;;;;:::i;:::-;17379:1:::1;-1:-1:-1::0;;;;;17331:50:0::1;:10;17342;17331:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:36:::1;;::::0;-1:-1:-1;;;;;17331:36:0::1;:50:::0;17323:88:::1;;;::::0;-1:-1:-1;;;17323:88:0;;22151:2:1;17323:88:0::1;::::0;::::1;22133:21:1::0;22190:2;22170:18;;;22163:30;22229:27;22209:18;;;22202:55;22274:18;;17323:88:0::1;21949:349:1::0;17323:88:0::1;17430:29;17448:10;17430:17;:29::i;:::-;17422:68;;;::::0;-1:-1:-1;;;17422:68:0;;22505:2:1;17422:68:0::1;::::0;::::1;22487:21:1::0;22544:2;22524:18;;;22517:30;22583:28;22563:18;;;22556:56;22629:18;;17422:68:0::1;22303:350:1::0;17422:68:0::1;17602:8;17585:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;17575:37;;;;;;17538:10;17549;17538:22;;;;;;:::i;:::-;;;;;;;;;;;;;:31;;17521:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;17511:60;;;;;;:101;17503:138;;;::::0;-1:-1:-1;;;17503:138:0;;23065:2:1;17503:138:0::1;::::0;::::1;23047:21:1::0;23104:2;23084:18;;;23077:30;23143:26;23123:18;;;23116:54;23187:18;;17503:138:0::1;22863:348:1::0;17503:138:0::1;17751:8;17734:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;17724:37;;;;;;17687:10;17698;17687:22;;;;;;:::i;:::-;;;;;;;;;;;;;:31;;17670:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;17660:60;;;;;;:101;17652:138;;;::::0;-1:-1:-1;;;17652:138:0;;23418:2:1;17652:138:0::1;::::0;::::1;23400:21:1::0;23457:2;23437:18;;;23430:30;23496:26;23476:18;;;23469:54;23540:18;;17652:138:0::1;23216:348:1::0;17652:138:0::1;17810:10;17821;17810:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;::::1;17803:29;17810:22:::0;;17803:29:::1;:::i;:::-;;;::::0;::::1;;;:::i;:::-;;;::::0;::::1;;;:::i;:::-;;::::0;::::1;::::0;;-1:-1:-1;;;;;;17803:29:0::1;::::0;;::::1;;::::0;::::1;;;:::i;:::-;;;;;;;;;17850:37;17867:10;17879:7;17850:37;;;;;;;:::i;:::-;;;;;;;;17173:722:::0;;;;:::o;13294:451::-;4670:5;;-1:-1:-1;;;;;4670:5:0;4656:10;:19;4648:55;;;;-1:-1:-1;;;4648:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13407:26:0;::::1;13399:67;;;::::0;-1:-1:-1;;;13399:67:0;;24159:2:1;13399:67:0::1;::::0;::::1;24141:21:1::0;24198:2;24178:18;;;24171:30;24237;24217:18;;;24210:58;24285:18;;13399:67:0::1;23957:352:1::0;13399:67:0::1;-1:-1:-1::0;;;;;13485:27:0;::::1;13477:69;;;::::0;-1:-1:-1;;;13477:69:0;;24516:2:1;13477:69:0::1;::::0;::::1;24498:21:1::0;24555:2;24535:18;;;24528:30;24594:31;24574:18;;;24567:59;24643:18;;13477:69:0::1;24314:353:1::0;13477:69:0::1;-1:-1:-1::0;;;;;13559:40:0;;::::1;;::::0;;;:26:::1;:40;::::0;;;;;;;;:56;;-1:-1:-1;;;;;;13559:56:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;13626:19:::1;:34:::0;;;;::::1;::::0;::::1;::::0;;13676:61;;24884:34:1;;;24934:18;;24927:43;;;;13676:61:0::1;::::0;24819:18:1;13676:61:0::1;;;;;;;13294:451:::0;;:::o;11754:417::-;11847:21;11870:23;11895:27;11941:39;11983:12;:27;11996:13;11983:27;;;;;;;;;;;11941:69;;12045:11;:19;;12079:11;:27;;;12121:11;:31;;;12023:140;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11754:417;;;;;:::o;7057:118::-;4670:5;;-1:-1:-1;;;;;4670:5:0;4656:10;:19;4648:55;;;;-1:-1:-1;;;4648:55:0;;;;;;;:::i;:::-;6095:7:::1;::::0;::::1;::::0;::::1;;;6094:8;6086:39;;;;-1:-1:-1::0;;;6086:39:0::1;;;;;;;:::i;:::-;7116:7:::2;:14:::0;;-1:-1:-1;;7116:14:0::2;;;::::0;;7057:118::o;14160:210::-;4670:5;;-1:-1:-1;;;;;4670:5:0;4656:10;:19;4648:55;;;;-1:-1:-1;;;4648:55:0;;;;;;;:::i;:::-;14246:6:::1;14234:8;:18;;14226:67;;;::::0;-1:-1:-1;;;14226:67:0;;25183:2:1;14226:67:0::1;::::0;::::1;25165:21:1::0;25222:2;25202:18;;;25195:30;25261:34;25241:18;;;25234:62;-1:-1:-1;;;25312:18:1;;;25305:34;25356:19;;14226:67:0::1;24981:400:1::0;14226:67:0::1;14304:7;:18:::0;;;14338:24:::1;::::0;2414:25:1;;;14338:24:0::1;::::0;2402:2:1;2387:18;14338:24:0::1;;;;;;;14160:210:::0;:::o;15542:970::-;4670:5;;-1:-1:-1;;;;;4670:5:0;4656:10;:19;4648:55;;;;-1:-1:-1;;;4648:55:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15718:27:0;::::1;15710:69;;;::::0;-1:-1:-1;;;15710:69:0;;24516:2:1;15710:69:0::1;::::0;::::1;24498:21:1::0;24555:2;24535:18;;;24528:30;24594:31;24574:18;;;24567:59;24643:18;;15710:69:0::1;24314:353:1::0;15710:69:0::1;15798:29;15816:10;15798:17;:29::i;:::-;15790:68;;;::::0;-1:-1:-1;;;15790:68:0;;22505:2:1;15790:68:0::1;::::0;::::1;22487:21:1::0;22544:2;22524:18;;;22517:30;22583:28;22563:18;;;22556:56;22629:18;;15790:68:0::1;22303:350:1::0;15790:68:0::1;15871:21;15907:14;15903:225;;;15977:33;15992:17;::::0;15990:19:::1;;;;;:::i;:::-;::::0;;;;-1:-1:-1;15977:12:0::1;:33::i;:::-;15955:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;15938:74;;15903:225;;;16084:30;16099:14;;16097:16;;;;;:::i;16084:30::-;16062:53;;;;;;;;:::i;:::-;;;;;;;;;;;;;16045:71;;15903:225;16177:16;16223:10;16235:8;16245;16255:13;16270:14;16286:7;16206:88;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16196:99;;;;;;16177:118;;16333:75;;;;;;;;16343:10;16333:75;;;;16355:8;16333:75;;;;16365:8;16333:75;;;;16375:13;-1:-1:-1::0;;;;;16333:75:0::1;;;;;16390:7;16333:75;;;;16399:8;16333:75;;::::0;16308:10:::1;16319;16308:22;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:100;;:22;;:100:::1;::::0;:22;:100:::1;:::i;:::-;-1:-1:-1::0;16308:100:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;16308:100:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;16308:100:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;;16308:100:0::1;-1:-1:-1::0;;;;;16308:100:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;;;;;;;;;;;;;16424:80;16439:10;16451:8;16461;16471:13;16486:7;16495:8;16424:80;;;;;;;;;;;:::i;:::-;;;;;;;;15699:813;;15542:970:::0;;;;;:::o;6718:156::-;5766:7;;;;5765:8;5757:42;;;;-1:-1:-1;;;5757:42:0;;28471:2:1;5757:42:0;;;28453:21:1;28510:2;28490:18;;;28483:30;-1:-1:-1;;;28529:18:1;;;28522:51;28590:18;;5757:42:0;28269:345:1;5757:42:0;6763:5:::1;:18:::0;;-1:-1:-1;;;;;;6763:18:0::1;6771:10;6763:18:::0;;::::1;::::0;;;6805:12:::1;6792:10;:25:::0;;;6833:33:::1;::::0;2414:25:1;;;6833:33:0::1;::::0;2402:2:1;2387:18;6833:33:0::1;;;;;;;5822:7:::0;:14;;-1:-1:-1;;5822:14:0;5832:4;5822:14;;;6718:156::o;27295:438::-;27366:6;;27385:302;27426:14;;27406:17;;:34;;;;:::i;:::-;27402:1;:38;27385:302;;;27462:27;27492:10;27503:15;27516:1;27503:12;:15::i;:::-;27492:27;;;;;;:::i;:::-;;;;;;;;;;;;;27462:57;;27593:7;27577:25;;;;;;27554:9;:17;;27538:35;;;;;;:::i;:::-;;;;;;;;:64;27534:142;;27630:30;27639:9;:20;;27630:30;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:8;:30::i;27534:142::-;-1:-1:-1;27442:3:0;;27385:302;;;-1:-1:-1;27697:28:0;;-1:-1:-1;;;27697:28:0;;28951:2:1;27697:28:0;;;28933:21:1;28990:2;28970:18;;;28963:30;-1:-1:-1;;;29009:18:1;;;29002:48;29067:18;;27697:28:0;28749:342:1;25377:384:0;4670:5;;-1:-1:-1;;;;;4670:5:0;4656:10;:19;4648:55;;;;-1:-1:-1;;;4648:55:0;;;;;;;:::i;:::-;25465:19:::1;::::0;-1:-1:-1;;;;;25465:19:0::1;25457:75;;;;-1:-1:-1::0;;;25457:75:0::1;;;;;;;:::i;:::-;25575:19;::::0;25614:53:::1;::::0;-1:-1:-1;;;25614:53:0;;25633:10:::1;25614:53;::::0;::::1;17929:34:1::0;25653:4:0::1;17979:18:1::0;;;17972:43;18031:18;;;18024:34;;;-1:-1:-1;;;;;25575:19:0;;::::1;::::0;;;25614:18:::1;::::0;17864::1;;25614:53:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25606:81;;;;-1:-1:-1::0;;;25606:81:0::1;;;;;;;:::i;:::-;25705:48;::::0;2414:25:1;;;25734:10:0::1;::::0;25705:48:::1;::::0;2402:2:1;2387:18;25705:48:0::1;;;;;;;25446:315;25377:384:::0;:::o;23523:1679::-;6095:7;;;;;;;6094:8;6086:39;;;;-1:-1:-1;;;6086:39:0;;;;;;;:::i;:::-;5510:6:::1;::::0;::::1;;5509:7;5501:34;;;::::0;-1:-1:-1;;;5501:34:0;;14891:2:1;5501:34:0::1;::::0;::::1;14873:21:1::0;14930:2;14910:18;;;14903:30;-1:-1:-1;;;14949:18:1;;;14942:44;15003:18;;5501:34:0::1;14689:338:1::0;5501:34:0::1;5546:6;:13:::0;;-1:-1:-1;;5546:13:0::1;5555:4;5546:13;::::0;;:6:::1;23647:27:::0;;;:12:::2;:27;::::0;;;;23695:20:::2;::::0;::::2;::::0;5546:13:::1;23695:20:::2;23687:58;;;::::0;-1:-1:-1;;;23687:58:0;;29298:2:1;23687:58:0::2;::::0;::::2;29280:21:1::0;29337:2;29317:18;;;29310:30;29376:27;29356:18;;;29349:55;29421:18;;23687:58:0::2;29096:349:1::0;23687:58:0::2;23764:17;::::0;::::2;::::0;-1:-1:-1;;;;;23764:17:0::2;23785:10;23764:31;23756:85;;;::::0;-1:-1:-1;;;23756:85:0;;29652:2:1;23756:85:0::2;::::0;::::2;29634:21:1::0;29691:2;29671:18;;;29664:30;29730:34;29710:18;;;29703:62;-1:-1:-1;;;29781:18:1;;;29774:39;29830:19;;23756:85:0::2;29450:405:1::0;23756:85:0::2;23910:9;;23876:11;:31;;;:43;;;;:::i;:::-;23860:12;:59;;23852:97;;;::::0;-1:-1:-1;;;23852:97:0;;30062:2:1;23852:97:0::2;::::0;::::2;30044:21:1::0;30101:2;30081:18;;;30074:30;30140:27;30120:18;;;30113:55;30185:18;;23852:97:0::2;29860:349:1::0;23852:97:0::2;23962:28;23993:32;24002:11;:22;;23993:32;;;;;:::i;:::-;23962:63;;24036:20;24092:11;:27;;;24067:21;24059:60;;;;:::i;:::-;24036:83;;24130:21;24192:11;:27;;;24162:11;:26;;;24154:65;;;;:::i;:::-;24130:89:::0;-1:-1:-1;24254:12:0;24232:19:::2;24321:28:::0;;::::2;24362:298:::0;::::2;;;24391:14;24408:28;24423:13:::0;24408:12;:28:::2;:::i;:::-;24391:45;;24451:11;24484:7;24474;;24465:6;:16;;;;:::i;:::-;:26;;;;:::i;:::-;24451:40:::0;-1:-1:-1;24518:12:0::2;24451:40:::0;24518:6;:12:::2;:::i;:::-;24506:24;;24376:166;;24362:298;;;24575:12;24563:24;;24362:298;24694:19;::::0;24733:30:::2;::::0;-1:-1:-1;;;24733:30:0;;24757:4:::2;24733:30;::::0;::::2;2596:51:1::0;-1:-1:-1;;;;;24694:19:0;;::::2;::::0;24767:9;;24694:19;;24733:15:::2;::::0;2569:18:1;;24733:30:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;24725:85;;;::::0;-1:-1:-1;;;24725:85:0;;30549:2:1;24725:85:0::2;::::0;::::2;30531:21:1::0;30588:2;30568:18;;;30561:30;30627:31;30607:18;;;30600:59;30676:18;;24725:85:0::2;30347:353:1::0;24725:85:0::2;24829:37;::::0;-1:-1:-1;;;24829:37:0;;24844:10:::2;24829:37;::::0;::::2;13990:51:1::0;14057:18;;;14050:34;;;-1:-1:-1;;;;;24829:14:0;::::2;::::0;::::2;::::0;13963:18:1;;24829:37:0::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24821:65;;;;-1:-1:-1::0;;;24821:65:0::2;;;;;;;:::i;:::-;24899:20;::::0;::::2;:28:::0;;-1:-1:-1;;24899:28:0::2;::::0;;25026:27:::2;::::0;::::2;::::0;24945:249:::2;::::0;;31042:25:1;;;25001:10:0::2;31098:2:1::0;31083:18;;31076:60;31152:18;;;31145:34;;;;31210:2;31195:18;;31188:34;;;31253:3;31238:19;;31231:35;;;25118:12:0::2;31123:3:1::0;31282:19;;31275:35;25145:15:0::2;31341:3:1::0;31326:19;;31319:35;31398:14;;31391:22;31385:3;31370:19;;31363:51;24945:249:0;::::2;::::0;;;;31029:3:1;24945:249:0;;::::2;-1:-1:-1::0;;5582:6:0::1;:14:::0;;-1:-1:-1;;5582:14:0::1;::::0;;-1:-1:-1;;;;;;;23523:1679:0:o;10974:397::-;11053:21;11076:22;11100:24;11143:39;11185:12;:27;11198:13;11185:27;;;;;;;;;;;11143:69;;11247:11;:26;;;11288:11;:27;;;11330:11;:22;;11225:138;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10974:397;;;;;:::o;12301:101::-;12349:13;12382:12;12375:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12301:101;:::o;27952:490::-;28023:4;28073:6;28023:4;;28127:278;28147:11;:18;28143:1;:22;28127:278;;;28190:11;28202:1;28190:14;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;28190:14:0;-1:-1:-1;;;28190:21:0;28187:207;;28235:10;:20;;;-1:-1:-1;28249:6:0;;28235:20;:51;;;;28285:1;28264:11;:18;:22;;;;:::i;:::-;28259:1;:27;28235:51;28232:111;;;-1:-1:-1;28318:5:0;;27952:490;-1:-1:-1;;;;27952:490:0:o;28232:111::-;28374:4;28361:17;;28187:207;28167:3;;28127:278;;;-1:-1:-1;28424:10:0;27952:490;-1:-1:-1;;;27952:490:0:o;28649:559::-;28701:17;28735:1;28740;28735:6;28731:49;;-1:-1:-1;;28758:10:0;;;;;;;;;;;;-1:-1:-1;;;28758:10:0;;;;;28649:559::o;28731:49::-;28799:1;28790:6;28830:69;28837:6;;28830:69;;28860:5;;;;:::i;:::-;;-1:-1:-1;28880:7:0;;-1:-1:-1;28885:2:0;28880:7;;:::i;:::-;;;28830:69;;;28909:17;28939:3;28929:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28929:14:0;-1:-1:-1;28909:34:0;-1:-1:-1;28963:3:0;28977:194;28984:6;;28977:194;;29011:3;29013:1;29011;:3;:::i;:::-;29007:7;-1:-1:-1;29029:10:0;29058:6;29062:2;29058:1;:6;:::i;:::-;:11;;29067:2;29058:11;:::i;:::-;29054:15;;:1;:15;:::i;:::-;29043:27;;:2;:27;:::i;:::-;29029:42;;29086:9;29105:4;29098:12;;29086:24;;29135:2;29125:4;29130:1;29125:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;29125:12:0;;;;;;;;-1:-1:-1;29152:7:0;29157:2;29152:7;;:::i;:::-;;;28992:179;;28977:194;;;-1:-1:-1;29195:4:0;28649:559;-1:-1:-1;;;;28649:559:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;14:592:1:-;85:6;93;146:2;134:9;125:7;121:23;117:32;114:52;;;162:1;159;152:12;114:52;202:9;189:23;231:18;272:2;264:6;261:14;258:34;;;288:1;285;278:12;258:34;326:6;315:9;311:22;301:32;;371:7;364:4;360:2;356:13;352:27;342:55;;393:1;390;383:12;342:55;433:2;420:16;459:2;451:6;448:14;445:34;;;475:1;472;465:12;445:34;520:7;515:2;506:6;502:2;498:15;494:24;491:37;488:57;;;541:1;538;531:12;488:57;572:2;564:11;;;;;594:6;;-1:-1:-1;14:592:1;;-1:-1:-1;;;;14:592:1:o;611:180::-;670:6;723:2;711:9;702:7;698:23;694:32;691:52;;;739:1;736;729:12;691:52;-1:-1:-1;762:23:1;;611:180;-1:-1:-1;611:180:1:o;796:127::-;857:10;852:3;848:20;845:1;838:31;888:4;885:1;878:15;912:4;909:1;902:15;928:719;971:5;1024:3;1017:4;1009:6;1005:17;1001:27;991:55;;1042:1;1039;1032:12;991:55;1078:6;1065:20;1104:18;1141:2;1137;1134:10;1131:36;;;1147:18;;:::i;:::-;1222:2;1216:9;1190:2;1276:13;;-1:-1:-1;;1272:22:1;;;1296:2;1268:31;1264:40;1252:53;;;1320:18;;;1340:22;;;1317:46;1314:72;;;1366:18;;:::i;:::-;1406:10;1402:2;1395:22;1441:2;1433:6;1426:18;1487:3;1480:4;1475:2;1467:6;1463:15;1459:26;1456:35;1453:55;;;1504:1;1501;1494:12;1453:55;1568:2;1561:4;1553:6;1549:17;1542:4;1534:6;1530:17;1517:54;1615:1;1608:4;1603:2;1595:6;1591:15;1587:26;1580:37;1635:6;1626:15;;;;;;928:719;;;;:::o;1652:611::-;1749:6;1757;1765;1818:2;1806:9;1797:7;1793:23;1789:32;1786:52;;;1834:1;1831;1824:12;1786:52;1874:9;1861:23;1903:18;1944:2;1936:6;1933:14;1930:34;;;1960:1;1957;1950:12;1930:34;1983:50;2025:7;2016:6;2005:9;2001:22;1983:50;:::i;:::-;1973:60;;2086:2;2075:9;2071:18;2058:32;2042:48;;2115:2;2105:8;2102:16;2099:36;;;2131:1;2128;2121:12;2099:36;;2154:52;2198:7;2187:8;2176:9;2172:24;2154:52;:::i;:::-;2144:62;;;2253:2;2242:9;2238:18;2225:32;2215:42;;1652:611;;;;;:::o;2658:322::-;2727:6;2780:2;2768:9;2759:7;2755:23;2751:32;2748:52;;;2796:1;2793;2786:12;2748:52;2836:9;2823:23;2869:18;2861:6;2858:30;2855:50;;;2901:1;2898;2891:12;2855:50;2924;2966:7;2957:6;2946:9;2942:22;2924:50;:::i;3165:250::-;3250:1;3260:113;3274:6;3271:1;3268:13;3260:113;;;3350:11;;;3344:18;3331:11;;;3324:39;3296:2;3289:10;3260:113;;;-1:-1:-1;;3407:1:1;3389:16;;3382:27;3165:250::o;3420:271::-;3462:3;3500:5;3494:12;3527:6;3522:3;3515:19;3543:76;3612:6;3605:4;3600:3;3596:14;3589:4;3582:5;3578:16;3543:76;:::i;:::-;3673:2;3652:15;-1:-1:-1;;3648:29:1;3639:39;;;;3680:4;3635:50;;3420:271;-1:-1:-1;;3420:271:1:o;3696:615::-;3979:6;3968:9;3961:25;4051:1;4047;4042:3;4038:11;4034:19;4026:6;4022:32;4017:2;4006:9;4002:18;3995:60;4091:6;4086:2;4075:9;4071:18;4064:34;4134:6;4129:2;4118:9;4114:18;4107:34;4178:3;4172;4161:9;4157:19;4150:32;3942:4;4199:46;4240:3;4229:9;4225:19;4217:6;4199:46;:::i;:::-;4191:54;;4296:6;4289:14;4282:22;4276:3;4265:9;4261:19;4254:51;3696:615;;;;;;;;;:::o;4316:944::-;4442:6;4450;4458;4466;4519:3;4507:9;4498:7;4494:23;4490:33;4487:53;;;4536:1;4533;4526:12;4487:53;4576:9;4563:23;4605:18;4646:2;4638:6;4635:14;4632:34;;;4662:1;4659;4652:12;4632:34;4685:50;4727:7;4718:6;4707:9;4703:22;4685:50;:::i;:::-;4675:60;;4788:2;4777:9;4773:18;4760:32;4744:48;;4817:2;4807:8;4804:16;4801:36;;;4833:1;4830;4823:12;4801:36;4856:52;4900:7;4889:8;4878:9;4874:24;4856:52;:::i;:::-;4846:62;;4961:2;4950:9;4946:18;4933:32;4917:48;;4990:2;4980:8;4977:16;4974:36;;;5006:1;5003;4996:12;4974:36;5029:52;5073:7;5062:8;5051:9;5047:24;5029:52;:::i;:::-;5019:62;;5134:2;5123:9;5119:18;5106:32;5090:48;;5163:2;5153:8;5150:16;5147:36;;;5179:1;5176;5169:12;5147:36;;5202:52;5246:7;5235:8;5224:9;5220:24;5202:52;:::i;:::-;5192:62;;;4316:944;;;;;;;:::o;5265:173::-;5333:20;;-1:-1:-1;;;;;5382:31:1;;5372:42;;5362:70;;5428:1;5425;5418:12;5362:70;5265:173;;;:::o;5443:260::-;5511:6;5519;5572:2;5560:9;5551:7;5547:23;5543:32;5540:52;;;5588:1;5585;5578:12;5540:52;5611:29;5630:9;5611:29;:::i;:::-;5601:39;;5659:38;5693:2;5682:9;5678:18;5659:38;:::i;:::-;5649:48;;5443:260;;;;;:::o;5708:362::-;5913:2;5902:9;5895:21;5876:4;5933:45;5974:2;5963:9;5959:18;5951:6;5933:45;:::i;:::-;6009:2;5994:18;;5987:34;;;;-1:-1:-1;6052:2:1;6037:18;6030:34;5925:53;5708:362;-1:-1:-1;5708:362:1:o;6075:118::-;6161:5;6154:13;6147:21;6140:5;6137:32;6127:60;;6183:1;6180;6173:12;6198:948;6320:6;6328;6336;6344;6352;6405:3;6393:9;6384:7;6380:23;6376:33;6373:53;;;6422:1;6419;6412:12;6373:53;6462:9;6449:23;6491:18;6532:2;6524:6;6521:14;6518:34;;;6548:1;6545;6538:12;6518:34;6571:50;6613:7;6604:6;6593:9;6589:22;6571:50;:::i;:::-;6561:60;;6674:2;6663:9;6659:18;6646:32;6630:48;;6703:2;6693:8;6690:16;6687:36;;;6719:1;6716;6709:12;6687:36;6742:52;6786:7;6775:8;6764:9;6760:24;6742:52;:::i;:::-;6732:62;;6847:2;6836:9;6832:18;6819:32;6803:48;;6876:2;6866:8;6863:16;6860:36;;;6892:1;6889;6882:12;6860:36;;6915:52;6959:7;6948:8;6937:9;6933:24;6915:52;:::i;:::-;6905:62;;;6986:38;7020:2;7009:9;7005:18;6986:38;:::i;:::-;6976:48;;7074:3;7063:9;7059:19;7046:33;7088:28;7110:5;7088:28;:::i;:::-;7135:5;7125:15;;;6198:948;;;;;;;;:::o;7343:186::-;7402:6;7455:2;7443:9;7434:7;7430:23;7426:32;7423:52;;;7471:1;7468;7461:12;7423:52;7494:29;7513:9;7494:29;:::i;:::-;7484:39;7343:186;-1:-1:-1;;;7343:186:1:o;7534:358::-;7735:6;7724:9;7717:25;7778:6;7773:2;7762:9;7758:18;7751:34;7821:2;7816;7805:9;7801:18;7794:30;7698:4;7841:45;7882:2;7871:9;7867:18;7859:6;7841:45;:::i;:::-;7833:53;7534:358;-1:-1:-1;;;;;7534:358:1:o;7897:220::-;8046:2;8035:9;8028:21;8009:4;8066:45;8107:2;8096:9;8092:18;8084:6;8066:45;:::i;8122:347::-;8324:2;8306:21;;;8363:2;8343:18;;;8336:30;8402:25;8397:2;8382:18;;8375:53;8460:2;8445:18;;8122:347::o;8474:342::-;8676:2;8658:21;;;8715:2;8695:18;;;8688:30;-1:-1:-1;;;8749:2:1;8734:18;;8727:48;8807:2;8792:18;;8474:342::o;8821:380::-;8900:1;8896:12;;;;8943;;;8964:61;;9018:4;9010:6;9006:17;8996:27;;8964:61;9071:2;9063:6;9060:14;9040:18;9037:38;9034:161;;9117:10;9112:3;9108:20;9105:1;9098:31;9152:4;9149:1;9142:15;9180:4;9177:1;9170:15;9034:161;;8821:380;;;:::o;9335:726::-;9388:3;9429:5;9423:12;9458:36;9484:9;9458:36;:::i;:::-;9513:1;9530:17;;;9556:133;;;;9703:1;9698:357;;;;9523:532;;9556:133;-1:-1:-1;;9589:24:1;;9577:37;;9662:14;;9655:22;9643:35;;9634:45;;;-1:-1:-1;9556:133:1;;9698:357;9729:5;9726:1;9719:16;9758:4;9803;9800:1;9790:18;9830:1;9844:165;9858:6;9855:1;9852:13;9844:165;;;9936:14;;9923:11;;;9916:35;9979:16;;;;9873:10;;9844:165;;;9848:3;;;10038:6;10033:3;10029:16;10022:23;;9523:532;;;;;9335:726;;;;:::o;10066:202::-;10196:3;10221:41;10258:3;10250:6;10221:41;:::i;10273:271::-;10456:6;10448;10443:3;10430:33;10412:3;10482:16;;10507:13;;;10482:16;10273:271;-1:-1:-1;10273:271:1:o;10966:518::-;11068:2;11063:3;11060:11;11057:421;;;11104:5;11101:1;11094:16;11148:4;11145:1;11135:18;11218:2;11206:10;11202:19;11199:1;11195:27;11189:4;11185:38;11254:4;11242:10;11239:20;11236:47;;;-1:-1:-1;11277:4:1;11236:47;11332:2;11327:3;11323:12;11320:1;11316:20;11310:4;11306:31;11296:41;;11387:81;11405:2;11398:5;11395:13;11387:81;;;11464:1;11450:16;;11431:1;11420:13;11387:81;;;11391:3;;10966:518;;;:::o;11660:1201::-;11784:18;11779:3;11776:27;11773:53;;;11806:18;;:::i;:::-;11835:94;11925:3;11885:38;11917:4;11911:11;11885:38;:::i;:::-;11879:4;11835:94;:::i;:::-;11955:1;11980:2;11975:3;11972:11;11997:1;11992:611;;;;12647:1;12664:3;12661:93;;;-1:-1:-1;12720:19:1;;;12707:33;12661:93;-1:-1:-1;;11617:1:1;11613:11;;;11609:24;11605:29;11595:40;11641:1;11637:11;;;11592:57;12767:78;;11965:890;;11992:611;9282:1;9275:14;;;9319:4;9306:18;;-1:-1:-1;;12028:17:1;;;12146:229;12160:7;12157:1;12154:14;12146:229;;;12249:19;;;12236:33;12221:49;;12356:4;12341:20;;;;12309:1;12297:14;;;;12176:12;12146:229;;;12150:3;12403;12394:7;12391:16;12388:159;;;12527:1;12523:6;12517:3;12511;12508:1;12504:11;12500:21;12496:34;12492:39;12479:9;12474:3;12470:19;12457:33;12453:79;12445:6;12438:95;12388:159;;;12590:1;12584:3;12581:1;12577:11;12573:19;12567:4;12560:33;11965:890;;11660:1201;;;:::o;12866:353::-;13068:2;13050:21;;;13107:2;13087:18;;;13080:30;13146:31;13141:2;13126:18;;13119:59;13210:2;13195:18;;12866:353::o;13224:184::-;13294:6;13347:2;13335:9;13326:7;13322:23;13318:32;13315:52;;;13363:1;13360;13353:12;13315:52;-1:-1:-1;13386:16:1;;13224:184;-1:-1:-1;13224:184:1:o;14095:245::-;14162:6;14215:2;14203:9;14194:7;14190:23;14186:32;14183:52;;;14231:1;14228;14221:12;14183:52;14263:9;14257:16;14282:28;14304:5;14282:28;:::i;14345:339::-;14547:2;14529:21;;;14586:2;14566:18;;;14559:30;-1:-1:-1;;;14620:2:1;14605:18;;14598:45;14675:2;14660:18;;14345:339::o;16397:127::-;16458:10;16453:3;16449:20;16446:1;16439:31;16489:4;16486:1;16479:15;16513:4;16510:1;16503:15;16529:168;16602:9;;;16633;;16650:15;;;16644:22;;16630:37;16620:71;;16671:18;;:::i;:::-;16529:168;;;;:::o;16702:217::-;16742:1;16768;16758:132;;16812:10;16807:3;16803:20;16800:1;16793:31;16847:4;16844:1;16837:15;16875:4;16872:1;16865:15;16758:132;-1:-1:-1;16904:9:1;;16702:217::o;18419:135::-;18458:3;18479:17;;;18476:43;;18499:18;;:::i;:::-;-1:-1:-1;18546:1:1;18535:13;;18419:135::o;18559:1348::-;18685:3;18679:10;18712:18;18704:6;18701:30;18698:56;;;18734:18;;:::i;:::-;18763:97;18853:6;18813:38;18845:4;18839:11;18813:38;:::i;:::-;18807:4;18763:97;:::i;:::-;18915:4;;18972:2;18961:14;;18989:1;18984:666;;;;19694:1;19711:6;19708:89;;;-1:-1:-1;19763:19:1;;;19757:26;19708:89;-1:-1:-1;;11617:1:1;11613:11;;;11609:24;11605:29;11595:40;11641:1;11637:11;;;11592:57;19810:81;;18954:947;;18984:666;9282:1;9275:14;;;9319:4;9306:18;;-1:-1:-1;;19020:20:1;;;19141:236;19155:7;19152:1;19149:14;19141:236;;;19244:19;;;19238:26;19223:42;;19336:27;;;;19304:1;19292:14;;;;19171:19;;19141:236;;;19145:3;19405:6;19396:7;19393:19;19390:201;;;19466:19;;;19460:26;-1:-1:-1;;19549:1:1;19545:14;;;19561:3;19541:24;19537:37;19533:42;19518:58;19503:74;;19390:201;;;19637:1;19628:6;19625:1;19621:14;19617:22;19611:4;19604:36;18954:947;;;;;18559:1348;;:::o;19912:681::-;20215:3;20204:9;20197:22;20178:4;20242:46;20283:3;20272:9;20268:19;20260:6;20242:46;:::i;:::-;20336:9;20328:6;20324:22;20319:2;20308:9;20304:18;20297:50;20364:33;20390:6;20382;20364:33;:::i;:::-;20356:41;;;20433:6;20428:2;20417:9;20413:18;20406:34;20476:6;20471:2;20460:9;20456:18;20449:34;20520:6;20514:3;20503:9;20499:19;20492:35;20578:6;20571:14;20564:22;20558:3;20547:9;20543:19;20536:51;19912:681;;;;;;;;;:::o;20949:289::-;21080:3;21118:6;21112:13;21134:66;21193:6;21188:3;21181:4;21173:6;21169:17;21134:66;:::i;:::-;21216:16;;;;;20949:289;-1:-1:-1;;20949:289:1:o;23569:383::-;23766:2;23755:9;23748:21;23729:4;23792:45;23833:2;23822:9;23818:18;23810:6;23792:45;:::i;:::-;23885:9;23877:6;23873:22;23868:2;23857:9;23853:18;23846:50;23913:33;23939:6;23931;23913:33;:::i;25386:431::-;-1:-1:-1;;;25643:3:1;25636:16;25618:3;25681:6;25675:13;25697:74;25764:6;25760:1;25755:3;25751:11;25744:4;25736:6;25732:17;25697:74;:::i;:::-;25791:16;;;;25809:1;25787:24;;25386:431;-1:-1:-1;;25386:431:1:o;25822:::-;-1:-1:-1;;;26079:3:1;26072:16;26054:3;26117:6;26111:13;26133:74;26200:6;26196:1;26191:3;26187:11;26180:4;26172:6;26168:17;26133:74;:::i;26258:1120::-;26583:3;26621:6;26615:13;26637:66;26696:6;26691:3;26684:4;26676:6;26672:17;26637:66;:::i;:::-;26766:13;;26725:16;;;;26788:70;26766:13;26725:16;26835:4;26823:17;;26788:70;:::i;:::-;26925:13;;26880:20;;;26947:70;26925:13;26880:20;26994:4;26982:17;;26947:70;:::i;:::-;27090:2;27086:15;;;-1:-1:-1;;27082:53:1;27039:20;;27068:68;;;27184:14;;27177:22;27172:3;27168:32;27163:2;27152:14;;27145:56;27226:13;;27248:79;27226:13;27313:2;27302:14;;27295:4;27283:17;;27248:79;:::i;:::-;27347:20;27369:2;27343:29;;26258:1120;-1:-1:-1;;;;;;;;26258:1120:1:o;27383:881::-;27732:3;27721:9;27714:22;27695:4;27759:46;27800:3;27789:9;27785:19;27777:6;27759:46;:::i;:::-;27853:9;27845:6;27841:22;27836:2;27825:9;27821:18;27814:50;27887:33;27913:6;27905;27887:33;:::i;:::-;27873:47;;27968:9;27960:6;27956:22;27951:2;27940:9;27936:18;27929:50;28002:33;28028:6;28020;28002:33;:::i;:::-;-1:-1:-1;;;;;28071:32:1;;28066:2;28051:18;;28044:60;28141:22;;;28135:3;28120:19;;28113:51;27988:47;-1:-1:-1;28181:33:1;27988:47;28199:6;28181:33;:::i;:::-;28173:41;;;28251:6;28245:3;28234:9;28230:19;28223:35;27383:881;;;;;;;;;:::o;28619:125::-;28684:9;;;28705:10;;;28702:36;;;28718:18;;:::i;30214:128::-;30281:9;;;30302:11;;;30299:37;;;30316:18;;:::i;31425:127::-;31486:10;31481:3;31477:20;31474:1;31467:31;31517:4;31514:1;31507:15;31541:4;31538:1;31531:15;31557:148;31645:4;31624:12;;;31638;;;31620:31;;31663:13;;31660:39;;;31679:18;;:::i
Swarm Source
ipfs://25b29a9bb1a2961038620ab46e33832c9fe74b2b94cf02493616ebc00e52a7e2
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.