ETH Price: $1,910.92 (-5.82%)

Contract

0xfD4cB1294dF23920e683e046963117cAe6C807D9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim User Aucti...221438082025-03-28 7:05:352 hrs ago1743145535IN
0xfD4cB129...Ae6C807D9
0 ETH0.000125481.14110519
Enter Auction X2...221432212025-03-28 5:07:594 hrs ago1743138479IN
0xfD4cB129...Ae6C807D9
0 ETH0.000123870.8
Manual Daily Upd...221432172025-03-28 5:07:114 hrs ago1743138431IN
0xfD4cB129...Ae6C807D9
0 ETH0.000070710.72247873
Claim User Aucti...221374332025-03-27 9:44:3523 hrs ago1743068675IN
0xfD4cB129...Ae6C807D9
0 ETH0.000052420.94182614
Claim User Aucti...221370162025-03-27 8:20:5925 hrs ago1743063659IN
0xfD4cB129...Ae6C807D9
0 ETH0.000068790.91222714
Enter Auction X2...221369102025-03-27 7:59:4725 hrs ago1743062387IN
0xfD4cB129...Ae6C807D9
0 ETH0.000121440.88159485
Enter Auction X2...221363012025-03-27 5:57:3527 hrs ago1743055055IN
0xfD4cB129...Ae6C807D9
0 ETH0.000053350.44221235
Enter Auction X2...221362792025-03-27 5:53:1127 hrs ago1743054791IN
0xfD4cB129...Ae6C807D9
0 ETH0.000056090.46497055
Approve221361862025-03-27 5:34:3528 hrs ago1743053675IN
0xfD4cB129...Ae6C807D9
0 ETH0.000020810.44037077
Claim User Aucti...221361742025-03-27 5:32:1128 hrs ago1743053531IN
0xfD4cB129...Ae6C807D9
0 ETH0.000030470.46500258
Enter Auction X2...221361572025-03-27 5:28:3528 hrs ago1743053315IN
0xfD4cB129...Ae6C807D9
0 ETH0.000063870.46370592
Enter Auction X2...221360912025-03-27 5:15:1128 hrs ago1743052511IN
0xfD4cB129...Ae6C807D9
0 ETH0.000051420.42619246
Enter Auction X2...221360792025-03-27 5:12:4728 hrs ago1743052367IN
0xfD4cB129...Ae6C807D9
0 ETH0.000057560.41790741
Claim User Aucti...221360652025-03-27 5:09:5928 hrs ago1743052199IN
0xfD4cB129...Ae6C807D9
0 ETH0.000062670.4
Claim User Aucti...221360582025-03-27 5:08:2328 hrs ago1743052103IN
0xfD4cB129...Ae6C807D9
0 ETH0.00002910.4
Enter Auction X2...221360552025-03-27 5:07:4728 hrs ago1743052067IN
0xfD4cB129...Ae6C807D9
0 ETH0.000110990.5
Enter Auction X2...221348182025-03-27 0:58:5932 hrs ago1743037139IN
0xfD4cB129...Ae6C807D9
0 ETH0.000141161.02480376
Enter Auction X2...221344612025-03-26 23:46:5933 hrs ago1743032819IN
0xfD4cB129...Ae6C807D9
0 ETH0.000118660.86148563
Enter Auction X2...221335882025-03-26 20:51:2336 hrs ago1743022283IN
0xfD4cB129...Ae6C807D9
0 ETH0.000117450.86519531
Enter Auction X2...221302252025-03-26 9:37:112 days ago1742981831IN
0xfD4cB129...Ae6C807D9
0 ETH0.000067240.48816748
Claim User Aucti...221299902025-03-26 8:50:112 days ago1742979011IN
0xfD4cB129...Ae6C807D9
0 ETH0.000052640.9457292
Enter Auction X2...221289962025-03-26 5:30:352 days ago1742967035IN
0xfD4cB129...Ae6C807D9
0 ETH0.000055090.4
Claim User Aucti...221288822025-03-26 5:07:472 days ago1742965667IN
0xfD4cB129...Ae6C807D9
0 ETH0.00002910.4
Enter Auction X2...221288802025-03-26 5:07:232 days ago1742965643IN
0xfD4cB129...Ae6C807D9
0 ETH0.000087990.4
Enter Auction X2...221275702025-03-26 0:43:592 days ago1742949839IN
0xfD4cB129...Ae6C807D9
0 ETH0.000055090.4
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Shogun

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 20 : Shogun.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.21;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/interfaces/IERC165.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

import "../interfaces/ITITANX.sol";
import "../interfaces/ITitanBurn.sol";
import "../interfaces/ITitanOnBurn.sol";
import "../interfaces/IShogunOnBurn.sol";
import "../interfaces/IShogun.sol";
import "../interfaces/IX28.sol";

import "./GlobalInfo.sol";
import "./BurnInfo.sol";

//custom errors
error Shogun_NotSupportedContract();
error Shogun_NotAllowed();
error Shogun_InvalidBurnRewardPercent();
error Shogun_LPTokensHasMinted();
error Shogun_InvalidAddress();
error Shogun_UnregisteredCA();
error Shogun_NoSupplyToClaim();
error Shogun_NoAllowance();
error Shogun_NotEnoughBalance();
error Shogun_BurnStakeClosed();
error Shogun_CannotZero();

