FRAX Price: $0.88 (-12.99%)

Contract

0xD8f76Ec7754970149F3cad19B934630Ea04D2871

Overview

FRAX Balance | FXTL Balance

0 FRAX | 0 FXTL

FRAX Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Set Contract Nam...11614772024-02-28 15:21:05696 days ago1709133665IN
0xD8f76Ec7...Ea04D2871
0 FRAX0.000262241.50000025
Setup11614352024-02-28 15:19:41696 days ago1709133581IN
0xD8f76Ec7...Ea04D2871
0 FRAX0.000214661.50000025

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PricePairMarket

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

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

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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.