/** @title Shogun */
contract Shogun is ERC20, ReentrancyGuard, GlobalInfo, BurnInfo, Ownable, ITitanOnBurn {
    /** Storage Variables*/
    /** @dev stores genesis wallet address */
    address private s_genesisAddress;

    /** @dev stores LP wallet address */
    address private s_lPAddress;

    /** @dev stores buy and burn contract address */
    address private s_buyAndBurnAddress;

    /** @dev tracks total amount of X28 deposited */
    uint256 s_totalX28Deposited;

    /** @dev tracks total amount of X28 burned */
    uint256 s_totalX28Burned;

    /** @dev tracks total amount of TitanX deposited */
    uint256 s_totalTitanXDeposited;

    /** @dev tracks total amount of TitanX burned */
    uint256 s_totalTitanXBurned;

    /** @dev tracks total amount of Shogun burned from tax */
    uint256 s_totalShogunTaxBurned;

    /** @dev Tracks Shogun buy and burn contract addresses status
     * Specifically used for burning Shogun in registered CA */
    mapping(address => bool) s_buyAndBurnAddressRegistry;

    /** @dev track addresses to exclude from transfer tax */
    mapping(address => bool) private s_taxExclusionList;

    /** @dev tracks if initial LP tokens has minted or not */
    bool private s_initialLPMinted;

    event AuctionEntered(address indexed user, uint256 indexed day, uint256 indexed amount);
    event AuctionSupplyClaimed(address indexed user, uint256 indexed amount);

    constructor(
        address genesisAddress,
        address lPAddress,
        address buyAndBurnAddress
    ) Ownable(msg.sender) ERC20("SHOGUN", "SHOGUN") {
        if (genesisAddress == address(0)) revert Shogun_InvalidAddress();
        if (lPAddress == address(0)) revert Shogun_InvalidAddress();
        if (buyAndBurnAddress == address(0)) revert Shogun_InvalidAddress();
        s_genesisAddress = genesisAddress;
        s_lPAddress = lPAddress;
        s_buyAndBurnAddress = buyAndBurnAddress;
        s_buyAndBurnAddressRegistry[buyAndBurnAddress] = true;
        s_taxExclusionList[buyAndBurnAddress] = true;
        s_taxExclusionList[lPAddress] = true;
        s_taxExclusionList[address(0)] = true;
        _mint(s_lPAddress, LP_WALLET_TOKENS);
    }

    /** @notice add given address to be excluded from transfer tax. Only callable by owner address.
     * @param addr address
     */
    function addTaxExclusionAddress(address addr) external onlyOwner {
        if (addr == address(0)) revert Shogun_InvalidAddress();
        s_taxExclusionList[addr] = true;
    }

    /** @notice remove given address to be excluded from transfer tax. Only callable by owner address.
     * @param addr address
     */
    function removeTaxExclusionAddress(address addr) external onlyOwner {
        if (addr == address(0)) revert Shogun_InvalidAddress();
        s_taxExclusionList[addr] = false;
    }

    /** @notice Set BuyAndBurn Contract Address.
     * Only owner can call this function
     * @param contractAddress BuyAndBurn contract address
     */
    function setBuyAndBurnContractAddress(address contractAddress) external onlyOwner {
        /* Only able to change to supported buyandburn contract address.
         * Also prevents owner from registering EOA address into s_buyAndBurnAddressRegistry and call burnCAShogun to burn user's tokens.
         */
        if (
            !IERC165(contractAddress).supportsInterface(IERC165.supportsInterface.selector) ||
            !IERC165(contractAddress).supportsInterface(type(IShogun).interfaceId)
        ) revert Shogun_NotSupportedContract();
        s_buyAndBurnAddress = contractAddress;
        s_buyAndBurnAddressRegistry[contractAddress] = true;
        s_taxExclusionList[contractAddress] = true;
    }

    /** @notice Set to new genesis wallet. Only genesis wallet can call this function
     * @param newAddress new genesis wallet address
     */
    function setNewGenesisAddress(address newAddress) external {
        if (msg.sender != s_genesisAddress) revert Shogun_NotAllowed();
        if (newAddress == address(0)) revert Shogun_InvalidAddress();
        s_genesisAddress = newAddress;
    }

    /** @notice Set to new LP wallet. Only LP wallet can call this function
     * @param newAddress new LP wallet address
     */
    function setNewLPAddress(address newAddress) external {
        if (msg.sender != s_lPAddress) revert Shogun_NotAllowed();
        if (newAddress == address(0)) revert Shogun_InvalidAddress();
        s_lPAddress = newAddress;
        s_taxExclusionList[newAddress] = true;
    }

    /** @notice mint initial LP tokens. Only BuyAndBurn contract set by owner can call this function
     */
    function mintLPTokens() external {
        if (msg.sender != s_buyAndBurnAddress) revert Shogun_NotAllowed();
        if (s_initialLPMinted) revert Shogun_LPTokensHasMinted();
        s_initialLPMinted = true;
        _mint(s_buyAndBurnAddress, INITAL_LP_TOKENS);
    }

    /** @notice burn Shogun in BuyAndBurn contract.
     * Only burns registered contract address
     * % to LP wallet, % to War Chest supply (stored in variable), burn all tokens except LP tokens
     */
    function burnCAShogun(address contractAddress) external dailyUpdate(s_buyAndBurnAddress) {
        if (!s_buyAndBurnAddressRegistry[contractAddress]) revert Shogun_UnregisteredCA();

        uint256 totalAmount = balanceOf(contractAddress);
        uint256 lPAmount = (totalAmount * SHOGUN_LP_PERCENT) / PERCENT_BPS;
        uint256 warChestAmount = (totalAmount * SHOGUN_WARCHEST_PERCENT) / PERCENT_BPS;
        super._update(contractAddress, address(0), totalAmount - lPAmount); //burn including war chest supply
        super._update(contractAddress, s_lPAddress, lPAmount); //LP supply
        _AddWarChestSupply(warChestAmount);
    }

    /** @notice enter auction using liquid X28
     * % burned, % to LP address, % to genesis address, % to B&B contract
     * @param amount TitanX amount
     */
    function enterAuctionX28Liquid(
        uint256 amount
    ) external dailyUpdate(s_buyAndBurnAddress) nonReentrant {
        if (amount == 0) revert Shogun_CannotZero();

        //transfer burn amount to X28 BNB, call public burnCAX28() to burn X28
        uint256 burnAmount = (amount * BURN_PERCENT) / PERCENT_BPS;
        IX28(X28).transferFrom(msg.sender, X28_BNB, burnAmount);
        IX28(X28).burnCAX28(X28_BNB);

        //transfer LP amount to LP address
        uint256 lPAmount = (amount * LP_PERCENT) / PERCENT_BPS;
        IX28(X28).transferFrom(msg.sender, s_lPAddress, lPAmount);

        //transfer genesis amount to genesis address
        uint256 genesisAmount = (amount * GENESIS_PERCENT) / PERCENT_BPS;
        IX28(X28).transferFrom(msg.sender, s_genesisAddress, genesisAmount);

        //transfer BnB amount to BnB contract
        IX28(X28).transferFrom(
            msg.sender,
            s_buyAndBurnAddress,
            amount - burnAmount - lPAmount - genesisAmount
        );

        _updateCycleAmount(msg.sender, amount);
        s_totalX28Deposited += amount;
        s_totalX28Burned += burnAmount;

        emit AuctionEntered(msg.sender, getCurrentContractDay(), amount);
    }

    /** @notice enter auction using TitanX stakes (up to 28 at once)
     * same amount of staked TitanX as liquid is required to burn stake
     * % burned, % to LP address, % to genesis address, % to B&B contract
     * 8% burn dev reward to BnB contract
     * credit 2x amount in current auction
     * @param stakeId User TitanX stake Ids
     */
    function enterAuctionTitanXStake(
        uint256[] calldata stakeId
    ) external dailyUpdate(s_buyAndBurnAddress) nonReentrant {
        if (getCurrentContractDay() > 28) revert Shogun_BurnStakeClosed();
        if (ITITANX(TITANX_CA).allowanceBurnStakes(msg.sender, address(this)) < stakeId.length)
            revert Shogun_NoAllowance();

        uint256 amount;
        uint256 claimCount;
        for (uint256 i = 0; i < stakeId.length; i++) {
            ITITANX.UserStakeInfo memory info = ITITANX(TITANX_CA).getUserStakeInfo(
                msg.sender,
                stakeId[i]
            );

            if (info.status == ITITANX.StakeStatus.ACTIVE && info.titanAmount != 0) {
                ITitanBurn(TITANX_CA).burnStakeToPayAddress(
                    msg.sender,
                    stakeId[i],
                    0,
                    8,
                    s_buyAndBurnAddress
                );
                amount += info.titanAmount;
                ++claimCount;
            }
            if (claimCount == MAX_BATCH_BURN_COUNT) break;
        }
        if (ITITANX(TITANX_CA).balanceOf(msg.sender) < amount) revert Shogun_NotEnoughBalance();

        //transfer burn amount to TitanX BNBV2, call public burnLPTokens() to burn TitanX
        uint256 burnAmount = (amount * BURN_PERCENT) / PERCENT_BPS;
        ITITANX(TITANX_CA).transferFrom(msg.sender, TITANX_BNBV2, burnAmount);
        ITITANX(TITANX_CA).burnLPTokens();

        //transfer LP amount to LP address
        uint256 lPAmount = (amount * LP_PERCENT) / PERCENT_BPS;
        ITITANX(TITANX_CA).transferFrom(msg.sender, s_lPAddress, lPAmount);

        //transfer genesis amount to genesis address
        uint256 genesisAmount = (amount * GENESIS_PERCENT) / PERCENT_BPS;
        ITITANX(TITANX_CA).transferFrom(msg.sender, s_genesisAddress, genesisAmount);

        //transfer BnB amount to BnB contract
        ITITANX(TITANX_CA).transferFrom(
            msg.sender,
            s_buyAndBurnAddress,
            amount - burnAmount - lPAmount - genesisAmount
        );

        uint256 totalCreditAmount = amount * 2;
        _updateCycleAmount(msg.sender, totalCreditAmount);
        s_totalTitanXDeposited += totalCreditAmount;
        s_totalTitanXBurned += burnAmount + amount; //100% staked amount burned + 20% liquid burned

        emit AuctionEntered(msg.sender, getCurrentContractDay(), totalCreditAmount);
    }

    /** @notice claim available auction supply (accumulate if past auctions was not claimed) */
    function claimUserAuction() external dailyUpdate(s_buyAndBurnAddress) nonReentrant {
        uint256 claimableSupply = getUserClaimableAuctionSupply(msg.sender);
        if (claimableSupply == 0) revert Shogun_NoSupplyToClaim();

        _updateUserAuctionClaimIndex(msg.sender);
        _mint(msg.sender, claimableSupply);

        emit AuctionSupplyClaimed(msg.sender, claimableSupply);
    }

    /** @notice callback function from TitanX contract after burn.
     * do nothing
     * @param user wallet address
     * @param amount burned Titan X amount
     */
    function onBurn(address user, uint256 amount) external {}

    //private functions
    /** @dev override ERC20 update for tax logic
     * add to tax exlusion list to avoid tax logic
     */
    function _update(address from, address to, uint256 value) internal virtual override {
        if (s_taxExclusionList[from] || s_taxExclusionList[to]) {
            super._update(from, to, value);
            return;
        }

        uint256 taxAmount = (value * TRANSFER_TAX_PERCENT) / PERCENT_BPS;
        uint256 lPAmount = (taxAmount * SHOGUN_LP_PERCENT) / PERCENT_BPS;
        uint256 warChestAmount = (taxAmount * SHOGUN_WARCHEST_PERCENT) / PERCENT_BPS;
        super._update(from, address(0), taxAmount - lPAmount); //burn including war chest supply
        super._update(from, s_lPAddress, lPAmount); //LP supply
        super._update(from, to, value - taxAmount); //transfer taxed amount
        _AddWarChestSupply(warChestAmount);
        s_totalShogunTaxBurned += taxAmount - lPAmount - warChestAmount;
    }

    /** @dev burn liquid Shogun through other project.
     * called by other contracts for proof of burn 2.0 with up to 8% for both builder fee and user rebate
     * @param user user address
     * @param amount liquid Shogun amount
     * @param userRebatePercentage percentage for user rebate in liquid Shogun (0 - 8)
     * @param rewardPaybackPercentage percentage for builder fee in liquid Shogun (0 - 8)
     * @param rewardPaybackAddress builder can opt to receive fee in another address
     */
    function _burnLiquidShogun(
        address user,
        uint256 amount,
        uint256 userRebatePercentage,
        uint256 rewardPaybackPercentage,
        address rewardPaybackAddress
    ) private {
        _spendAllowance(user, msg.sender, amount);
        _burnbefore(userRebatePercentage, rewardPaybackPercentage);
        _burn(user, amount);
        _burnAfter(
            user,
            amount,
            userRebatePercentage,
            rewardPaybackPercentage,
            rewardPaybackAddress
        );
    }

    /** @dev perform checks before burning starts.
     * check reward percentage and check if called by supported contract
     * @param userRebatePercentage percentage for user rebate
     * @param rewardPaybackPercentage percentage for builder fee
     */
    function _burnbefore(
        uint256 userRebatePercentage,
        uint256 rewardPaybackPercentage
    ) private view {
        if (rewardPaybackPercentage + userRebatePercentage > MAX_BURN_REWARD_PERCENT)
            revert Shogun_InvalidBurnRewardPercent();

        //Only supported contracts is allowed to call this function
        if (
            !IERC165(msg.sender).supportsInterface(IERC165.supportsInterface.selector) ||
            !IERC165(msg.sender).supportsInterface(type(IShogunOnBurn).interfaceId)
        ) revert Shogun_NotSupportedContract();
    }

    /** @dev update burn stats and mint reward to builder or user if applicable
     * @param user user address
     * @param amount Shogun amount burned
     * @param userRebatePercentage percentage for user rebate in liquid Shogun (0 - 8)
     * @param rewardPaybackPercentage percentage for builder fee in liquid Shogun (0 - 8)
     * @param rewardPaybackAddress builder can opt to receive fee in another address
     */
    function _burnAfter(
        address user,
        uint256 amount,
        uint256 userRebatePercentage,
        uint256 rewardPaybackPercentage,
        address rewardPaybackAddress
    ) private {
        _updateBurnAmount(user, msg.sender, amount);

        uint256 devFee;
        uint256 userRebate;
        if (rewardPaybackPercentage != 0) devFee = (amount * rewardPaybackPercentage) / 100;
        if (userRebatePercentage != 0) userRebate = (amount * userRebatePercentage) / 100;

        if (devFee != 0) _mint(rewardPaybackAddress, devFee);
        if (userRebate != 0) _mint(user, userRebate);

        IShogunOnBurn(msg.sender).onBurn(user, amount);
    }

    //Views
    /** @notice Returns true/false of the given interfaceId
     * @param interfaceId interface id
     * @return bool true/false
     */
    function supportsInterface(bytes4 interfaceId) public pure returns (bool) {
        return
            interfaceId == IERC165.supportsInterface.selector ||
            interfaceId == type(ITitanOnBurn).interfaceId;
    }

    /** @notice Returns current genesis wallet address
     * @return address current genesis wallet address
     */
    function getGenesisAddress() public view returns (address) {
        return s_genesisAddress;
    }

    /** @notice Returns current LP wallet address
     * @return address current LP wallet address
     */
    function getLPAddress() public view returns (address) {
        return s_lPAddress;
    }

    /** @notice Returns current buy and burn contract address
     * @return address current buy and burn contract address
     */
    function getBuyAndBurnAddress() public view returns (address) {
        return s_buyAndBurnAddress;
    }

    /** @notice Returns status of the given address
     * @return true/false
     */
    function getBuyAndBurnAddressRegistry(address contractAddress) public view returns (bool) {
        return s_buyAndBurnAddressRegistry[contractAddress];
    }

    /** @notice Returns status of the given address if it's excluded from transfer tax
     * @return true/false
     */
    function isAddressTaxExcluded(address user) public view returns (bool) {
        return s_taxExclusionList[user];
    }

    /** @notice Returns total X28 deposited
     * @return amount
     */
    function getTotalX28Deposited() public view returns (uint256) {
        return s_totalX28Deposited;
    }

    /** @notice Returns total TitanX burned from deposit
     * @return amount
     */
    function getTotalX28BurnedFromDeposits() public view returns (uint256) {
        return s_totalX28Burned;
    }

    /** @notice Returns total TitanX deposited
     * @return amount
     */
    function getTotalTitanXDeposited() public view returns (uint256) {
        return s_totalTitanXDeposited;
    }

    /** @notice Returns total TitanX burned from deposit
     * @return amount
     */
    function getTotalTitanXBurnedFromDeposits() public view returns (uint256) {
        return s_totalTitanXBurned;
    }

    /** @notice Returns total Shogun burned from tax
     * @return amount
     */
    function getTotalShogunBurnedFromTax() public view returns (uint256) {
        return s_totalShogunTaxBurned;
    }

    //Public functions for devs to intergrate with Shogun
    /** @notice allow anyone to sync dailyUpdate manually */
    function manualDailyUpdate() public dailyUpdate(s_buyAndBurnAddress) {}

    /** @notice Burn Shogun tokens and creates Proof-Of-Burn record to be used by connected DeFi and fee is paid to specified address
     * @param user user address
     * @param amount Shogun amount
     * @param userRebatePercentage percentage for user rebate in liquid Shogun (0 - 8)
     * @param rewardPaybackPercentage percentage for builder fee in liquid Shogun (0 - 8)
     * @param rewardPaybackAddress builder can opt to receive fee in another address
     */
    function burnTokensToPayAddress(
        address user,
        uint256 amount,
        uint256 userRebatePercentage,
        uint256 rewardPaybackPercentage,
        address rewardPaybackAddress
    ) public nonReentrant dailyUpdate(s_buyAndBurnAddress) {
        _burnLiquidShogun(
            user,
            amount,
            userRebatePercentage,
            rewardPaybackPercentage,
            rewardPaybackAddress
        );
    }

    /** @notice Burn Shogun tokens and creates Proof-Of-Burn record to be used by connected DeFi and fee is paid to specified address
     * @param user user address
     * @param amount Shogun amount
     * @param userRebatePercentage percentage for user rebate in liquid Shogun (0 - 8)
     * @param rewardPaybackPercentage percentage for builder fee in liquid Shogun (0 - 8)
     */
    function burnTokens(
        address user,
        uint256 amount,
        uint256 userRebatePercentage,
        uint256 rewardPaybackPercentage
    ) public nonReentrant dailyUpdate(s_buyAndBurnAddress) {
        _burnLiquidShogun(user, amount, userRebatePercentage, rewardPaybackPercentage, msg.sender);
    }

    /** @notice allows user to burn liquid Shogun directly from contract
     * @param amount Shogun amount
     */
    function userBurnTokens(uint256 amount) public nonReentrant dailyUpdate(s_buyAndBurnAddress) {
        _burn(msg.sender, amount);
        _updateBurnAmount(msg.sender, address(0), amount);
    }
}

File 2 of 20 : BurnInfo.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.21;

import "../libs/constant.sol";

/**
 * @title BurnInfo
 * @dev this contract is meant to be inherited into main contract
 * @notice It has the variables and functions specifically for tracking burn amount and reward
 */

abstract contract BurnInfo {
    //Variables
    //track the total Shogun burn amount
    uint256 private s_totalShogunBurned;

    //mappings
    //track wallet address -> total Shogun burn amount
    mapping(address => uint256) private s_userBurnAmount;
    //track contract/project address -> total Shogun burn amount
    mapping(address => uint256) private s_project_BurnAmount;
    //track contract/project address, wallet address -> total Shogun burn amount
    mapping(address => mapping(address => uint256)) private s_projectUser_BurnAmount;

    //events
    /** @dev log user burn Shogun event
     * project can be address(0) if user burns Shogun directly from Shogun contract
     */
    event ShogunBurned(address indexed user, address indexed project, uint256 amount);

    //functions
    /** @dev update the burn amount
     * @param user wallet address
     * @param project contract address
     * @param amount Shogun amount burned
     */
    function _updateBurnAmount(address user, address project, uint256 amount) internal {
        s_userBurnAmount[user] += amount;
        s_totalShogunBurned += amount;

        if (project != address(0)) {
            s_project_BurnAmount[project] += amount;
            s_projectUser_BurnAmount[project][user] += amount;
        }

        emit ShogunBurned(user, project, amount);
    }

    //views
    /** @notice return total burned Shogun amount from all users burn or projects burn
     * @return totalBurnAmount returns entire burned Shogun
     */
    function getTotalBurnTotal() public view returns (uint256) {
        return s_totalShogunBurned;
    }

    /** @notice return user address total burned Shogun
     * @return userBurnAmount returns user address total burned Shogun
     */
    function getUserBurnTotal(address user) public view returns (uint256) {
        return s_userBurnAmount[user];
    }

    /** @notice return project address total burned Shogun amount
     * @return projectTotalBurnAmount returns project total burned Shogun
     */
    function getProjectBurnTotal(address contractAddress) public view returns (uint256) {
        return s_project_BurnAmount[contractAddress];
    }

    /** @notice return user address total burned Shogun amount via a project address
     * @param contractAddress project address
     * @param user user address
     * @return projectUserTotalBurnAmount returns user address total burned Shogun via a project address
     */
    function getProjectUserBurnTotal(
        address contractAddress,
        address user
    ) public view returns (uint256) {
        return s_projectUser_BurnAmount[contractAddress][user];
    }
}

File 3 of 20 : GlobalInfo.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.21;

import "../libs/constant.sol";

import "../interfaces/IShogunBnB.sol";

error Shogun_InvalidRange();

abstract contract GlobalInfo {
    //Variables
    //deployed timestamp
    uint256 private immutable i_genesisTs;

    /** @dev track current contract day */
    uint256 private s_currentContractDay;

    /** @dev track current daily auction supply in phase 2 */
    uint256 private s_currentAuctionSupply;

    /** @dev track current amount for next perpetual auction supply in phase 2 */
    uint256 private s_currentWarChestSupply;

    //*********** Auction Variables ***********/
    /** @dev track user total amount for each daily cycle
     * s_userCycleAmount[address][1] = 300 = day 1 300
     * s_userCycleAmount[address][2] = 500 = day 2 500
     * */
    mapping(address => mapping(uint256 => uint256)) s_userCycleAmount;

    /** @dev track auction total amount for each daily cycle
     * s_cycleTotal[1] = 30000
     * s_cycleTotal[2] = 60000
     */
    mapping(uint256 => uint256) private s_cycleTotal;

    /** @dev track auction supply per share for each daily cycle
     * s_cycleSupplyPerShare[1] = 10
     * s_cycleSupplyPerShare[2] = 8
     */
    mapping(uint256 => uint256) private s_cycleSupplyPerShare;

    /** @dev track user start auction claim index
     * so calculation would start from current index
     * [address] = 1
     */
    mapping(address => uint256) private s_userStartAuctionClaimIndex;

    //structs
    struct CycleAuctionInfo {
        uint256 day;
        uint256 amount;
        uint256 reward;
    }

    //event
    event GlobalDailyUpdateStats(uint256 indexed day, uint256 indexed auctionSupply);
    event CalculatedAuctionSupplyPerShare(uint256 indexed day, uint256 indexed supplyPerShare);

    /** @dev Update variables in terms of day, modifier is used in all external/public functions (exclude view)
     * Every interaction to the contract would run this function to update variables
     */
    modifier dailyUpdate(address bnbAddress) {
        _dailyUpdate(bnbAddress);
        _;
    }

    constructor() {
        i_genesisTs = block.timestamp;
        s_currentContractDay = 1;
        s_currentAuctionSupply = INITIAL_PHASE_DAILY_AUCTION_SUPPLY;
    }

    /** @dev calculate and update variables daily */
    function _dailyUpdate(address bnbAddress) private {
        uint256 currentContractDay = s_currentContractDay;
        uint256 currentBlockDay = ((block.timestamp - i_genesisTs) / 1 days) + 1;

        if (currentBlockDay > currentContractDay) {
            //calculate previous cycle SupplyPerShare
            if (currentContractDay < 28) {
                _calculateCycleSupplyPerShare(
                    currentContractDay,
                    INITIAL_PHASE_DAILY_AUCTION_SUPPLY
                );

                emit GlobalDailyUpdateStats(currentBlockDay, INITIAL_PHASE_DAILY_AUCTION_SUPPLY);
            } else {
                _calculateCycleSupplyPerShare(currentContractDay, s_currentAuctionSupply);

                uint256 newAuctionSupply = (s_currentWarChestSupply *
                    PHASE_2_DAILY_AUCTION_SUPPLY_PERCENT) / PERCENT_BPS;
                s_currentAuctionSupply = newAuctionSupply;
                s_currentWarChestSupply -= newAuctionSupply;

                emit GlobalDailyUpdateStats(currentBlockDay, newAuctionSupply);
            }

            s_currentContractDay = currentBlockDay;
            IShogunBnB(bnbAddress).dailyUpdate(); //update BnB daily funds
        }
    }

    /******* Auction functions *******/
    /** @dev calculate supply per share on a given contract day
     * @param contractDay contract day
     * @param auctionSupply auction supply
     */
    function _calculateCycleSupplyPerShare(uint256 contractDay, uint256 auctionSupply) internal {
        uint256 supplyPerShare;
        uint256 totalAmount = s_cycleTotal[contractDay];

        if (totalAmount != 0) {
            supplyPerShare = (auctionSupply * 1 ether) / totalAmount;
            s_cycleSupplyPerShare[contractDay] = supplyPerShare;
        }

        emit CalculatedAuctionSupplyPerShare(contractDay, supplyPerShare);
    }

    /** @dev update cylce user amount and total amount based on current contract day
     * @param user address
     * @param amount amount
     */
    function _updateCycleAmount(address user, uint256 amount) internal {
        uint256 currentContractDay = getCurrentContractDay();

        //only new user will need to init claim index
        //set claim index to start from current contract day
        if (s_userStartAuctionClaimIndex[user] == 0) {
            s_userStartAuctionClaimIndex[user] = currentContractDay;
        }

        //update user amount and total amount in current cycle
        s_userCycleAmount[user][currentContractDay] += amount;
        s_cycleTotal[currentContractDay] += amount;
    }

    /** @dev update to the last index where a user has claimed the auction
     * @param user user address
     */
    function _updateUserAuctionClaimIndex(address user) internal {
        s_userStartAuctionClaimIndex[user] = getCurrentContractDay();
    }

    /** @dev increase War Chest supply from buy and burn or a % from transfer tax
     * @param amount amount to increase
     */
    function _AddWarChestSupply(uint256 amount) internal {
        s_currentWarChestSupply += amount;
    }

    /** Views */
    /** @notice Returns current contract day
     * @return currentContractDay current contract day
     */
    function getCurrentContractDay() public view returns (uint256) {
        return s_currentContractDay;
    }

    /** @notice Returns current auction supply
     * @return current auction supply
     */
    function getCurrentAuctionSupply() public view returns (uint256) {
        return s_currentAuctionSupply;
    }

    /** @notice Returns current War Chest supply
     * @return current War Chest supply
     */
    function getCurrentWarChestSupply() public view returns (uint256) {
        return s_currentWarChestSupply;
    }

    /** @notice Returns contract deployment block timestamp
     * @return genesisTs deployed timestamp
     */
    function genesisTs() public view returns (uint256) {
        return i_genesisTs;
    }

    /** @notice Returns the calculated supply per share for a given contract day as index
     * @param index cycle index
     * @return supplyPerShare
     */
    function getSupplyPerShare(uint256 index) public view returns (uint256) {
        return s_cycleSupplyPerShare[index];
    }

    /** @notice Returns total amount in a given daily cycle
     * * @param day day
     * @return total amount
     */
    function getCycleTotalAmount(uint256 day) public view returns (uint256) {
        return s_cycleTotal[day];
    }

    /** @notice Returns user total amount in a given daily cycle
     * @param user user address
     * * @param day day
     * @return total amount
     */
    function getUserCycleAmount(address user, uint256 day) public view returns (uint256) {
        return s_userCycleAmount[user][day];
    }

    /** @notice Returns user's start claim index
     * @param user user address
     * @return cycleIndex cycle index
     */
    function getUserStartAuctionClaimIndex(address user) public view returns (uint256) {
        return s_userStartAuctionClaimIndex[user];
    }

    /** @notice Returns user total unclaim auction supply from user's start claim index
     * @param user address
     * @return claimableSupply total unclaim amount
     */
    function getUserClaimableAuctionSupply(
        address user
    ) public view returns (uint256 claimableSupply) {
        uint256 startClaimIndex = s_userStartAuctionClaimIndex[user];
        uint256 maxContractDay = getCurrentContractDay();
        for (uint256 i = startClaimIndex; i < maxContractDay; i++) {
            claimableSupply += s_userCycleAmount[user][i] * s_cycleSupplyPerShare[i];
        }

        //supplyPerShare has 18 decimals scaling, so here divide by 18 decimals
        if (claimableSupply != 0) claimableSupply /= 1 ether;
    }

    /** @notice return a list of user auction info based on input range (contract start and end day)
     * the list will return real time auction amount (current contract day) and past cycles' auction reward
     * @param startDay start day
     * @param endDay end day
     */
    function getUserAuctionInfo(
        address user,
        uint256 startDay,
        uint256 endDay
    ) public view returns (CycleAuctionInfo[] memory cycleAuctionInfo) {
        if (startDay > endDay) revert Shogun_InvalidRange();
        uint256 currentContractDay = getCurrentContractDay();
        endDay = endDay > currentContractDay ? currentContractDay : endDay;

        uint256 index = 0;
        cycleAuctionInfo = new CycleAuctionInfo[](endDay - startDay + 1);

        for (uint256 i = startDay; i <= endDay; i++) {
            uint256 amount = s_userCycleAmount[user][i];
            cycleAuctionInfo[index++] = CycleAuctionInfo({
                day: i,
                amount: amount,
                reward: (amount * s_cycleSupplyPerShare[i]) / 1 ether
            });
        }
    }
}

File 4 of 20 : IX28.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IX28 is IERC20 {
    function mintX28withTitanX(uint256 amount) external;

    function burnCAX28(address contractAddress) external;
}

File 5 of 20 : IShogun.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

interface IShogun {
    function mintLPTokens() external;

    function burnCAShogun(address contractAddress) external;

    function genesisTs() external returns (uint256);

    function getGenesisAddress() external returns (address);

    function getLPAddress() external returns (address);
}

File 6 of 20 : IShogunOnBurn.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

interface IShogunOnBurn {
    function onBurn(address user, uint256 amount) external;
}

File 7 of 20 : ITitanOnBurn.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

interface ITitanOnBurn {
    function onBurn(address user, uint256 amount) external;
}

File 8 of 20 : ITitanBurn.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

interface ITitanBurn {
    function burnTokens(
        address user,
        uint256 amount,
        uint256 userRebatePercentage,
        uint256 rewardPaybackPercentage
    ) external;

    function burnTokensToPayAddress(
        address user,
        uint256 amount,
        uint256 userRebatePercentage,
        uint256 rewardPaybackPercentage,
        address rewardPaybackAddress
    ) external;

    function burnMint(address userAddress, uint256 id) external;

    function burnStake(
        address userAddress,
        uint256 id,
        uint256 userRebatePercentage,
        uint256 rewardPaybackPercentage
    ) external;

    function burnStakeToPayAddress(
        address userAddress,
        uint256 id,
        uint256 userRebatePercentage,
        uint256 rewardPaybackPercentage,
        address rewardPaybackAddress
    ) external;
}

File 9 of 20 : ITITANX.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface ITITANX is IERC20 {
    enum StakeStatus {
        ACTIVE,
        ENDED,
        BURNED
    }

    struct UserStakeInfo {
        uint152 titanAmount;
        uint128 shares;
        uint16 numOfDays;
        uint48 stakeStartTs;
        uint48 maturityTs;
        StakeStatus status;
    }

    function startMint(uint256 mintPower, uint256 numOfDays) external payable;

    function batchMint(uint256 mintPower, uint256 numOfDays, uint256 count) external payable;

    function claimMint(uint256 id) external;

    function batchClaimMint() external;

    function startStake(uint256 amount, uint256 numOfDays) external;

    function getUserStakeInfo(address user, uint256 id) external returns (UserStakeInfo memory);

    function approveBurnStakes(address spender, uint256 amount) external returns (bool);

    function allowanceBurnStakes(address user, address spender) external view returns (uint256);

    function burnLPTokens() external;
}

File 10 of 20 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

File 11 of 20 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)

pragma solidity ^0.8.20;

import {IERC165} from "../utils/introspection/IERC165.sol";

File 12 of 20 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
 * consider using {ReentrancyGuardTransient} instead.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

File 13 of 20 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 14 of 20 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

File 15 of 20 : IShogunBnB.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;

interface IShogunBnB {
    function dailyUpdate() external;
}

File 16 of 20 : constant.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.21;

address constant TITANX_CA = 0xF19308F923582A6f7c465e5CE7a9Dc1BEC6665B1;
address constant TITANX_BNBV2 = 0x410e10C33a49279f78CB99c8d816F18D5e7D5404;

address constant X28 = 0x5c47902c8C80779CB99235E42C354E53F38C3B0d;
address constant X28_BNB = 0xa3144E7FCceD79Ce6ff6E14AE9d8DF229417A7a2;

// ===================== Shogun ==========================================
uint256 constant GENESIS_PERCENT = 5_00;
uint256 constant BURN_PERCENT = 20_00;
uint256 constant LP_PERCENT = 22_00;
uint256 constant BNB_PERCENT = 53_00;

uint256 constant TRANSFER_TAX_PERCENT = 8_00;

uint256 constant SHOGUN_BURN_PERCENT = 28_00;
uint256 constant SHOGUN_LP_PERCENT = 8_00;
uint256 constant SHOGUN_WARCHEST_PERCENT = 64_00;

uint256 constant PERCENT_BPS = 100_00;

uint256 constant INITAL_LP_TOKENS = 1_000_000 ether;
uint256 constant LP_WALLET_TOKENS = 100_000_000 ether;

// ===================== AuctionInfo ==========================================
uint256 constant INITIAL_PHASE_DAILY_AUCTION_SUPPLY = 100_000_000 ether;
uint256 constant PHASE_2_DAILY_AUCTION_SUPPLY_PERCENT = 8_00;

uint256 constant MAX_BATCH_BURN_COUNT = 28;

// ===================== BurnInfo ==========================================
uint256 constant MAX_BURN_REWARD_PERCENT = 8;

File 17 of 20 : draft-IERC6093.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

File 18 of 20 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 19 of 20 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 20 of 20 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "remappings": []
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"genesisAddress","type":"address"},{"internalType":"address","name":"lPAddress","type":"address"},{"internalType":"address","name":"buyAndBurnAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"Shogun_BurnStakeClosed","type":"error"},{"inputs":[],"name":"Shogun_CannotZero","type":"error"},{"inputs":[],"name":"Shogun_InvalidAddress","type":"error"},{"inputs":[],"name":"Shogun_InvalidBurnRewardPercent","type":"error"},{"inputs":[],"name":"Shogun_InvalidRange","type":"error"},{"inputs":[],"name":"Shogun_LPTokensHasMinted","type":"error"},{"inputs":[],"name":"Shogun_NoAllowance","type":"error"},{"inputs":[],"name":"Shogun_NoSupplyToClaim","type":"error"},{"inputs":[],"name":"Shogun_NotAllowed","type":"error"},{"inputs":[],"name":"Shogun_NotEnoughBalance","type":"error"},{"inputs":[],"name":"Shogun_NotSupportedContract","type":"error"},{"inputs":[],"name":"Shogun_UnregisteredCA","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AuctionEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AuctionSupplyClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"supplyPerShare","type":"uint256"}],"name":"CalculatedAuctionSupplyPerShare","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"day","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"auctionSupply","type":"uint256"}],"name":"GlobalDailyUpdateStats","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"project","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ShogunBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addTaxExclusionAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"burnCAShogun","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"userRebatePercentage","type":"uint256"},{"internalType":"uint256","name":"rewardPaybackPercentage","type":"uint256"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"userRebatePercentage","type":"uint256"},{"internalType":"uint256","name":"rewardPaybackPercentage","type":"uint256"},{"internalType":"address","name":"rewardPaybackAddress","type":"address"}],"name":"burnTokensToPayAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimUserAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"stakeId","type":"uint256[]"}],"name":"enterAuctionTitanXStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"enterAuctionX28Liquid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyAndBurnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"getBuyAndBurnAddressRegistry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentAuctionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentContractDay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentWarChestSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"day","type":"uint256"}],"name":"getCycleTotalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGenesisAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"getProjectBurnTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"address","name":"user","type":"address"}],"name":"getProjectUserBurnTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getSupplyPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBurnTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalShogunBurnedFromTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalTitanXBurnedFromDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalTitanXDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalX28BurnedFromDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalX28Deposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"startDay","type":"uint256"},{"internalType":"uint256","name":"endDay","type":"uint256"}],"name":"getUserAuctionInfo","outputs":[{"components":[{"internalType":"uint256","name":"day","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"reward","type":"uint256"}],"internalType":"struct GlobalInfo.CycleAuctionInfo[]","name":"cycleAuctionInfo","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserBurnTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserClaimableAuctionSupply","outputs":[{"internalType":"uint256","name":"claimableSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"day","type":"uint256"}],"name":"getUserCycleAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserStartAuctionClaimIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isAddressTaxExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualDailyUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintLPTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"onBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeTaxExclusionAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setBuyAndBurnContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setNewGenesisAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setNewLPAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"userBurnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405234801561000f575f80fd5b50604051615b79380380615b7983398181016040528101906100319190610a8b565b336040518060400160405280600681526020017f53484f47554e00000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f53484f47554e000000000000000000000000000000000000000000000000000081525081600390816100ad9190610d15565b5080600490816100bd9190610d15565b5050506001600581905550426080818152505060016006819055506a52b7d2dcc80cd2e40000006007819055505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361015a575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016101519190610df3565b60405180910390fd5b610169816104f160201b60201c565b505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036101cf576040517f9206838200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610234576040517f9206838200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610299576040517f9206838200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601b5f8073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506104e960135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166a52b7d2dcc80cd2e40000006105b460201b60201c565b505050610f9a565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610624575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161061b9190610df3565b60405180910390fd5b6106355f838361063960201b60201c565b5050565b601b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806106d45750601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156106ef576106ea8383836107f960201b60201c565b6107f4565b5f612710610320836107019190610e39565b61070b9190610ea7565b90505f6127106103208361071f9190610e39565b6107299190610ea7565b90505f6127106119008461073d9190610e39565b6107479190610ea7565b9050610765865f848661075a9190610ed7565b6107f960201b60201c565b6107978660135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846107f960201b60201c565b6107b3868685876107a89190610ed7565b6107f960201b60201c565b6107c281610a1260201b60201c565b8082846107cf9190610ed7565b6107d99190610ed7565b60195f8282546107e99190610f0a565b925050819055505050505b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610849578060025f82825461083d9190610f0a565b92505081905550610917565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156108d2578381836040517fe450d38c0000000000000000000000000000000000000000000000000000000081526004016108c993929190610f4c565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361095e578060025f82825403925050819055506109a8565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610a059190610f81565b60405180910390a3505050565b8060085f828254610a239190610f0a565b9250508190555050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610a5a82610a31565b9050919050565b610a6a81610a50565b8114610a74575f80fd5b50565b5f81519050610a8581610a61565b92915050565b5f805f60608486031215610aa257610aa1610a2d565b5b5f610aaf86828701610a77565b9350506020610ac086828701610a77565b9250506040610ad186828701610a77565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610b5657607f821691505b602082108103610b6957610b68610b12565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302610bcb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610b90565b610bd58683610b90565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f610c19610c14610c0f84610bed565b610bf6565b610bed565b9050919050565b5f819050919050565b610c3283610bff565b610c46610c3e82610c20565b848454610b9c565b825550505050565b5f90565b610c5a610c4e565b610c65818484610c29565b505050565b5b81811015610c8857610c7d5f82610c52565b600181019050610c6b565b5050565b601f821115610ccd57610c9e81610b6f565b610ca784610b81565b81016020851015610cb6578190505b610cca610cc285610b81565b830182610c6a565b50505b505050565b5f82821c905092915050565b5f610ced5f1984600802610cd2565b1980831691505092915050565b5f610d058383610cde565b9150826002028217905092915050565b610d1e82610adb565b67ffffffffffffffff811115610d3757610d36610ae5565b5b610d418254610b3f565b610d4c828285610c8c565b5f60209050601f831160018114610d7d575f8415610d6b578287015190505b610d758582610cfa565b865550610ddc565b601f198416610d8b86610b6f565b5f5b82811015610db257848901518255600182019150602085019450602081019050610d8d565b86831015610dcf5784890151610dcb601f891682610cde565b8355505b6001600288020188555050505b505050505050565b610ded81610a50565b82525050565b5f602082019050610e065f830184610de4565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610e4382610bed565b9150610e4e83610bed565b9250828202610e5c81610bed565b91508282048414831517610e7357610e72610e0c565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f610eb182610bed565b9150610ebc83610bed565b925082610ecc57610ecb610e7a565b5b828204905092915050565b5f610ee182610bed565b9150610eec83610bed565b9250828203905081811115610f0457610f03610e0c565b5b92915050565b5f610f1482610bed565b9150610f1f83610bed565b9250828201905080821115610f3757610f36610e0c565b5b92915050565b610f4681610bed565b82525050565b5f606082019050610f5f5f830186610de4565b610f6c6020830185610f3d565b610f796040830184610f3d565b949350505050565b5f602082019050610f945f830184610f3d565b92915050565b608051614bc0610fb95f395f81816129a60152612c470152614bc05ff3fe608060405234801561000f575f80fd5b5060043610610309575f3560e01c80638305b4491161019b578063b6a0df9d116100e7578063e37a48c8116100a0578063e80521741161007a578063e805217414610953578063e90225cb14610983578063eaf3cc0a146109a1578063f2fde38b146109d157610309565b8063e37a48c81461090d578063e3af6d0a1461092b578063e3d3227d1461094957610309565b8063b6a0df9d14610839578063cbc028fe14610869578063d592757e14610887578063da4d5129146108b7578063dd62ed3e146108c1578063e12fc670146108f157610309565b806395d89b4111610154578063a2573e5b1161012e578063a2573e5b1461079f578063a67be471146107bd578063a9059cbb146107ed578063b269fb311461081d57610309565b806395d89b4114610747578063996e96f0146107655780639ed992201461078357610309565b80638305b4491461068357806386156c73146106a157806389205c8c146106bf5780638a3a73ff146106dd5780638da5cb5b1461070d578063916c37d51461072b57610309565b806333f3fd781161025a57806345a1b92c116102135780636a74cf62116101ed5780636a74cf621461060f57806370a082311461062d578063715018a61461065d5780637d6b32531461066757610309565b806345a1b92c146105a55780635109c57c146105c157806354f5d028146105f157610309565b806333f3fd78146104e9578063341ccbf9146105055780633a9693e1146105355780633c34267f1461055157806341b1aa221461056d578063422e5f2c1461058957610309565b806318160ddd116102c757806323b872dd116102a157806323b872dd1461043b57806329b70d7a1461046b5780632d705a1e1461049b578063313ce567146104cb57610309565b806318160ddd146103e35780631a2fc785146104015780631ae409c01461041d57610309565b8062ecd37b1461030d57806301ffc9a71461032b57806306fdde031461035b578063095ea7b3146103795780631371bb40146103a957806313aad510146103d9575b5f80fd5b6103156109ed565b6040516103229190613e58565b60405180910390f35b61034560048036038101906103409190613ed7565b6109f6565b6040516103529190613f1c565b60405180910390f35b610363610aae565b6040516103709190613fa5565b60405180910390f35b610393600480360381019061038e9190614049565b610b3e565b6040516103a09190613f1c565b60405180910390f35b6103c360048036038101906103be9190614087565b610b60565b6040516103d09190613e58565b60405180910390f35b6103e1610be2565b005b6103eb610c10565b6040516103f89190613e58565b60405180910390f35b61041b600480360381019061041691906140c5565b610c19565b005b610425610cde565b6040516104329190613e58565b60405180910390f35b610455600480360381019061045091906140f0565b610ce7565b6040516104629190613f1c565b60405180910390f35b610485600480360381019061048091906140c5565b610d15565b6040516104929190613e58565b60405180910390f35b6104b560048036038101906104b09190614140565b610d5b565b6040516104c29190613e58565b60405180910390f35b6104d3610d75565b6040516104e09190614186565b60405180910390f35b61050360048036038101906104fe919061419f565b610d7d565b005b61051f600480360381019061051a9190614049565b610dcd565b60405161052c9190613e58565b60405180910390f35b61054f600480360381019061054a91906140c5565b610e23565b005b61056b60048036038101906105669190614140565b610f51565b005b61058760048036038101906105829190614277565b610fa5565b005b6105a3600480360381019061059e91906140c5565b611820565b005b6105bf60048036038101906105ba9190614049565b6118e4565b005b6105db60048036038101906105d691906140c5565b6118e8565b6040516105e89190613f1c565b60405180910390f35b6105f961193a565b6040516106069190613e58565b60405180910390f35b610617611943565b6040516106249190613e58565b60405180910390f35b610647600480360381019061064291906140c5565b61194c565b6040516106549190613e58565b60405180910390f35b610665611991565b005b610681600480360381019061067c91906140c5565b6119a4565b005b61068b611bec565b6040516106989190613e58565b60405180910390f35b6106a9611bf5565b6040516106b69190613e58565b60405180910390f35b6106c7611bfe565b6040516106d49190613e58565b60405180910390f35b6106f760048036038101906106f291906140c5565b611c07565b6040516107049190613f1c565b60405180910390f35b610715611c59565b60405161072291906142d1565b60405180910390f35b61074560048036038101906107409190614140565b611c81565b005b61074f61214a565b60405161075c9190613fa5565b60405180910390f35b61076d6121da565b60405161077a91906142d1565b60405180910390f35b61079d600480360381019061079891906142ea565b612202565b005b6107a7612251565b6040516107b491906142d1565b60405180910390f35b6107d760048036038101906107d2919061434e565b612279565b6040516107e49190614495565b60405180910390f35b61080760048036038101906108029190614049565b61242d565b6040516108149190613f1c565b60405180910390f35b610837600480360381019061083291906140c5565b61244f565b005b610853600480360381019061084e91906140c5565b612594565b6040516108609190613e58565b60405180910390f35b610871612697565b60405161087e9190613e58565b60405180910390f35b6108a1600480360381019061089c9190614140565b6126a0565b6040516108ae9190613e58565b60405180910390f35b6108bf6126ba565b005b6108db60048036038101906108d69190614087565b612795565b6040516108e89190613e58565b60405180910390f35b61090b600480360381019061090691906140c5565b612817565b005b61091561299a565b6040516109229190613e58565b60405180910390f35b6109336129a3565b6040516109409190613e58565b60405180910390f35b6109516129ca565b005b61096d600480360381019061096891906140c5565b612ae7565b60405161097a9190613e58565b60405180910390f35b61098b612b2d565b60405161099891906142d1565b60405180910390f35b6109bb60048036038101906109b691906140c5565b612b55565b6040516109c89190613e58565b60405180910390f35b6109eb60048036038101906109e691906140c5565b612b9b565b005b5f601554905090565b5f6301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa757507f45a1b92c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610abd906144e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae9906144e2565b8015610b345780601f10610b0b57610100808354040283529160200191610b34565b820191905f5260205f20905b815481529060010190602001808311610b1757829003601f168201915b5050505050905090565b5f80610b48612c1f565b9050610b55818585612c26565b600191505092915050565b5f60105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610c0d81612c38565b50565b5f600254905090565b610c21612dce565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c86576040517f9206838200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f600654905090565b5f80610cf1612c1f565b9050610cfe858285612e55565b610d09858585612ee7565b60019150509392505050565b5f600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f600b5f8381526020019081526020015f20549050919050565b5f6012905090565b610d85612fd7565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610db081612c38565b610dbd868686868661301d565b50610dc6613050565b5050505050565b5f60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f2054905092915050565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517fd767ecd500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0e576040517f9206838200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610f59612fd7565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f8481612c38565b610f8e338361305a565b610f99335f846130d9565b50610fa2613050565b50565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610fd081612c38565b610fd8612fd7565b601c610fe2610cde565b111561101a576040517fd187eef600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8282905073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff16635c3ef13033306040518363ffffffff1660e01b815260040161106d929190614512565b602060405180830381865afa158015611088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ac919061454d565b10156110e4576040517f86a6dfae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f5b858590508110156112fd575f73f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff1662ae5faa3389898681811061113757611136614578565b5b905060200201356040518363ffffffff1660e01b815260040161115b9291906145a5565b60c0604051808303815f875af1158015611177573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119b9190614807565b90505f60028111156111b0576111af614832565b5b8160a0015160028111156111c7576111c6614832565b5b1480156111ec57505f815f015172ffffffffffffffffffffffffffffffffffffff1614155b156112e15773f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166377a542693389898681811061123557611234614578565b5b905060200201355f600860145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518663ffffffff1660e01b81526004016112819594939291906148da565b5f604051808303815f87803b158015611298575f80fd5b505af11580156112aa573d5f803e3d5ffd5b50505050805f015172ffffffffffffffffffffffffffffffffffffff16846112d29190614958565b9350826112de9061498b565b92505b601c83036112ef57506112fd565b5080806001019150506110e8565b508173f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161134c91906142d1565b602060405180830381865afa158015611367573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061138b919061454d565b10156113c3576040517ffd2a3cae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6127106107d0846113d591906149d2565b6113df9190614a40565b905073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166323b872dd3373410e10c33a49279f78cb99c8d816f18d5e7d5404846040518463ffffffff1660e01b815260040161144693929190614a70565b6020604051808303815f875af1158015611462573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114869190614acf565b5073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff1663bb88603c6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156114e0575f80fd5b505af11580156114f2573d5f803e3d5ffd5b505050505f6127106108988561150891906149d2565b6115129190614a40565b905073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166323b872dd3360135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161158693929190614a70565b6020604051808303815f875af11580156115a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c69190614acf565b505f6127106101f4866115d991906149d2565b6115e39190614a40565b905073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166323b872dd3360125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161165793929190614a70565b6020604051808303815f875af1158015611673573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116979190614acf565b5073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166323b872dd3360145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168486888b6116f99190614afa565b6117039190614afa565b61170d9190614afa565b6040518463ffffffff1660e01b815260040161172b93929190614a70565b6020604051808303815f875af1158015611747573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176b9190614acf565b505f60028661177a91906149d2565b905061178633826132c3565b8060175f8282546117979190614958565b9250508190555085846117aa9190614958565b60185f8282546117ba9190614958565b92505081905550806117ca610cde565b3373ffffffffffffffffffffffffffffffffffffffff167f74f51c14cea6ce944f7b9299e147dd51402823abca664482383d87ee93014a5b60405160405180910390a450505050505061181b613050565b505050565b611828612dce565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361188d576040517f9206838200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5050565b5f601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f600d54905090565b5f601854905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611999612dce565b6119a25f6133e3565b565b6119ac612dce565b8073ffffffffffffffffffffffffffffffffffffffff166301ffc9a78060e01b6040518263ffffffff1660e01b81526004016119e89190614b3c565b602060405180830381865afa158015611a03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a279190614acf565b1580611ac857508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f892c1ced000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401611a879190614b3c565b602060405180830381865afa158015611aa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac69190614acf565b155b15611aff576040517f524561ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f601754905090565b5f600854905090565b5f601954905090565b5f601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611cac81612c38565b611cb4612fd7565b5f8203611ced576040517f8be8f2b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6127106107d084611cff91906149d2565b611d099190614a40565b9050735c47902c8c80779cb99235e42c354e53f38c3b0d73ffffffffffffffffffffffffffffffffffffffff166323b872dd3373a3144e7fcced79ce6ff6e14ae9d8df229417a7a2846040518463ffffffff1660e01b8152600401611d7093929190614a70565b6020604051808303815f875af1158015611d8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db09190614acf565b50735c47902c8c80779cb99235e42c354e53f38c3b0d73ffffffffffffffffffffffffffffffffffffffff1663d9580be973a3144e7fcced79ce6ff6e14ae9d8df229417a7a26040518263ffffffff1660e01b8152600401611e1291906142d1565b5f604051808303815f87803b158015611e29575f80fd5b505af1158015611e3b573d5f803e3d5ffd5b505050505f61271061089885611e5191906149d2565b611e5b9190614a40565b9050735c47902c8c80779cb99235e42c354e53f38c3b0d73ffffffffffffffffffffffffffffffffffffffff166323b872dd3360135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401611ecf93929190614a70565b6020604051808303815f875af1158015611eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f0f9190614acf565b505f6127106101f486611f2291906149d2565b611f2c9190614a40565b9050735c47902c8c80779cb99235e42c354e53f38c3b0d73ffffffffffffffffffffffffffffffffffffffff166323b872dd3360125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401611fa093929190614a70565b6020604051808303815f875af1158015611fbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe09190614acf565b50735c47902c8c80779cb99235e42c354e53f38c3b0d73ffffffffffffffffffffffffffffffffffffffff166323b872dd3360145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168486888b6120429190614afa565b61204c9190614afa565b6120569190614afa565b6040518463ffffffff1660e01b815260040161207493929190614a70565b6020604051808303815f875af1158015612090573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b49190614acf565b506120bf33866132c3565b8460155f8282546120d09190614958565b925050819055508260165f8282546120e89190614958565b92505081905550846120f8610cde565b3373ffffffffffffffffffffffffffffffffffffffff167f74f51c14cea6ce944f7b9299e147dd51402823abca664482383d87ee93014a5b60405160405180910390a4505050612146613050565b5050565b606060048054612159906144e2565b80601f0160208091040260200160405190810160405280929190818152602001828054612185906144e2565b80156121d05780601f106121a7576101008083540402835291602001916121d0565b820191905f5260205f20905b8154815290600101906020018083116121b357829003601f168201915b5050505050905090565b5f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61220a612fd7565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661223581612c38565b612242858585853361301d565b5061224b613050565b50505050565b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060818311156122b5576040517fd951e47f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6122be610cde565b90508083116122cd57826122cf565b805b92505f600185856122e09190614afa565b6122ea9190614958565b67ffffffffffffffff811115612303576123026145d0565b5b60405190808252806020026020018201604052801561233c57816020015b612329613e22565b8152602001906001900390816123215790505b5092505f8590505b848111612423575f60095f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205490506040518060600160405280838152602001828152602001670de0b6b3a7640000600b5f8681526020019081526020015f2054846123d891906149d2565b6123e29190614a40565b8152508584806123f19061498b565b95508151811061240457612403614578565b5b602002602001018190525050808061241b9061498b565b915050612344565b5050509392505050565b5f80612437612c1f565b9050612444818585612ee7565b600191505092915050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661247a81612c38565b601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166124fa576040517f612a332e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6125048361194c565b90505f6127106103208361251891906149d2565b6125229190614a40565b90505f6127106119008461253691906149d2565b6125409190614a40565b9050612558855f84866125539190614afa565b6134a6565b6125848560135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846134a6565b61258d816136bf565b5050505050565b5f80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f6125df610cde565b90505f8290505b8181101561267157600b5f8281526020019081526020015f205460095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205461265791906149d2565b846126629190614958565b935080806001019150506125e6565b505f831461269057670de0b6b3a76400008361268d9190614a40565b92505b5050919050565b5f601654905090565b5f600a5f8381526020019081526020015f20549050919050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166126e581612c38565b6126ed612fd7565b5f6126f733612594565b90505f8103612732576040517f89ceb32d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61273b336136da565b6127453382613726565b803373ffffffffffffffffffffffffffffffffffffffff167f72b33dd56e7ab58671f352c0e2b20944dc71ace94a6a0d76df0589215d37cf7360405160405180910390a350612792613050565b50565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461289d576040517fd767ecd500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612902576040517f9206838200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f600754905090565b5f7f0000000000000000000000000000000000000000000000000000000000000000905090565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a50576040517fd767ecd500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c5f9054906101000a900460ff1615612a96576040517f6f56087500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c5f6101000a81548160ff021916908315150217905550612ae560145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1669d3c21bcecceda1000000613726565b565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b612ba3612dce565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c13575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612c0a91906142d1565b60405180910390fd5b612c1c816133e3565b50565b5f33905090565b612c3383838360016137a5565b505050565b5f60065490505f6001620151807f000000000000000000000000000000000000000000000000000000000000000042612c719190614afa565b612c7b9190614a40565b612c859190614958565b905081811115612dc957601c821015612ceb57612cad826a52b7d2dcc80cd2e4000000613974565b6a52b7d2dcc80cd2e4000000817f502806f7cf43435d83b251173d47f99095d52c72115be741aa35f763db4a814060405160405180910390a3612d66565b612cf782600754613974565b5f612710610320600854612d0b91906149d2565b612d159190614a40565b9050806007819055508060085f828254612d2f9190614afa565b9250508190555080827f502806f7cf43435d83b251173d47f99095d52c72115be741aa35f763db4a814060405160405180910390a3505b806006819055508273ffffffffffffffffffffffffffffffffffffffff16634fe1c3536040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612db2575f80fd5b505af1158015612dc4573d5f803e3d5ffd5b505050505b505050565b612dd6612c1f565b73ffffffffffffffffffffffffffffffffffffffff16612df4611c59565b73ffffffffffffffffffffffffffffffffffffffff1614612e5357612e17612c1f565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612e4a91906142d1565b60405180910390fd5b565b5f612e608484612795565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612ee15781811015612ed2578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401612ec993929190614b55565b60405180910390fd5b612ee084848484035f6137a5565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f57575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612f4e91906142d1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fc7575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401612fbe91906142d1565b60405180910390fd5b612fd28383836139fd565b505050565b600260055403613013576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600581905550565b613028853386612e55565b6130328383613b9f565b61303c858561305a565b6130498585858585613d3c565b5050505050565b6001600581905550565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130ca575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016130c191906142d1565b60405180910390fd5b6130d5825f836139fd565b5050565b80600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546131259190614958565b9250508190555080600d5f82825461313d9190614958565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132595780600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546131c39190614958565b925050819055508060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546132519190614958565b925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff16cb9ee431a9deecb9ec463e22221162e3a7994f5e4a8b1fefc32619853f455836040516132b69190613e58565b60405180910390a3505050565b5f6132cc610cde565b90505f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036133555780600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f8282546133b09190614958565b9250508190555081600a5f8381526020019081526020015f205f8282546133d79190614958565b92505081905550505050565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036134f6578060025f8282546134ea9190614958565b925050819055506135c4565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561357f578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161357693929190614b55565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361360b578060025f8282540392505081905550613655565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516136b29190613e58565b60405180910390a3505050565b8060085f8282546136d09190614958565b9250508190555050565b6136e2610cde565b600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613796575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161378d91906142d1565b60405180910390fd5b6137a15f83836139fd565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613815575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161380c91906142d1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613885575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161387c91906142d1565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561396e578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516139659190613e58565b60405180910390a35b50505050565b5f80600a5f8581526020019081526020015f205490505f81146139c95780670de0b6b3a7640000846139a691906149d2565b6139b09190614a40565b915081600b5f8681526020019081526020015f20819055505b81847fbdb1fa05dc0b9558966cdb9f339604c1c67a886cae02191c128b02b7661a70d860405160405180910390a350505050565b601b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680613a985750601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15613aad57613aa88383836134a6565b613b9a565b5f61271061032083613abf91906149d2565b613ac99190614a40565b90505f61271061032083613add91906149d2565b613ae79190614a40565b90505f61271061190084613afb91906149d2565b613b059190614a40565b9050613b1d865f8486613b189190614afa565b6134a6565b613b498660135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846134a6565b613b5f86868587613b5a9190614afa565b6134a6565b613b68816136bf565b808284613b759190614afa565b613b7f9190614afa565b60195f828254613b8f9190614958565b925050819055505050505b505050565b60088282613bad9190614958565b1115613be5576040517f4ca31b7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166301ffc9a78060e01b6040518263ffffffff1660e01b8152600401613c219190614b3c565b602060405180830381865afa158015613c3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c609190614acf565b1580613d0157503373ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f45a1b92c000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401613cc09190614b3c565b602060405180830381865afa158015613cdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cff9190614acf565b155b15613d38576040517f524561ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b613d478533866130d9565b5f805f8414613d6b5760648487613d5e91906149d2565b613d689190614a40565b91505b5f8514613d8d5760648587613d8091906149d2565b613d8a9190614a40565b90505b5f8214613d9f57613d9e8383613726565b5b5f8114613db157613db08782613726565b5b3373ffffffffffffffffffffffffffffffffffffffff166345a1b92c88886040518363ffffffff1660e01b8152600401613dec9291906145a5565b5f604051808303815f87803b158015613e03575f80fd5b505af1158015613e15573d5f803e3d5ffd5b5050505050505050505050565b60405180606001604052805f81526020015f81526020015f81525090565b5f819050919050565b613e5281613e40565b82525050565b5f602082019050613e6b5f830184613e49565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613eb681613e82565b8114613ec0575f80fd5b50565b5f81359050613ed181613ead565b92915050565b5f60208284031215613eec57613eeb613e7a565b5b5f613ef984828501613ec3565b91505092915050565b5f8115159050919050565b613f1681613f02565b82525050565b5f602082019050613f2f5f830184613f0d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613f7782613f35565b613f818185613f3f565b9350613f91818560208601613f4f565b613f9a81613f5d565b840191505092915050565b5f6020820190508181035f830152613fbd8184613f6d565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613fee82613fc5565b9050919050565b613ffe81613fe4565b8114614008575f80fd5b50565b5f8135905061401981613ff5565b92915050565b61402881613e40565b8114614032575f80fd5b50565b5f813590506140438161401f565b92915050565b5f806040838503121561405f5761405e613e7a565b5b5f61406c8582860161400b565b925050602061407d85828601614035565b9150509250929050565b5f806040838503121561409d5761409c613e7a565b5b5f6140aa8582860161400b565b92505060206140bb8582860161400b565b9150509250929050565b5f602082840312156140da576140d9613e7a565b5b5f6140e78482850161400b565b91505092915050565b5f805f6060848603121561410757614106613e7a565b5b5f6141148682870161400b565b93505060206141258682870161400b565b925050604061413686828701614035565b9150509250925092565b5f6020828403121561415557614154613e7a565b5b5f61416284828501614035565b91505092915050565b5f60ff82169050919050565b6141808161416b565b82525050565b5f6020820190506141995f830184614177565b92915050565b5f805f805f60a086880312156141b8576141b7613e7a565b5b5f6141c58882890161400b565b95505060206141d688828901614035565b94505060406141e788828901614035565b93505060606141f888828901614035565b92505060806142098882890161400b565b9150509295509295909350565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261423757614236614216565b5b8235905067ffffffffffffffff8111156142545761425361421a565b5b6020830191508360208202830111156142705761426f61421e565b5b9250929050565b5f806020838503121561428d5761428c613e7a565b5b5f83013567ffffffffffffffff8111156142aa576142a9613e7e565b5b6142b685828601614222565b92509250509250929050565b6142cb81613fe4565b82525050565b5f6020820190506142e45f8301846142c2565b92915050565b5f805f806080858703121561430257614301613e7a565b5b5f61430f8782880161400b565b945050602061432087828801614035565b935050604061433187828801614035565b925050606061434287828801614035565b91505092959194509250565b5f805f6060848603121561436557614364613e7a565b5b5f6143728682870161400b565b935050602061438386828701614035565b925050604061439486828701614035565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6143d081613e40565b82525050565b606082015f8201516143ea5f8501826143c7565b5060208201516143fd60208501826143c7565b50604082015161441060408501826143c7565b50505050565b5f61442183836143d6565b60608301905092915050565b5f602082019050919050565b5f6144438261439e565b61444d81856143a8565b9350614458836143b8565b805f5b8381101561448857815161446f8882614416565b975061447a8361442d565b92505060018101905061445b565b5085935050505092915050565b5f6020820190508181035f8301526144ad8184614439565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806144f957607f821691505b60208210810361450c5761450b6144b5565b5b50919050565b5f6040820190506145255f8301856142c2565b61453260208301846142c2565b9392505050565b5f815190506145478161401f565b92915050565b5f6020828403121561456257614561613e7a565b5b5f61456f84828501614539565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6040820190506145b85f8301856142c2565b6145c56020830184613e49565b9392505050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61460682613f5d565b810181811067ffffffffffffffff82111715614625576146246145d0565b5b80604052505050565b5f614637613e71565b905061464382826145fd565b919050565b5f72ffffffffffffffffffffffffffffffffffffff82169050919050565b61466f81614648565b8114614679575f80fd5b50565b5f8151905061468a81614666565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6146b481614690565b81146146be575f80fd5b50565b5f815190506146cf816146ab565b92915050565b5f61ffff82169050919050565b6146eb816146d5565b81146146f5575f80fd5b50565b5f81519050614706816146e2565b92915050565b5f65ffffffffffff82169050919050565b6147268161470c565b8114614730575f80fd5b50565b5f815190506147418161471d565b92915050565b60038110614753575f80fd5b50565b5f8151905061476481614747565b92915050565b5f60c0828403121561477f5761477e6145cc565b5b61478960c061462e565b90505f6147988482850161467c565b5f8301525060206147ab848285016146c1565b60208301525060406147bf848285016146f8565b60408301525060606147d384828501614733565b60608301525060806147e784828501614733565b60808301525060a06147fb84828501614756565b60a08301525092915050565b5f60c0828403121561481c5761481b613e7a565b5b5f6148298482850161476a565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f819050919050565b5f819050919050565b5f61488b6148866148818461485f565b614868565b613e40565b9050919050565b61489b81614871565b82525050565b5f819050919050565b5f6148c46148bf6148ba846148a1565b614868565b613e40565b9050919050565b6148d4816148aa565b82525050565b5f60a0820190506148ed5f8301886142c2565b6148fa6020830187613e49565b6149076040830186614892565b61491460608301856148cb565b61492160808301846142c2565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61496282613e40565b915061496d83613e40565b92508282019050808211156149855761498461492b565b5b92915050565b5f61499582613e40565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149c7576149c661492b565b5b600182019050919050565b5f6149dc82613e40565b91506149e783613e40565b92508282026149f581613e40565b91508282048414831517614a0c57614a0b61492b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a4a82613e40565b9150614a5583613e40565b925082614a6557614a64614a13565b5b828204905092915050565b5f606082019050614a835f8301866142c2565b614a9060208301856142c2565b614a9d6040830184613e49565b949350505050565b614aae81613f02565b8114614ab8575f80fd5b50565b5f81519050614ac981614aa5565b92915050565b5f60208284031215614ae457614ae3613e7a565b5b5f614af184828501614abb565b91505092915050565b5f614b0482613e40565b9150614b0f83613e40565b9250828203905081811115614b2757614b2661492b565b5b92915050565b614b3681613e82565b82525050565b5f602082019050614b4f5f830184614b2d565b92915050565b5f606082019050614b685f8301866142c2565b614b756020830185613e49565b614b826040830184613e49565b94935050505056fea264697066735822122088b642f3738a77f31ba65b92af75efc41cc048a13f360f3d5b46955fa0ef7bf764736f6c634300081a00330000000000000000000000004d10ca62be4160d6e79735b609320df7cb58933d00000000000000000000000016c79a8dabaae7f4ab9e40b1ee40889a89bc8d74000000000000000000000000f53d4f2e79d66605ae7c2cadc0a40a1e7cbe973a

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610309575f3560e01c80638305b4491161019b578063b6a0df9d116100e7578063e37a48c8116100a0578063e80521741161007a578063e805217414610953578063e90225cb14610983578063eaf3cc0a146109a1578063f2fde38b146109d157610309565b8063e37a48c81461090d578063e3af6d0a1461092b578063e3d3227d1461094957610309565b8063b6a0df9d14610839578063cbc028fe14610869578063d592757e14610887578063da4d5129146108b7578063dd62ed3e146108c1578063e12fc670146108f157610309565b806395d89b4111610154578063a2573e5b1161012e578063a2573e5b1461079f578063a67be471146107bd578063a9059cbb146107ed578063b269fb311461081d57610309565b806395d89b4114610747578063996e96f0146107655780639ed992201461078357610309565b80638305b4491461068357806386156c73146106a157806389205c8c146106bf5780638a3a73ff146106dd5780638da5cb5b1461070d578063916c37d51461072b57610309565b806333f3fd781161025a57806345a1b92c116102135780636a74cf62116101ed5780636a74cf621461060f57806370a082311461062d578063715018a61461065d5780637d6b32531461066757610309565b806345a1b92c146105a55780635109c57c146105c157806354f5d028146105f157610309565b806333f3fd78146104e9578063341ccbf9146105055780633a9693e1146105355780633c34267f1461055157806341b1aa221461056d578063422e5f2c1461058957610309565b806318160ddd116102c757806323b872dd116102a157806323b872dd1461043b57806329b70d7a1461046b5780632d705a1e1461049b578063313ce567146104cb57610309565b806318160ddd146103e35780631a2fc785146104015780631ae409c01461041d57610309565b8062ecd37b1461030d57806301ffc9a71461032b57806306fdde031461035b578063095ea7b3146103795780631371bb40146103a957806313aad510146103d9575b5f80fd5b6103156109ed565b6040516103229190613e58565b60405180910390f35b61034560048036038101906103409190613ed7565b6109f6565b6040516103529190613f1c565b60405180910390f35b610363610aae565b6040516103709190613fa5565b60405180910390f35b610393600480360381019061038e9190614049565b610b3e565b6040516103a09190613f1c565b60405180910390f35b6103c360048036038101906103be9190614087565b610b60565b6040516103d09190613e58565b60405180910390f35b6103e1610be2565b005b6103eb610c10565b6040516103f89190613e58565b60405180910390f35b61041b600480360381019061041691906140c5565b610c19565b005b610425610cde565b6040516104329190613e58565b60405180910390f35b610455600480360381019061045091906140f0565b610ce7565b6040516104629190613f1c565b60405180910390f35b610485600480360381019061048091906140c5565b610d15565b6040516104929190613e58565b60405180910390f35b6104b560048036038101906104b09190614140565b610d5b565b6040516104c29190613e58565b60405180910390f35b6104d3610d75565b6040516104e09190614186565b60405180910390f35b61050360048036038101906104fe919061419f565b610d7d565b005b61051f600480360381019061051a9190614049565b610dcd565b60405161052c9190613e58565b60405180910390f35b61054f600480360381019061054a91906140c5565b610e23565b005b61056b60048036038101906105669190614140565b610f51565b005b61058760048036038101906105829190614277565b610fa5565b005b6105a3600480360381019061059e91906140c5565b611820565b005b6105bf60048036038101906105ba9190614049565b6118e4565b005b6105db60048036038101906105d691906140c5565b6118e8565b6040516105e89190613f1c565b60405180910390f35b6105f961193a565b6040516106069190613e58565b60405180910390f35b610617611943565b6040516106249190613e58565b60405180910390f35b610647600480360381019061064291906140c5565b61194c565b6040516106549190613e58565b60405180910390f35b610665611991565b005b610681600480360381019061067c91906140c5565b6119a4565b005b61068b611bec565b6040516106989190613e58565b60405180910390f35b6106a9611bf5565b6040516106b69190613e58565b60405180910390f35b6106c7611bfe565b6040516106d49190613e58565b60405180910390f35b6106f760048036038101906106f291906140c5565b611c07565b6040516107049190613f1c565b60405180910390f35b610715611c59565b60405161072291906142d1565b60405180910390f35b61074560048036038101906107409190614140565b611c81565b005b61074f61214a565b60405161075c9190613fa5565b60405180910390f35b61076d6121da565b60405161077a91906142d1565b60405180910390f35b61079d600480360381019061079891906142ea565b612202565b005b6107a7612251565b6040516107b491906142d1565b60405180910390f35b6107d760048036038101906107d2919061434e565b612279565b6040516107e49190614495565b60405180910390f35b61080760048036038101906108029190614049565b61242d565b6040516108149190613f1c565b60405180910390f35b610837600480360381019061083291906140c5565b61244f565b005b610853600480360381019061084e91906140c5565b612594565b6040516108609190613e58565b60405180910390f35b610871612697565b60405161087e9190613e58565b60405180910390f35b6108a1600480360381019061089c9190614140565b6126a0565b6040516108ae9190613e58565b60405180910390f35b6108bf6126ba565b005b6108db60048036038101906108d69190614087565b612795565b6040516108e89190613e58565b60405180910390f35b61090b600480360381019061090691906140c5565b612817565b005b61091561299a565b6040516109229190613e58565b60405180910390f35b6109336129a3565b6040516109409190613e58565b60405180910390f35b6109516129ca565b005b61096d600480360381019061096891906140c5565b612ae7565b60405161097a9190613e58565b60405180910390f35b61098b612b2d565b60405161099891906142d1565b60405180910390f35b6109bb60048036038101906109b691906140c5565b612b55565b6040516109c89190613e58565b60405180910390f35b6109eb60048036038101906109e691906140c5565b612b9b565b005b5f601554905090565b5f6301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aa757507f45a1b92c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610abd906144e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae9906144e2565b8015610b345780601f10610b0b57610100808354040283529160200191610b34565b820191905f5260205f20905b815481529060010190602001808311610b1757829003601f168201915b5050505050905090565b5f80610b48612c1f565b9050610b55818585612c26565b600191505092915050565b5f60105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610c0d81612c38565b50565b5f600254905090565b610c21612dce565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c86576040517f9206838200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f600654905090565b5f80610cf1612c1f565b9050610cfe858285612e55565b610d09858585612ee7565b60019150509392505050565b5f600f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f600b5f8381526020019081526020015f20549050919050565b5f6012905090565b610d85612fd7565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610db081612c38565b610dbd868686868661301d565b50610dc6613050565b5050505050565b5f60095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f2054905092915050565b60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ea9576040517fd767ecd500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f0e576040517f9206838200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060125f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610f59612fd7565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f8481612c38565b610f8e338361305a565b610f99335f846130d9565b50610fa2613050565b50565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610fd081612c38565b610fd8612fd7565b601c610fe2610cde565b111561101a576040517fd187eef600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8282905073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff16635c3ef13033306040518363ffffffff1660e01b815260040161106d929190614512565b602060405180830381865afa158015611088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ac919061454d565b10156110e4576040517f86a6dfae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f5b858590508110156112fd575f73f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff1662ae5faa3389898681811061113757611136614578565b5b905060200201356040518363ffffffff1660e01b815260040161115b9291906145a5565b60c0604051808303815f875af1158015611177573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119b9190614807565b90505f60028111156111b0576111af614832565b5b8160a0015160028111156111c7576111c6614832565b5b1480156111ec57505f815f015172ffffffffffffffffffffffffffffffffffffff1614155b156112e15773f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166377a542693389898681811061123557611234614578565b5b905060200201355f600860145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518663ffffffff1660e01b81526004016112819594939291906148da565b5f604051808303815f87803b158015611298575f80fd5b505af11580156112aa573d5f803e3d5ffd5b50505050805f015172ffffffffffffffffffffffffffffffffffffff16846112d29190614958565b9350826112de9061498b565b92505b601c83036112ef57506112fd565b5080806001019150506110e8565b508173f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161134c91906142d1565b602060405180830381865afa158015611367573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061138b919061454d565b10156113c3576040517ffd2a3cae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6127106107d0846113d591906149d2565b6113df9190614a40565b905073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166323b872dd3373410e10c33a49279f78cb99c8d816f18d5e7d5404846040518463ffffffff1660e01b815260040161144693929190614a70565b6020604051808303815f875af1158015611462573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114869190614acf565b5073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff1663bb88603c6040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156114e0575f80fd5b505af11580156114f2573d5f803e3d5ffd5b505050505f6127106108988561150891906149d2565b6115129190614a40565b905073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166323b872dd3360135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161158693929190614a70565b6020604051808303815f875af11580156115a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c69190614acf565b505f6127106101f4866115d991906149d2565b6115e39190614a40565b905073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166323b872dd3360125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b815260040161165793929190614a70565b6020604051808303815f875af1158015611673573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116979190614acf565b5073f19308f923582a6f7c465e5ce7a9dc1bec6665b173ffffffffffffffffffffffffffffffffffffffff166323b872dd3360145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168486888b6116f99190614afa565b6117039190614afa565b61170d9190614afa565b6040518463ffffffff1660e01b815260040161172b93929190614a70565b6020604051808303815f875af1158015611747573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176b9190614acf565b505f60028661177a91906149d2565b905061178633826132c3565b8060175f8282546117979190614958565b9250508190555085846117aa9190614958565b60185f8282546117ba9190614958565b92505081905550806117ca610cde565b3373ffffffffffffffffffffffffffffffffffffffff167f74f51c14cea6ce944f7b9299e147dd51402823abca664482383d87ee93014a5b60405160405180910390a450505050505061181b613050565b505050565b611828612dce565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361188d576040517f9206838200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5050565b5f601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f600d54905090565b5f601854905090565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611999612dce565b6119a25f6133e3565b565b6119ac612dce565b8073ffffffffffffffffffffffffffffffffffffffff166301ffc9a78060e01b6040518263ffffffff1660e01b81526004016119e89190614b3c565b602060405180830381865afa158015611a03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a279190614acf565b1580611ac857508073ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f892c1ced000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401611a879190614b3c565b602060405180830381865afa158015611aa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac69190614acf565b155b15611aff576040517f524561ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060145f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506001601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f601754905090565b5f600854905090565b5f601954905090565b5f601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611cac81612c38565b611cb4612fd7565b5f8203611ced576040517f8be8f2b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6127106107d084611cff91906149d2565b611d099190614a40565b9050735c47902c8c80779cb99235e42c354e53f38c3b0d73ffffffffffffffffffffffffffffffffffffffff166323b872dd3373a3144e7fcced79ce6ff6e14ae9d8df229417a7a2846040518463ffffffff1660e01b8152600401611d7093929190614a70565b6020604051808303815f875af1158015611d8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db09190614acf565b50735c47902c8c80779cb99235e42c354e53f38c3b0d73ffffffffffffffffffffffffffffffffffffffff1663d9580be973a3144e7fcced79ce6ff6e14ae9d8df229417a7a26040518263ffffffff1660e01b8152600401611e1291906142d1565b5f604051808303815f87803b158015611e29575f80fd5b505af1158015611e3b573d5f803e3d5ffd5b505050505f61271061089885611e5191906149d2565b611e5b9190614a40565b9050735c47902c8c80779cb99235e42c354e53f38c3b0d73ffffffffffffffffffffffffffffffffffffffff166323b872dd3360135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401611ecf93929190614a70565b6020604051808303815f875af1158015611eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f0f9190614acf565b505f6127106101f486611f2291906149d2565b611f2c9190614a40565b9050735c47902c8c80779cb99235e42c354e53f38c3b0d73ffffffffffffffffffffffffffffffffffffffff166323b872dd3360125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401611fa093929190614a70565b6020604051808303815f875af1158015611fbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe09190614acf565b50735c47902c8c80779cb99235e42c354e53f38c3b0d73ffffffffffffffffffffffffffffffffffffffff166323b872dd3360145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168486888b6120429190614afa565b61204c9190614afa565b6120569190614afa565b6040518463ffffffff1660e01b815260040161207493929190614a70565b6020604051808303815f875af1158015612090573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b49190614acf565b506120bf33866132c3565b8460155f8282546120d09190614958565b925050819055508260165f8282546120e89190614958565b92505081905550846120f8610cde565b3373ffffffffffffffffffffffffffffffffffffffff167f74f51c14cea6ce944f7b9299e147dd51402823abca664482383d87ee93014a5b60405160405180910390a4505050612146613050565b5050565b606060048054612159906144e2565b80601f0160208091040260200160405190810160405280929190818152602001828054612185906144e2565b80156121d05780601f106121a7576101008083540402835291602001916121d0565b820191905f5260205f20905b8154815290600101906020018083116121b357829003601f168201915b5050505050905090565b5f60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61220a612fd7565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661223581612c38565b612242858585853361301d565b5061224b613050565b50505050565b5f60125f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060818311156122b5576040517fd951e47f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6122be610cde565b90508083116122cd57826122cf565b805b92505f600185856122e09190614afa565b6122ea9190614958565b67ffffffffffffffff811115612303576123026145d0565b5b60405190808252806020026020018201604052801561233c57816020015b612329613e22565b8152602001906001900390816123215790505b5092505f8590505b848111612423575f60095f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205490506040518060600160405280838152602001828152602001670de0b6b3a7640000600b5f8681526020019081526020015f2054846123d891906149d2565b6123e29190614a40565b8152508584806123f19061498b565b95508151811061240457612403614578565b5b602002602001018190525050808061241b9061498b565b915050612344565b5050509392505050565b5f80612437612c1f565b9050612444818585612ee7565b600191505092915050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661247a81612c38565b601a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166124fa576040517f612a332e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6125048361194c565b90505f6127106103208361251891906149d2565b6125229190614a40565b90505f6127106119008461253691906149d2565b6125409190614a40565b9050612558855f84866125539190614afa565b6134a6565b6125848560135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846134a6565b61258d816136bf565b5050505050565b5f80600c5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f6125df610cde565b90505f8290505b8181101561267157600b5f8281526020019081526020015f205460095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205461265791906149d2565b846126629190614958565b935080806001019150506125e6565b505f831461269057670de0b6b3a76400008361268d9190614a40565b92505b5050919050565b5f601654905090565b5f600a5f8381526020019081526020015f20549050919050565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166126e581612c38565b6126ed612fd7565b5f6126f733612594565b90505f8103612732576040517f89ceb32d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61273b336136da565b6127453382613726565b803373ffffffffffffffffffffffffffffffffffffffff167f72b33dd56e7ab58671f352c0e2b20944dc71ace94a6a0d76df0589215d37cf7360405160405180910390a350612792613050565b50565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461289d576040517fd767ecd500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612902576040517f9206838200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060135f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f600754905090565b5f7f000000000000000000000000000000000000000000000000000000006747fa2b905090565b60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a50576040517fd767ecd500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601c5f9054906101000a900460ff1615612a96576040517f6f56087500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001601c5f6101000a81548160ff021916908315150217905550612ae560145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1669d3c21bcecceda1000000613726565b565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f60145f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b612ba3612dce565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612c13575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401612c0a91906142d1565b60405180910390fd5b612c1c816133e3565b50565b5f33905090565b612c3383838360016137a5565b505050565b5f60065490505f6001620151807f000000000000000000000000000000000000000000000000000000006747fa2b42612c719190614afa565b612c7b9190614a40565b612c859190614958565b905081811115612dc957601c821015612ceb57612cad826a52b7d2dcc80cd2e4000000613974565b6a52b7d2dcc80cd2e4000000817f502806f7cf43435d83b251173d47f99095d52c72115be741aa35f763db4a814060405160405180910390a3612d66565b612cf782600754613974565b5f612710610320600854612d0b91906149d2565b612d159190614a40565b9050806007819055508060085f828254612d2f9190614afa565b9250508190555080827f502806f7cf43435d83b251173d47f99095d52c72115be741aa35f763db4a814060405160405180910390a3505b806006819055508273ffffffffffffffffffffffffffffffffffffffff16634fe1c3536040518163ffffffff1660e01b81526004015f604051808303815f87803b158015612db2575f80fd5b505af1158015612dc4573d5f803e3d5ffd5b505050505b505050565b612dd6612c1f565b73ffffffffffffffffffffffffffffffffffffffff16612df4611c59565b73ffffffffffffffffffffffffffffffffffffffff1614612e5357612e17612c1f565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612e4a91906142d1565b60405180910390fd5b565b5f612e608484612795565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612ee15781811015612ed2578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401612ec993929190614b55565b60405180910390fd5b612ee084848484035f6137a5565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612f57575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401612f4e91906142d1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fc7575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401612fbe91906142d1565b60405180910390fd5b612fd28383836139fd565b505050565b600260055403613013576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600581905550565b613028853386612e55565b6130328383613b9f565b61303c858561305a565b6130498585858585613d3c565b5050505050565b6001600581905550565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036130ca575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016130c191906142d1565b60405180910390fd5b6130d5825f836139fd565b5050565b80600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546131259190614958565b9250508190555080600d5f82825461313d9190614958565b925050819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132595780600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546131c39190614958565b925050819055508060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546132519190614958565b925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ff16cb9ee431a9deecb9ec463e22221162e3a7994f5e4a8b1fefc32619853f455836040516132b69190613e58565b60405180910390a3505050565b5f6132cc610cde565b90505f600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036133555780600c5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b8160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205f8282546133b09190614958565b9250508190555081600a5f8381526020019081526020015f205f8282546133d79190614958565b92505081905550505050565b5f60115f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160115f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036134f6578060025f8282546134ea9190614958565b925050819055506135c4565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508181101561357f578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161357693929190614b55565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361360b578060025f8282540392505081905550613655565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516136b29190613e58565b60405180910390a3505050565b8060085f8282546136d09190614958565b9250508190555050565b6136e2610cde565b600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613796575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161378d91906142d1565b60405180910390fd5b6137a15f83836139fd565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613815575f6040517fe602df0500000000000000000000000000000000000000000000000000000000815260040161380c91906142d1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613885575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161387c91906142d1565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550801561396e578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516139659190613e58565b60405180910390a35b50505050565b5f80600a5f8581526020019081526020015f205490505f81146139c95780670de0b6b3a7640000846139a691906149d2565b6139b09190614a40565b915081600b5f8681526020019081526020015f20819055505b81847fbdb1fa05dc0b9558966cdb9f339604c1c67a886cae02191c128b02b7661a70d860405160405180910390a350505050565b601b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680613a985750601b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15613aad57613aa88383836134a6565b613b9a565b5f61271061032083613abf91906149d2565b613ac99190614a40565b90505f61271061032083613add91906149d2565b613ae79190614a40565b90505f61271061190084613afb91906149d2565b613b059190614a40565b9050613b1d865f8486613b189190614afa565b6134a6565b613b498660135f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846134a6565b613b5f86868587613b5a9190614afa565b6134a6565b613b68816136bf565b808284613b759190614afa565b613b7f9190614afa565b60195f828254613b8f9190614958565b925050819055505050505b505050565b60088282613bad9190614958565b1115613be5576040517f4ca31b7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166301ffc9a78060e01b6040518263ffffffff1660e01b8152600401613c219190614b3c565b602060405180830381865afa158015613c3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c609190614acf565b1580613d0157503373ffffffffffffffffffffffffffffffffffffffff166301ffc9a77f45a1b92c000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401613cc09190614b3c565b602060405180830381865afa158015613cdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cff9190614acf565b155b15613d38576040517f524561ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b613d478533866130d9565b5f805f8414613d6b5760648487613d5e91906149d2565b613d689190614a40565b91505b5f8514613d8d5760648587613d8091906149d2565b613d8a9190614a40565b90505b5f8214613d9f57613d9e8383613726565b5b5f8114613db157613db08782613726565b5b3373ffffffffffffffffffffffffffffffffffffffff166345a1b92c88886040518363ffffffff1660e01b8152600401613dec9291906145a5565b5f604051808303815f87803b158015613e03575f80fd5b505af1158015613e15573d5f803e3d5ffd5b5050505050505050505050565b60405180606001604052805f81526020015f81526020015f81525090565b5f819050919050565b613e5281613e40565b82525050565b5f602082019050613e6b5f830184613e49565b92915050565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613eb681613e82565b8114613ec0575f80fd5b50565b5f81359050613ed181613ead565b92915050565b5f60208284031215613eec57613eeb613e7a565b5b5f613ef984828501613ec3565b91505092915050565b5f8115159050919050565b613f1681613f02565b82525050565b5f602082019050613f2f5f830184613f0d565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f613f7782613f35565b613f818185613f3f565b9350613f91818560208601613f4f565b613f9a81613f5d565b840191505092915050565b5f6020820190508181035f830152613fbd8184613f6d565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613fee82613fc5565b9050919050565b613ffe81613fe4565b8114614008575f80fd5b50565b5f8135905061401981613ff5565b92915050565b61402881613e40565b8114614032575f80fd5b50565b5f813590506140438161401f565b92915050565b5f806040838503121561405f5761405e613e7a565b5b5f61406c8582860161400b565b925050602061407d85828601614035565b9150509250929050565b5f806040838503121561409d5761409c613e7a565b5b5f6140aa8582860161400b565b92505060206140bb8582860161400b565b9150509250929050565b5f602082840312156140da576140d9613e7a565b5b5f6140e78482850161400b565b91505092915050565b5f805f6060848603121561410757614106613e7a565b5b5f6141148682870161400b565b93505060206141258682870161400b565b925050604061413686828701614035565b9150509250925092565b5f6020828403121561415557614154613e7a565b5b5f61416284828501614035565b91505092915050565b5f60ff82169050919050565b6141808161416b565b82525050565b5f6020820190506141995f830184614177565b92915050565b5f805f805f60a086880312156141b8576141b7613e7a565b5b5f6141c58882890161400b565b95505060206141d688828901614035565b94505060406141e788828901614035565b93505060606141f888828901614035565b92505060806142098882890161400b565b9150509295509295909350565b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261423757614236614216565b5b8235905067ffffffffffffffff8111156142545761425361421a565b5b6020830191508360208202830111156142705761426f61421e565b5b9250929050565b5f806020838503121561428d5761428c613e7a565b5b5f83013567ffffffffffffffff8111156142aa576142a9613e7e565b5b6142b685828601614222565b92509250509250929050565b6142cb81613fe4565b82525050565b5f6020820190506142e45f8301846142c2565b92915050565b5f805f806080858703121561430257614301613e7a565b5b5f61430f8782880161400b565b945050602061432087828801614035565b935050604061433187828801614035565b925050606061434287828801614035565b91505092959194509250565b5f805f6060848603121561436557614364613e7a565b5b5f6143728682870161400b565b935050602061438386828701614035565b925050604061439486828701614035565b9150509250925092565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6143d081613e40565b82525050565b606082015f8201516143ea5f8501826143c7565b5060208201516143fd60208501826143c7565b50604082015161441060408501826143c7565b50505050565b5f61442183836143d6565b60608301905092915050565b5f602082019050919050565b5f6144438261439e565b61444d81856143a8565b9350614458836143b8565b805f5b8381101561448857815161446f8882614416565b975061447a8361442d565b92505060018101905061445b565b5085935050505092915050565b5f6020820190508181035f8301526144ad8184614439565b905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806144f957607f821691505b60208210810361450c5761450b6144b5565b5b50919050565b5f6040820190506145255f8301856142c2565b61453260208301846142c2565b9392505050565b5f815190506145478161401f565b92915050565b5f6020828403121561456257614561613e7a565b5b5f61456f84828501614539565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6040820190506145b85f8301856142c2565b6145c56020830184613e49565b9392505050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61460682613f5d565b810181811067ffffffffffffffff82111715614625576146246145d0565b5b80604052505050565b5f614637613e71565b905061464382826145fd565b919050565b5f72ffffffffffffffffffffffffffffffffffffff82169050919050565b61466f81614648565b8114614679575f80fd5b50565b5f8151905061468a81614666565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b6146b481614690565b81146146be575f80fd5b50565b5f815190506146cf816146ab565b92915050565b5f61ffff82169050919050565b6146eb816146d5565b81146146f5575f80fd5b50565b5f81519050614706816146e2565b92915050565b5f65ffffffffffff82169050919050565b6147268161470c565b8114614730575f80fd5b50565b5f815190506147418161471d565b92915050565b60038110614753575f80fd5b50565b5f8151905061476481614747565b92915050565b5f60c0828403121561477f5761477e6145cc565b5b61478960c061462e565b90505f6147988482850161467c565b5f8301525060206147ab848285016146c1565b60208301525060406147bf848285016146f8565b60408301525060606147d384828501614733565b60608301525060806147e784828501614733565b60808301525060a06147fb84828501614756565b60a08301525092915050565b5f60c0828403121561481c5761481b613e7a565b5b5f6148298482850161476a565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f819050919050565b5f819050919050565b5f61488b6148866148818461485f565b614868565b613e40565b9050919050565b61489b81614871565b82525050565b5f819050919050565b5f6148c46148bf6148ba846148a1565b614868565b613e40565b9050919050565b6148d4816148aa565b82525050565b5f60a0820190506148ed5f8301886142c2565b6148fa6020830187613e49565b6149076040830186614892565b61491460608301856148cb565b61492160808301846142c2565b9695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61496282613e40565b915061496d83613e40565b92508282019050808211156149855761498461492b565b5b92915050565b5f61499582613e40565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149c7576149c661492b565b5b600182019050919050565b5f6149dc82613e40565b91506149e783613e40565b92508282026149f581613e40565b91508282048414831517614a0c57614a0b61492b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a4a82613e40565b9150614a5583613e40565b925082614a6557614a64614a13565b5b828204905092915050565b5f606082019050614a835f8301866142c2565b614a9060208301856142c2565b614a9d6040830184613e49565b949350505050565b614aae81613f02565b8114614ab8575f80fd5b50565b5f81519050614ac981614aa5565b92915050565b5f60208284031215614ae457614ae3613e7a565b5b5f614af184828501614abb565b91505092915050565b5f614b0482613e40565b9150614b0f83613e40565b9250828203905081811115614b2757614b2661492b565b5b92915050565b614b3681613e82565b82525050565b5f602082019050614b4f5f830184614b2d565b92915050565b5f606082019050614b685f8301866142c2565b614b756020830185613e49565b614b826040830184613e49565b94935050505056fea264697066735822122088b642f3738a77f31ba65b92af75efc41cc048a13f360f3d5b46955fa0ef7bf764736f6c634300081a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000004d10ca62be4160d6e79735b609320df7cb58933d00000000000000000000000016c79a8dabaae7f4ab9e40b1ee40889a89bc8d74000000000000000000000000f53d4f2e79d66605ae7c2cadc0a40a1e7cbe973a

-----Decoded View---------------
Arg [0] : genesisAddress (address): 0x4D10ca62BE4160D6e79735B609320df7Cb58933D
Arg [1] : lPAddress (address): 0x16c79a8dABaAe7f4AB9e40b1Ee40889a89BC8d74
Arg [2] : buyAndBurnAddress (address): 0xF53D4f2E79d66605aE7c2CAdc0A40A1e7CbE973A

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000004d10ca62be4160d6e79735b609320df7cb58933d
Arg [1] : 00000000000000000000000016c79a8dabaae7f4ab9e40b1ee40889a89bc8d74
Arg [2] : 000000000000000000000000f53d4f2e79d66605ae7c2cadc0a40a1e7cbe973a


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.