Contract 0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d 2

Contract Overview

Balance:
0 MOVR

MOVR Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x2d9b3f34879b7b1d5e76e5568405a9a69dcb9c641673bc34f518562527447177Make Offer51481042023-09-20 2:29:062 days 6 hrs ago0x725f5b2e92164c38ef25a70f0807b71a7f0e770a IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00051657885
0xaed6c6b1f85386795cc581b53e1c8489a5f98a96925f56508d6991e421c5d367Make Offer51168562023-09-15 17:19:126 days 15 hrs ago0x0b3340650dde5891698e156ee117c34d827a37e4 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00051657885
0x15c66dc7628b28ebef7e0aad81782fb945d51ade8b2faa6a89f6a31bc07b0bf0Return Escrowed51168472023-09-15 17:17:246 days 15 hrs ago0x0b3340650dde5891698e156ee117c34d827a37e4 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00045881964
0x07f60e809140dbc151de458a40037d6285345379ac323a0c3a3ecdc6431d8e23Cancel Offer51168432023-09-15 17:16:366 days 15 hrs ago0x0b3340650dde5891698e156ee117c34d827a37e4 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.000293441527
0x07a46c0957d0cdea79d0c75e45507b751fdcbd9ef112ea711e956a921cc16b6bMake Offer51168322023-09-15 17:14:246 days 15 hrs ago0x0b3340650dde5891698e156ee117c34d827a37e4 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00051657885
0xd466ed90c15b4c544fc0f102085350dad5e848bbf590bc56fe40fcedbd6e695aReturn Escrowed51168052023-09-15 17:08:546 days 15 hrs ago0x0b3340650dde5891698e156ee117c34d827a37e4 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00045881964
0x3f15fa9ab51cd7d3a146aee981d73b660865019d907439424391954fc1a55a0aCancel Offer51167932023-09-15 17:06:306 days 16 hrs ago0x0b3340650dde5891698e156ee117c34d827a37e4 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00030378114
0x91c2170ab9e4a0ee13fef9a956ac55aa6dc9c6c46d7d2b09fbc9cb503ee82142Cancel Offer51167822023-09-15 17:04:186 days 16 hrs ago0x0b3340650dde5891698e156ee117c34d827a37e4 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00030378114
0xbfadefa88d47227e571fa0928a9d32b63453c83e5e4d6aaac6f8f7b5a4f1e7ffMake Offer51163622023-09-15 15:39:546 days 17 hrs ago0x24a566a73f252c2ea9e9bac5b6873cf3ba03f232 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00051657885
0x657a6e9ce0e357404103f8d3390a90c8a87b8d0e6972aa1826f74ea0ffbe07ceMake Offer51163602023-09-15 15:39:306 days 17 hrs ago0x24a566a73f252c2ea9e9bac5b6873cf3ba03f232 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00051657885
0x9df7ba1f65d36d7d8a5f6fb9a764edad52c8fa93bd58581939c5fe9ef477bf62Make Offer51163522023-09-15 15:37:546 days 17 hrs ago0x24a566a73f252c2ea9e9bac5b6873cf3ba03f232 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.000507653734
0x33d704a1f31c4c06e3dff9a0f51536a6f114b0b9c2ad086e70597de787cbb2bfBuy51163262023-09-15 15:32:406 days 17 hrs ago0x24a566a73f252c2ea9e9bac5b6873cf3ba03f232 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.002898350437
0x267862089f471f88df5b34f41702cdaaa6398abe55dffca1f7bdc40cd59ddc7bBuy51163232023-09-15 15:32:066 days 17 hrs ago0x24a566a73f252c2ea9e9bac5b6873cf3ba03f232 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.002854869254
0x434399014b3d8519a7b8a70e66e73c121e5836cb961c9a03869f3993d956200eBuy51163202023-09-15 15:31:306 days 17 hrs ago0x24a566a73f252c2ea9e9bac5b6873cf3ba03f232 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.0029116584
0x19ee6091db0410949fe05b133548e5ac6652d22ec6db862c7c3af8a33f322092Buy51163172023-09-15 15:30:546 days 17 hrs ago0x24a566a73f252c2ea9e9bac5b6873cf3ba03f232 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.002918349225
0x8a0e221080287dfa1f41989c16a2460c8fe89b45fe6fdcbe4559af43a5247b08Buy51163092023-09-15 15:29:186 days 17 hrs ago0x24a566a73f252c2ea9e9bac5b6873cf3ba03f232 IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.002924020215
0x60bab64c21e4d193286c98b1fc99b4a0fc387ec4ea629c9c9a6c7a187cb01625Change Price51162902023-09-15 15:25:246 days 17 hrs ago0xa9344c3e4af194e0add567a402805bd121de95db IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00029831058
0x481ca57186976180ef9390de0109d5918b55dd93bf2891e5937f52bc9e07b661Change Price51162812023-09-15 15:23:366 days 17 hrs ago0xa9344c3e4af194e0add567a402805bd121de95db IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00029831058
0x1fabb96c4724b77bea6842ab54815f55342b8d4d65035835d1c05009a2229468Change Price51162762023-09-15 15:22:366 days 17 hrs ago0xa9344c3e4af194e0add567a402805bd121de95db IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00029831058
0xf002ab5fbc84b9b83625303e488d968d8c17a36a1de9174ce1fb996448765c6aChange Price51162702023-09-15 15:21:196 days 17 hrs ago0xa9344c3e4af194e0add567a402805bd121de95db IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00029831058
0x9747d046e5024e4895f9b4d55975cd216b383ddccdb0ddeec7e934404d14c14bChange Price51162652023-09-15 15:20:186 days 17 hrs ago0xa9344c3e4af194e0add567a402805bd121de95db IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.000278322
0x8188c9a99d4c77b4b50dfae2405c2d105b8ac5fbf410ddf43e231072bdf3451eList51162492023-09-15 15:17:066 days 17 hrs ago0xa9344c3e4af194e0add567a402805bd121de95db IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00030316806
0xdf7a856659e3905c603c4df4ad63db1b5f40b18f8109468edf7ec3c3a8fa8b36List51162452023-09-15 15:16:186 days 17 hrs ago0xa9344c3e4af194e0add567a402805bd121de95db IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00030316806
0xa9688492a3d04bc9bff0c3eebb314e68d043a21c894ec5b2d5c3a9fe16b52221List51162292023-09-15 15:13:066 days 17 hrs ago0xa9344c3e4af194e0add567a402805bd121de95db IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.00030316806
0x90849f2e207670029100e048140b3b413f7166f8de24a6441a02a9318bd2d5b9List51162202023-09-15 15:11:186 days 17 hrs ago0xa9344c3e4af194e0add567a402805bd121de95db IN  0x913a3e067a559ba24a7a06a6cdea4837eeeaf72d0 MOVR0.000282854
[ Download CSV Export 
Parent Txn Hash Block From To Value
Index Block
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LandSaleMarket

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity Multiple files format)

File 1 of 7: LandSaleMarket.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

import "./LandSale.sol";
import "./IERC20.sol";

contract LandSaleMarket is LandSale {

    event PlotListed(uint256 indexed plotId, address indexed seller, uint256 price);
    event PlotPriceChanged(uint256 indexed plotId, address indexed seller, uint256 oldPrice, uint256 newPrice);
    event PlotDelisted(uint256 indexed plotId, address indexed seller);
    event PlotPurchased(uint256 indexed plotId, address indexed seller, address indexed buyer, uint256 price);
    event OfferMade(uint256 indexed plotId, address indexed buyer, uint256 price);
    event OfferCancelled(uint256 indexed plotId, address indexed buyer, uint256 price);
    event EscrowReturned(address indexed buyer, uint256 value);
    event PlotTransferred(uint256 indexed plotIds, address indexed oldOwner, address indexed newOwner);

    struct Listing {
        uint256 price;
        uint256 timestamp;
    }

    struct Offer {
        address buyer;
        uint256 price;
        uint256 timestamp;
        bool cancelled;
    }

    bool private _pausedSales;
    bool private _pausedTransfers;
    uint256 private _creatorFee;

    mapping(uint256 => Listing) private _listings;
    mapping(uint256 => Offer[]) private _offers;
    mapping(address => uint256) private _claimableEscrow;

    constructor(uint256 commonPrice, uint256 rarePrice, uint256 epicPrice, uint256 creatorFee)
        LandSale(commonPrice, rarePrice, epicPrice)
    {
        _creatorFee = creatorFee;
        _pausedSales = true;
        _pausedTransfers = true;
    }

    modifier notPaused () {
        require(!_pausedSales, "Sales are paused");
        _;
    }

    // Setings
    function setPausedSales(bool paused) external onlyOwnerOrAdmin {
        _pausedSales = paused;
    }
    function setPausedTransfers(bool paused) external onlyOwnerOrAdmin {
        _pausedTransfers = paused;
    }

    function setCreatorFee(uint256 creatorFee) external onlyOwnerOrAdmin {
        _creatorFee = creatorFee;
    }

    function getPausedSales() external view returns (bool) {
        return _pausedSales;
    }

    function getPausedTransfers() external view returns (bool) {
        return _pausedTransfers;
    }

    function getCreatorFee() external view returns (uint256) {
        return _creatorFee;
    }

    // List - Buy - Offer

    function list(uint256 plotId, uint256 price) external onlyPlotOwner(plotId) notPaused {
        require(price > 0, "Price must be greater than 0");
        require(getPlotRarity(plotId) != Rarity.Harb, "Cannot list Harberger land");
        _listings[plotId] = Listing(price, block.timestamp);

        emit PlotListed(plotId, msg.sender, price);
    }

    function changePrice(uint256 plotId, uint256 newPrice) external onlyPlotOwner(plotId) {
        require(newPrice > 0, "Price must be greater than 0");
        uint oldPrice = _listings[plotId].price;
        require(oldPrice > 0, "Not listed");
        _listings[plotId].price = newPrice;

        emit PlotPriceChanged(plotId, msg.sender, oldPrice, newPrice);
    }

    function delist(uint256 plotId) external onlyPlotOwner(plotId) {
        _delist(plotId, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        emit PlotDelisted(plotId, msg.sender);
    }

    function _delist(uint256 plotId, uint256 doNotReturnIndex) private {
        delete _listings[plotId];
        Offer[] memory offers = _offers[plotId];
        uint numOffers = offers.length;
        for (uint i; i<numOffers;) {
            if (!offers[i].cancelled && i != doNotReturnIndex) {
                _claimableEscrow[offers[i].buyer] += offers[i].price;
            }
            unchecked { ++i; }
        }
        delete _offers[plotId];
    }

    function buy(uint256 plotId, uint256 price) external notPaused {
        Listing memory listing = _listings[plotId];
        require(listing.price > 0, "Not listed");
        IERC20 rmrkToken = IERC20(xcRMRK);
        require(rmrkToken.allowance(msg.sender, address(this)) >= listing.price, "Not enough allowance");
        require(price == listing.price, "Price does not match");

        _delist(plotId, 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        address previousOwner = getPlotOwner(plotId);
        setPlotOwner(msg.sender, plotId);
        (uint pay, uint fee) = _getPayAndFee(listing.price);
        rmrkToken.transferFrom(msg.sender, previousOwner, pay);
        rmrkToken.transferFrom(msg.sender, beneficiary, fee);

        emit PlotPurchased(plotId, previousOwner, msg.sender, price);
    }

    function makeOffer(uint256 plotId, uint256 price) external notPaused {
        require(price > 0, "Price must be higher than 0");
        address plotOwner = getPlotOwner(plotId);
        require(plotOwner != msg.sender, "User is land owner");
        require(plotOwner != address(0), "Plot not sellable"); //
        require(getPlotRarity(plotId) != Rarity.Harb, "Cannot offer on Harberger land");

        uint listingPrice = _listings[plotId].price;
        // This check only applies if listed:
        if (listingPrice > 0) {
            require(price < listingPrice, "Offer over listed price");
        }

        IERC20 rmrkToken = IERC20(xcRMRK);
        require(rmrkToken.allowance(msg.sender, address(this)) >= price, "Not enough allowance");

        Offer memory offer = Offer(msg.sender, price, block.timestamp, false);
        _offers[plotId].push(offer);
        rmrkToken.transferFrom(msg.sender, address(this), price);

        emit OfferMade(plotId, msg.sender, price);
    }

    function cancelOffer(uint256 plotId, uint256 offerIndex) external {
        require(offerIndex < _offers[plotId].length, "Offer index out of range");
        Offer memory offer = _offers[plotId][offerIndex];
        require(msg.sender == offer.buyer, "User is not offer owner");
        require(!offer.cancelled, "Offer already cancelled");

        _claimableEscrow[offer.buyer] += offer.price;
        _offers[plotId][offerIndex].cancelled = true;

        emit OfferCancelled(plotId, msg.sender, offer.price);
    }

    function getOffers(uint256 plotId) external view returns(Offer[] memory) {
        return _offers[plotId];
    }

    function acceptOffer(uint256 plotId, uint256 offerIndex, uint256 price) external onlyPlotOwner(plotId) notPaused {
        require(offerIndex < _offers[plotId].length, "Offer index out of range");
        Offer memory offer = _offers[plotId][offerIndex];
        require(!offer.cancelled, "Offer already cancelled");
        require(offer.price == price, "Price does not match");

        _delist(plotId, offerIndex);
        setPlotOwner(offer.buyer, plotId);

        IERC20 rmrkToken = IERC20(xcRMRK);
        (uint pay, uint fee) = _getPayAndFee(offer.price);
        rmrkToken.transfer(msg.sender, pay);
        rmrkToken.transfer(beneficiary, fee);
        emit PlotPurchased(plotId, msg.sender, offer.buyer, price);
    }

    function returnEscrowed() external {
        uint256 returnValue = _claimableEscrow[msg.sender];
        require(returnValue > 0, "No escrow to return");
        _claimableEscrow[msg.sender] = 0;
        IERC20(xcRMRK).transfer(msg.sender, returnValue);

        emit EscrowReturned(msg.sender, returnValue);
    }

    // Transfer

    function transfer(uint plotId, address newOwner) external onlyPlotOwner(plotId) {
        require(newOwner != msg.sender, "Cannot transfer to self");
        require(!_pausedTransfers, "Transfers are paused");
        require(_listings[plotId].price == 0, "Cannot transfer listed plot");
        require(getPlotRarity(plotId) != Rarity.Harb, "Cannot transfer Harberger land");

        setPlotOwner(newOwner, plotId);
        emit PlotTransferred(plotId, msg.sender, newOwner);
    }

    // Utilities
    function getIsListed(uint256 plotId) external view returns (bool) {
        return _listings[plotId].price > 0; 
    }

    function getListedInfo(uint256 plotId) external view returns (uint256, uint256) {
        Listing memory listing = _listings[plotId];
        require(listing.price > 0, "Not listed");
        return (listing.price, listing.timestamp);
    }

    function getListedPrice(uint256 plotId) external view returns (uint256) {
        uint256 price = _listings[plotId].price;
        require(price > 0, "Not listed");
        return price;
    }

    function getCurrentBid(uint256 plotId) external view returns (uint256) {
        Offer[] memory offers = _offers[plotId];
        uint numOffers = offers.length;
        uint currentBid = 0;
        for (uint i; i<numOffers;) {
            if (!offers[i].cancelled && offers[i].price > currentBid) {
                currentBid = offers[i].price;
            }
            unchecked { ++i; }
        }
        return currentBid;
    }

    function getClaimableEscrow(address buyer) external view returns (uint256) {
        return _claimableEscrow[buyer];
    }

    function _getPayAndFee(uint256 price) private view returns (uint256, uint256) {
        uint256 fee = uint256(price * _creatorFee) / _PRICE_PRECISION;
        uint256 pay = uint256(price - fee);
        return (pay, fee);
    }

}

File 2 of 7: AdminAccessible.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

contract AdminAccesible {
    address private _owner;
    // int as value is cheaper than boolean:
    mapping(address => uint) private _admins;

    modifier onlyOwner {
        require(msg.sender == _owner, "User is not owner.");
        _;
    }

    modifier onlyOwnerOrAdmin {
        require(msg.sender == _owner || isAdmin(msg.sender), "User is not owner or admin.");
        _;
    }

    constructor () {
        _owner = msg.sender;
    }

    function addAdmin(address admin) external onlyOwner {
        require(admin != address(0), "Admin cannot be the zero address");
        _admins[admin] = 1;
    }

    function revokeAdmin(address admin) external onlyOwner {
        delete _admins[admin];
    }

    function isAdmin(address admin) public view returns (bool) {
        return _admins[admin] == 1;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        require(newOwner != address(0), "Owner cannot be the zero address");
        _owner = newOwner;
    }

    function getOwner() external view returns(address) {
        return _owner;
    }
}

File 3 of 7: IERC20.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

interface IERC20 {
    function transfer(
        address to,
        uint256 amount
    ) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);
}

File 4 of 7: LandSale.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

import "./UserData.sol";
import "./Plots.sol";
import "./IERC20.sol";

contract LandSale is Plots {

    event PlotsBought(uint256[] plotIds, address indexed buyer, address indexed referrer, bool indexed boughtWithCredits);

    // All discounts should be in terms of x / 1_000_000
    uint256 internal constant _PRICE_PRECISION = 1_000_000;
    uint256 internal constant _MAX_DISCOUNT = 500_000; // 50%
    uint256 internal constant _REFERRER_FEE = 50_000; // 5%
    uint256 private constant _LERP_PRECISION = 10_000;
    uint256 private constant _MIN_MASS_FOR_BIOME_DISCOUNT = 40;

    uint256 private immutable _commonPrice;
    uint256 private immutable _rarePrice;
    uint256 private immutable _epicPrice;

    uint256 private constant _XCRMRK_DECIMALS = 1*10**10;

    address internal xcRMRK;
    address internal beneficiary;
    address private _userDataAddress;

    uint256 private _whiteListPhase;
    uint256 private _dutchStart;
    uint256 private _dutchDuration;
    uint256 private _dutchMinMultiplier = 100_000;
    bool private _referralIsActive;
    uint256 private _referralMinCommonPlots; // Or equivalent in XCRMRK

    uint256 private _soldWithCredits;
    uint256 private _soldWithxcRMRK;

    mapping(address => uint) private _approvedReferrers;

    modifier checkWhitelist {
        UserData(_userDataAddress).checkWhitelist(msg.sender, _whiteListPhase);
        _;
    }

    constructor(uint256 commonPrice_, uint256 rarePrice_, uint256 epicPrice_) {
        require(commonPrice_ > _XCRMRK_DECIMALS, "Common price must be > 1 xcRMRK");
        require(rarePrice_ > _XCRMRK_DECIMALS, "Rare price must be > 1 xcRMRK");
        require(epicPrice_ > _XCRMRK_DECIMALS, "Epic price must be > 1 xcRMRK");
        _commonPrice = commonPrice_;
        _rarePrice = rarePrice_;
        _epicPrice = epicPrice_;
        _referralIsActive = true;
        _referralMinCommonPlots = 10;
    }

    function getPricesPerRarity() external view returns (uint256, uint256, uint256) {
        return (_commonPrice, _rarePrice, _epicPrice);
    }

    function getReferralIsActive() external view returns (bool) {
        return _referralIsActive;
    }

    function setReferralIsActive(bool isActive) external onlyOwnerOrAdmin {
        _referralIsActive = isActive;
    }

    function getReferralMinCommonPlots() external view returns (uint256) {
        return _referralMinCommonPlots;
    }

    function setReferralMinCommonPlots(uint256 minCommonPlots) external onlyOwnerOrAdmin {
        _referralMinCommonPlots = minCommonPlots;
    }

    function addReferrer(address referrer) external onlyOwnerOrAdmin {
        require(referrer != address(0), "Referrer cannot be the 0 address");
        _approvedReferrers[referrer] = 1;
    }

    function removeReferrer(address referrer) external onlyOwnerOrAdmin {
        delete _approvedReferrers[referrer];
    }

    function isReferrer(address referrer) external view returns (bool) {
        return _approvedReferrers[referrer] == 1;
    }

    function getNumPlotsSold() external view returns (uint256, uint256) {
        return (_soldWithxcRMRK, _soldWithCredits);
    }

    function buyPlots(
        uint256[] calldata plotIds,
        uint256[] calldata singleDiscountIndexes,
        uint256[] calldata multiDiscountIndexes,
        address referrer
    ) external checkWhitelist {
        _buyPlots(plotIds, singleDiscountIndexes, multiDiscountIndexes, referrer);
    }

    function _buyPlots(
        uint256[] calldata plotIds,
        uint256[] calldata singleDiscountIndexes,
        uint256[] calldata multiDiscountIndexes,
        address referrer
    ) internal {
        require(plotIds.length > 0, "No plots to buy");
        uint256 price = _getPurchasePrice(msg.sender, plotIds, singleDiscountIndexes, multiDiscountIndexes);
        UserData(_userDataAddress).spendDiscounts(msg.sender, singleDiscountIndexes, multiDiscountIndexes);
        bool success;
        if (_referrerApplies(referrer)) {
            (uint pay, uint fee) = _getPayAndReferrerFee(price);
            success = IERC20(xcRMRK).transferFrom(msg.sender, referrer, fee);
            if (success) {
                success = IERC20(xcRMRK).transferFrom(msg.sender, beneficiary, pay);
            }
        }
        else {
            referrer = address(0);
            success = IERC20(xcRMRK).transferFrom(msg.sender, beneficiary, price);
        }

        require(success, "Landsale: TransferFrom failure");

        _processPlotBuy(plotIds, referrer, false);
    }

    function _referrerApplies(address referrer) internal view returns (bool) {
        if (referrer == address(0) || referrer == msg.sender || !_referralIsActive) {
            return false;
        }
        return canRefer(referrer);

    }

    function canRefer(address referrer) public view returns(bool) {
        if (_approvedReferrers[referrer] == 1) {
            return true;
        }
        (uint256 numCommon, uint256 numRare, uint256 numEpic, , ) = countPlotRarities(_allOwnedPlots[referrer]);
        return numCommon + numRare * 3 + numEpic * 5 >= _referralMinCommonPlots;
    }

    function _getPayAndReferrerFee(uint256 price) private pure returns (uint256, uint256) {
        uint256 fee = uint256(price * _REFERRER_FEE) / _PRICE_PRECISION;
        uint256 pay = uint256(price - fee);
        return (pay, fee);
    }

    function buyWithCredits(uint256[] calldata plotIds, Rarity creditRarity) external checkWhitelist {
        uint numPlots = plotIds.length;
        require(numPlots > 0, "No plots to buy");
        uint256 userAvailableCredits = UserData(_userDataAddress).getUserCreditsForRarity(msg.sender, creditRarity);
        require(userAvailableCredits >= numPlots, "Not enough credits in account");

        (uint256 numCommon, uint256 numRare, uint256 numEpic, uint256 numHarb, uint256 numPremium) = countPlotRarities(plotIds);
        // There are no Harb credits, but Harb can be bought with premium.
        numPremium += numHarb;
        numHarb = 0;

        if (creditRarity == Rarity.Common) {
            require(numCommon == numPlots, "Only common lands");
            UserData(_userDataAddress).spendCredits(msg.sender, numPlots, 0, 0, 0);
            _processPlotBuy(plotIds, address(0), true);
        }

        else if (creditRarity == Rarity.Rare) {
            require(numCommon + numRare == numPlots, "Only common or rare lands");
            UserData(_userDataAddress).spendCredits(msg.sender, 0, numPlots, 0, 0);
            _processPlotBuy(plotIds, address(0), true);
        }

        else if (creditRarity == Rarity.Epic) {
            require(numCommon + numRare + numEpic == numPlots, "Only common, rare or epic lands");
            UserData(_userDataAddress).spendCredits(msg.sender, 0, 0, numPlots, 0);
            _processPlotBuy(plotIds, address(0), true);
        }

        else {
            // These conditions could only break if the in chain plot data was corrupted:
            require(
                creditRarity == Rarity.Premium
                && numCommon + numRare + numEpic + numPremium == numPlots,
                "Unexpected credit rarity"
            );
            UserData(_userDataAddress).spendCredits(msg.sender, 0, 0, 0, numPlots);
            _processPlotBuy(plotIds, address(0), true);
        }
    }

    function _processPlotBuy(uint256[] memory plotIds, address referrer, bool boughtWithCredits) private {
        uint256 numPlots = plotIds.length;
        for(uint i; i<numPlots;) {
            uint256 plotId = plotIds[i];
            require(getPlotAvailability(plotId), "RMRK Landsale: Plot unavailable");
            setPlotOwner(msg.sender, plotId);
            unchecked { ++i; }
        }

        if (boughtWithCredits) {
            _soldWithCredits += plotIds.length;
        }
        else {
            _soldWithxcRMRK += plotIds.length;
        }

        emit PlotsBought(plotIds, msg.sender, referrer, boughtWithCredits);
    }

    function smartBuyWithCredits(
        uint256[] calldata plotIds,
        uint256 commonCredits,
        uint256 rareCredits,
        uint256 epicCredits,
        uint256 premiumCredits
    ) external checkWhitelist {
        _smartBuyWithCredits(plotIds, commonCredits, rareCredits, epicCredits, premiumCredits);
    }

    function _smartBuyWithCredits(
        uint256[] calldata plotIds,
        uint256 commonCredits,
        uint256 rareCredits,
        uint256 epicCredits,
        uint256 premiumCredits
    ) internal {
        require(plotIds.length > 0, "No plots to buy");
        (uint256 numCommon, uint256 numRare, uint256 numEpic, uint256 numHarb, uint256 numPremium) = countPlotRarities(plotIds);

        // There are no Harb credits, but Harb can be bought with premium.
        numPremium += numHarb;
        numHarb = 0;

        // Pass missing to the next tier, order is critical
        if(numCommon > commonCredits) {
            numRare += (numCommon - commonCredits);
            numCommon -= (numCommon - commonCredits);
        }

        // Pass missing to the next tier, order is critical
        if(numRare > rareCredits) {
            numEpic += (numRare - rareCredits);
            numRare -= (numRare - rareCredits);
        }

        // Pass missing to the next tier, order is critical
        if(numEpic > epicCredits) {
            numPremium += (numEpic - epicCredits);
            numEpic -= (numEpic - epicCredits);
        }

        require(
            commonCredits >= numCommon && rareCredits >= numRare && epicCredits >= numEpic && premiumCredits >= numPremium,
            "Not enough credits set"
        );

        UserData(_userDataAddress).spendCredits(msg.sender, numCommon, numRare, numEpic, numPremium);
        _processPlotBuy(plotIds, address(0), true);
    }

    function mixBuy(
        uint256[] calldata xcRmrkPlotIds,
        uint256[] calldata singleDiscountIndexes,
        uint256[] calldata multiDiscountIndexes,
        address referrer,
        uint256[] calldata creditsPlotIds,
        UserCredits calldata userCredits
    ) external checkWhitelist {
        _smartBuyWithCredits(creditsPlotIds, userCredits.commonCredits, userCredits.rareCredits, userCredits.epicCredits, userCredits.premiumCredits);
        _buyPlots(xcRmrkPlotIds, singleDiscountIndexes, multiDiscountIndexes, referrer);
    }

    function getPurchasePrice(
        address buyer,
        uint256[] memory plotIds,
        uint256[] calldata singleDiscountIndexes,
        uint256[] calldata multiDiscountIndexes
    ) external view returns (uint) {
        return _getPurchasePrice(buyer, plotIds, singleDiscountIndexes, multiDiscountIndexes);
    }

    function _getPurchasePrice(
        address buyer,
        uint256[] memory plotIds,
        uint256[] calldata singleDiscountIndexes,
        uint256[] calldata multiDiscountIndexes
    ) private view returns (uint) {
        uint numPlots = plotIds.length;
        require(singleDiscountIndexes.length == 0 || numPlots == 1, "Use single discounts with 1 plot");

        uint256 price = 0;
        // We load all discounts into a single array for simplicity
        UserData.Discount[] memory discounts = UserData(_userDataAddress).loadDiscounts(buyer, singleDiscountIndexes, multiDiscountIndexes);

        for (uint i; i<numPlots;) {
            PlotData memory plotData = getPlotData(plotIds[i]);
            uint256 plotPrice = _getPriceWithDiscount(plotData, discounts);
            price += plotPrice;

            unchecked { ++i; }
        }

        if (_isDutchPhase()) {
            price = _getDutchPrice(price);
        }

        return price;
    }

    function _getPriceWithDiscount(PlotData memory plotData, UserData.Discount[] memory discounts) private view returns (uint) {
        uint256 initPrice;
        uint256 discountSum;

        if (plotData.rarity == Rarity.Common) {
            initPrice = _commonPrice;
        }

        else if (plotData.rarity == Rarity.Rare) {
            initPrice = _rarePrice;
        }

        else if (plotData.rarity == Rarity.Epic) {
            initPrice = _epicPrice;
        }

        else {
            revert("Bad land rarity");
        }

        uint numDiscounts = discounts.length;
        // This should be the common case
        if (numDiscounts == 0){
            return initPrice;
        }
        UserData.Discount memory discount;

        for (uint i; i < numDiscounts;) {
            discount = discounts[i];
            if (discount.forAll) {
                discountSum += discount.discount;
            }
            else if (plotData.cyber > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forCyberBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.steampunk > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forSteampunkBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.wind > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forWindBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.volcano > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forVolcanoBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.fire > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forFireBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.water > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forWaterBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.necro > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forNecroBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.mecha > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forMechaBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.dragon > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forDragonBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.meadow > _MIN_MASS_FOR_BIOME_DISCOUNT && discount.forMeadowBiome) {
                discountSum += discount.discount;
            }
            else if (plotData.isIsland == 1 && discount.forIsland) {
                discountSum += discount.discount;
            }
            else if (plotData.isShore == 1 && discount.forShore) {
                discountSum += discount.discount;
            }
            else if (plotData.isMountainFoot == 1 && discount.forMountainFoot) {
                discountSum += discount.discount;
            }
            unchecked { ++i; }
        }

        if (discountSum > _MAX_DISCOUNT) {
            discountSum = _MAX_DISCOUNT;
        }
        return (initPrice * (_PRICE_PRECISION - discountSum)) / _PRICE_PRECISION;
    }

    function setxcRMRK(address newAddress) external onlyOwnerOrAdmin {
        xcRMRK = newAddress;
    }

    function setUserDataAddress(address newAddress) external onlyOwnerOrAdmin {
        _userDataAddress = newAddress;
    }

    function setBeneficiary(address newAddress) external onlyOwnerOrAdmin {
        beneficiary = newAddress;
    }

    function setDutchConfig(uint256 start, uint256 duration, uint256 multiplier) external onlyOwnerOrAdmin {
        require(multiplier < 1_000_000, "Value over precision");
        _dutchStart = start;
        _dutchDuration = duration;
        _dutchMinMultiplier = multiplier;
    }

    function _isDutchPhase() private view returns(bool) {
        return _whiteListPhase == 5;
    }

    function getXcRMRK() external view returns(address) {
        return xcRMRK;
    }

    function getUserDataAddress() external view returns(address) {
        return _userDataAddress;
    }

    function getBeneficiary() external view returns(address) {
        return beneficiary;
    }

    function getWhiteListPhase() external view returns(uint256) {
        return _whiteListPhase;
    }

    function getDutchStart() external view returns(uint256) {
        return _dutchStart;
    }

    function getDutchDuration() external view returns(uint256) {
        return _dutchDuration;
    }

    function getDutchMinMultiplier() external view returns(uint256) {
        return _dutchMinMultiplier;
    }

    // White list:
    function setWhitelistPhase(uint256 phaseId) external onlyOwnerOrAdmin {
        require(phaseId <= 5, "Bad phase id");
        _whiteListPhase = phaseId;
    }

    function getDutchPrice(uint256 price) external view returns(uint) {
        return _getDutchPrice(price);
    }

    function _getDutchPrice(uint256 price) private view returns(uint) {
        //Clamp to prevent underflow on currentElapsedRatio calculation
        // elapsed must be between 0 and _dutchDuration:
        uint256 elapsed = _clampUpper(_getTimeElapsed(), _dutchDuration);
        // currentElapsedRatio is between 0 (beginning of auction) to _LERP_PRECISION (end of auction)
        uint256 currentElapsedRatio = _LERP_PRECISION - (_dutchDuration - elapsed) * _LERP_PRECISION / _dutchDuration;
        // _PRICE_PRECISION is 100%
        uint256 currentPriceMultipler = _lerp(_PRICE_PRECISION, _dutchMinMultiplier, currentElapsedRatio);
        uint256 adjustedPrice = currentPriceMultipler * price / _PRICE_PRECISION;
        return adjustedPrice;
    }

    function _getTimeElapsed() private view returns(uint) {
        return _dutchStart < block.timestamp ? (block.timestamp - _dutchStart) : 0 ;
    }

    //Linear interpellation. Position has precision of _LERP_PRECISION
    function _lerp(uint256 val0, uint256 val1, uint256 position) private pure returns(uint256) {
        uint256 res = ((((_LERP_PRECISION - position) * val0) + (position * val1)) / _LERP_PRECISION);
        return res;
    }

    function _clampUpper(uint256 value, uint256 clamp) private pure returns(uint) {
        if (value < clamp){
            return value;
        }
        else {
            return clamp;
        }
    }

}

File 5 of 7: LandSaleCore.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;


contract LandSaleCore {

    enum Rarity { None, Common, Rare, Epic, Harb, Premium }
    enum Entropy { None, Seldom, Infrequent, Uncommon, Common, Frequent, Constant }

    struct UserCredits {
        uint256 commonCredits;
        uint256 rareCredits;
        uint256 epicCredits;
        uint256 premiumCredits;
    }
}

File 6 of 7: Plots.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

import "./AdminAccessible.sol";
import "./LandSaleCore.sol";


contract Plots is AdminAccesible, LandSaleCore {

    event PlotResourceSet(uint256 indexed plotId, string buyer);

    struct PlotData {
        uint8 cyber;
        uint8 steampunk;
        uint8 wind;
        uint8 volcano;
        uint8 fire;
        uint8 water;
        uint8 necro;
        uint8 mecha;
        uint8 dragon;
        uint8 meadow;
        uint8 isShore; // 0 = no, 1 = yes
        uint8 isIsland; // 0 = mainland, 1 = island
        uint8 isMountainFoot; // 0 = no, 1 = yes
        Rarity rarity;
        Entropy entropy;
    }

    struct OwnedPlotRarities {
        uint32 common;
        uint32 rare;
        uint32 epic;
        uint32 harb;
        uint32 premium;
    }

    mapping(uint256 => PlotData) private _plotData;
    mapping(uint256 => address) private _plotOwners;
    mapping(uint256 => string) private _plotImg;
    mapping(address => uint256[]) internal _allOwnedPlots;
    bool private _plotDataLock;
    bool private _migrationLock;

    modifier onlyPlotOwner (uint256 plotId) {
        require(msg.sender == _plotOwners[plotId], "User is not land owner");
        _;
    }

    function getPlotOwner(uint256 plotId) public view returns (address) {
        return _plotOwners[plotId];
    }

    function setPlotDataLock(bool state) external onlyOwnerOrAdmin {
        _plotDataLock = state;
    }

    function getMigrationLock() external view returns (bool) {
        return _migrationLock;
    }

    function lockMigration() external onlyOwnerOrAdmin {
        _migrationLock = true;
    }

    function getPlotDataLock() external view returns (bool) {
        return _plotDataLock;
    }

    function getPlotData(uint256 plotId) public view returns(PlotData memory) {
        return _plotData[plotId];
    }

    function getPlotRarity(uint256 plotId) internal view returns(Rarity) {
        return _plotData[plotId].rarity;
    }

    //Expects all arrays to be identical size.
    function setPlotDataMulti(uint256[] calldata plotIds, PlotData[] calldata plotsData) external onlyOwnerOrAdmin {
        require(!_plotDataLock, "Plot data setter is locked.");
        uint256 len = plotIds.length;
        require(len==plotsData.length, "Arrays must have the same length");
        for(uint i; i<len;) {
            uint256 plotId = plotIds[i];
            _plotData[plotId] = plotsData[i];
            unchecked { ++i; }
        }
    }

    function setPlotData(uint256 plotId, PlotData calldata plotData) external onlyOwnerOrAdmin {
        require(!_plotDataLock, "Plot data setter is locked.");
        _plotData[plotId] = plotData;
    }

    function countPlotRarities(uint256[] memory plotIds) internal view returns (uint, uint, uint, uint, uint) {

        uint256 commons;
        uint256 rares;
        uint256 epics;
        uint256 harbs;
        uint256 premium;

        uint256 len = plotIds.length;

        for(uint i; i<len;) {
            uint256 plotId = plotIds[i];

            if (_plotData[plotId].rarity == Rarity.Common) {
                commons +=1;
            }
            else if (_plotData[plotId].rarity == Rarity.Rare) {
                rares +=1;
            }
            else if (_plotData[plotId].rarity == Rarity.Epic) {
                epics +=1;
            }
            else if (_plotData[plotId].rarity == Rarity.Harb) {
                harbs +=1;
            }
            else {
                // This condition should be unreachable
                require(_plotData[plotId].rarity == Rarity.Premium, "Bad land rarity");
                premium +=1;
            }

            unchecked { ++i; }
        }

        return (commons, rares, epics, harbs, premium);
    }

    function getOwnedPlotRarities(address user) external view returns(OwnedPlotRarities memory ownedPlotRarities) {
        (uint256 numCommon, uint256 numRare, uint256 numEpic, uint256 numHarb, uint256 numPremium) = countPlotRarities(_allOwnedPlots[user]);

        ownedPlotRarities = OwnedPlotRarities({
            common: uint32(numCommon),
            rare: uint32(numRare),
            epic: uint32(numEpic),
            harb: uint32(numHarb),
            premium: uint32(numPremium)
        });
    }

    function getPlotAvailability(uint256 plotId) public view returns(bool) {
        require(_plotData[plotId].rarity != Rarity.None, "Plot not initialized");
        return _plotOwners[plotId] == address(0);
    }

    function getPlotOwners(uint256[] memory plotIds) external view returns(address[] memory) {
        uint256 numPlots = plotIds.length;
        address[] memory owners = new address[](numPlots);

        for(uint i; i<numPlots;) {
            uint256 plotId = plotIds[i];
            owners[i] = _plotOwners[plotId];
            unchecked { ++i; }
        }

        return owners;
    }

    function getOwnedPlots(address user) external view returns(uint256[] memory) {
        return _allOwnedPlots[user];
    }

    function migratePlotOwners(
        address[] memory users,
        uint256[] memory plotIds
    ) public onlyOwnerOrAdmin {
        // We'll lock after migration is complete so not even the owner can do it.
        require(!_migrationLock, "Migration is now locked");
        uint numUsers = users.length;
        require(numUsers == plotIds.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            _setPlotOwner(users[i], plotIds[i]);
            unchecked { ++i; }
        }
    }

    function setPlotOwner(address user, uint256 plotId) internal {
        address oldOwner = _plotOwners[plotId];
        _setPlotOwner(user, plotId);

        // Remove plot from old owner
        if (oldOwner != address(0)) {
            uint256[] memory oldOwnerPlots = _allOwnedPlots[oldOwner];
            uint256 len = oldOwnerPlots.length;
            uint256 oldIndex = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
            for(uint i; i<len;) {
                if (oldOwnerPlots[i] == plotId) {
                    oldIndex = i;
                    break;
                }
                unchecked { ++i; }
            }
            // This condition should be unreachable
            require(oldIndex != 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff, "Plot not found in old owner");
            // No need to swap if we're removing the last element
            if (oldIndex != len-1) {
                _allOwnedPlots[oldOwner][oldIndex] = _allOwnedPlots[oldOwner][len-1];
            }
            _allOwnedPlots[oldOwner].pop();
        }
    }

    function _setPlotOwner(address user, uint256 plotId) private {
        _plotOwners[plotId] = user;
        _allOwnedPlots[user].push(plotId);
    }

    function setPlotResource(uint256 plotId, string memory imgData) external onlyPlotOwner(plotId) {
        _plotImg[plotId] = imgData;
        emit PlotResourceSet(plotId, imgData);
    }

    function getPlotResource(uint256 plotId) external view returns(string memory) {
        return _plotImg[plotId];
    }

    function getPlotResourceBatch(uint256[] memory plotIds) external view returns(string[] memory) {
        uint256 numPlots = plotIds.length;
        string[] memory resources = new string[](numPlots);

        for(uint i; i<numPlots;) {
            uint256 plotId = plotIds[i];
            resources[i] = _plotImg[plotId];
            unchecked { ++i; }
        }

        return resources;
    }
}

File 7 of 7: UserData.sol
//SPDX-License-Identifier: Apache 2.0
pragma solidity ^0.8.13;

import "./AdminAccessible.sol";
import "./LandSaleCore.sol";


contract UserData is AdminAccesible, LandSaleCore {

    event CreditsSpent(address indexed user, uint common, uint rare, uint epic, uint premium);
    event DiscountsSpent(address indexed user, uint256[] singleDiscountIndexes, uint256[] multiDiscountIndexes);

    struct UserWhiteList {
        bool phase1;
        bool phase2;
        bool phase3;
    }

    struct Discount {
        uint128 discount;
        bool forCyberBiome;
        bool forSteampunkBiome;
        bool forWindBiome;
        bool forVolcanoBiome;
        bool forFireBiome;
        bool forWaterBiome;
        bool forNecroBiome;
        bool forMechaBiome;
        bool forDragonBiome;
        bool forMeadowBiome;
        bool forShore;
        bool forIsland;
        bool forMountainFoot;
        bool forAll;
    }

    struct UserDiscounts {
        Discount[] single;
        Discount[] multi;
    }

    //getter composition
    struct UserDataIntake {
        uint256 commonCredits;
        uint256 rareCredits;
        uint256 epicCredits;
        uint256 premiumCredits;
        Discount[] singleDiscounts;
        Discount[] multiDiscounts;
        bool whiteListPhase1;
        bool whiteListPhase2;
        bool whiteListPhase3;
    }

    // Credits
    mapping(address => mapping(Rarity => uint256)) private _userCredits;
    // Whitelist
    address private _landSaleAddress;
    uint256 private _lastUpdate;
    mapping(address => UserWhiteList) private _userWL;
    // Discounts
    mapping(address => Discount[]) private _userDiscountsSingle;
    mapping(address => Discount[]) private _userDiscountsMulti;

    modifier onlyLandsale {
        require(_landSaleAddress == msg.sender, "Forbidden");
        _;
    }

    function checkWhitelist(address user, uint256 whiteListPhase) external view {
        if (whiteListPhase == 0) {
            revert("Sale not open");
        }
        else if (whiteListPhase == 1) {
            require(
                _userWL[user].phase1,
                "Kokopelli: Not whitelisted"
                );
        }
        else if (whiteListPhase == 2) {
            require(
                _userWL[user].phase1 ||
                _userWL[user].phase2,
                "Kanaria: Not whitelisted"
                );
        }
        else if (whiteListPhase == 3) {
            require(
                _userWL[user].phase1 ||
                _userWL[user].phase2 ||
                _userWL[user].phase3,
                "WL: Not whitelisted");
        }
        // 4 is public, 5 is dutch, they require no whitelist
    }


    // LandSale
    function setLandSaleAddress(address landSaleAddress) external onlyOwnerOrAdmin {
        _landSaleAddress = landSaleAddress;
    }

    function getLandSaleAddress() external view returns(address) {
        return _landSaleAddress;
    }

    // Credits
    function setUserCredits(address user, uint256 commonCredits, uint256 rareCredits, uint256 epicCredits, uint256 premiumCredits) external onlyOwnerOrAdmin {
        _setUserCredits(user, commonCredits, rareCredits, epicCredits, premiumCredits);
        _setLastUpdate();
    }

    function setUserCreditsBatch(
        address[] calldata users,
        uint256[] calldata commonCredits,
        uint256[] calldata rareCredits,
        uint256[] calldata epicCredits,
        uint256[] calldata premiumCredits
    ) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == commonCredits.length && numUsers == rareCredits.length && numUsers == epicCredits.length && numUsers == premiumCredits.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            _setUserCredits(users[i], commonCredits[i], rareCredits[i], epicCredits[i], premiumCredits[i]);
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    function _setUserCredits(address user, uint256 commonCredits, uint256 rareCredits, uint256 epicCredits, uint256 premiumCredits) private {
        _userCredits[user][Rarity.Common] = commonCredits;
        _userCredits[user][Rarity.Rare] = rareCredits;
        _userCredits[user][Rarity.Epic] = epicCredits;
        _userCredits[user][Rarity.Premium] = premiumCredits;
    }

    function addUserCredits(address user, uint256 commonCredits, uint256 rareCredits, uint256 epicCredits, uint256 premiumCredits) external onlyOwnerOrAdmin {
        _addUserCredits(user, commonCredits, rareCredits, epicCredits, premiumCredits);
        _setLastUpdate();
    }

    function addUserCreditsBatch(
        address[] calldata users,
        uint256[] calldata commonCredits,
        uint256[] calldata rareCredits,
        uint256[] calldata epicCredits,
        uint256[] calldata premiumCredits
    ) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == commonCredits.length && numUsers == rareCredits.length && numUsers == epicCredits.length && numUsers == premiumCredits.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            _addUserCredits(users[i], commonCredits[i], rareCredits[i], epicCredits[i], premiumCredits[i]);
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    function _addUserCredits(address user, uint256 commonCredits, uint256 rareCredits, uint256 epicCredits, uint256 premiumCredits) internal {
        _userCredits[user][Rarity.Common] += commonCredits;
        _userCredits[user][Rarity.Rare] += rareCredits;
        _userCredits[user][Rarity.Epic] += epicCredits;
        _userCredits[user][Rarity.Premium] += premiumCredits;
    }

    function removeAllUserCredits(address user) external onlyOwnerOrAdmin {
        delete _userCredits[user][Rarity.Common];
        delete _userCredits[user][Rarity.Rare];
        delete _userCredits[user][Rarity.Epic];
        delete _userCredits[user][Rarity.Premium];
    }

    function getUserCreditData(address user) external view returns (UserCredits memory userCreditData) {
        userCreditData = UserCredits ({
            commonCredits: _userCredits[user][Rarity.Common],
            rareCredits: _userCredits[user][Rarity.Rare],
            epicCredits: _userCredits[user][Rarity.Epic],
            premiumCredits: _userCredits[user][Rarity.Premium]
        });
    }

    function getUserCreditsForRarity(address user, Rarity rarity) external view returns (uint256) {
        return _userCredits[user][rarity];
    }

    function spendCredits(address user, uint common, uint rare, uint epic, uint premium) external onlyLandsale {
        require(_userCredits[user][Rarity.Common] >= common, "Not enough common credits");
        require(_userCredits[user][Rarity.Rare] >= rare, "Not enough rare credits");
        require(_userCredits[user][Rarity.Epic] >= epic, "Not enough epic credits");
        require(_userCredits[user][Rarity.Premium] >= premium, "Not enough premium credits");

        _userCredits[user][Rarity.Common] -= common;
        _userCredits[user][Rarity.Rare] -= rare;
        _userCredits[user][Rarity.Epic] -= epic;
        _userCredits[user][Rarity.Premium] -= premium;
        emit CreditsSpent(user, common, rare, epic, premium);
    }

    function setUserWhitelist(address user, bool phase1, bool phase2, bool phase3) external onlyOwnerOrAdmin {
        _setUserWhitelist(user, phase1, phase2, phase3);
        _setLastUpdate();
    }

    function setUserWhitelistBatch(
        address[] calldata users,
        bool[] calldata phase1,
        bool[] calldata phase2,
        bool[] calldata phase3
    ) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == phase1.length && numUsers == phase2.length && numUsers == phase3.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            _setUserWhitelist(users[i], phase1[i], phase2[i], phase3[i]);
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    // Specific function to save gas since we expect to call this more.
    function setUserWhitelistBatchPhass3( address[] calldata users, bool[] calldata phase3) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == phase3.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            _userWL[users[i]].phase3 = phase3[i];
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    function _setUserWhitelist(address user, bool phase1, bool phase2, bool phase3) private {
        _userWL[user] = UserWhiteList ({
            phase1: phase1,
            phase2: phase2,
            phase3: phase3
        });
    }

    function removeUserWhitelist(address user) external onlyOwnerOrAdmin {
        delete _userWL[user];
    }

    function getUserWhitelistStatus(address user) external view returns(UserWhiteList memory userWhitelistData) {
        userWhitelistData = _userWL[user];
    }

    // Discounts
    function setUserDiscounts(address user, Discount[] calldata singleDiscounts, Discount[] calldata multiDiscounts) external onlyOwnerOrAdmin {
        _setUserDiscounts(user, singleDiscounts, multiDiscounts);
        _setLastUpdate();
    }

    function setUserDiscountsBatch(
        address[] calldata users,
        Discount[][] calldata singleDiscounts,
        Discount[][] calldata multiDiscounts
    ) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == singleDiscounts.length && numUsers == multiDiscounts.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            _setUserDiscounts(users[i], singleDiscounts[i], multiDiscounts[i]);
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    function _setUserDiscounts(address user, Discount[] calldata singleDiscounts, Discount[] calldata multiDiscounts) private {
        delete _userDiscountsSingle[user];
        delete _userDiscountsMulti[user];

        _addUserDiscounts(_userDiscountsSingle[user], singleDiscounts);
        _addUserDiscounts(_userDiscountsMulti[user], multiDiscounts);
    }

    function _addUserDiscounts(Discount[] storage localDiscounts, Discount[] calldata newDiscounts) internal {
        uint numDiscounts = newDiscounts.length;
        for(uint i; i<numDiscounts;) {
            localDiscounts.push(newDiscounts[i]);
            unchecked { ++i; }
        }
    }

    function addUserDiscounts(address user, Discount[] calldata singleDiscounts, Discount[] calldata multiDiscounts) external onlyOwnerOrAdmin {
        _addUserDiscounts(_userDiscountsSingle[user], singleDiscounts);
        _addUserDiscounts(_userDiscountsMulti[user], multiDiscounts);
        _setLastUpdate();
    }

    function addUserDiscountsBatch(
        address[] calldata users,
        Discount[][] calldata singleDiscounts,
        Discount[][] calldata multiDiscounts
    ) external onlyOwnerOrAdmin {
        uint numUsers = users.length;
        require(numUsers == singleDiscounts.length && numUsers == multiDiscounts.length, "Arrays must have the same length");
        for (uint i; i<numUsers;) {
            address user = users[i];
            _addUserDiscounts(_userDiscountsSingle[user], singleDiscounts[i]);
            _addUserDiscounts(_userDiscountsMulti[user], multiDiscounts[i]);
            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    function removeAllUserDiscoutns(address user) external onlyOwnerOrAdmin {
        delete _userDiscountsSingle[user];
        delete _userDiscountsMulti[user];
    }

    function getUserDiscountData(address user) external view returns (UserDiscounts memory userDiscountData) {
        userDiscountData = UserDiscounts ({
            single: _userDiscountsSingle[user],
            multi: _userDiscountsMulti[user]
        });
    }

    function loadDiscounts(address user, uint256[] calldata singleDiscountIndexes, uint256[] calldata multiDiscountIndexes) external view returns (Discount[] memory) {
        uint numSingleDiscounts = singleDiscountIndexes.length;
        uint numMultiDiscounts = multiDiscountIndexes.length;

        Discount[] memory discounts = new Discount[](numSingleDiscounts + numMultiDiscounts);

        if (numSingleDiscounts > 0) {
            for (uint i; i<numSingleDiscounts;) {
                require(singleDiscountIndexes[i] < _userDiscountsSingle[user].length, "Bad single discount index");
                discounts[i] = _userDiscountsSingle[user][singleDiscountIndexes[i]];
                unchecked { ++i; }
            }
        }

        if (numMultiDiscounts > 0) {
            for (uint i; i<numMultiDiscounts;) {
                require(multiDiscountIndexes[i] < _userDiscountsMulti[user].length, "Bad multi discount index");
                // Mind to start from after the last index for single discounts
                discounts[numSingleDiscounts + i] = _userDiscountsMulti[user][multiDiscountIndexes[i]];
                unchecked { ++i; }
            }
        }
        return discounts;
    }

    function spendDiscounts(address user, uint256[] calldata singleDiscountIndexes, uint256[] calldata multiDiscountIndexes) external onlyLandsale {
        _removeDiscountsByIndex(_userDiscountsSingle[user], singleDiscountIndexes);
        _removeDiscountsByIndex(_userDiscountsMulti[user], multiDiscountIndexes);
        if (singleDiscountIndexes.length > 0 || multiDiscountIndexes.length > 0) {
            emit DiscountsSpent(user, singleDiscountIndexes, multiDiscountIndexes);
        }
    }

    function _removeDiscountsByIndex(Discount[] storage array, uint256[] calldata indexes) internal {
        uint numDiscounts = indexes.length;
        if (numDiscounts == 0) {
            return;
        }
        // Since we move the last element to a lower position on deletion
        // We may save gas by deleting higher indexes first, so we go last to first
        // and enforce order using lastIndex variable.
        uint lastIndex = indexes[numDiscounts - 1];
        for (uint i; i<numDiscounts;) {
            uint index = indexes[numDiscounts - i - 1];
            uint arrayLen = array.length;
            require(index <= lastIndex, "Discount indexes must be ordered");
            // This condition should be unreachable, since discounts were already loaded.
            require(index < arrayLen, "Bad array index");
            if (index != arrayLen - 1) {
                array[index] = array[arrayLen - 1];
            }
            array.pop();
            lastIndex = index;
            unchecked { ++i; }
        }
    }

    // All in one
    function getUserData(address user) external view returns (UserDataIntake memory userData) {
        UserWhiteList memory userWhitelist = _userWL[user];

        userData = UserDataIntake ({
            commonCredits: _userCredits[user][Rarity.Common],
            rareCredits: _userCredits[user][Rarity.Rare],
            epicCredits: _userCredits[user][Rarity.Epic],
            premiumCredits: _userCredits[user][Rarity.Premium],
            singleDiscounts: _userDiscountsSingle[user],
            multiDiscounts: _userDiscountsMulti[user],
            whiteListPhase1: userWhitelist.phase1,
            whiteListPhase2: userWhitelist.phase2,
            whiteListPhase3: userWhitelist.phase3
        });
    }

    function setUserData(address user, UserDataIntake calldata intakeData) external onlyOwnerOrAdmin {
        _setUserWhitelist(user, intakeData.whiteListPhase1, intakeData.whiteListPhase2, intakeData.whiteListPhase3);
        _setUserCredits(user, intakeData.commonCredits, intakeData.rareCredits, intakeData.epicCredits, intakeData.premiumCredits);
        _setUserDiscounts(user, intakeData.singleDiscounts, intakeData.multiDiscounts);
        _setLastUpdate();
    }

    function setUserDataBatch(address[] calldata users, UserDataIntake[] calldata intakeData) external onlyOwnerOrAdmin {
        uint256 len = users.length;
        require(len == intakeData.length, "Arrays must have the same length");

        for(uint i; i<len;) {
            _setUserWhitelist(users[i], intakeData[i].whiteListPhase1, intakeData[i].whiteListPhase2, intakeData[i].whiteListPhase3);
            _setUserCredits(users[i], intakeData[i].commonCredits, intakeData[i].rareCredits, intakeData[i].epicCredits, intakeData[i].premiumCredits);
            _setUserDiscounts(users[i], intakeData[i].singleDiscounts, intakeData[i].multiDiscounts);

            unchecked { ++i; }
        }
        _setLastUpdate();
    }

    // Last Update

    function _setLastUpdate() private {
        _lastUpdate = block.timestamp;
    }

    function getLastUpdate() external view returns (uint256) {
        return _lastUpdate;
    }

}

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"commonPrice","type":"uint256"},{"internalType":"uint256","name":"rarePrice","type":"uint256"},{"internalType":"uint256","name":"epicPrice","type":"uint256"},{"internalType":"uint256","name":"creatorFee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"EscrowReturned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"OfferCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"OfferMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"}],"name":"PlotDelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PlotListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"PlotPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PlotPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotId","type":"uint256"},{"indexed":false,"internalType":"string","name":"buyer","type":"string"}],"name":"PlotResourceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"plotIds","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"PlotTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":true,"internalType":"bool","name":"boughtWithCredits","type":"bool"}],"name":"PlotsBought","type":"event"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"offerIndex","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"acceptOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"addReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"internalType":"uint256[]","name":"singleDiscountIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"multiDiscountIndexes","type":"uint256[]"},{"internalType":"address","name":"referrer","type":"address"}],"name":"buyPlots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"internalType":"enum LandSaleCore.Rarity","name":"creditRarity","type":"uint8"}],"name":"buyWithCredits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"canRefer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"offerIndex","type":"uint256"}],"name":"cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"delist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBeneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"}],"name":"getClaimableEscrow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCreatorFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getCurrentBid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDutchDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDutchMinMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"getDutchPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDutchStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getIsListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getListedInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getListedPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMigrationLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumPlotsSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getOffers","outputs":[{"components":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"cancelled","type":"bool"}],"internalType":"struct LandSaleMarket.Offer[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getOwnedPlotRarities","outputs":[{"components":[{"internalType":"uint32","name":"common","type":"uint32"},{"internalType":"uint32","name":"rare","type":"uint32"},{"internalType":"uint32","name":"epic","type":"uint32"},{"internalType":"uint32","name":"harb","type":"uint32"},{"internalType":"uint32","name":"premium","type":"uint32"}],"internalType":"struct Plots.OwnedPlotRarities","name":"ownedPlotRarities","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getOwnedPlots","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPausedSales","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPausedTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getPlotAvailability","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getPlotData","outputs":[{"components":[{"internalType":"uint8","name":"cyber","type":"uint8"},{"internalType":"uint8","name":"steampunk","type":"uint8"},{"internalType":"uint8","name":"wind","type":"uint8"},{"internalType":"uint8","name":"volcano","type":"uint8"},{"internalType":"uint8","name":"fire","type":"uint8"},{"internalType":"uint8","name":"water","type":"uint8"},{"internalType":"uint8","name":"necro","type":"uint8"},{"internalType":"uint8","name":"mecha","type":"uint8"},{"internalType":"uint8","name":"dragon","type":"uint8"},{"internalType":"uint8","name":"meadow","type":"uint8"},{"internalType":"uint8","name":"isShore","type":"uint8"},{"internalType":"uint8","name":"isIsland","type":"uint8"},{"internalType":"uint8","name":"isMountainFoot","type":"uint8"},{"internalType":"enum LandSaleCore.Rarity","name":"rarity","type":"uint8"},{"internalType":"enum LandSaleCore.Entropy","name":"entropy","type":"uint8"}],"internalType":"struct Plots.PlotData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlotDataLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getPlotOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"}],"name":"getPlotOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"}],"name":"getPlotResource","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"}],"name":"getPlotResourceBatch","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricesPerRarity","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"internalType":"uint256[]","name":"singleDiscountIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"multiDiscountIndexes","type":"uint256[]"}],"name":"getPurchasePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferralIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReferralMinCommonPlots","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getUserDataAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhiteListPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getXcRMRK","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"isReferrer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"list","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"makeOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"}],"name":"migratePlotOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"xcRmrkPlotIds","type":"uint256[]"},{"internalType":"uint256[]","name":"singleDiscountIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"multiDiscountIndexes","type":"uint256[]"},{"internalType":"address","name":"referrer","type":"address"},{"internalType":"uint256[]","name":"creditsPlotIds","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"commonCredits","type":"uint256"},{"internalType":"uint256","name":"rareCredits","type":"uint256"},{"internalType":"uint256","name":"epicCredits","type":"uint256"},{"internalType":"uint256","name":"premiumCredits","type":"uint256"}],"internalType":"struct LandSaleCore.UserCredits","name":"userCredits","type":"tuple"}],"name":"mixBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"referrer","type":"address"}],"name":"removeReferrer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"returnEscrowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"creatorFee","type":"uint256"}],"name":"setCreatorFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"multiplier","type":"uint256"}],"name":"setDutchConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setPausedSales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"setPausedTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"components":[{"internalType":"uint8","name":"cyber","type":"uint8"},{"internalType":"uint8","name":"steampunk","type":"uint8"},{"internalType":"uint8","name":"wind","type":"uint8"},{"internalType":"uint8","name":"volcano","type":"uint8"},{"internalType":"uint8","name":"fire","type":"uint8"},{"internalType":"uint8","name":"water","type":"uint8"},{"internalType":"uint8","name":"necro","type":"uint8"},{"internalType":"uint8","name":"mecha","type":"uint8"},{"internalType":"uint8","name":"dragon","type":"uint8"},{"internalType":"uint8","name":"meadow","type":"uint8"},{"internalType":"uint8","name":"isShore","type":"uint8"},{"internalType":"uint8","name":"isIsland","type":"uint8"},{"internalType":"uint8","name":"isMountainFoot","type":"uint8"},{"internalType":"enum LandSaleCore.Rarity","name":"rarity","type":"uint8"},{"internalType":"enum LandSaleCore.Entropy","name":"entropy","type":"uint8"}],"internalType":"struct Plots.PlotData","name":"plotData","type":"tuple"}],"name":"setPlotData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"state","type":"bool"}],"name":"setPlotDataLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"components":[{"internalType":"uint8","name":"cyber","type":"uint8"},{"internalType":"uint8","name":"steampunk","type":"uint8"},{"internalType":"uint8","name":"wind","type":"uint8"},{"internalType":"uint8","name":"volcano","type":"uint8"},{"internalType":"uint8","name":"fire","type":"uint8"},{"internalType":"uint8","name":"water","type":"uint8"},{"internalType":"uint8","name":"necro","type":"uint8"},{"internalType":"uint8","name":"mecha","type":"uint8"},{"internalType":"uint8","name":"dragon","type":"uint8"},{"internalType":"uint8","name":"meadow","type":"uint8"},{"internalType":"uint8","name":"isShore","type":"uint8"},{"internalType":"uint8","name":"isIsland","type":"uint8"},{"internalType":"uint8","name":"isMountainFoot","type":"uint8"},{"internalType":"enum LandSaleCore.Rarity","name":"rarity","type":"uint8"},{"internalType":"enum LandSaleCore.Entropy","name":"entropy","type":"uint8"}],"internalType":"struct Plots.PlotData[]","name":"plotsData","type":"tuple[]"}],"name":"setPlotDataMulti","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"string","name":"imgData","type":"string"}],"name":"setPlotResource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isActive","type":"bool"}],"name":"setReferralIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minCommonPlots","type":"uint256"}],"name":"setReferralMinCommonPlots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setUserDataAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"phaseId","type":"uint256"}],"name":"setWhitelistPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setxcRMRK","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"plotIds","type":"uint256[]"},{"internalType":"uint256","name":"commonCredits","type":"uint256"},{"internalType":"uint256","name":"rareCredits","type":"uint256"},{"internalType":"uint256","name":"epicCredits","type":"uint256"},{"internalType":"uint256","name":"premiumCredits","type":"uint256"}],"name":"smartBuyWithCredits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"plotId","type":"uint256"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052620186a0600c553480156200001857600080fd5b50604051620061b2380380620061b28339810160408190526200003b9162000191565b600080546001600160a01b031916331790558383836402540be4008311620000aa5760405162461bcd60e51b815260206004820152601f60248201527f436f6d6d6f6e207072696365206d757374206265203e2031207863524d524b0060448201526064015b60405180910390fd5b6402540be4008211620001005760405162461bcd60e51b815260206004820152601d60248201527f52617265207072696365206d757374206265203e2031207863524d524b0000006044820152606401620000a1565b6402540be4008111620001565760405162461bcd60e51b815260206004820152601d60248201527f45706963207072696365206d757374206265203e2031207863524d524b0000006044820152606401620000a1565b60809290925260a05260c052600d805460ff19166001179055600a600e5560135550506012805461010161ffff1990911617905550620001c8565b60008060008060808587031215620001a857600080fd5b505082516020840151604085015160609095015191969095509092509050565b60805160a05160c051615fa56200020d6000396000818161046601526146fc01526000818161044001526146b601526000818161041d01526146700152615fa56000f3fe608060405234801561001057600080fd5b50600436106104125760003560e01c80638708c55e11610220578063d21c694811610130578063e5e06d45116100b8578063f2fde38b11610087578063f2fde38b14610a13578063f38ced4714610a26578063f48dab7014610a31578063fefa9bb114610a44578063ff39a2ea14610a5757600080fd5b8063e5e06d45146109ba578063e63c88dc146109cd578063f0b3300f146109e0578063f2b0a55d146109f357600080fd5b8063d64d6968116100ff578063d64d696814610935578063d6febde814610961578063da4e364f14610974578063dd9e9dc814610987578063dfa49e6f1461099a57600080fd5b8063d21c6948146108f4578063d2839e79146108fc578063d3a8c4ec1461090f578063d45557cc1461092257600080fd5b8063a718d525116101b3578063b79df7e111610182578063b79df7e11461082a578063bc138fe014610853578063be0800251461086f578063c0ea1f1114610882578063c1744fd81461089557600080fd5b8063a718d525146107de578063b3de019c146107f1578063b673344014610804578063b7760c8f1461081757600080fd5b8063964bc33f116101ef578063964bc33f1461076f578063992274b114610782578063a11b6fbb14610795578063a1f45dd6146107b557600080fd5b80638708c55e14610718578063877850ef1461072b5780638927e6271461073e578063893d20e81461075e57600080fd5b80632d34567011610326578063565a2e2c116102ae578063635335231161027d57806363533523146106be57806370480275146106ce57806379bd6cf9146106e15780637a00e2e3146106f2578063864ca4851461070557600080fd5b8063565a2e2c1461067f5780635a5b0f56146106905780635c09d628146106985780635f53e077146106ab57600080fd5b806342434134116102f55780634243413414610636578063450d996a1461063e57806347831ac01461065157806350fd736714610659578063549458d41461066c57600080fd5b80632d345670146105e55780633bb9fcab146105f85780633db7a49f1461060b5780633e1042191461061657600080fd5b8063142a6fca116103a95780631e4a8116116103785780631e4a81161461057957806324d7806c1461058c57806326394dbd1461059f5780632a46841f146105ca5780632c92f9bc146105d257600080fd5b8063142a6fca14610509578063194a9716146105295780631c31f7101461055b5780631da66c271461056e57600080fd5b80630dd16fd5116103e55780630dd16fd5146104c85780630e15166e146104db5780630fc0482a146104ee57806311ea8857146104f657600080fd5b8063012a53311461041757806301d3f03b14610499578063024463c1146104ab57806305b7cdd3146104b3575b600080fd5b604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091526060015b60405180910390f35b600a545b604051908152602001610490565b600c5461049d565b6104c66104c1366004614cdb565b610a67565b005b6104c66104d6366004614cfd565b610e5b565b6104c66104e9366004614d24565b610e99565b6104c6610ee5565b61049d610504366004614ea5565b610f2f565b61051c610517366004614cfd565b610f4a565b6040516104909190614f96565b61054b610537366004614cfd565b600090815260146020526040902054151590565b6040519015158152602001610490565b6104c6610569366004614fa9565b610fec565b60125460ff1661054b565b6104c6610587366004614fd1565b611047565b61054b61059a366004614fa9565b61159d565b6006546201000090046001600160a01b03165b6040516001600160a01b039091168152602001610490565b6104c66115bc565b6104c66105e0366004615027565b6116d6565b6104c66105f3366004614fa9565b611766565b6104c6610606366004615053565b6117aa565b60065460ff1661054b565b610629610624366004614fa9565b6118e2565b6040516104909190615112565b600e5461049d565b6104c661064c366004615156565b61194d565b60095461049d565b6104c6610667366004614cdb565b6119cb565b6104c661067a366004614fa9565b611b5d565b6007546001600160a01b03166105b2565b60135461049d565b6104c66106a6366004614fa9565b611bc0565b6104c66106b9366004614d24565b611c1b565b601254610100900460ff1661054b565b6104c66106dc366004614fa9565b611c6e565b6008546001600160a01b03166105b2565b6104c6610700366004614fa9565b611d0b565b6104c6610713366004614cfd565b611d5e565b6104c6610726366004614d24565b611d9c565b6104c6610739366004614cfd565b611de8565b61075161074c366004615200565b611e66565b604051610490919061523c565b6000546001600160a01b03166105b2565b6104c661077d366004614cfd565b611fae565b6104c661079036600461529e565b612023565b6107a86107a3366004615200565b61209f565b60405161049091906152ff565b6105b26107c3366004614cfd565b6000908152600360205260409020546001600160a01b031690565b6104c66107ec366004615340565b61216d565b6104c66107ff366004614cdb565b612202565b6104c66108123660046153de565b61230b565b6104c6610825366004615478565b612452565b61049d610838366004614fa9565b6001600160a01b031660009081526016602052604090205490565b601054600f545b60408051928352602083019190915201610490565b6104c661087d366004614d24565b61264d565b61054b610890366004614cfd565b612699565b6108a86108a3366004614fa9565b612727565b6040516104909190815163ffffffff9081168252602080840151821690830152604080840151821690830152606080840151821690830152608092830151169181019190915260a00190565b600b5461049d565b61054b61090a366004614fa9565b612803565b61049d61091d366004614cfd565b6128dc565b6104c6610930366004614cdb565b6128ed565b61054b610943366004614fa9565b6001600160a01b031660009081526011602052604090205460011490565b6104c661096f366004614cdb565b612b13565b61049d610982366004614cfd565b612e0b565b6104c66109953660046154bc565b612f2c565b6109ad6109a8366004614cfd565b612fbf565b60405161049091906155a5565b61085a6109c8366004614cfd565b613061565b6104c66109db366004615027565b6130bc565b6104c66109ee366004615614565b6133fd565b610a06610a01366004614cfd565b6134a3565b6040516104909190615688565b6104c6610a21366004614fa9565b61367d565b600d5460ff1661054b565b61049d610a3f366004614cfd565b61371f565b6104c6610a52366004614fa9565b61374b565b600654610100900460ff1661054b565b60125460ff1615610a935760405162461bcd60e51b8152600401610a8a9061579f565b60405180910390fd5b60008111610ae35760405162461bcd60e51b815260206004820152601b60248201527f5072696365206d75737420626520686967686572207468616e203000000000006044820152606401610a8a565b6000828152600360205260409020546001600160a01b0316338103610b3f5760405162461bcd60e51b81526020600482015260126024820152712ab9b2b91034b9903630b7321037bbb732b960711b6044820152606401610a8a565b6001600160a01b038116610b895760405162461bcd60e51b8152602060048201526011602482015270506c6f74206e6f742073656c6c61626c6560781b6044820152606401610a8a565b6004600084815260026020526040902054600160681b900460ff166005811115610bb557610bb561564e565b03610c025760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206f66666572206f6e20486172626572676572206c616e6400006044820152606401610a8a565b6000838152601460205260409020548015610c6657808310610c665760405162461bcd60e51b815260206004820152601760248201527f4f66666572206f766572206c69737465642070726963650000000000000000006044820152606401610a8a565b600654604051636eb1769f60e11b8152336004820152306024820152620100009091046001600160a01b0316908490829063dd62ed3e90604401602060405180830381865afa158015610cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce191906157c9565b1015610d265760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f75676820616c6c6f77616e636560601b6044820152606401610a8a565b60408051608081018252338082526020808301888152428486019081526000606086018181528c825260158552878220805460018082018355918452959092208751600496870290910180546001600160a01b0319166001600160a01b039283161781559451928501929092559151600284015590516003909201805460ff19169215159290921790915593516323b872dd60e01b815292938516926323b872dd92610dd892909130918b91016157e2565b6020604051808303816000875af1158015610df7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1b9190615811565b50604051858152339087907fbdf1e76c2ba2a5c85b93bf78678a4a3b06d63b18422612dac8d7d5249ed467149060200160405180910390a3505050505050565b6000546001600160a01b0316331480610e785750610e783361159d565b610e945760405162461bcd60e51b8152600401610a8a9061582e565b601355565b6000546001600160a01b0316331480610eb65750610eb63361159d565b610ed25760405162461bcd60e51b8152600401610a8a9061582e565b6012805460ff1916911515919091179055565b6000546001600160a01b0316331480610f025750610f023361159d565b610f1e5760405162461bcd60e51b8152600401610a8a9061582e565b6006805461ff001916610100179055565b6000610f3f8787878787876137f7565b979650505050505050565b6000818152600460205260409020805460609190610f6790615865565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9390615865565b8015610fe05780601f10610fb557610100808354040283529160200191610fe0565b820191906000526020600020905b815481529060010190602001808311610fc357829003601f168201915b50505050509050919050565b6000546001600160a01b031633148061100957506110093361159d565b6110255760405162461bcd60e51b8152600401610a8a9061582e565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b600854600954604051636844038560e11b815233600482015260248101919091526001600160a01b039091169063d088070a9060440160006040518083038186803b15801561109557600080fd5b505afa1580156110a9573d6000803e3d6000fd5b508492505050806110cc5760405162461bcd60e51b8152600401610a8a90615899565b600854604051637bfb039f60e11b81526000916001600160a01b03169063f7f6073e906110ff90339087906004016158c2565b602060405180830381865afa15801561111c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114091906157c9565b9050818110156111925760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f756768206372656469747320696e206163636f756e740000006044820152606401610a8a565b60008060008060006111d68a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061395592505050565b9450945094509450945081816111ec91906158f5565b60009250905060018860058111156112065761120661564e565b036112fd5786851461124e5760405162461bcd60e51b81526020600482015260116024820152704f6e6c7920636f6d6d6f6e206c616e647360781b6044820152606401610a8a565b60085460405163036954ed60e01b81526001600160a01b039091169063036954ed906112879033908b906000908190819060040161590d565b600060405180830381600087803b1580156112a157600080fd5b505af11580156112b5573d6000803e3d6000fd5b505050506112f88a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250925060019150613b459050565b611591565b60028860058111156113115761131161564e565b036113a7578661132185876158f5565b1461136e5760405162461bcd60e51b815260206004820152601960248201527f4f6e6c7920636f6d6d6f6e206f722072617265206c616e6473000000000000006044820152606401610a8a565b60085460405163036954ed60e01b81526001600160a01b039091169063036954ed906112879033906000908c908290819060040161590d565b60038860058111156113bb576113bb61564e565b0361145c5786836113cc86886158f5565b6113d691906158f5565b146114235760405162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920636f6d6d6f6e2c2072617265206f722065706963206c616e6473006044820152606401610a8a565b60085460405163036954ed60e01b81526001600160a01b039091169063036954ed9061128790339060009081908d90829060040161590d565b60058860058111156114705761147061564e565b14801561149b575086818461148587896158f5565b61148f91906158f5565b61149991906158f5565b145b6114e75760405162461bcd60e51b815260206004820152601860248201527f556e6578706563746564206372656469742072617269747900000000000000006044820152606401610a8a565b60085460405163036954ed60e01b81526001600160a01b039091169063036954ed90611520903390600090819081908e9060040161590d565b600060405180830381600087803b15801561153a57600080fd5b505af115801561154e573d6000803e3d6000fd5b505050506115918a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250925060019150613b459050565b50505050505050505050565b6001600160a01b03166000908152600160208190526040909120541490565b336000908152601660205260409020548061160f5760405162461bcd60e51b815260206004820152601360248201527227379032b9b1b937bb903a37903932ba3ab93760691b6044820152606401610a8a565b3360008181526016602052604080822091909155600654905163a9059cbb60e01b81526004810192909252602482018390526201000090046001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015611679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061169d9190615811565b5060405181815233907fbf1a0ef092ef679427b427c6a95d51133522541e667b737b795a77f2b61c240d9060200160405180910390a250565b6000546001600160a01b03163314806116f357506116f33361159d565b61170f5760405162461bcd60e51b8152600401610a8a9061582e565b620f424081106117585760405162461bcd60e51b81526020600482015260146024820152732b30b63ab29037bb32b910383932b1b4b9b4b7b760611b6044820152606401610a8a565b600a92909255600b55600c55565b6000546001600160a01b031633146117905760405162461bcd60e51b8152600401610a8a9061593b565b6001600160a01b0316600090815260016020526040812055565b6000546001600160a01b03163314806117c757506117c73361159d565b6117e35760405162461bcd60e51b8152600401610a8a9061582e565b600654610100900460ff161561183b5760405162461bcd60e51b815260206004820152601760248201527f4d6967726174696f6e206973206e6f77206c6f636b65640000000000000000006044820152606401610a8a565b81518151811461188d5760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e6774686044820152606401610a8a565b60005b818110156118dc576118d48482815181106118ad576118ad615967565b60200260200101518483815181106118c7576118c7615967565b6020026020010151613c6a565b600101611890565b50505050565b6001600160a01b038116600090815260056020908152604091829020805483518184028101840190945280845260609392830182828015610fe057602002820191906000526020600020905b81548152602001906001019080831161192e5750505050509050919050565b600854600954604051636844038560e11b815233600482015260248101919091526001600160a01b039091169063d088070a9060440160006040518083038186803b15801561199b57600080fd5b505afa1580156119af573d6000803e3d6000fd5b505050506119c287878787878787613cb6565b50505050505050565b60008281526003602052604090205482906001600160a01b03163314611a035760405162461bcd60e51b8152600401610a8a9061597d565b60125460ff1615611a265760405162461bcd60e51b8152600401610a8a9061579f565b60008211611a765760405162461bcd60e51b815260206004820152601c60248201527f5072696365206d7573742062652067726561746572207468616e2030000000006044820152606401610a8a565b6004600084815260026020526040902054600160681b900460ff166005811115611aa257611aa261564e565b03611aef5760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f74206c69737420486172626572676572206c616e640000000000006044820152606401610a8a565b60408051808201825283815242602080830191825260008781526014909152839020915182555160019091015551339084907f7f5dd6779248014167a5e507bf4a6edb7c0985fd0eb2fe89412fe3783a4b133090611b509086815260200190565b60405180910390a3505050565b6000546001600160a01b0316331480611b7a5750611b7a3361159d565b611b965760405162461bcd60e51b8152600401610a8a9061582e565b600680546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b6000546001600160a01b0316331480611bdd5750611bdd3361159d565b611bf95760405162461bcd60e51b8152600401610a8a9061582e565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331480611c385750611c383361159d565b611c545760405162461bcd60e51b8152600401610a8a9061582e565b601280549115156101000261ff0019909216919091179055565b6000546001600160a01b03163314611c985760405162461bcd60e51b8152600401610a8a9061593b565b6001600160a01b038116611cee5760405162461bcd60e51b815260206004820181905260248201527f41646d696e2063616e6e6f7420626520746865207a65726f20616464726573736044820152606401610a8a565b6001600160a01b0316600090815260016020819052604090912055565b6000546001600160a01b0316331480611d285750611d283361159d565b611d445760405162461bcd60e51b8152600401610a8a9061582e565b6001600160a01b0316600090815260116020526040812055565b6000546001600160a01b0316331480611d7b5750611d7b3361159d565b611d975760405162461bcd60e51b8152600401610a8a9061582e565b600e55565b6000546001600160a01b0316331480611db95750611db93361159d565b611dd55760405162461bcd60e51b8152600401610a8a9061582e565b6006805460ff1916911515919091179055565b6000546001600160a01b0316331480611e055750611e053361159d565b611e215760405162461bcd60e51b8152600401610a8a9061582e565b6005811115611e615760405162461bcd60e51b815260206004820152600c60248201526b109859081c1a185cd9481a5960a21b6044820152606401610a8a565b600955565b80516060906000816001600160401b03811115611e8557611e85614d5d565b604051908082528060200260200182016040528015611eb857816020015b6060815260200190600190039081611ea35790505b50905060005b82811015611fa6576000858281518110611eda57611eda615967565b60200260200101519050600460008281526020019081526020016000208054611f0290615865565b80601f0160208091040260200160405190810160405280929190818152602001828054611f2e90615865565b8015611f7b5780601f10611f5057610100808354040283529160200191611f7b565b820191906000526020600020905b815481529060010190602001808311611f5e57829003601f168201915b5050505050838381518110611f9257611f92615967565b602090810291909101015250600101611ebe565b509392505050565b60008181526003602052604090205481906001600160a01b03163314611fe65760405162461bcd60e51b8152600401610a8a9061597d565b611ff282600019613fd3565b604051339083907f731e216f3c5263def1695d416b13f97a35d25331ad11ccb640d803ebd105f4e890600090a35050565b600854600954604051636844038560e11b815233600482015260248101919091526001600160a01b039091169063d088070a9060440160006040518083038186803b15801561207157600080fd5b505afa158015612085573d6000803e3d6000fd5b5050505061209786868686868661414b565b505050505050565b80516060906000816001600160401b038111156120be576120be614d5d565b6040519080825280602002602001820160405280156120e7578160200160208202803683370190505b50905060005b82811015611fa657600085828151811061210957612109615967565b602002602001015190506003600082815260200190815260200160002060009054906101000a90046001600160a01b031683838151811061214c5761214c615967565b6001600160a01b0390921660209283029190910190910152506001016120ed565b60008281526003602052604090205482906001600160a01b031633146121a55760405162461bcd60e51b8152600401610a8a9061597d565b600083815260046020908152604090912083516121c492850190614be5565b50827f98a3c3986b7677c879cb2d25ed860fa739755d655ee07fd9582d82a343200874836040516121f59190614f96565b60405180910390a2505050565b60008281526003602052604090205482906001600160a01b0316331461223a5760405162461bcd60e51b8152600401610a8a9061597d565b6000821161228a5760405162461bcd60e51b815260206004820152601c60248201527f5072696365206d7573742062652067726561746572207468616e2030000000006044820152606401610a8a565b600083815260146020526040902054806122b65760405162461bcd60e51b8152600401610a8a906159ad565b6000848152601460209081526040918290208590558151838152908101859052339186917fe4e96eded0c1652afb311b4f5a4d768a48f1544ae888996bedc732c85778061e910160405180910390a350505050565b6000546001600160a01b031633148061232857506123283361159d565b6123445760405162461bcd60e51b8152600401610a8a9061582e565b60065460ff16156123975760405162461bcd60e51b815260206004820152601b60248201527f506c6f74206461746120736574746572206973206c6f636b65642e00000000006044820152606401610a8a565b828181146123e75760405162461bcd60e51b815260206004820181905260248201527f417272617973206d7573742068617665207468652073616d65206c656e6774686044820152606401610a8a565b60005b8181101561209757600086868381811061240657612406615967565b90506020020135905084848381811061242157612421615967565b90506101e002016002600083815260200190815260200160002081816124479190615a5c565b5050506001016123ea565b60008281526003602052604090205482906001600160a01b0316331461248a5760405162461bcd60e51b8152600401610a8a9061597d565b336001600160a01b038316036124e25760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610a8a565b601254610100900460ff16156125315760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8185c99481c185d5cd95960621b6044820152606401610a8a565b6000838152601460205260409020541561258d5760405162461bcd60e51b815260206004820152601b60248201527f43616e6e6f74207472616e73666572206c697374656420706c6f7400000000006044820152606401610a8a565b6004600084815260026020526040902054600160681b900460ff1660058111156125b9576125b961564e565b036126065760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74207472616e7366657220486172626572676572206c616e6400006044820152606401610a8a565b612610828461438a565b6040516001600160a01b03831690339085907f370ed8b5aeb5adcdf0f4852ad764fd28ca4cc2a9d744446d05da996594ea6aa490600090a4505050565b6000546001600160a01b031633148061266a575061266a3361159d565b6126865760405162461bcd60e51b8152600401610a8a9061582e565b600d805460ff1916911515919091179055565b600080600083815260026020526040902054600160681b900460ff1660058111156126c6576126c661564e565b0361270a5760405162461bcd60e51b8152602060048201526014602482015273141b1bdd081b9bdd081a5b9a5d1a585b1a5e995960621b6044820152606401610a8a565b506000908152600360205260409020546001600160a01b03161590565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526001600160a01b0382166000908152600560209081526040808320805482518185028101850190935280835284938493849384936127c3938301828280156127b957602002820191906000526020600020905b8154815260200190600101908083116127a5575b5050505050613955565b6040805160a08101825263ffffffff9687168152948616602086015292851692840192909252831660608301529091166080820152979650505050505050565b6001600160a01b03811660009081526011602052604081205460010361282b57506001919050565b6001600160a01b038216600090815260056020908152604080832080548251818502810185019093528083528493849361289a93909290918301828280156127b957602002820191906000526020600020908154815260200190600101908083116127a5575050505050613955565b5050925092509250600e548160056128b29190615cca565b6128bd846003615cca565b6128c790866158f5565b6128d191906158f5565b101595945050505050565b60006128e78261458c565b92915050565b60008281526015602052604090205481106129455760405162461bcd60e51b81526020600482015260186024820152774f6666657220696e646578206f7574206f662072616e676560401b6044820152606401610a8a565b600082815260156020526040812080548390811061296557612965615967565b600091825260209182902060408051608081018252600490930290910180546001600160a01b03168084526001820154948401949094526002810154918301919091526003015460ff161515606082015291503314612a065760405162461bcd60e51b815260206004820152601760248201527f55736572206973206e6f74206f66666572206f776e65720000000000000000006044820152606401610a8a565b806060015115612a525760405162461bcd60e51b815260206004820152601760248201527613d999995c88185b1c9958591e4818d85b98d95b1b1959604a1b6044820152606401610a8a565b60208082015182516001600160a01b03166000908152601690925260408220805491929091612a829084906158f5565b9091555050600083815260156020526040902080546001919084908110612aab57612aab615967565b906000526020600020906004020160030160006101000a81548160ff021916908315150217905550336001600160a01b0316837fe2dc0bfd2fc658db980184c3f7c091c2f886874e896043b562d5099c8d95b1dd8360200151604051611b5091815260200190565b60125460ff1615612b365760405162461bcd60e51b8152600401610a8a9061579f565b6000828152601460209081526040918290208251808401909352805480845260019091015491830191909152612b7e5760405162461bcd60e51b8152600401610a8a906159ad565b6006548151604051636eb1769f60e11b8152336004820152306024820152620100009092046001600160a01b031691829063dd62ed3e90604401602060405180830381865afa158015612bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bf991906157c9565b1015612c3e5760405162461bcd60e51b81526020600482015260146024820152734e6f7420656e6f75676820616c6c6f77616e636560601b6044820152606401610a8a565b81518314612c855760405162461bcd60e51b81526020600482015260146024820152730a0e4d2c6ca40c8decae640dcdee840dac2e8c6d60631b6044820152606401610a8a565b612c9184600019613fd3565b6000848152600360205260409020546001600160a01b0316612cb3338661438a565b600080612cc38560000151614612565b6040516323b872dd60e01b815291935091506001600160a01b038516906323b872dd90612cf8903390879087906004016157e2565b6020604051808303816000875af1158015612d17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3b9190615811565b506007546040516323b872dd60e01b81526001600160a01b03808716926323b872dd92612d70923392169086906004016157e2565b6020604051808303816000875af1158015612d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db39190615811565b50336001600160a01b0316836001600160a01b0316887f78e40a3f168941f73efe6fbf315c11eca5de75a6575fd334ffa4f1801a05322389604051612dfa91815260200190565b60405180910390a450505050505050565b600081815260156020908152604080832080548251818502810185019093528083528493849084015b82821015612e96576000848152602090819020604080516080810182526004860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003015460ff16151560608301529083529092019101612e34565b5050505090506000815190506000805b82811015612f2357838181518110612ec057612ec0615967565b602002602001015160600151158015612ef5575081848281518110612ee757612ee7615967565b602002602001015160200151115b15612f1b57838181518110612f0c57612f0c615967565b60200260200101516020015191505b600101612ea6565b50949350505050565b600854600954604051636844038560e11b815233600482015260248101919091526001600160a01b039091169063d088070a9060440160006040518083038186803b158015612f7a57600080fd5b505afa158015612f8e573d6000803e3d6000fd5b50505050612fb08383836000013584602001358560400135866060013561414b565b6115918a8a8a8a8a8a8a613cb6565b606060156000838152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015613056576000848152602090819020604080516080810182526004860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003015460ff16151560608301529083529092019101612ff4565b505050509050919050565b6000818152601460209081526040808320815180830190925280548083526001909101549282019290925282916130aa5760405162461bcd60e51b8152600401610a8a906159ad565b80516020909101519094909350915050565b60008381526003602052604090205483906001600160a01b031633146130f45760405162461bcd60e51b8152600401610a8a9061597d565b60125460ff16156131175760405162461bcd60e51b8152600401610a8a9061579f565b600084815260156020526040902054831061316f5760405162461bcd60e51b81526020600482015260186024820152774f6666657220696e646578206f7574206f662072616e676560401b6044820152606401610a8a565b600084815260156020526040812080548590811061318f5761318f615967565b600091825260209182902060408051608081018252600490930290910180546001600160a01b0316835260018101549383019390935260028301549082015260039091015460ff1615801560608301529091506132285760405162461bcd60e51b815260206004820152601760248201527613d999995c88185b1c9958591e4818d85b98d95b1b1959604a1b6044820152606401610a8a565b828160200151146132725760405162461bcd60e51b81526020600482015260146024820152730a0e4d2c6ca40c8decae640dcdee840dac2e8c6d60631b6044820152606401610a8a565b61327c8585613fd3565b8051613288908661438a565b6000600660029054906101000a90046001600160a01b031690506000806132b28460200151614612565b60405163a9059cbb60e01b81523360048201526024810183905291935091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015613304573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133289190615811565b5060075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529084169063a9059cbb906044016020604051808303816000875af115801561337c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133a09190615811565b5083600001516001600160a01b0316336001600160a01b0316897f78e40a3f168941f73efe6fbf315c11eca5de75a6575fd334ffa4f1801a053223896040516133eb91815260200190565b60405180910390a45050505050505050565b6000546001600160a01b031633148061341a575061341a3361159d565b6134365760405162461bcd60e51b8152600401610a8a9061582e565b60065460ff16156134895760405162461bcd60e51b815260206004820152601b60248201527f506c6f74206461746120736574746572206973206c6f636b65642e00000000006044820152606401610a8a565b600082815260026020526040902081906118dc8282615a5c565b613521604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081018290526101208101829052610140810182905261016081018290526101808101829052906101a082019081526020016000905290565b60008281526002602090815260409182902082516101e081018452815460ff80821683526101008083048216958401959095526201000082048116958301959095526301000000810485166060830152640100000000810485166080830152650100000000008104851660a083015266010000000000008104851660c08301526701000000000000008104851660e0830152680100000000000000008104851693820193909352690100000000000000000083048416610120820152600160501b83048416610140820152600160581b83048416610160820152600160601b830484166101808201529290916101a0840191600160681b90910416600581111561362d5761362d61564e565b600581111561363e5761363e61564e565b81528154602090910190600160701b900460ff1660068111156136635761366361564e565b60068111156136745761367461564e565b90525092915050565b6000546001600160a01b031633146136a75760405162461bcd60e51b8152600401610a8a9061593b565b6001600160a01b0381166136fd5760405162461bcd60e51b815260206004820181905260248201527f4f776e65722063616e6e6f7420626520746865207a65726f20616464726573736044820152606401610a8a565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600081815260146020526040812054806128e75760405162461bcd60e51b8152600401610a8a906159ad565b6000546001600160a01b031633148061376857506137683361159d565b6137845760405162461bcd60e51b8152600401610a8a9061582e565b6001600160a01b0381166137da5760405162461bcd60e51b815260206004820181905260248201527f52656665727265722063616e6e6f7420626520746865203020616464726573736044820152606401610a8a565b6001600160a01b0316600090815260116020526040902060019055565b84516000908415806138095750806001145b6138555760405162461bcd60e51b815260206004820181905260248201527f5573652073696e676c6520646973636f756e74732077697468203120706c6f746044820152606401610a8a565b6008546040516315b6e8ab60e01b815260009182916001600160a01b03909116906315b6e8ab90613892908d908c908c908c908c90600401615d1f565b600060405180830381865afa1580156138af573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526138d79190810190615d7a565b905060005b838110156139315760006139088b83815181106138fb576138fb615967565b60200260200101516134a3565b90506000613916828561464c565b905061392281866158f5565b945082600101925050506138dc565b50600954600503613948576139458261458c565b91505b5098975050505050505050565b60008060008060008060008060008060008b51905060005b81811015613b325760008d828151811061398957613989615967565b60200260200101519050600160058111156139a6576139a661564e565b600082815260026020526040902054600160681b900460ff1660058111156139d0576139d061564e565b036139e7576139e06001896158f5565b9750613b29565b6002600082815260026020526040902054600160681b900460ff166005811115613a1357613a1361564e565b03613a2a57613a236001886158f5565b9650613b29565b6003600082815260026020526040902054600160681b900460ff166005811115613a5657613a5661564e565b03613a6d57613a666001876158f5565b9550613b29565b6004600082815260026020526040902054600160681b900460ff166005811115613a9957613a9961564e565b03613ab057613aa96001866158f5565b9450613b29565b6005600082815260026020526040902054600160681b900460ff166005811115613adc57613adc61564e565b14613b1b5760405162461bcd60e51b815260206004820152600f60248201526e426164206c616e642072617269747960881b6044820152606401610a8a565b613b266001856158f5565b93505b5060010161396d565b50949b939a509198509650945092505050565b825160005b81811015613bd8576000858281518110613b6657613b66615967565b60200260200101519050613b7981612699565b613bc55760405162461bcd60e51b815260206004820152601f60248201527f524d524b204c616e6473616c653a20506c6f7420756e617661696c61626c65006044820152606401610a8a565b613bcf338261438a565b50600101613b4a565b508115613bfd578351600f6000828254613bf291906158f5565b90915550613c169050565b835160106000828254613c1091906158f5565b90915550505b811515836001600160a01b0316336001600160a01b03167f8ab30b0cba3d3325d957c283bcd2f5ac70efe38245303058259d4c9dbb7d432187604051613c5c9190615112565b60405180910390a450505050565b600081815260036020908152604080832080546001600160a01b039096166001600160a01b03199096168617905593825260058152928120805460018101825590825292902090910155565b85613cd35760405162461bcd60e51b8152600401610a8a90615899565b6000613d18338989808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508b92508a9150899050886137f7565b6008546040516329523dbb60e11b81529192506001600160a01b0316906352a47b7690613d519033908a908a908a908a90600401615d1f565b600060405180830381600087803b158015613d6b57600080fd5b505af1158015613d7f573d6000803e3d6000fd5b505050506000613d8e83614b0c565b15613eb457600080613d9f84614b50565b6006546040516323b872dd60e01b81529294509092506201000090046001600160a01b0316906323b872dd90613ddd903390899086906004016157e2565b6020604051808303816000875af1158015613dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e209190615811565b92508215613ead576006546007546040516323b872dd60e01b8152620100009092046001600160a01b03908116926323b872dd92613e6792339291169087906004016157e2565b6020604051808303816000875af1158015613e86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eaa9190615811565b92505b5050613f3d565b6006546007546040516323b872dd60e01b815260009550620100009092046001600160a01b03908116926323b872dd92613ef792339291169087906004016157e2565b6020604051808303816000875af1158015613f16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f3a9190615811565b90505b80613f8a5760405162461bcd60e51b815260206004820152601e60248201527f4c616e6473616c653a205472616e7366657246726f6d206661696c75726500006044820152606401610a8a565b613fc889898080602002602001604051908101604052809392919081815260200183836020028082843760009201829052508893509150613b459050565b505050505050505050565b60008281526014602090815260408083208381556001018390556015825280832080548251818502810185019093528083529192909190849084015b82821015614071576000848152602090819020604080516080810182526004860290920180546001600160a01b03168352600180820154848601526002820154928401929092526003015460ff1615156060830152908352909201910161400f565b5050825192935060009150505b818110156141335782818151811061409857614098615967565b6020026020010151606001511580156140b15750838114155b1561412b578281815181106140c8576140c8615967565b602002602001015160200151601660008584815181106140ea576140ea615967565b6020026020010151600001516001600160a01b03166001600160a01b03168152602001908152602001600020600082825461412591906158f5565b90915550505b60010161407e565b5060008481526015602052604081206118dc91614c69565b846141685760405162461bcd60e51b8152600401610a8a90615899565b60008060008060006141ac8b8b8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061395592505050565b9450945094509450945081816141c291906158f5565b905060009150888511156141fd576141da8986615f20565b6141e490856158f5565b93506141f08986615f20565b6141fa9086615f20565b94505b878411156142325761420f8885615f20565b61421990846158f5565b92506142258885615f20565b61422f9085615f20565b93505b86831115614267576142448784615f20565b61424e90826158f5565b905061425a8784615f20565b6142649084615f20565b92505b8489101580156142775750838810155b80156142835750828710155b801561428f5750808610155b6142d45760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da0818dc99591a5d1cc81cd95d60521b6044820152606401610a8a565b60085460405163036954ed60e01b81526001600160a01b039091169063036954ed9061430c903390899089908990889060040161590d565b600060405180830381600087803b15801561432657600080fd5b505af115801561433a573d6000803e3d6000fd5b5050505061437d8b8b808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250925060019150613b459050565b5050505050505050505050565b6000818152600360205260409020546001600160a01b03166143ac8383613c6a565b6001600160a01b03811615614587576001600160a01b03811660009081526005602090815260408083208054825181850281018501909352808352919290919083018282801561441b57602002820191906000526020600020905b815481526020019060010190808311614407575b50508351939450600019925060009150505b82811015614465578584828151811061444857614448615967565b60200260200101510361445d57809150614465565b60010161442d565b5080196144b45760405162461bcd60e51b815260206004820152601b60248201527f506c6f74206e6f7420666f756e6420696e206f6c64206f776e657200000000006044820152606401610a8a565b6144bf600183615f20565b8114614546576001600160a01b03841660009081526005602052604090206144e8600184615f20565b815481106144f8576144f8615967565b906000526020600020015460056000866001600160a01b03166001600160a01b03168152602001908152602001600020828154811061453957614539615967565b6000918252602090912001555b6001600160a01b038416600090815260056020526040902080548061456d5761456d615f37565b600190038181906000526020600020016000905590555050505b505050565b6000806145a261459a614b64565b600b54614b87565b600b549091506000906127106145b88483615f20565b6145c29190615cca565b6145cc9190615f4d565b6145d890612710615f20565b905060006145ec620f4240600c5484614b9f565b90506000620f42406145fe8784615cca565b6146089190615f4d565b9695505050505050565b6000806000620f4240601354856146299190615cca565b6146339190615f4d565b905060006146418286615f20565b959194509092505050565b600080806001856101a0015160058111156146695761466961564e565b03614696577f0000000000000000000000000000000000000000000000000000000000000000915061475c565b6002856101a0015160058111156146af576146af61564e565b036146dc577f0000000000000000000000000000000000000000000000000000000000000000915061475c565b6003856101a0015160058111156146f5576146f561564e565b03614722577f0000000000000000000000000000000000000000000000000000000000000000915061475c565b60405162461bcd60e51b815260206004820152600f60248201526e426164206c616e642072617269747960881b6044820152606401610a8a565b83516000819003614772578293505050506128e7565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c08101829052905b82811015614ad75786818151811061480657614806615967565b60200260200101519150816101c0015115614837578151614830906001600160801b0316856158f5565b9350614acf565b6028886000015160ff1611801561484f575081602001515b15614869578151614830906001600160801b0316856158f5565b6028886020015160ff16118015614881575081604001515b1561489b578151614830906001600160801b0316856158f5565b6028886040015160ff161180156148b3575081606001515b156148cd578151614830906001600160801b0316856158f5565b6028886060015160ff161180156148e5575081608001515b156148ff578151614830906001600160801b0316856158f5565b6028886080015160ff1611801561491757508160a001515b15614931578151614830906001600160801b0316856158f5565b60288860a0015160ff1611801561494957508160c001515b15614963578151614830906001600160801b0316856158f5565b60288860c0015160ff1611801561497b57508160e001515b15614995578151614830906001600160801b0316856158f5565b60288860e0015160ff161180156149ae57508161010001515b156149c8578151614830906001600160801b0316856158f5565b602888610100015160ff161180156149e257508161012001515b156149fc578151614830906001600160801b0316856158f5565b602888610120015160ff16118015614a1657508161014001515b15614a30578151614830906001600160801b0316856158f5565b87610160015160ff166001148015614a4a57508161018001515b15614a64578151614830906001600160801b0316856158f5565b87610140015160ff166001148015614a7e57508161016001515b15614a98578151614830906001600160801b0316856158f5565b87610180015160ff166001148015614ab25750816101a001515b15614acf578151614acc906001600160801b0316856158f5565b93505b6001016147ec565b506207a120831115614aea576207a12092505b620f4240614af88482615f20565b614b029086615cca565b610f3f9190615f4d565b60006001600160a01b0382161580614b2c57506001600160a01b03821633145b80614b3a5750600d5460ff16155b15614b4757506000919050565b6128e782612803565b60008080620f424061462961c35086615cca565b600042600a5410614b755750600090565b600a54614b829042615f20565b905090565b600081831015614b985750816128e7565b50806128e7565b600080612710614baf8585615cca565b86614bbc86612710615f20565b614bc69190615cca565b614bd091906158f5565b614bda9190615f4d565b9150505b9392505050565b828054614bf190615865565b90600052602060002090601f016020900481019282614c135760008555614c59565b82601f10614c2c57805160ff1916838001178555614c59565b82800160010185558215614c59579182015b82811115614c59578251825591602001919060010190614c3e565b50614c65929150614c8d565b5090565b5080546000825560040290600052602060002090810190614c8a9190614ca2565b50565b5b80821115614c655760008155600101614c8e565b5b80821115614c655780546001600160a01b0319168155600060018201819055600282015560038101805460ff19169055600401614ca3565b60008060408385031215614cee57600080fd5b50508035926020909101359150565b600060208284031215614d0f57600080fd5b5035919050565b8015158114614c8a57600080fd5b600060208284031215614d3657600080fd5b8135614bde81614d16565b80356001600160a01b0381168114614d5857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6040516101e081016001600160401b0381118282101715614d9657614d96614d5d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614dc457614dc4614d5d565b604052919050565b60006001600160401b03821115614de557614de5614d5d565b5060051b60200190565b600082601f830112614e0057600080fd5b81356020614e15614e1083614dcc565b614d9c565b82815260059290921b84018101918181019086841115614e3457600080fd5b8286015b84811015614e4f5780358352918301918301614e38565b509695505050505050565b60008083601f840112614e6c57600080fd5b5081356001600160401b03811115614e8357600080fd5b6020830191508360208260051b8501011115614e9e57600080fd5b9250929050565b60008060008060008060808789031215614ebe57600080fd5b614ec787614d41565b955060208701356001600160401b0380821115614ee357600080fd5b614eef8a838b01614def565b96506040890135915080821115614f0557600080fd5b614f118a838b01614e5a565b90965094506060890135915080821115614f2a57600080fd5b50614f3789828a01614e5a565b979a9699509497509295939492505050565b6000815180845260005b81811015614f6f57602081850181015186830182015201614f53565b81811115614f81576000602083870101525b50601f01601f19169290920160200192915050565b602081526000614bde6020830184614f49565b600060208284031215614fbb57600080fd5b614bde82614d41565b60068110614c8a57600080fd5b600080600060408486031215614fe657600080fd5b83356001600160401b03811115614ffc57600080fd5b61500886828701614e5a565b909450925050602084013561501c81614fc4565b809150509250925092565b60008060006060848603121561503c57600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561506657600080fd5b82356001600160401b038082111561507d57600080fd5b818501915085601f83011261509157600080fd5b813560206150a1614e1083614dcc565b82815260059290921b840181019181810190898411156150c057600080fd5b948201945b838610156150e5576150d686614d41565b825294820194908201906150c5565b965050860135925050808211156150fb57600080fd5b5061510885828601614def565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561514a5783518352928401929184019160010161512e565b50909695505050505050565b60008060008060008060006080888a03121561517157600080fd5b87356001600160401b038082111561518857600080fd5b6151948b838c01614e5a565b909950975060208a01359150808211156151ad57600080fd5b6151b98b838c01614e5a565b909750955060408a01359150808211156151d257600080fd5b506151df8a828b01614e5a565b90945092506151f2905060608901614d41565b905092959891949750929550565b60006020828403121561521257600080fd5b81356001600160401b0381111561522857600080fd5b61523484828501614def565b949350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561529157603f1988860301845261527f858351614f49565b94509285019290850190600101615263565b5092979650505050505050565b60008060008060008060a087890312156152b757600080fd5b86356001600160401b038111156152cd57600080fd5b6152d989828a01614e5a565b909a90995060208901359860408101359850606081013597506080013595509350505050565b6020808252825182820181905260009190848201906040850190845b8181101561514a5783516001600160a01b03168352928401929184019160010161531b565b6000806040838503121561535357600080fd5b823591506020808401356001600160401b038082111561537257600080fd5b818601915086601f83011261538657600080fd5b81358181111561539857615398614d5d565b6153aa601f8201601f19168501614d9c565b915080825287848285010111156153c057600080fd5b80848401858401376000848284010152508093505050509250929050565b600080600080604085870312156153f457600080fd5b84356001600160401b038082111561540b57600080fd5b61541788838901614e5a565b9096509450602087013591508082111561543057600080fd5b818701915087601f83011261544457600080fd5b81358181111561545357600080fd5b8860206101e08302850101111561546957600080fd5b95989497505060200194505050565b6000806040838503121561548b57600080fd5b8235915061549b60208401614d41565b90509250929050565b6000608082840312156154b657600080fd5b50919050565b6000806000806000806000806000806101208b8d0312156154dc57600080fd5b8a356001600160401b03808211156154f357600080fd5b6154ff8e838f01614e5a565b909c509a5060208d013591508082111561551857600080fd5b6155248e838f01614e5a565b909a50985060408d013591508082111561553d57600080fd5b6155498e838f01614e5a565b909850965086915061555d60608e01614d41565b955060808d013591508082111561557357600080fd5b506155808d828e01614e5a565b909450925061559490508c60a08d016154a4565b90509295989b9194979a5092959850565b602080825282518282018190526000919060409081850190868401855b8281101561560757815180516001600160a01b0316855286810151878601528581015186860152606090810151151590850152608090930192908501906001016155c2565b5091979650505050505050565b60008082840361020081121561562957600080fd5b833592506101e0601f198201121561564057600080fd5b506020830190509250929050565b634e487b7160e01b600052602160045260246000fd5b600681106156745761567461564e565b9052565b600781106156745761567461564e565b815160ff1681526101e0810160208301516156a8602084018260ff169052565b5060408301516156bd604084018260ff169052565b5060608301516156d2606084018260ff169052565b5060808301516156e7608084018260ff169052565b5060a08301516156fc60a084018260ff169052565b5060c083015161571160c084018260ff169052565b5060e083015161572660e084018260ff169052565b506101008381015160ff9081169184019190915261012080850151821690840152610140808501518216908401526101608085015182169084015261018080850151909116908301526101a08084015161578282850182615664565b50506101c08084015161579782850182615678565b505092915050565b60208082526010908201526f14d85b195cc8185c99481c185d5cd95960821b604082015260600190565b6000602082840312156157db57600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b8051614d5881614d16565b60006020828403121561582357600080fd5b8151614bde81614d16565b6020808252601b908201527f55736572206973206e6f74206f776e6572206f722061646d696e2e0000000000604082015260600190565b600181811c9082168061587957607f821691505b6020821081036154b657634e487b7160e01b600052602260045260246000fd5b6020808252600f908201526e4e6f20706c6f747320746f2062757960881b604082015260600190565b6001600160a01b038316815260408101614bde6020830184615664565b634e487b7160e01b600052601160045260246000fd5b60008219821115615908576159086158df565b500190565b6001600160a01b03959095168552602085019390935260408401919091526060830152608082015260a00190565b6020808252601290820152712ab9b2b91034b9903737ba1037bbb732b91760711b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6020808252601690820152752ab9b2b91034b9903737ba103630b7321037bbb732b960511b604082015260600190565b6020808252600a9082015269139bdd081b1a5cdd195960b21b604082015260600190565b6000813560ff811681146128e757600080fd5b600081356128e781614fc4565b60068210615a0157615a0161564e565b805460ff60681b191660689290921b60ff60681b16919091179055565b60008135600781106128e757600080fd5b60078210615a3f57615a3f61564e565b805460ff60701b191660709290921b60ff60701b16919091179055565b615a79615a68836159d1565b825460ff191660ff91909116178255565b615a9e615a88602084016159d1565b825461ff00191660089190911b61ff0016178255565b615ac5615aad604084016159d1565b825462ff0000191660109190911b62ff000016178255565b615aee615ad4606084016159d1565b825463ff000000191660189190911b63ff00000016178255565b615b19615afd608084016159d1565b825464ff00000000191660209190911b64ff0000000016178255565b615b46615b2860a084016159d1565b825465ff0000000000191660289190911b65ff000000000016178255565b615b75615b5560c084016159d1565b825466ff000000000000191660309190911b66ff00000000000016178255565b615ba6615b8460e084016159d1565b825467ff00000000000000191660389190911b67ff0000000000000016178255565b615bda615bb661010084016159d1565b825468ff0000000000000000191660409190911b68ff000000000000000016178255565b615c10615bea61012084016159d1565b825469ff000000000000000000191660489190911b69ff00000000000000000016178255565b615c3e615c2061014084016159d1565b82805460ff60501b191660509290921b60ff60501b16919091179055565b615c6c615c4e61016084016159d1565b82805460ff60581b191660589290921b60ff60581b16919091179055565b615c9a615c7c61018084016159d1565b82805460ff60601b191660609290921b60ff60601b16919091179055565b615cb0615caa6101a084016159e4565b826159f1565b615cc6615cc06101c08401615a1e565b82615a2f565b5050565b6000816000190483118215151615615ce457615ce46158df565b500290565b81835260006001600160fb1b03831115615d0257600080fd5b8260051b8083602087013760009401602001938452509192915050565b6001600160a01b0386168152606060208201819052600090615d449083018688615ce9565b8281036040840152615d57818587615ce9565b98975050505050505050565b80516001600160801b0381168114614d5857600080fd5b60006020808385031215615d8d57600080fd5b82516001600160401b03811115615da357600080fd5b8301601f81018513615db457600080fd5b8051615dc2614e1082614dcc565b8181526101e09182028301840191848201919088841115615de257600080fd5b938501935b83851015615f145780858a031215615dff5760008081fd5b615e07614d73565b615e1086615d63565b8152615e1d878701615806565b878201526040615e2e818801615806565b908201526060615e3f878201615806565b908201526080615e50878201615806565b9082015260a0615e61878201615806565b9082015260c0615e72878201615806565b9082015260e0615e83878201615806565b90820152610100615e95878201615806565b90820152610120615ea7878201615806565b90820152610140615eb9878201615806565b90820152610160615ecb878201615806565b90820152610180615edd878201615806565b908201526101a0615eef878201615806565b908201526101c0615f01878201615806565b9082015283529384019391850191615de7565b50979650505050505050565b600082821015615f3257615f326158df565b500390565b634e487b7160e01b600052603160045260246000fd5b600082615f6a57634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220587189e6446d9770b5882175c2d99054862a54212a1cbce1509faf08f0208b9e64736f6c634300080d0033000000000000000000000000000000000000000000000000000000746a5288000000000000000000000000000000000000000000000000000000015d3ef7980000000000000000000000000000000000000000000000000000000246139ca800000000000000000000000000000000000000000000000000000000000000c350

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

000000000000000000000000000000000000000000000000000000746a5288000000000000000000000000000000000000000000000000000000015d3ef7980000000000000000000000000000000000000000000000000000000246139ca800000000000000000000000000000000000000000000000000000000000000c350

-----Decoded View---------------
Arg [0] : commonPrice (uint256): 500000000000
Arg [1] : rarePrice (uint256): 1500000000000
Arg [2] : epicPrice (uint256): 2500000000000
Arg [3] : creatorFee (uint256): 50000

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000000000000000000000000000000000746a528800
Arg [1] : 0000000000000000000000000000000000000000000000000000015d3ef79800
Arg [2] : 00000000000000000000000000000000000000000000000000000246139ca800
Arg [3] : 000000000000000000000000000000000000000000000000000000000000c350


Deployed ByteCode Sourcemap

113:9087:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1979:142:2;;;;2077:12;216:25:7;;2091:10:2;272:2:7;257:18;;250:34;2103:10:2;300:18:7;;;293:34;;;;204:2;189:18;1979:142:2;;;;;;;;16018:91;16091:11;;16018:91;;;484:25:7;;;472:2;457:18;16018:91:2;338:177:7;16218:107:2;16299:19;;16218:107;;4617:993:4;;;;;;:::i;:::-;;:::i;:::-;;1926:110;;;;;;:::i;:::-;;:::i;1705:101::-;;;;;;:::i;:::-;;:::i;1577:89:5:-;;;:::i;10413:319:2:-;;;;;;:::i;:::-;;:::i;7023:118:5:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7835::4:-;;;;;;:::i;:::-;7895:4;7918:17;;;:9;:17;;;;;:23;:27;;;7835:118;;;;5350:14:7;;5343:22;5325:41;;5313:2;5298:18;7835:118:4;5185:187:7;15114:111:2;;;;;;:::i;:::-;;:::i;2042:91:4:-;2114:12;;;;2042:91;;5436:1950:2;;;;;;:::i;:::-;;:::i;784:102:0:-;;;;;;:::i;:::-;;:::i;15620:82:2:-;15689:6;;;;;-1:-1:-1;;;;;15689:6:2;15620:82;;;-1:-1:-1;;;;;6434:32:7;;;6416:51;;6404:2;6389:18;15620:82:2;6270:203:7;6992:314:4;;;:::i;15231:281:2:-;;;;;;:::i;:::-;;:::i;685:93:0:-;;;;;;:::i;:::-;;:::i;5047:519:5:-;;;;;;:::i;:::-;;:::i;1672:93::-;1745:13;;;;1672:93;;4920:121;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2355:116:2:-;2441:23;;2355:116;;3211:299;;;;;;:::i;:::-;;:::i;15913:99::-;15990:15;;15913:99;;2369:352:4;;;;;;:::i;:::-;;:::i;14881:101:2:-;;;;;;:::i;:::-;;:::i;15815:92::-;15889:11;;-1:-1:-1;;;;;15889:11:2;15815:92;;2244::4;2318:11;;2244:92;;14988:120:2;;;;;;:::i;:::-;;:::i;1811:109:4:-;;;;;;:::i;:::-;;:::i;2139:99::-;2215:16;;;;;;;2139:99;;518:161:0;;;;;;:::i;:::-;;:::i;15708:101:2:-;15786:16;;-1:-1:-1;;;;;15786:16:2;15708:101;;2822:120;;;;;;:::i;:::-;;:::i;2477:142::-;;;;;;:::i;:::-;;:::i;1369:101:5:-;;;;;;:::i;:::-;;:::i;16350:159:2:-;;;;;;:::i;:::-;;:::i;7147:395:5:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1073:81:0:-;1115:7;1141:6;-1:-1:-1;;;;;1141:6:0;1073:81;;3099:210:4;;;;;;:::i;:::-;;:::i;8038:319:2:-;;;;;;:::i;:::-;;:::i;4529:385:5:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1252:111::-;;;;;;:::i;:::-;1311:7;1337:19;;;:11;:19;;;;;;-1:-1:-1;;;;;1337:19:5;;1252:111;6832:185;;;;;;:::i;:::-;;:::i;2727:366:4:-;;;;;;:::i;:::-;;:::i;2062:454:5:-;;;;;;:::i;:::-;;:::i;7329:483:4:-;;;;;;:::i;:::-;;:::i;8842:122::-;;;;;;:::i;:::-;-1:-1:-1;;;;;8934:23:4;8908:7;8934:23;;;:16;:23;;;;;;;8842:122;3078:127:2;3164:15;;3181:16;;3078:127;;;;14533:25:7;;;14589:2;14574:18;;14567:34;;;;14506:18;3078:127:2;14359:248:7;2234:115:2;;;;;;:::i;:::-;;:::i;4313:210:5:-;;;;;;:::i;:::-;;:::i;3803:504::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;14880:13:7;;14839:10;14876:22;;;14858:41;;14959:4;14947:17;;;14941:24;14937:33;;14915:20;;;14908:63;15031:4;15019:17;;;15013:24;15009:33;;14987:20;;;14980:63;15103:4;15091:17;;;15085:24;15081:33;;15059:20;;;15052:63;15175:4;15163:17;;;15157:24;15153:33;15131:20;;;15124:63;;;;14816:3;14801:19;;14612:581;16115:97:2;16191:14;;16115:97;;4840:347;;;;;;:::i;:::-;;:::i;16515:111::-;;;;;;:::i;:::-;;:::i;5616:518:4:-;;;;;;:::i;:::-;;:::i;2948:124:2:-;;;;;;:::i;:::-;-1:-1:-1;;;;;3032:28:2;3009:4;3032:28;;;:18;:28;;;;;;3064:1;3032:33;;2948:124;3777:834:4;;;;;;:::i;:::-;;:::i;8403:433::-;;;;;;:::i;:::-;;:::i;9862:545:2:-;;;;;;:::i;:::-;;:::i;6140:112:4:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7959:240::-;;;;;;:::i;:::-;;:::i;6258:728::-;;;;;;:::i;:::-;;:::i;2522:200:5:-;;;;;;:::i;:::-;;:::i;1771:115::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;892:175:0:-;;;;;;:::i;:::-;;:::i;2127:101:2:-;2204:17;;;;2127:101;;8205:192:4;;;;;;:::i;:::-;;:::i;2625:191:2:-;;;;;;:::i;:::-;;:::i;1476:95:5:-;1550:14;;;;;;;1476:95;;4617:993:4;1633:12;;;;1632:13;1624:42;;;;-1:-1:-1;;;1624:42:4;;;;;;;:::i;:::-;;;;;;;;;4712:1:::1;4704:5;:9;4696:49;;;::::0;-1:-1:-1;;;4696:49:4;;21404:2:7;4696:49:4::1;::::0;::::1;21386:21:7::0;21443:2;21423:18;;;21416:30;21482:29;21462:18;;;21455:57;21529:18;;4696:49:4::1;21202:351:7::0;4696:49:4::1;4755:17;1337:19:5::0;;;:11;:19;;;;;;-1:-1:-1;;;;;1337:19:5;4826:10:4::1;4813:23:::0;;4805:54:::1;;;::::0;-1:-1:-1;;;4805:54:4;;21760:2:7;4805:54:4::1;::::0;::::1;21742:21:7::0;21799:2;21779:18;;;21772:30;-1:-1:-1;;;21818:18:7;;;21811:48;21876:18;;4805:54:4::1;21558:342:7::0;4805:54:4::1;-1:-1:-1::0;;;;;4877:23:4;::::1;4869:53;;;::::0;-1:-1:-1;;;4869:53:4;;22107:2:7;4869:53:4::1;::::0;::::1;22089:21:7::0;22146:2;22126:18;;;22119:30;-1:-1:-1;;;22165:18:7;;;22158:47;22222:18;;4869:53:4::1;21905:341:7::0;4869:53:4::1;4968:11;1953:6:5::0;1978:17;;;:9;:17;;;;;:24;-1:-1:-1;;;1978:24:5;;;;4943:36:4::1;;;;;;;;:::i;:::-;::::0;4935:79:::1;;;::::0;-1:-1:-1;;;4935:79:4;;22453:2:7;4935:79:4::1;::::0;::::1;22435:21:7::0;22492:2;22472:18;;;22465:30;22531:32;22511:18;;;22504:60;22581:18;;4935:79:4::1;22251:354:7::0;4935:79:4::1;5025:17;5045::::0;;;:9:::1;:17;::::0;;;;:23;5128:16;;5124:103:::1;;5176:12;5168:5;:20;5160:56;;;::::0;-1:-1:-1;;;5160:56:4;;22812:2:7;5160:56:4::1;::::0;::::1;22794:21:7::0;22851:2;22831:18;;;22824:30;22890:25;22870:18;;;22863:53;22933:18;;5160:56:4::1;22610:347:7::0;5160:56:4::1;5263:6;::::0;5288:46:::1;::::0;-1:-1:-1;;;5288:46:4;;5308:10:::1;5288:46;::::0;::::1;23174:34:7::0;5328:4:4::1;23224:18:7::0;;;23217:43;5263:6:4;;;::::1;-1:-1:-1::0;;;;;5263:6:4::1;::::0;5338:5;;5263:6;;5288:19:::1;::::0;23109:18:7;;5288:46:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;5280:88;;;::::0;-1:-1:-1;;;5280:88:4;;23662:2:7;5280:88:4::1;::::0;::::1;23644:21:7::0;23701:2;23681:18;;;23674:30;-1:-1:-1;;;23720:18:7;;;23713:50;23780:18;;5280:88:4::1;23460:344:7::0;5280:88:4::1;5400:48;::::0;;::::1;::::0;::::1;::::0;;5406:10:::1;5400:48:::0;;;::::1;::::0;;::::1;::::0;;;5425:15:::1;5400:48:::0;;;;;;-1:-1:-1;5400:48:4;;;;;;5458:15;;;:7:::1;:15:::0;;;;;:27;;5400:48;5458:27;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;5458:27:4::1;-1:-1:-1::0;;;;;5458:27:4;;::::1;;::::0;;;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;5458:27:4::1;::::0;::::1;;::::0;;;::::1;::::0;;;5495:56;;-1:-1:-1;;;5495:56:4;;5400:48;;5495:22;::::1;::::0;::::1;::::0;:56:::1;::::0;5406:10;;5538:4:::1;::::0;5400:48;;5495:56:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;5567:36:4::1;::::0;484:25:7;;;5585:10:4::1;::::0;5577:6;;5567:36:::1;::::0;472:2:7;457:18;5567:36:4::1;;;;;;;4686:924;;;;4617:993:::0;;:::o;1926:110::-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;2005:11:4::1;:24:::0;1926:110::o;1705:101::-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;1778:12:4::1;:21:::0;;-1:-1:-1;;1778:21:4::1;::::0;::::1;;::::0;;;::::1;::::0;;1705:101::o;1577:89:5:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;1638:14:5::1;:21:::0;;-1:-1:-1;;1638:21:5::1;;;::::0;;1577:89::o;10413:319:2:-;10624:4;10647:78;10665:5;10672:7;10681:21;;10704:20;;10647:17;:78::i;:::-;10640:85;10413:319;-1:-1:-1;;;;;;;10413:319:2:o;7023:118:5:-;7118:16;;;;:8;:16;;;;;7111:23;;7086:13;;7118:16;7111:23;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7023:118;;;:::o;15114:111:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;15194:11:2::1;:24:::0;;-1:-1:-1;;;;;;15194:24:2::1;-1:-1:-1::0;;;;;15194:24:2;;;::::1;::::0;;;::::1;::::0;;15114:111::o;5436:1950::-;1385:16;;1430:15;;1376:70;;-1:-1:-1;;;1376:70:2;;1418:10;1376:70;;;25491:51:7;25558:18;;;25551:34;;;;-1:-1:-1;;;;;1385:16:2;;;;1376:41;;25464:18:7;;1376:70:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5559:7:2;;-1:-1:-1;;;5591:12:2;5583:40:::1;;;;-1:-1:-1::0;;;5583:40:2::1;;;;;;;:::i;:::-;5673:16;::::0;5664:76:::1;::::0;-1:-1:-1;;;5664:76:2;;5633:28:::1;::::0;-1:-1:-1;;;;;5673:16:2::1;::::0;5664:50:::1;::::0;:76:::1;::::0;5715:10:::1;::::0;5727:12;;5664:76:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5633:107;;5782:8;5758:20;:32;;5750:74;;;::::0;-1:-1:-1;;;5750:74:2;;26446:2:7;5750:74:2::1;::::0;::::1;26428:21:7::0;26485:2;26465:18;;;26458:30;26524:31;26504:18;;;26497:59;26573:18;;5750:74:2::1;26244:353:7::0;5750:74:2::1;5836:17;5855:15:::0;5872::::1;5889::::0;5906:18:::1;5928:26;5946:7;;5928:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;5928:17:2::1;::::0;-1:-1:-1;;;5928:26:2:i:1;:::-;5835:119;;;;;;;;;;6053:7;6039:21;;;;;:::i;:::-;6080:1;::::0;-1:-1:-1;6039:21:2;-1:-1:-1;6112:13:2::1;6096:12;:29;;;;;;;;:::i;:::-;::::0;6092:1288:::1;;6162:8;6149:9;:21;6141:51;;;::::0;-1:-1:-1;;;6141:51:2;;27069:2:7;6141:51:2::1;::::0;::::1;27051:21:7::0;27108:2;27088:18;;;27081:30;-1:-1:-1;;;27127:18:7;;;27120:47;27184:18;;6141:51:2::1;26867:341:7::0;6141:51:2::1;6215:16;::::0;6206:70:::1;::::0;-1:-1:-1;;;6206:70:2;;-1:-1:-1;;;;;6215:16:2;;::::1;::::0;6206:39:::1;::::0;:70:::1;::::0;6246:10:::1;::::0;6258:8;;6215:16:::1;::::0;;;;;6206:70:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;6290:42;6306:7;;6290:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;6290:42:2;-1:-1:-1;6327:4:2::1;::::0;-1:-1:-1;6290:15:2::1;::::0;-1:-1:-1;6290:42:2:i:1;:::-;6092:1288;;;6378:11;6362:12;:27;;;;;;;;:::i;:::-;::::0;6358:1022:::1;;6436:8:::0;6413:19:::1;6425:7:::0;6413:9;:19:::1;:::i;:::-;:31;6405:69;;;::::0;-1:-1:-1;;;6405:69:2;;27933:2:7;6405:69:2::1;::::0;::::1;27915:21:7::0;27972:2;27952:18;;;27945:30;28011:27;27991:18;;;27984:55;28056:18;;6405:69:2::1;27731:349:7::0;6405:69:2::1;6497:16;::::0;6488:70:::1;::::0;-1:-1:-1;;;6488:70:2;;-1:-1:-1;;;;;6497:16:2;;::::1;::::0;6488:39:::1;::::0;:70:::1;::::0;6528:10:::1;::::0;6497:16:::1;::::0;6543:8;;6497:16;;;;6488:70:::1;;;:::i;6358:1022::-;6660:11;6644:12;:27;;;;;;;;:::i;:::-;::::0;6640:740:::1;;6728:8:::0;6717:7;6695:19:::1;6707:7:::0;6695:9;:19:::1;:::i;:::-;:29;;;;:::i;:::-;:41;6687:85;;;::::0;-1:-1:-1;;;6687:85:2;;28805:2:7;6687:85:2::1;::::0;::::1;28787:21:7::0;28844:2;28824:18;;;28817:30;28883:33;28863:18;;;28856:61;28934:18;;6687:85:2::1;28603:355:7::0;6687:85:2::1;6795:16;::::0;6786:70:::1;::::0;-1:-1:-1;;;6786:70:2;;-1:-1:-1;;;;;6795:16:2;;::::1;::::0;6786:39:::1;::::0;:70:::1;::::0;6826:10:::1;::::0;6795:16:::1;::::0;;;6844:8;;6795:16;;6786:70:::1;;;:::i;6640:740::-;7083:14;7067:12;:30;;;;;;;;:::i;:::-;;:104;;;;-1:-1:-1::0;7163:8:2;7149:10;7139:7;7117:19:::1;7129:7:::0;7117:9;:19:::1;:::i;:::-;:29;;;;:::i;:::-;:42;;;;:::i;:::-;:54;7067:104;7042:187;;;::::0;-1:-1:-1;;;7042:187:2;;29683:2:7;7042:187:2::1;::::0;::::1;29665:21:7::0;29722:2;29702:18;;;29695:30;29761:26;29741:18;;;29734:54;29805:18;;7042:187:2::1;29481:348:7::0;7042:187:2::1;7252:16;::::0;7243:70:::1;::::0;-1:-1:-1;;;7243:70:2;;-1:-1:-1;;;;;7252:16:2;;::::1;::::0;7243:39:::1;::::0;:70:::1;::::0;7283:10:::1;::::0;7252:16:::1;::::0;;;;;7304:8;;7243:70:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7327:42;7343:7;;7327:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;7327:42:2;-1:-1:-1;7364:4:2::1;::::0;-1:-1:-1;7327:15:2::1;::::0;-1:-1:-1;7327:42:2:i:1;:::-;5533:1853;;;;;;;5436:1950:::0;;;:::o;784:102:0:-;-1:-1:-1;;;;;860:14:0;837:4;860:14;;;:7;:14;;;;;;;;;:19;;784:102::o;6992:314:4:-;7076:10;7037:19;7059:28;;;:16;:28;;;;;;7105:15;7097:47;;;;-1:-1:-1;;;7097:47:4;;30554:2:7;7097:47:4;;;30536:21:7;30593:2;30573:18;;;30566:30;-1:-1:-1;;;30612:18:7;;;30605:49;30671:18;;7097:47:4;30352:343:7;7097:47:4;7171:10;7185:1;7154:28;;;:16;:28;;;;;;:32;;;;7203:6;;7196:48;;-1:-1:-1;;;7196:48:4;;;;;25491:51:7;;;;25558:18;;;25551:34;;;7203:6:4;;;-1:-1:-1;;;;;7203:6:4;;7196:23;;25464:18:7;;7196:48:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;7260:39:4;;484:25:7;;;7275:10:4;;7260:39;;472:2:7;457:18;7260:39:4;;;;;;;7027:279;6992:314::o;15231:281:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;15365:9:2::1;15352:10;:22;15344:55;;;::::0;-1:-1:-1;;;15344:55:2;;30902:2:7;15344:55:2::1;::::0;::::1;30884:21:7::0;30941:2;30921:18;;;30914:30;-1:-1:-1;;;30960:18:7;;;30953:50;31020:18;;15344:55:2::1;30700:344:7::0;15344:55:2::1;15409:11;:19:::0;;;;15438:14:::1;:25:::0;15473:19:::1;:32:::0;15231:281::o;685:93:0:-;265:6;;-1:-1:-1;;;;;265:6:0;251:10;:20;243:51;;;;-1:-1:-1;;;243:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;757:14:0::1;;::::0;;;:7:::1;:14;::::0;;;;750:21;685:93::o;5047:519:5:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;5272:14:5::1;::::0;::::1;::::0;::::1;;;5271:15;5263:51;;;::::0;-1:-1:-1;;;5263:51:5;;31598:2:7;5263:51:5::1;::::0;::::1;31580:21:7::0;31637:2;31617:18;;;31610:30;31676:25;31656:18;;;31649:53;31719:18;;5263:51:5::1;31396:347:7::0;5263:51:5::1;5340:12:::0;;5382:14;;5370:26;::::1;5362:71;;;::::0;-1:-1:-1;;;5362:71:5;;31950:2:7;5362:71:5::1;::::0;::::1;31932:21:7::0;;;31969:18;;;31962:30;32028:34;32008:18;;;32001:62;32080:18;;5362:71:5::1;31748:356:7::0;5362:71:5::1;5448:6;5443:117;5458:8;5456:1;:10;5443:117;;;5483:35;5497:5;5503:1;5497:8;;;;;;;;:::i;:::-;;;;;;;5507:7;5515:1;5507:10;;;;;;;;:::i;:::-;;;;;;;5483:13;:35::i;:::-;5544:3;;5443:117;;;;5170:396;5047:519:::0;;:::o;4920:121::-;-1:-1:-1;;;;;5014:20:5;;;;;;:14;:20;;;;;;;;;5007:27;;;;;;;;;;;;;;;;;4979:16;;5007:27;;;5014:20;5007:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4920:121;;;:::o;3211:299:2:-;1385:16;;1430:15;;1376:70;;-1:-1:-1;;;1376:70:2;;1418:10;1376:70;;;25491:51:7;25558:18;;;25551:34;;;;-1:-1:-1;;;;;1385:16:2;;;;1376:41;;25464:18:7;;1376:70:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3430:73:::1;3440:7;;3449:21;;3472:20;;3494:8;3430:9;:73::i;:::-;3211:299:::0;;;;;;;:::o;2369:352:4:-;1182:19:5;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1182:19:5;1168:10;:33;1160:68;;;;-1:-1:-1;;;1160:68:5;;;;;;;:::i;:::-;1633:12:4::1;::::0;::::1;;1632:13;1624:42;;;;-1:-1:-1::0;;;1624:42:4::1;;;;;;;:::i;:::-;2481:1:::2;2473:5;:9;2465:50;;;::::0;-1:-1:-1;;;2465:50:4;;32794:2:7;2465:50:4::2;::::0;::::2;32776:21:7::0;32833:2;32813:18;;;32806:30;32872;32852:18;;;32845:58;32920:18;;2465:50:4::2;32592:352:7::0;2465:50:4::2;2558:11;1953:6:5::0;1978:17;;;:9;:17;;;;;:24;-1:-1:-1;;;1978:24:5;;;;2533:36:4::2;;;;;;;;:::i;:::-;::::0;2525:75:::2;;;::::0;-1:-1:-1;;;2525:75:4;;33151:2:7;2525:75:4::2;::::0;::::2;33133:21:7::0;33190:2;33170:18;;;33163:30;33229:28;33209:18;;;33202:56;33275:18;;2525:75:4::2;32949:350:7::0;2525:75:4::2;2630:31;::::0;;;;::::2;::::0;;;;;2645:15:::2;2630:31;::::0;;::::2;::::0;;;-1:-1:-1;2610:17:4;;;:9:::2;:17:::0;;;;;;:51;;;;;::::2;::::0;;::::2;::::0;2677:37;2696:10:::2;::::0;2620:6;;2677:37:::2;::::0;::::2;::::0;2638:5;484:25:7;;472:2;457:18;;338:177;2677:37:4::2;;;;;;;;2369:352:::0;;;:::o;14881:101:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;14956:6:2::1;:19:::0;;-1:-1:-1;;;;;14956:19:2;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;14956:19:2;;::::1;::::0;;;::::1;::::0;;14881:101::o;14988:120::-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;15072:16:2::1;:29:::0;;-1:-1:-1;;;;;;15072:29:2::1;-1:-1:-1::0;;;;;15072:29:2;;;::::1;::::0;;;::::1;::::0;;14988:120::o;1811:109:4:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;1888:16:4::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;1888:25:4;;::::1;::::0;;;::::1;::::0;;1811:109::o;518:161:0:-;265:6;;-1:-1:-1;;;;;265:6:0;251:10;:20;243:51;;;;-1:-1:-1;;;243:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;588:19:0;::::1;580:64;;;::::0;-1:-1:-1;;;580:64:0;;33506:2:7;580:64:0::1;::::0;::::1;33488:21:7::0;;;33525:18;;;33518:30;33584:34;33564:18;;;33557:62;33636:18;;580:64:0::1;33304:356:7::0;580:64:0::1;-1:-1:-1::0;;;;;654:14:0::1;;::::0;;;671:1:::1;654:14;::::0;;;;;;;:18;518:161::o;2822:120:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2907:28:2::1;;::::0;;;:18:::1;:28;::::0;;;;2900:35;2822:120::o;2477:142::-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;2572:23:2::1;:40:::0;2477:142::o;1369:101:5:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;1442:13:5::1;:21:::0;;-1:-1:-1;;1442:21:5::1;::::0;::::1;;::::0;;;::::1;::::0;;1369:101::o;16350:159:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;16449:1:2::1;16438:7;:12;;16430:37;;;::::0;-1:-1:-1;;;16430:37:2;;33867:2:7;16430:37:2::1;::::0;::::1;33849:21:7::0;33906:2;33886:18;;;33879:30;-1:-1:-1;;;33925:18:7;;;33918:42;33977:18;;16430:37:2::1;33665:336:7::0;16430:37:2::1;16477:15;:25:::0;16350:159::o;7147:395:5:-;7271:14;;7225:15;;7252:16;7271:14;-1:-1:-1;;;;;7323:22:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7295:50;;7360:6;7356:153;7370:8;7368:1;:10;7356:153;;;7395:14;7412:7;7420:1;7412:10;;;;;;;;:::i;:::-;;;;;;;7395:27;;7451:8;:16;7460:6;7451:16;;;;;;;;;;;7436:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;7446:1;7436:12;;;;;;;;:::i;:::-;;;;;;;;;;:31;-1:-1:-1;7493:3:5;;7356:153;;;-1:-1:-1;7526:9:5;7147:395;-1:-1:-1;;;7147:395:5:o;3099:210:4:-;1182:19:5;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1182:19:5;1168:10;:33;1160:68;;;;-1:-1:-1;;;1160:68:5;;;;;;;:::i;:::-;3172:83:4::1;3180:6;-1:-1:-1::0;;3172:7:4::1;:83::i;:::-;3270:32;::::0;3291:10:::1;::::0;3283:6;;3270:32:::1;::::0;;;::::1;3099:210:::0;;:::o;8038:319:2:-;1385:16;;1430:15;;1376:70;;-1:-1:-1;;;1376:70:2;;1418:10;1376:70;;;25491:51:7;25558:18;;;25551:34;;;;-1:-1:-1;;;;;1385:16:2;;;;1376:41;;25464:18:7;;1376:70:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8264:86:::1;8285:7;;8294:13;8309:11;8322;8335:14;8264:20;:86::i;:::-;8038:319:::0;;;;;;:::o;4529:385:5:-;4647:14;;4600:16;;4628;4647:14;-1:-1:-1;;;;;4697:23:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4697:23:5;;4671:49;;4735:6;4731:153;4745:8;4743:1;:10;4731:153;;;4770:14;4787:7;4795:1;4787:10;;;;;;;;:::i;:::-;;;;;;;4770:27;;4823:11;:19;4835:6;4823:19;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4823:19:5;4811:6;4818:1;4811:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4811:31:5;;;:9;;;;;;;;;;;:31;-1:-1:-1;4868:3:5;;4731:153;;6832:185;1182:19;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1182:19:5;1168:10;:33;1160:68;;;;-1:-1:-1;;;1160:68:5;;;;;;;:::i;:::-;6937:16:::1;::::0;;;:8:::1;:16;::::0;;;;;;;:26;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;6994:6;6978:32;7002:7;6978:32;;;;;;:::i;:::-;;;;;;;;6832:185:::0;;;:::o;2727:366:4:-;1182:19:5;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1182:19:5;1168:10;:33;1160:68;;;;-1:-1:-1;;;1160:68:5;;;;;;;:::i;:::-;2842:1:4::1;2831:8;:12;2823:53;;;::::0;-1:-1:-1;;;2823:53:4;;32794:2:7;2823:53:4::1;::::0;::::1;32776:21:7::0;32833:2;32813:18;;;32806:30;32872;32852:18;;;32845:58;32920:18;;2823:53:4::1;32592:352:7::0;2823:53:4::1;2886:13;2902:17:::0;;;:9:::1;:17;::::0;;;;:23;2943:12;2935:35:::1;;;;-1:-1:-1::0;;;2935:35:4::1;;;;;;;:::i;:::-;2980:17;::::0;;;:9:::1;:17;::::0;;;;;;;;:34;;;3030:56;;14533:25:7;;;14574:18;;;14567:34;;;3055:10:4::1;::::0;2980:17;;3030:56:::1;::::0;14506:18:7;3030:56:4::1;;;;;;;2813:280;2727:366:::0;;;:::o;2062:454:5:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;2192:13:5::1;::::0;::::1;;2191:14;2183:54;;;::::0;-1:-1:-1;;;2183:54:5;;34547:2:7;2183:54:5::1;::::0;::::1;34529:21:7::0;34586:2;34566:18;;;34559:30;34625:29;34605:18;;;34598:57;34672:18;;2183:54:5::1;34345:351:7::0;2183:54:5::1;2261:7:::0;2293:21;;::::1;2285:66;;;::::0;-1:-1:-1;;;2285:66:5;;31950:2:7;2285:66:5::1;::::0;::::1;31932:21:7::0;;;31969:18;;;31962:30;32028:34;32008:18;;;32001:62;32080:18;;2285:66:5::1;31748:356:7::0;2285:66:5::1;2365:6;2361:149;2375:3;2373:1;:5;2361:149;;;2395:14;2412:7;;2420:1;2412:10;;;;;;;:::i;:::-;;;;;;;2395:27;;2456:9;;2466:1;2456:12;;;;;;;:::i;:::-;;;;;;2436:9;:17;2446:6;2436:17;;;;;;;;;;;:32;;;;;;:::i;:::-;-1:-1:-1::0;;;2494:3:5::1;;2361:149;;7329:483:4::0;1182:19:5;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1182:19:5;1168:10;:33;1160:68;;;;-1:-1:-1;;;1160:68:5;;;;;;;:::i;:::-;7439:10:4::1;-1:-1:-1::0;;;;;7427:22:4;::::1;::::0;7419:58:::1;;;::::0;-1:-1:-1;;;7419:58:4;;40369:2:7;7419:58:4::1;::::0;::::1;40351:21:7::0;40408:2;40388:18;;;40381:30;40447:25;40427:18;;;40420:53;40490:18;;7419:58:4::1;40167:347:7::0;7419:58:4::1;7496:16;::::0;::::1;::::0;::::1;;;7495:17;7487:50;;;::::0;-1:-1:-1;;;7487:50:4;;40721:2:7;7487:50:4::1;::::0;::::1;40703:21:7::0;40760:2;40740:18;;;40733:30;-1:-1:-1;;;40779:18:7;;;40772:50;40839:18;;7487:50:4::1;40519:344:7::0;7487:50:4::1;7555:17;::::0;;;:9:::1;:17;::::0;;;;:23;:28;7547:68:::1;;;::::0;-1:-1:-1;;;7547:68:4;;41070:2:7;7547:68:4::1;::::0;::::1;41052:21:7::0;41109:2;41089:18;;;41082:30;41148:29;41128:18;;;41121:57;41195:18;;7547:68:4::1;40868:351:7::0;7547:68:4::1;7658:11;1953:6:5::0;1978:17;;;:9;:17;;;;;:24;-1:-1:-1;;;1978:24:5;;;;7633:36:4::1;;;;;;;;:::i;:::-;::::0;7625:79:::1;;;::::0;-1:-1:-1;;;7625:79:4;;41426:2:7;7625:79:4::1;::::0;::::1;41408:21:7::0;41465:2;41445:18;;;41438:30;41504:32;41484:18;;;41477:60;41554:18;;7625:79:4::1;41224:354:7::0;7625:79:4::1;7715:30;7728:8;7738:6;7715:12;:30::i;:::-;7760:45;::::0;-1:-1:-1;;;;;7760:45:4;::::1;::::0;7784:10:::1;::::0;7776:6;;7760:45:::1;::::0;;;::::1;7329:483:::0;;;:::o;2234:115:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;2314:17:2::1;:28:::0;;-1:-1:-1;;2314:28:2::1;::::0;::::1;;::::0;;;::::1;::::0;;2234:115::o;4313:210:5:-;4378:4;;4402:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;4402:24:5;;;;:39;;;;;;;;:::i;:::-;;4394:72;;;;-1:-1:-1;;;4394:72:5;;41785:2:7;4394:72:5;;;41767:21:7;41824:2;41804:18;;;41797:30;-1:-1:-1;;;41843:18:7;;;41836:50;41903:18;;4394:72:5;41583:344:7;4394:72:5;-1:-1:-1;4514:1:5;4483:19;;;:11;:19;;;;;;-1:-1:-1;;;;;4483:19:5;:33;;4313:210::o;3803:504::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4034:20:5;;3924:17;4034:20;;;:14;:20;;;;;;;;4016:39;;;;;;;;;;;;;;;;;3924:17;;;;;;;;4016:39;;;;4034:20;4016:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:39::i;:::-;4086:214;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;3803:504:5:o;4840:347:2:-;-1:-1:-1;;;;;4916:28:2;;4896:4;4916:28;;;:18;:28;;;;;;4948:1;4916:33;4912:75;;-1:-1:-1;4972:4:2;;4840:347;-1:-1:-1;4840:347:2:o;4912:75::-;-1:-1:-1;;;;;5074:24:2;;4997:17;5074:24;;;:14;:24;;;;;;;;5056:43;;;;;;;;;;;;;;;;;4997:17;;;;5056:43;;;;5074:24;;5056:43;;5074:24;5056:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:43::i;:::-;4996:103;;;;;;;;5157:23;;5142:7;5152:1;5142:11;;;;:::i;:::-;5128;:7;5138:1;5128:11;:::i;:::-;5116:23;;:9;:23;:::i;:::-;:37;;;;:::i;:::-;:64;;;4840:347;-1:-1:-1;;;;;4840:347:2:o;16515:111::-;16575:4;16598:21;16613:5;16598:14;:21::i;:::-;16591:28;16515:111;-1:-1:-1;;16515:111:2:o;5616:518:4:-;5713:15;;;;:7;:15;;;;;:22;5700:35;;5692:72;;;;-1:-1:-1;;;5692:72:4;;42307:2:7;5692:72:4;;;42289:21:7;42346:2;42326:18;;;42319:30;-1:-1:-1;;;42365:18:7;;;42358:54;42429:18;;5692:72:4;42105:348:7;5692:72:4;5774:18;5795:15;;;:7;:15;;;;;:27;;5811:10;;5795:27;;;;;;:::i;:::-;;;;;;;;;;5774:48;;;;;;;;5795:27;;;;;;;5774:48;;-1:-1:-1;;;;;5774:48:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5840:10:4;:25;5832:61;;;;-1:-1:-1;;;5832:61:4;;42660:2:7;5832:61:4;;;42642:21:7;42699:2;42679:18;;;42672:30;42738:25;42718:18;;;42711:53;42781:18;;5832:61:4;42458:347:7;5832:61:4;5912:5;:15;;;5911:16;5903:52;;;;-1:-1:-1;;;5903:52:4;;43012:2:7;5903:52:4;;;42994:21:7;43051:2;43031:18;;;43024:30;-1:-1:-1;;;43070:18:7;;;43063:53;43133:18;;5903:52:4;42810:347:7;5903:52:4;5999:11;;;;;5983;;-1:-1:-1;;;;;5966:29:4;;;;;:16;:29;;;;;;:44;;5999:11;;5966:29;;:44;;5999:11;;5966:44;:::i;:::-;;;;-1:-1:-1;;6020:15:4;;;;:7;:15;;;;;:27;;6060:4;;6020:15;6036:10;;6020:27;;;;;;:::i;:::-;;;;;;;;;;;:37;;;:44;;;;;;;;;;;;;;;;;;6103:10;-1:-1:-1;;;;;6080:47:4;6095:6;6080:47;6115:5;:11;;;6080:47;;;;484:25:7;;472:2;457:18;;338:177;3777:834:4;1633:12;;;;1632:13;1624:42;;;;-1:-1:-1;;;1624:42:4;;;;;;;:::i;:::-;3850:22:::1;3875:17:::0;;;:9:::1;:17;::::0;;;;;;;;3850:42;;;;::::1;::::0;;;;;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;3902:40:::1;;;;-1:-1:-1::0;;;3902:40:4::1;;;;;;;:::i;:::-;3978:6;::::0;4053:13;;4003:46:::1;::::0;-1:-1:-1;;;4003:46:4;;4023:10:::1;4003:46;::::0;::::1;23174:34:7::0;4043:4:4::1;23224:18:7::0;;;23217:43;3978:6:4;;;::::1;-1:-1:-1::0;;;;;3978:6:4::1;::::0;;;4003:19:::1;::::0;23109:18:7;;4003:46:4::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;3995:96;;;::::0;-1:-1:-1;;;3995:96:4;;23662:2:7;3995:96:4::1;::::0;::::1;23644:21:7::0;23701:2;23681:18;;;23674:30;-1:-1:-1;;;23720:18:7;;;23713:50;23780:18;;3995:96:4::1;23460:344:7::0;3995:96:4::1;4118:13:::0;;4109:22;::::1;4101:55;;;::::0;-1:-1:-1;;;4101:55:4;;43364:2:7;4101:55:4::1;::::0;::::1;43346:21:7::0;43403:2;43383:18;;;43376:30;-1:-1:-1;;;43422:18:7;;;43415:50;43482:18;;4101:55:4::1;43162:344:7::0;4101:55:4::1;4167:83;4175:6;-1:-1:-1::0;;4167:7:4::1;:83::i;:::-;4260:21;1337:19:5::0;;;:11;:19;;;;;;-1:-1:-1;;;;;1337:19:5;4314:32:4::1;4327:10;1337:19:5::0;4314:12:4::1;:32::i;:::-;4357:8;4367::::0;4379:28:::1;4393:7;:13;;;4379;:28::i;:::-;4417:54;::::0;-1:-1:-1;;;4417:54:4;;4356:51;;-1:-1:-1;4356:51:4;-1:-1:-1;;;;;;4417:22:4;::::1;::::0;::::1;::::0;:54:::1;::::0;4440:10:::1;::::0;4452:13;;4356:51;;4417:54:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;4516:11:4::1;::::0;4481:52:::1;::::0;-1:-1:-1;;;4481:52:4;;-1:-1:-1;;;;;4481:22:4;;::::1;::::0;::::1;::::0;:52:::1;::::0;4504:10:::1;::::0;4516:11:::1;::::0;4529:3;;4481:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4586:10;-1:-1:-1::0;;;;;4549:55:4::1;4571:13;-1:-1:-1::0;;;;;4549:55:4::1;4563:6;4549:55;4598:5;4549:55;;;;484:25:7::0;;472:2;457:18;;338:177;4549:55:4::1;;;;;;;;3840:771;;;;;3777:834:::0;;:::o;8403:433::-;8465:7;8508:15;;;:7;:15;;;;;;;;8484:39;;;;;;;;;;;;;;;;;8465:7;;;;8484:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8484:39:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8533:14;8550:6;:13;8533:30;;8573:15;8607:6;8602:201;8617:9;8615:1;:11;8602:201;;;8648:6;8655:1;8648:9;;;;;;;;:::i;:::-;;;;;;;:19;;;8647:20;:52;;;;;8689:10;8671:6;8678:1;8671:9;;;;;;;;:::i;:::-;;;;;;;:15;;;:28;8647:52;8643:119;;;8732:6;8739:1;8732:9;;;;;;;;:::i;:::-;;;;;;;:15;;;8719:28;;8643:119;8787:3;;8602:201;;;-1:-1:-1;8819:10:4;8403:433;-1:-1:-1;;;;8403:433:4:o;9862:545:2:-;1385:16;;1430:15;;1376:70;;-1:-1:-1;;;1376:70:2;;1418:10;1376:70;;;25491:51:7;25558:18;;;25551:34;;;;-1:-1:-1;;;;;1385:16:2;;;;1376:41;;25464:18:7;;1376:70:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10170:141:::1;10191:14;;10207:11;:25;;;10234:11;:23;;;10259:11;:23;;;10284:11;:26;;;10170:20;:141::i;:::-;10321:79;10331:13;;10346:21;;10369:20;;10391:8;10321:9;:79::i;6140:112:4:-:0;6197:14;6230:7;:15;6238:6;6230:15;;;;;;;;;;;6223:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6223:22:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6140:112;;;:::o;7959:240::-;8021:7;8074:17;;;:9;:17;;;;;;;;8049:42;;;;;;;;;;;;;;;;;;;;;;;;;8021:7;;8101:40;;;;-1:-1:-1;;;8101:40:4;;;;;;;:::i;:::-;8159:13;;8174:17;;;;;8159:13;;8174:17;;-1:-1:-1;7959:240:4;-1:-1:-1;;7959:240:4:o;6258:728::-;1182:19:5;;;;:11;:19;;;;;;;;-1:-1:-1;;;;;1182:19:5;1168:10;:33;1160:68;;;;-1:-1:-1;;;1160:68:5;;;;;;;:::i;:::-;1633:12:4::1;::::0;::::1;;1632:13;1624:42;;;;-1:-1:-1::0;;;1624:42:4::1;;;;;;;:::i;:::-;6402:15:::2;::::0;;;:7:::2;:15;::::0;;;;:22;6389:35;::::2;6381:72;;;::::0;-1:-1:-1;;;6381:72:4;;42307:2:7;6381:72:4::2;::::0;::::2;42289:21:7::0;42346:2;42326:18;;;42319:30;-1:-1:-1;;;42365:18:7;;;42358:54;42429:18;;6381:72:4::2;42105:348:7::0;6381:72:4::2;6463:18;6484:15:::0;;;:7:::2;:15;::::0;;;;:27;;6500:10;;6484:27;::::2;;;;;:::i;:::-;;::::0;;;::::2;::::0;;;;6463:48:::2;::::0;;::::2;::::0;::::2;::::0;;6484:27:::2;::::0;;::::2;::::0;;::::2;6463:48:::0;;-1:-1:-1;;;;;6463:48:4::2;::::0;;;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;;::::2;::::0;::::2;;;::::0;::::2;::::0;;;;;;-1:-1:-1;6521:52:4::2;;;::::0;-1:-1:-1;;;6521:52:4;;43012:2:7;6521:52:4::2;::::0;::::2;42994:21:7::0;43051:2;43031:18;;;43024:30;-1:-1:-1;;;43070:18:7;;;43063:53;43133:18;;6521:52:4::2;42810:347:7::0;6521:52:4::2;6606:5;6591;:11;;;:20;6583:53;;;::::0;-1:-1:-1;;;6583:53:4;;43364:2:7;6583:53:4::2;::::0;::::2;43346:21:7::0;43403:2;43383:18;;;43376:30;-1:-1:-1;;;43422:18:7;;;43415:50;43482:18;;6583:53:4::2;43162:344:7::0;6583:53:4::2;6647:27;6655:6;6663:10;6647:7;:27::i;:::-;6697:11:::0;;6684:33:::2;::::0;6710:6;6684:12:::2;:33::i;:::-;6728:16;6754:6;;;;;;;;;-1:-1:-1::0;;;;;6754:6:4::2;6728:33;;6772:8;6782::::0;6794:26:::2;6808:5;:11;;;6794:13;:26::i;:::-;6830:35;::::0;-1:-1:-1;;;6830:35:4;;6849:10:::2;6830:35;::::0;::::2;25491:51:7::0;25558:18;;;25551:34;;;6771:49:4;;-1:-1:-1;6771:49:4;-1:-1:-1;;;;;;6830:18:4;::::2;::::0;::::2;::::0;25464::7;;6830:35:4::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;6894:11:4::2;::::0;6875:36:::2;::::0;-1:-1:-1;;;6875:36:4;;-1:-1:-1;;;;;6894:11:4;;::::2;6875:36;::::0;::::2;25491:51:7::0;25558:18;;;25551:34;;;6875:18:4;;::::2;::::0;::::2;::::0;25464::7;;6875:36:4::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;6960:5;:11;;;-1:-1:-1::0;;;;;6926:53:4::2;6948:10;-1:-1:-1::0;;;;;6926:53:4::2;6940:6;6926:53;6973:5;6926:53;;;;484:25:7::0;;472:2;457:18;;338:177;6926:53:4::2;;;;;;;;6371:615;;;;6258:728:::0;;;;:::o;2522:200:5:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;2632:13:5::1;::::0;::::1;;2631:14;2623:54;;;::::0;-1:-1:-1;;;2623:54:5;;34547:2:7;2623:54:5::1;::::0;::::1;34529:21:7::0;34586:2;34566:18;;;34559:30;34625:29;34605:18;;;34598:57;34672:18;;2623:54:5::1;34345:351:7::0;2623:54:5::1;2687:17;::::0;;;:9:::1;:17;::::0;;;;2707:8;;2687:28:::1;2707:8:::0;2687:17;:28:::1;:::i;1771:115::-:0;1828:15;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1828:15:5;1862:17;;;;:9;:17;;;;;;;;;1855:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1855:24:5;;;;;;;;-1:-1:-1;;;1855:24:5;;;;;;;;-1:-1:-1;;;1855:24:5;;;;;;;;;1862:17;;1855:24;;;;-1:-1:-1;;;1855:24:5;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;;1855:24:5;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;-1:-1:-1;1855:24:5;1771:115;-1:-1:-1;;1771:115:5:o;892:175:0:-;265:6;;-1:-1:-1;;;;;265:6:0;251:10;:20;243:51;;;;-1:-1:-1;;;243:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;974:22:0;::::1;966:67;;;::::0;-1:-1:-1;;;966:67:0;;43713:2:7;966:67:0::1;::::0;::::1;43695:21:7::0;;;43732:18;;;43725:30;43791:34;43771:18;;;43764:62;43843:18;;966:67:0::1;43511:356:7::0;966:67:0::1;1043:6;:17:::0;;-1:-1:-1;;;;;;1043:17:0::1;-1:-1:-1::0;;;;;1043:17:0;;;::::1;::::0;;;::::1;::::0;;892:175::o;8205:192:4:-;8268:7;8303:17;;;:9;:17;;;;;:23;8344:9;8336:32;;;;-1:-1:-1;;;8336:32:4;;;;;;;:::i;2625:191:2:-;376:6:0;;-1:-1:-1;;;;;376:6:0;362:10;:20;;:43;;;386:19;394:10;386:7;:19::i;:::-;354:83;;;;-1:-1:-1;;;354:83:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2708:22:2;::::1;2700:67;;;::::0;-1:-1:-1;;;2700:67:2;;44074:2:7;2700:67:2::1;::::0;::::1;44056:21:7::0;;;44093:18;;;44086:30;44152:34;44132:18;;;44125:62;44204:18;;2700:67:2::1;43872:356:7::0;2700:67:2::1;-1:-1:-1::0;;;;;2777:28:2::1;;::::0;;;:18:::1;:28;::::0;;;;2808:1:::1;2777:32:::0;;2625:191::o;10738:965::-;10981:14;;10949:4;;11013:33;;;:50;;;11050:8;11062:1;11050:13;11013:50;11005:95;;;;-1:-1:-1;;;11005:95:2;;44435:2:7;11005:95:2;;;44417:21:7;;;44454:18;;;44447:30;44513:34;44493:18;;;44486:62;44565:18;;11005:95:2;44233:356:7;11005:95:2;11254:16;;11245:92;;-1:-1:-1;;;11245:92:2;;11111:13;;;;-1:-1:-1;;;;;11254:16:2;;;;11245:40;;:92;;11286:5;;11293:21;;;;11316:20;;;;11245:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;11245:92:2;;;;;;;;;;;;:::i;:::-;11206:131;;11353:6;11348:241;11363:8;11361:1;:10;11348:241;;;11388:24;11415:23;11427:7;11435:1;11427:10;;;;;;;;:::i;:::-;;;;;;;11415:11;:23::i;:::-;11388:50;;11452:17;11472:42;11494:8;11504:9;11472:21;:42::i;:::-;11452:62;-1:-1:-1;11528:18:2;11452:62;11528:18;;:::i;:::-;;;11573:3;;;;;11374:215;;11348:241;;;-1:-1:-1;15587:15:2;;15606:1;15587:20;11599:75;;11642:21;11657:5;11642:14;:21::i;:::-;11634:29;;11599:75;-1:-1:-1;11691:5:2;10738:965;-1:-1:-1;;;;;;;;10738:965:2:o;2728:1069:5:-;2804:4;2810;2816;2822;2828;2845:15;2870:13;2893;2916;2939:15;2965:11;2979:7;:14;2965:28;;3008:6;3004:730;3018:3;3016:1;:5;3004:730;;;3038:14;3055:7;3063:1;3055:10;;;;;;;;:::i;:::-;;;;;;;3038:27;;3112:13;3084:41;;;;;;;;:::i;:::-;:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;3084:24:5;;;;:41;;;;;;;;:::i;:::-;;3080:612;;3145:11;3155:1;3145:11;;:::i;:::-;;;3080:612;;;3221:11;3193:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;3193:24:5;;;;:39;;;;;;;;:::i;:::-;;3189:503;;3252:9;3260:1;3252:9;;:::i;:::-;;;3189:503;;;3326:11;3298:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;3298:24:5;;;;:39;;;;;;;;:::i;:::-;;3294:398;;3357:9;3365:1;3357:9;;:::i;:::-;;;3294:398;;;3431:11;3403:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;3403:24:5;;;;:39;;;;;;;;:::i;:::-;;3399:293;;3462:9;3470:1;3462:9;;:::i;:::-;;;3399:293;;;3614:14;3586:17;;;;:9;:17;;;;;:24;-1:-1:-1;;;3586:24:5;;;;:42;;;;;;;;:::i;:::-;;3578:70;;;;-1:-1:-1;;;3578:70:5;;48586:2:7;3578:70:5;;;48568:21:7;48625:2;48605:18;;;48598:30;-1:-1:-1;;;48644:18:7;;;48637:45;48699:18;;3578:70:5;48384:339:7;3578:70:5;3666:11;3676:1;3666:11;;:::i;:::-;;;3399:293;-1:-1:-1;3718:3:5;;3004:730;;;-1:-1:-1;3752:7:5;;3761:5;;-1:-1:-1;3768:5:5;;-1:-1:-1;3768:5:5;-1:-1:-1;3761:5:5;-1:-1:-1;2728:1069:5;-1:-1:-1;;;2728:1069:5:o;7392:640:2:-;7522:14;;7503:16;7546:239;7560:8;7558:1;:10;7546:239;;;7585:14;7602:7;7610:1;7602:10;;;;;;;;:::i;:::-;;;;;;;7585:27;;7634;7654:6;7634:19;:27::i;:::-;7626:71;;;;-1:-1:-1;;;7626:71:2;;48930:2:7;7626:71:2;;;48912:21:7;48969:2;48949:18;;;48942:30;49008:33;48988:18;;;48981:61;49059:18;;7626:71:2;48728:355:7;7626:71:2;7711:32;7724:10;7736:6;7711:12;:32::i;:::-;-1:-1:-1;7769:3:2;;7546:239;;;;7799:17;7795:154;;;7852:7;:14;7832:16;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;7795:154:2;;-1:-1:-1;7795:154:2;;7924:7;:14;7905:15;;:33;;;;;;;:::i;:::-;;;;-1:-1:-1;;7795:154:2;8007:17;7964:61;;7997:8;-1:-1:-1;;;;;7964:61:2;7985:10;-1:-1:-1;;;;;7964:61:2;;7976:7;7964:61;;;;;;:::i;:::-;;;;;;;;7493:539;7392:640;;;:::o;6679:147:5:-;6750:19;;;;:11;:19;;;;;;;;:26;;-1:-1:-1;;;;;6750:26:5;;;-1:-1:-1;;;;;;6750:26:5;;;;;;;6786:20;;;:14;:20;;;;;:33;;6750:26;6786:33;;;;;;;;;;;;;;6679:147::o;3516:1074:2:-;3729:18;3721:46;;;;-1:-1:-1;;;3721:46:2;;;;;;;:::i;:::-;3777:13;3793:83;3811:10;3823:7;;3793:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3832:21:2;;-1:-1:-1;3832:21:2;;-1:-1:-1;3855:20:2;;-1:-1:-1;3855:20:2;3793:17;:83::i;:::-;3895:16;;3886:98;;-1:-1:-1;;;3886:98:2;;3777:99;;-1:-1:-1;;;;;;3895:16:2;;3886:41;;:98;;3928:10;;3940:21;;;;3963:20;;;;3886:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3994:12;4020:26;4037:8;4020:16;:26::i;:::-;4016:455;;;4063:8;4073;4085:28;4107:5;4085:21;:28::i;:::-;4144:6;;4137:54;;-1:-1:-1;;;4137:54:2;;4062:51;;-1:-1:-1;4062:51:2;;-1:-1:-1;4144:6:2;;;-1:-1:-1;;;;;4144:6:2;;4137:27;;:54;;4165:10;;4177:8;;4062:51;;4137:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4127:64;;4209:7;4205:113;;;4253:6;;4286:11;;4246:57;;-1:-1:-1;;;4246:57:2;;4253:6;;;;-1:-1:-1;;;;;4253:6:2;;;;4246:27;;:57;;4274:10;;4286:11;;;4299:3;;4246:57;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4236:67;;4205:113;4048:280;;4016:455;;;4408:6;;4441:11;;4401:59;;-1:-1:-1;;;4401:59:2;;4375:1;;-1:-1:-1;4408:6:2;;;;-1:-1:-1;;;;;4408:6:2;;;;4401:27;;:59;;4429:10;;4441:11;;;4454:5;;4401:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4391:69;;4016:455;4489:7;4481:50;;;;-1:-1:-1;;;4481:50:2;;49290:2:7;4481:50:2;;;49272:21:7;49329:2;49309:18;;;49302:30;49368:32;49348:18;;;49341:60;49418:18;;4481:50:2;49088:354:7;4481:50:2;4542:41;4558:7;;4542:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4567:8:2;;-1:-1:-1;4542:41:2;-1:-1:-1;4542:15:2;;-1:-1:-1;4542:41:2:i;:::-;3711:879;;3516:1074;;;;;;;:::o;3315:456:4:-;3399:17;;;;:9;:17;;;;;;;;3392:24;;;;;;;;3450:7;:15;;;;;3426:39;;;;;;;;;;;;;;;;;;;3450:15;;3426:39;3399:17;;3426:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3426:39:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3492:13:4;;3426:39;;-1:-1:-1;3475:14:4;;-1:-1:-1;;3515:218:4;3530:9;3528:1;:11;3515:218;;;3561:6;3568:1;3561:9;;;;;;;;:::i;:::-;;;;;;;:19;;;3560:20;:45;;;;;3589:16;3584:1;:21;;3560:45;3556:136;;;3662:6;3669:1;3662:9;;;;;;;;:::i;:::-;;;;;;;:15;;;3625:16;:33;3642:6;3649:1;3642:9;;;;;;;;:::i;:::-;;;;;;;:15;;;-1:-1:-1;;;;;3625:33:4;-1:-1:-1;;;;;3625:33:4;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;;;-1:-1:-1;;3556:136:4;3717:3;;3515:218;;;-1:-1:-1;3749:15:4;;;;:7;:15;;;;;3742:22;;;:::i;8363:1493:2:-;8583:18;8575:46;;;;-1:-1:-1;;;8575:46:2;;;;;;;:::i;:::-;8632:17;8651:15;8668;8685;8702:18;8724:26;8742:7;;8724:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8724:17:2;;-1:-1:-1;;;8724:26:2:i;:::-;8631:119;;;;;;;;;;8850:7;8836:21;;;;;:::i;:::-;;;8877:1;8867:11;;8964:13;8952:9;:25;8949:147;;;9005:25;9017:13;9005:9;:25;:::i;:::-;8993:38;;;;:::i;:::-;;-1:-1:-1;9059:25:2;9071:13;9059:9;:25;:::i;:::-;9045:40;;;;:::i;:::-;;;8949:147;9179:11;9169:7;:21;9166:133;;;9218:21;9228:11;9218:7;:21;:::i;:::-;9206:34;;;;:::i;:::-;;-1:-1:-1;9266:21:2;9276:11;9266:7;:21;:::i;:::-;9254:34;;;;:::i;:::-;;;9166:133;9382:11;9372:7;:21;9369:136;;;9424:21;9434:11;9424:7;:21;:::i;:::-;9409:37;;;;:::i;:::-;;-1:-1:-1;9472:21:2;9482:11;9472:7;:21;:::i;:::-;9460:34;;;;:::i;:::-;;;9369:136;9553:9;9536:13;:26;;:52;;;;;9581:7;9566:11;:22;;9536:52;:78;;;;;9607:7;9592:11;:22;;9536:78;:110;;;;;9636:10;9618:14;:28;;9536:110;9515:179;;;;-1:-1:-1;;;9515:179:2;;49779:2:7;9515:179:2;;;49761:21:7;49818:2;49798:18;;;49791:30;-1:-1:-1;;;49837:18:7;;;49830:52;49899:18;;9515:179:2;49577:346:7;9515:179:2;9714:16;;9705:92;;-1:-1:-1;;;9705:92:2;;-1:-1:-1;;;;;9714:16:2;;;;9705:39;;:92;;9745:10;;9757:9;;9768:7;;9777;;9786:10;;9705:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9807:42;9823:7;;9807:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9807:42:2;-1:-1:-1;9844:4:2;;-1:-1:-1;9807:15:2;;-1:-1:-1;9807:42:2:i;:::-;8565:1291;;;;;8363:1493;;;;;;:::o;5572:1101:5:-;5643:16;5662:19;;;:11;:19;;;;;;-1:-1:-1;;;;;5662:19:5;5691:27;5705:4;5674:6;5691:13;:27::i;:::-;-1:-1:-1;;;;;5771:22:5;;;5767:900;;-1:-1:-1;;;;;5842:24:5;;5809:30;5842:24;;;:14;:24;;;;;;;;5809:57;;;;;;;;;;;;;;;;;;;5842:24;;5809:57;;;5842:24;5809:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5894:20:5;;5809:57;;-1:-1:-1;;;5947:66:5;-1:-1:-1;5880:11:5;;-1:-1:-1;;6027:199:5;6041:3;6039:1;:5;6027:199;;;6089:6;6069:13;6083:1;6069:16;;;;;;;;:::i;:::-;;;;;;;:26;6065:112;;6130:1;6119:12;;6153:5;;6065:112;6206:3;;6027:199;;;-1:-1:-1;6299:78:5;;6291:118;;;;-1:-1:-1;;;6291:118:5;;50624:2:7;6291:118:5;;;50606:21:7;50663:2;50643:18;;;50636:30;50702:29;50682:18;;;50675:57;50749:18;;6291:118:5;50422:351:7;6291:118:5;6505:5;6509:1;6505:3;:5;:::i;:::-;6493:8;:17;6489:124;;-1:-1:-1;;;;;6567:24:5;;;;;;:14;:24;;;;;6592:5;6596:1;6592:3;:5;:::i;:::-;6567:31;;;;;;;;:::i;:::-;;;;;;;;;6530:14;:24;6545:8;-1:-1:-1;;;;;6530:24:5;-1:-1:-1;;;;;6530:24:5;;;;;;;;;;;;6555:8;6530:34;;;;;;;;:::i;:::-;;;;;;;;;;:68;6489:124;-1:-1:-1;;;;;6626:24:5;;;;;;:14;:24;;;;;:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5795:872;;;5767:900;5633:1040;5572:1101;;:::o;16632:753:2:-;16692:4;16837:15;16855:46;16867:17;:15;:17::i;:::-;16886:14;;16855:11;:46::i;:::-;17109:14;;16837:64;;-1:-1:-1;17014:27:2;;575:6;17063:24;16837:64;17109:14;17063:24;:::i;:::-;17062:44;;;;:::i;:::-;:61;;;;:::i;:::-;17044:79;;575:6;17044:79;:::i;:::-;17014:109;;17169:29;17201:65;395:9;17225:19;;17246;17201:5;:65::i;:::-;17169:97;-1:-1:-1;17276:21:2;395:9;17300:29;17324:5;17169:97;17300:29;:::i;:::-;:48;;;;:::i;:::-;17276:72;16632:753;-1:-1:-1;;;;;;16632:753:2:o;8970:227:4:-;9030:7;9039;9058:11;395:9:2;9088:11:4;;9080:5;:19;;;;:::i;:::-;9072:47;;;;:::i;:::-;9058:61;-1:-1:-1;9129:11:4;9151;9058:61;9151:5;:11;:::i;:::-;9129:34;9186:3;;-1:-1:-1;8970:227:4;;-1:-1:-1;;;8970:227:4:o;11709:3166:2:-;11826:4;;;11922:13;11903:8;:15;;;:32;;;;;;;;:::i;:::-;;11899:348;;11963:12;11951:24;;11899:348;;;12024:11;12005:8;:15;;;:30;;;;;;;;:::i;:::-;;12001:246;;12063:10;12051:22;;12001:246;;;12122:11;12103:8;:15;;;:30;;;;;;;;:::i;:::-;;12099:148;;12161:10;12149:22;;12099:148;;;12211:25;;-1:-1:-1;;;12211:25:2;;48586:2:7;12211:25:2;;;48568:21:7;48625:2;48605:18;;;48598:30;-1:-1:-1;;;48644:18:7;;;48637:45;48699:18;;12211:25:2;48384:339:7;12099:148:2;12277:16;;12257:17;12349;;;12345:63;;12388:9;12381:16;;;;;;;12345:63;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12461:2231:2;12478:12;12474:1;:16;12461:2231;;;12518:9;12528:1;12518:12;;;;;;;;:::i;:::-;;;;;;;12507:23;;12548:8;:15;;;12544:2107;;;12598:17;;12583:32;;-1:-1:-1;;;;;12583:32:2;;;:::i;:::-;;;12544:2107;;;643:2;12652:8;:14;;;:45;;;:71;;;;;12701:8;:22;;;12652:71;12648:2003;;;12758:17;;12743:32;;-1:-1:-1;;;;;12743:32:2;;;:::i;12648:2003::-;643:2;12812:8;:18;;;:49;;;:79;;;;;12865:8;:26;;;12812:79;12808:1843;;;12926:17;;12911:32;;-1:-1:-1;;;;;12911:32:2;;;:::i;12808:1843::-;643:2;12980:8;:13;;;:44;;;:69;;;;;13028:8;:21;;;12980:69;12976:1675;;;13084:17;;13069:32;;-1:-1:-1;;;;;13069:32:2;;;:::i;12976:1675::-;643:2;13138:8;:16;;;:47;;;:75;;;;;13189:8;:24;;;13138:75;13134:1517;;;13248:17;;13233:32;;-1:-1:-1;;;;;13233:32:2;;;:::i;13134:1517::-;643:2;13302:8;:13;;;:44;;;:69;;;;;13350:8;:21;;;13302:69;13298:1353;;;13406:17;;13391:32;;-1:-1:-1;;;;;13391:32:2;;;:::i;13298:1353::-;643:2;13460:8;:14;;;:45;;;:71;;;;;13509:8;:22;;;13460:71;13456:1195;;;13566:17;;13551:32;;-1:-1:-1;;;;;13551:32:2;;;:::i;13456:1195::-;643:2;13620:8;:14;;;:45;;;:71;;;;;13669:8;:22;;;13620:71;13616:1035;;;13726:17;;13711:32;;-1:-1:-1;;;;;13711:32:2;;;:::i;13616:1035::-;643:2;13780:8;:14;;;:45;;;:71;;;;;13829:8;:22;;;13780:71;13776:875;;;13886:17;;13871:32;;-1:-1:-1;;;;;13871:32:2;;;:::i;13776:875::-;643:2;13940:8;:15;;;:46;;;:73;;;;;13990:8;:23;;;13940:73;13936:715;;;14048:17;;14033:32;;-1:-1:-1;;;;;14033:32:2;;;:::i;13936:715::-;643:2;14102:8;:15;;;:46;;;:73;;;;;14152:8;:23;;;14102:73;14098:553;;;14210:17;;14195:32;;-1:-1:-1;;;;;14195:32:2;;;:::i;14098:553::-;14264:8;:17;;;:22;;14285:1;14264:22;:44;;;;;14290:8;:18;;;14264:44;14260:391;;;14343:17;;14328:32;;-1:-1:-1;;;;;14328:32:2;;;:::i;14260:391::-;14397:8;:16;;;:21;;14417:1;14397:21;:42;;;;;14422:8;:17;;;14397:42;14393:258;;;14474:17;;14459:32;;-1:-1:-1;;;;;14459:32:2;;;:::i;14393:258::-;14528:8;:23;;;:28;;14555:1;14528:28;:56;;;;;14560:8;:24;;;14528:56;14524:127;;;14619:17;;14604:32;;-1:-1:-1;;;;;14604:32:2;;;:::i;:::-;;;14524:127;14676:3;;12461:2231;;;;452:7;14706:11;:27;14702:85;;;452:7;14749:27;;14702:85;395:9;14817:30;14836:11;395:9;14817:30;:::i;:::-;14804:44;;:9;:44;:::i;:::-;14803:65;;;;:::i;4596:238::-;4663:4;-1:-1:-1;;;;;4683:22:2;;;;:48;;-1:-1:-1;;;;;;4709:22:2;;4721:10;4709:22;4683:48;:70;;;-1:-1:-1;4736:17:2;;;;4735:18;4683:70;4679:113;;;-1:-1:-1;4776:5:2;;4596:238;-1:-1:-1;4596:238:2:o;4679:113::-;4808:18;4817:8;4808;:18::i;5193:237::-;5261:7;;;395:9;5311:21;514:6;5311:5;:21;:::i;17391:146::-;17439:4;17476:15;17462:11;;:29;:67;;-1:-1:-1;17528:1:2;;17391:146::o;17462:67::-;17513:11;;17495:29;;:15;:29;:::i;:::-;17455:74;;17391:146;:::o;17841:200::-;17913:4;17941:5;17933;:13;17929:106;;;-1:-1:-1;17968:5:2;17961:12;;17929:106;-1:-1:-1;18019:5:2;18012:12;;17614:221;17696:7;;575:6;17772:15;17783:4;17772:8;:15;:::i;:::-;17763:4;17733:26;17751:8;575:6;17733:26;:::i;:::-;17732:35;;;;:::i;:::-;17731:57;;;;:::i;:::-;17730:77;;;;:::i;:::-;17715:93;-1:-1:-1;;17614:221:2;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;520:248:7;588:6;596;649:2;637:9;628:7;624:23;620:32;617:52;;;665:1;662;655:12;617:52;-1:-1:-1;;688:23:7;;;758:2;743:18;;;730:32;;-1:-1:-1;520:248:7:o;773:180::-;832:6;885:2;873:9;864:7;860:23;856:32;853:52;;;901:1;898;891:12;853:52;-1:-1:-1;924:23:7;;773:180;-1:-1:-1;773:180:7:o;958:118::-;1044:5;1037:13;1030:21;1023:5;1020:32;1010:60;;1066:1;1063;1056:12;1081:241;1137:6;1190:2;1178:9;1169:7;1165:23;1161:32;1158:52;;;1206:1;1203;1196:12;1158:52;1245:9;1232:23;1264:28;1286:5;1264:28;:::i;1327:173::-;1395:20;;-1:-1:-1;;;;;1444:31:7;;1434:42;;1424:70;;1490:1;1487;1480:12;1424:70;1327:173;;;:::o;1505:127::-;1566:10;1561:3;1557:20;1554:1;1547:31;1597:4;1594:1;1587:15;1621:4;1618:1;1611:15;1637:255;1709:2;1703:9;1751:6;1739:19;;-1:-1:-1;;;;;1773:34:7;;1809:22;;;1770:62;1767:88;;;1835:18;;:::i;:::-;1871:2;1864:22;1637:255;:::o;1897:275::-;1968:2;1962:9;2033:2;2014:13;;-1:-1:-1;;2010:27:7;1998:40;;-1:-1:-1;;;;;2053:34:7;;2089:22;;;2050:62;2047:88;;;2115:18;;:::i;:::-;2151:2;2144:22;1897:275;;-1:-1:-1;1897:275:7:o;2177:183::-;2237:4;-1:-1:-1;;;;;2262:6:7;2259:30;2256:56;;;2292:18;;:::i;:::-;-1:-1:-1;2337:1:7;2333:14;2349:4;2329:25;;2177:183::o;2365:662::-;2419:5;2472:3;2465:4;2457:6;2453:17;2449:27;2439:55;;2490:1;2487;2480:12;2439:55;2526:6;2513:20;2552:4;2576:60;2592:43;2632:2;2592:43;:::i;:::-;2576:60;:::i;:::-;2670:15;;;2756:1;2752:10;;;;2740:23;;2736:32;;;2701:12;;;;2780:15;;;2777:35;;;2808:1;2805;2798:12;2777:35;2844:2;2836:6;2832:15;2856:142;2872:6;2867:3;2864:15;2856:142;;;2938:17;;2926:30;;2976:12;;;;2889;;2856:142;;;-1:-1:-1;3016:5:7;2365:662;-1:-1:-1;;;;;;2365:662:7:o;3032:367::-;3095:8;3105:6;3159:3;3152:4;3144:6;3140:17;3136:27;3126:55;;3177:1;3174;3167:12;3126:55;-1:-1:-1;3200:20:7;;-1:-1:-1;;;;;3232:30:7;;3229:50;;;3275:1;3272;3265:12;3229:50;3312:4;3304:6;3300:17;3288:29;;3372:3;3365:4;3355:6;3352:1;3348:14;3340:6;3336:27;3332:38;3329:47;3326:67;;;3389:1;3386;3379:12;3326:67;3032:367;;;;;:::o;3404:1074::-;3569:6;3577;3585;3593;3601;3609;3662:3;3650:9;3641:7;3637:23;3633:33;3630:53;;;3679:1;3676;3669:12;3630:53;3702:29;3721:9;3702:29;:::i;:::-;3692:39;;3782:2;3771:9;3767:18;3754:32;-1:-1:-1;;;;;3846:2:7;3838:6;3835:14;3832:34;;;3862:1;3859;3852:12;3832:34;3885:61;3938:7;3929:6;3918:9;3914:22;3885:61;:::i;:::-;3875:71;;3999:2;3988:9;3984:18;3971:32;3955:48;;4028:2;4018:8;4015:16;4012:36;;;4044:1;4041;4034:12;4012:36;4083:72;4147:7;4136:8;4125:9;4121:24;4083:72;:::i;:::-;4174:8;;-1:-1:-1;4057:98:7;-1:-1:-1;4262:2:7;4247:18;;4234:32;;-1:-1:-1;4278:16:7;;;4275:36;;;4307:1;4304;4297:12;4275:36;;4346:72;4410:7;4399:8;4388:9;4384:24;4346:72;:::i;:::-;3404:1074;;;;-1:-1:-1;3404:1074:7;;-1:-1:-1;3404:1074:7;;4437:8;;3404:1074;-1:-1:-1;;;3404:1074:7:o;4483:472::-;4525:3;4563:5;4557:12;4590:6;4585:3;4578:19;4615:1;4625:162;4639:6;4636:1;4633:13;4625:162;;;4701:4;4757:13;;;4753:22;;4747:29;4729:11;;;4725:20;;4718:59;4654:12;4625:162;;;4805:6;4802:1;4799:13;4796:87;;;4871:1;4864:4;4855:6;4850:3;4846:16;4842:27;4835:38;4796:87;-1:-1:-1;4937:2:7;4916:15;-1:-1:-1;;4912:29:7;4903:39;;;;4944:4;4899:50;;4483:472;-1:-1:-1;;4483:472:7:o;4960:220::-;5109:2;5098:9;5091:21;5072:4;5129:45;5170:2;5159:9;5155:18;5147:6;5129:45;:::i;5377:186::-;5436:6;5489:2;5477:9;5468:7;5464:23;5460:32;5457:52;;;5505:1;5502;5495:12;5457:52;5528:29;5547:9;5528:29;:::i;5568:105::-;5647:1;5640:5;5637:12;5627:40;;5663:1;5660;5653:12;5678:587;5784:6;5792;5800;5853:2;5841:9;5832:7;5828:23;5824:32;5821:52;;;5869:1;5866;5859:12;5821:52;5909:9;5896:23;-1:-1:-1;;;;;5934:6:7;5931:30;5928:50;;;5974:1;5971;5964:12;5928:50;6013:70;6075:7;6066:6;6055:9;6051:22;6013:70;:::i;:::-;6102:8;;-1:-1:-1;5987:96:7;-1:-1:-1;;6187:2:7;6172:18;;6159:32;6200:35;6159:32;6200:35;:::i;:::-;6254:5;6244:15;;;5678:587;;;;;:::o;6478:316::-;6555:6;6563;6571;6624:2;6612:9;6603:7;6599:23;6595:32;6592:52;;;6640:1;6637;6630:12;6592:52;-1:-1:-1;;6663:23:7;;;6733:2;6718:18;;6705:32;;-1:-1:-1;6784:2:7;6769:18;;;6756:32;;6478:316;-1:-1:-1;6478:316:7:o;6799:1146::-;6917:6;6925;6978:2;6966:9;6957:7;6953:23;6949:32;6946:52;;;6994:1;6991;6984:12;6946:52;7034:9;7021:23;-1:-1:-1;;;;;7104:2:7;7096:6;7093:14;7090:34;;;7120:1;7117;7110:12;7090:34;7158:6;7147:9;7143:22;7133:32;;7203:7;7196:4;7192:2;7188:13;7184:27;7174:55;;7225:1;7222;7215:12;7174:55;7261:2;7248:16;7283:4;7307:60;7323:43;7363:2;7323:43;:::i;7307:60::-;7401:15;;;7483:1;7479:10;;;;7471:19;;7467:28;;;7432:12;;;;7507:19;;;7504:39;;;7539:1;7536;7529:12;7504:39;7563:11;;;;7583:148;7599:6;7594:3;7591:15;7583:148;;;7665:23;7684:3;7665:23;:::i;:::-;7653:36;;7616:12;;;;7709;;;;7583:148;;;7750:5;-1:-1:-1;;7793:18:7;;7780:32;;-1:-1:-1;;7824:16:7;;;7821:36;;;7853:1;7850;7843:12;7821:36;;7876:63;7931:7;7920:8;7909:9;7905:24;7876:63;:::i;:::-;7866:73;;;6799:1146;;;;;:::o;7950:632::-;8121:2;8173:21;;;8243:13;;8146:18;;;8265:22;;;8092:4;;8121:2;8344:15;;;;8318:2;8303:18;;;8092:4;8387:169;8401:6;8398:1;8395:13;8387:169;;;8462:13;;8450:26;;8531:15;;;;8496:12;;;;8423:1;8416:9;8387:169;;;-1:-1:-1;8573:3:7;;7950:632;-1:-1:-1;;;;;;7950:632:7:o;8587:1163::-;8754:6;8762;8770;8778;8786;8794;8802;8855:3;8843:9;8834:7;8830:23;8826:33;8823:53;;;8872:1;8869;8862:12;8823:53;8912:9;8899:23;-1:-1:-1;;;;;8982:2:7;8974:6;8971:14;8968:34;;;8998:1;8995;8988:12;8968:34;9037:70;9099:7;9090:6;9079:9;9075:22;9037:70;:::i;:::-;9126:8;;-1:-1:-1;9011:96:7;-1:-1:-1;9214:2:7;9199:18;;9186:32;;-1:-1:-1;9230:16:7;;;9227:36;;;9259:1;9256;9249:12;9227:36;9298:72;9362:7;9351:8;9340:9;9336:24;9298:72;:::i;:::-;9389:8;;-1:-1:-1;9272:98:7;-1:-1:-1;9477:2:7;9462:18;;9449:32;;-1:-1:-1;9493:16:7;;;9490:36;;;9522:1;9519;9512:12;9490:36;;9561:72;9625:7;9614:8;9603:9;9599:24;9561:72;:::i;:::-;9652:8;;-1:-1:-1;9535:98:7;-1:-1:-1;9706:38:7;;-1:-1:-1;9740:2:7;9725:18;;9706:38;:::i;:::-;9696:48;;8587:1163;;;;;;;;;;:::o;9755:348::-;9839:6;9892:2;9880:9;9871:7;9867:23;9863:32;9860:52;;;9908:1;9905;9898:12;9860:52;9948:9;9935:23;-1:-1:-1;;;;;9973:6:7;9970:30;9967:50;;;10013:1;10010;10003:12;9967:50;10036:61;10089:7;10080:6;10069:9;10065:22;10036:61;:::i;:::-;10026:71;9755:348;-1:-1:-1;;;;9755:348:7:o;10108:803::-;10270:4;10299:2;10339;10328:9;10324:18;10369:2;10358:9;10351:21;10392:6;10427;10421:13;10458:6;10450;10443:22;10496:2;10485:9;10481:18;10474:25;;10558:2;10548:6;10545:1;10541:14;10530:9;10526:30;10522:39;10508:53;;10596:2;10588:6;10584:15;10617:1;10627:255;10641:6;10638:1;10635:13;10627:255;;;10734:2;10730:7;10718:9;10710:6;10706:22;10702:36;10697:3;10690:49;10762:40;10795:6;10786;10780:13;10762:40;:::i;:::-;10752:50;-1:-1:-1;10860:12:7;;;;10825:15;;;;10663:1;10656:9;10627:255;;;-1:-1:-1;10899:6:7;;10108:803;-1:-1:-1;;;;;;;10108:803:7:o;10916:711::-;11038:6;11046;11054;11062;11070;11078;11131:3;11119:9;11110:7;11106:23;11102:33;11099:53;;;11148:1;11145;11138:12;11099:53;11188:9;11175:23;-1:-1:-1;;;;;11213:6:7;11210:30;11207:50;;;11253:1;11250;11243:12;11207:50;11292:70;11354:7;11345:6;11334:9;11330:22;11292:70;:::i;:::-;11381:8;;11266:96;;-1:-1:-1;11463:2:7;11448:18;;11435:32;;11514:2;11499:18;;11486:32;;-1:-1:-1;11565:2:7;11550:18;;11537:32;;-1:-1:-1;11616:3:7;11601:19;11588:33;;-1:-1:-1;10916:711:7;-1:-1:-1;;;;10916:711:7:o;11632:658::-;11803:2;11855:21;;;11925:13;;11828:18;;;11947:22;;;11774:4;;11803:2;12026:15;;;;12000:2;11985:18;;;11774:4;12069:195;12083:6;12080:1;12077:13;12069:195;;;12148:13;;-1:-1:-1;;;;;12144:39:7;12132:52;;12239:15;;;;12204:12;;;;12180:1;12098:9;12069:195;;12295:832;12373:6;12381;12434:2;12422:9;12413:7;12409:23;12405:32;12402:52;;;12450:1;12447;12440:12;12402:52;12486:9;12473:23;12463:33;;12515:2;12568;12557:9;12553:18;12540:32;-1:-1:-1;;;;;12632:2:7;12624:6;12621:14;12618:34;;;12648:1;12645;12638:12;12618:34;12686:6;12675:9;12671:22;12661:32;;12731:7;12724:4;12720:2;12716:13;12712:27;12702:55;;12753:1;12750;12743:12;12702:55;12789:2;12776:16;12811:2;12807;12804:10;12801:36;;;12817:18;;:::i;:::-;12859:53;12902:2;12883:13;;-1:-1:-1;;12879:27:7;12875:36;;12859:53;:::i;:::-;12846:66;;12935:2;12928:5;12921:17;12975:7;12970:2;12965;12961;12957:11;12953:20;12950:33;12947:53;;;12996:1;12993;12986:12;12947:53;13051:2;13046;13042;13038:11;13033:2;13026:5;13022:14;13009:45;13095:1;13090:2;13085;13078:5;13074:14;13070:23;13063:34;;13116:5;13106:15;;;;;12295:832;;;;;:::o;13132:963::-;13282:6;13290;13298;13306;13359:2;13347:9;13338:7;13334:23;13330:32;13327:52;;;13375:1;13372;13365:12;13327:52;13415:9;13402:23;-1:-1:-1;;;;;13485:2:7;13477:6;13474:14;13471:34;;;13501:1;13498;13491:12;13471:34;13540:70;13602:7;13593:6;13582:9;13578:22;13540:70;:::i;:::-;13629:8;;-1:-1:-1;13514:96:7;-1:-1:-1;13717:2:7;13702:18;;13689:32;;-1:-1:-1;13733:16:7;;;13730:36;;;13762:1;13759;13752:12;13730:36;13800:8;13789:9;13785:24;13775:34;;13847:7;13840:4;13836:2;13832:13;13828:27;13818:55;;13869:1;13866;13859:12;13818:55;13909:2;13896:16;13935:2;13927:6;13924:14;13921:34;;;13951:1;13948;13941:12;13921:34;14009:7;14004:2;13994:6;13986;13982:19;13978:2;13974:28;13970:37;13967:50;13964:70;;;14030:1;14027;14020:12;13964:70;13132:963;;;;-1:-1:-1;;14061:2:7;14053:11;;-1:-1:-1;;;13132:963:7:o;14100:254::-;14168:6;14176;14229:2;14217:9;14208:7;14204:23;14200:32;14197:52;;;14245:1;14242;14235:12;14197:52;14281:9;14268:23;14258:33;;14310:38;14344:2;14333:9;14329:18;14310:38;:::i;:::-;14300:48;;14100:254;;;;;:::o;15198:160::-;15262:5;15307:3;15298:6;15293:3;15289:16;15285:26;15282:46;;;15324:1;15321;15314:12;15282:46;-1:-1:-1;15346:6:7;15198:160;-1:-1:-1;15198:160:7:o;15363:1614::-;15606:6;15614;15622;15630;15638;15646;15654;15662;15670;15678;15731:3;15719:9;15710:7;15706:23;15702:33;15699:53;;;15748:1;15745;15738:12;15699:53;15788:9;15775:23;-1:-1:-1;;;;;15858:2:7;15850:6;15847:14;15844:34;;;15874:1;15871;15864:12;15844:34;15913:70;15975:7;15966:6;15955:9;15951:22;15913:70;:::i;:::-;16002:8;;-1:-1:-1;15887:96:7;-1:-1:-1;16090:2:7;16075:18;;16062:32;;-1:-1:-1;16106:16:7;;;16103:36;;;16135:1;16132;16125:12;16103:36;16174:72;16238:7;16227:8;16216:9;16212:24;16174:72;:::i;:::-;16265:8;;-1:-1:-1;16148:98:7;-1:-1:-1;16353:2:7;16338:18;;16325:32;;-1:-1:-1;16369:16:7;;;16366:36;;;16398:1;16395;16388:12;16366:36;16437:72;16501:7;16490:8;16479:9;16475:24;16437:72;:::i;:::-;16528:8;;-1:-1:-1;16411:98:7;-1:-1:-1;16411:98:7;;-1:-1:-1;16582:38:7;16616:2;16601:18;;16582:38;:::i;:::-;16572:48;;16673:3;16662:9;16658:19;16645:33;16629:49;;16703:2;16693:8;16690:16;16687:36;;;16719:1;16716;16709:12;16687:36;;16758:72;16822:7;16811:8;16800:9;16796:24;16758:72;:::i;:::-;16849:8;;-1:-1:-1;16732:98:7;-1:-1:-1;16903:68:7;;-1:-1:-1;16963:7:7;16957:3;16942:19;;16903:68;:::i;:::-;16893:78;;15363:1614;;;;;;;;;;;;;:::o;16982:961::-;17199:2;17251:21;;;17321:13;;17224:18;;;17343:22;;;17170:4;;17199:2;17384;;17402:18;;;;17443:15;;;17170:4;17486:431;17500:6;17497:1;17494:13;17486:431;;;17559:13;;17601:9;;-1:-1:-1;;;;;17597:35:7;17585:48;;17673:11;;;17667:18;17653:12;;;17646:40;17726:11;;;17720:18;17706:12;;;17699:40;17762:4;17820:11;;;17814:18;17807:26;17800:34;17786:12;;;17779:56;17864:4;17855:14;;;;17892:15;;;;17629:1;17515:9;17486:431;;;-1:-1:-1;17934:3:7;;16982:961;-1:-1:-1;;;;;;;16982:961:7:o;17948:339::-;18044:6;18052;18096:9;18087:7;18083:23;18126:3;18122:2;18118:12;18115:32;;;18143:1;18140;18133:12;18115:32;18166:23;;;-1:-1:-1;18223:3:7;-1:-1:-1;;18205:16:7;;18201:26;18198:46;;;18240:1;18237;18230:12;18198:46;;18278:2;18267:9;18263:18;18253:28;;17948:339;;;;;:::o;18372:127::-;18433:10;18428:3;18424:20;18421:1;18414:31;18464:4;18461:1;18454:15;18488:4;18485:1;18478:15;18504:137;18582:1;18575:5;18572:12;18562:46;;18588:18;;:::i;:::-;18617;;18504:137::o;18646:138::-;18725:1;18718:5;18715:12;18705:46;;18731:18;;:::i;18789:2063::-;19005:13;;18359:4;18348:16;18336:29;;18975:3;18960:19;;19077:4;19069:6;19065:17;19059:24;19092:52;19138:4;19127:9;19123:20;19109:12;18359:4;18348:16;18336:29;;18292:75;19092:52;;19193:4;19185:6;19181:17;19175:24;19208:54;19256:4;19245:9;19241:20;19225:14;18359:4;18348:16;18336:29;;18292:75;19208:54;;19311:4;19303:6;19299:17;19293:24;19326:54;19374:4;19363:9;19359:20;19343:14;18359:4;18348:16;18336:29;;18292:75;19326:54;;19429:4;19421:6;19417:17;19411:24;19444:54;19492:4;19481:9;19477:20;19461:14;18359:4;18348:16;18336:29;;18292:75;19444:54;;19547:4;19539:6;19535:17;19529:24;19562:54;19610:4;19599:9;19595:20;19579:14;18359:4;18348:16;18336:29;;18292:75;19562:54;;19665:4;19657:6;19653:17;19647:24;19680:54;19728:4;19717:9;19713:20;19697:14;18359:4;18348:16;18336:29;;18292:75;19680:54;;19783:4;19775:6;19771:17;19765:24;19798:54;19846:4;19835:9;19831:20;19815:14;18359:4;18348:16;18336:29;;18292:75;19798:54;-1:-1:-1;19871:6:7;19914:15;;;19908:22;18359:4;18348:16;;;19972:18;;;18336:29;;;;20010:6;20053:15;;;20047:22;18348:16;;20111:18;;;18336:29;20149:6;20192:15;;;20186:22;18348:16;;20250:18;;;18336:29;20288:6;20332:15;;;20326:22;18348:16;;20391:18;;;18336:29;20429:6;20473:15;;;20467:22;18348:16;;;20532:18;;;18336:29;20570:6;20614:15;;;20608:22;20639:59;20679:18;;;20608:22;20639:59;:::i;:::-;;;20717:6;20773:2;20765:6;20761:15;20755:22;20786:60;20842:2;20831:9;20827:18;20810:15;20786:60;:::i;:::-;;;18789:2063;;;;:::o;20857:340::-;21059:2;21041:21;;;21098:2;21078:18;;;21071:30;-1:-1:-1;;;21132:2:7;21117:18;;21110:46;21188:2;21173:18;;20857:340::o;23271:184::-;23341:6;23394:2;23382:9;23373:7;23369:23;23365:32;23362:52;;;23410:1;23407;23400:12;23362:52;-1:-1:-1;23433:16:7;;23271:184;-1:-1:-1;23271:184:7:o;23809:375::-;-1:-1:-1;;;;;24067:15:7;;;24049:34;;24119:15;;;;24114:2;24099:18;;24092:43;24166:2;24151:18;;24144:34;;;;23999:2;23984:18;;23809:375::o;24189:132::-;24265:13;;24287:28;24265:13;24287:28;:::i;24326:245::-;24393:6;24446:2;24434:9;24425:7;24421:23;24417:32;24414:52;;;24462:1;24459;24452:12;24414:52;24494:9;24488:16;24513:28;24535:5;24513:28;:::i;24576:351::-;24778:2;24760:21;;;24817:2;24797:18;;;24790:30;24856:29;24851:2;24836:18;;24829:57;24918:2;24903:18;;24576:351::o;24932:380::-;25011:1;25007:12;;;;25054;;;25075:61;;25129:4;25121:6;25117:17;25107:27;;25075:61;25182:2;25174:6;25171:14;25151:18;25148:38;25145:161;;25228:10;25223:3;25219:20;25216:1;25209:31;25263:4;25260:1;25253:15;25291:4;25288:1;25281:15;25596:339;25798:2;25780:21;;;25837:2;25817:18;;;25810:30;-1:-1:-1;;;25871:2:7;25856:18;;25849:45;25926:2;25911:18;;25596:339::o;25940:299::-;-1:-1:-1;;;;;26141:32:7;;26123:51;;26111:2;26096:18;;26183:50;26229:2;26214:18;;26206:6;26183:50;:::i;26602:127::-;26663:10;26658:3;26654:20;26651:1;26644:31;26694:4;26691:1;26684:15;26718:4;26715:1;26708:15;26734:128;26774:3;26805:1;26801:6;26798:1;26795:13;26792:39;;;26811:18;;:::i;:::-;-1:-1:-1;26847:9:7;;26734:128::o;27213:513::-;-1:-1:-1;;;;;27514:32:7;;;;27496:51;;27578:2;27563:18;;27556:34;;;;27621:2;27606:18;;27599:34;;;;27664:2;27649:18;;27642:34;27707:3;27692:19;;27685:35;27483:3;27468:19;;27213:513::o;31049:342::-;31251:2;31233:21;;;31290:2;31270:18;;;31263:30;-1:-1:-1;;;31324:2:7;31309:18;;31302:48;31382:2;31367:18;;31049:342::o;32109:127::-;32170:10;32165:3;32161:20;32158:1;32151:31;32201:4;32198:1;32191:15;32225:4;32222:1;32215:15;32241:346;32443:2;32425:21;;;32482:2;32462:18;;;32455:30;-1:-1:-1;;;32516:2:7;32501:18;;32494:52;32578:2;32563:18;;32241:346::o;34006:334::-;34208:2;34190:21;;;34247:2;34227:18;;;34220:30;-1:-1:-1;;;34281:2:7;34266:18;;34259:40;34331:2;34316:18;;34006:334::o;34701:198::-;34744:11;34796:3;34783:17;34840:4;34833:5;34829:16;34822:5;34819:27;34809:55;;34860:1;34857;34850:12;37517:184;37566:11;37618:3;37605:17;37631:35;37660:5;37631:35;:::i;37706:265::-;37818:1;37811:5;37808:12;37798:46;;37824:18;;:::i;:::-;37863:11;;-1:-1:-1;;;;37899:27:7;37953:3;37932:15;;;;-1:-1:-1;;;37928:35:7;37896:68;;;;37883:82;;37706:265::o;37976:190::-;38026:11;38078:3;38065:17;38111:1;38104:5;38101:12;38091:40;;38127:1;38124;38117:12;38171:267;38285:1;38278:5;38275:12;38265:46;;38291:18;;:::i;:::-;38330:11;;-1:-1:-1;;;;38366:27:7;38420:3;38399:15;;;;-1:-1:-1;;;38395:35:7;38363:68;;;;38350:82;;38171:267::o;38443:1719::-;38582:85;38634:32;38660:5;38634:32;:::i;:::-;35006:11;;-1:-1:-1;;35002:26:7;35041:4;35030:16;;;;34999:48;34986:62;;34904:150;38582:85;38676:94;38728:41;38765:2;38758:5;38754:14;38728:41;:::i;:::-;35151:11;;-1:-1:-1;;35187:19:7;35216:1;35212:13;;;;35227:5;35208:25;35184:50;35171:64;;35059:182;38676:94;38779;38831:41;38868:2;38861:5;38857:14;38831:41;:::i;:::-;35338:11;;-1:-1:-1;;35374:22:7;35406:2;35402:14;;;;35418:8;35398:29;35371:57;35358:71;;35246:189;38779:94;38882:92;38932:41;38969:2;38962:5;38958:14;38932:41;:::i;:::-;35530:11;;-1:-1:-1;;35566:24:7;35600:2;35596:14;;;;35612:10;35592:31;35563:61;35550:75;;35440:191;38882:92;38983:95;39035:42;39072:3;39065:5;39061:15;39035:42;:::i;:::-;35728:11;;-1:-1:-1;;35764:26:7;35800:2;35796:14;;;;35812:12;35792:33;35761:65;35748:79;;35636:197;38983:95;39087;39139:42;39176:3;39169:5;39165:15;39139:42;:::i;:::-;35930:11;;-1:-1:-1;;35966:28:7;36004:2;36000:14;;;;36016;35996:35;35963:69;35950:83;;35838:201;39087:95;39191;39243:42;39280:3;39273:5;39269:15;39243:42;:::i;:::-;36136:11;;-1:-1:-1;;36172:30:7;36212:2;36208:14;;;;36224:16;36204:37;36169:73;36156:87;;36044:205;39191:95;39295;39347:42;39384:3;39377:5;39373:15;39347:42;:::i;:::-;36346:11;;-1:-1:-1;;36382:32:7;36424:2;36420:14;;;;36436:18;36416:39;36379:77;36366:91;;36254:209;39295:95;39399;39451:42;39488:3;39481:5;39477:15;39451:42;:::i;:::-;36560:11;;-1:-1:-1;;36596:34:7;36640:2;36636:14;;;;36652:20;36632:41;36593:81;36580:95;;36468:213;39399:95;39503;39555:42;39592:3;39585:5;39581:15;39555:42;:::i;:::-;36778:11;;-1:-1:-1;;36814:36:7;36860:2;36856:14;;;;36872:22;36852:43;36811:85;36798:99;;36686:217;39503:95;39607:96;39660:42;39697:3;39690:5;39686:15;39660:42;:::i;:::-;39654:4;37001:11;;-1:-1:-1;;;;37037:26:7;37089:2;37069:14;;;;-1:-1:-1;;;37065:33:7;37034:65;;;;37021:79;;36908:198;39607:96;39712;39765:42;39802:3;39795:5;39791:15;39765:42;:::i;:::-;39759:4;37204:11;;-1:-1:-1;;;;37240:26:7;37292:2;37272:14;;;;-1:-1:-1;;;37268:33:7;37237:65;;;;37224:79;;37111:198;39712:96;39817;39870:42;39907:3;39900:5;39896:15;39870:42;:::i;:::-;39864:4;37407:11;;-1:-1:-1;;;;37443:26:7;37495:2;37475:14;;;;-1:-1:-1;;;37471:33:7;37440:65;;;;37427:79;;37314:198;39817:96;39922:111;39984:48;40027:3;40020:5;40016:15;39984:48;:::i;:::-;39978:4;39922:111;:::i;:::-;40042:114;40106:49;40150:3;40143:5;40139:15;40106:49;:::i;:::-;40100:4;40042:114;:::i;:::-;;;38443:1719::o;41932:168::-;41972:7;42038:1;42034;42030:6;42026:14;42023:1;42020:21;42015:1;42008:9;42001:17;41997:45;41994:71;;;42045:18;;:::i;:::-;-1:-1:-1;42085:9:7;;41932:168::o;44594:354::-;44682:19;;;44664:3;-1:-1:-1;;;;;44713:31:7;;44710:51;;;44757:1;44754;44747:12;44710:51;44793:6;44790:1;44786:14;44845:8;44838:5;44831:4;44826:3;44822:14;44809:45;44922:1;44877:18;;44897:4;44873:29;44911:13;;;-1:-1:-1;44873:29:7;;44594:354;-1:-1:-1;;44594:354:7:o;44953:616::-;-1:-1:-1;;;;;45258:32:7;;45240:51;;45327:2;45322;45307:18;;45300:30;;;-1:-1:-1;;45353:73:7;;45407:18;;45399:6;45391;45353:73;:::i;:::-;45474:9;45466:6;45462:22;45457:2;45446:9;45442:18;45435:50;45502:61;45556:6;45548;45540;45502:61;:::i;:::-;45494:69;44953:616;-1:-1:-1;;;;;;;;44953:616:7:o;45574:192::-;45653:13;;-1:-1:-1;;;;;45695:46:7;;45685:57;;45675:85;;45756:1;45753;45746:12;45771:2608;45892:6;45923:2;45966;45954:9;45945:7;45941:23;45937:32;45934:52;;;45982:1;45979;45972:12;45934:52;46015:9;46009:16;-1:-1:-1;;;;;46040:6:7;46037:30;46034:50;;;46080:1;46077;46070:12;46034:50;46103:22;;46156:4;46148:13;;46144:27;-1:-1:-1;46134:55:7;;46185:1;46182;46175:12;46134:55;46214:2;46208:9;46237:60;46253:43;46293:2;46253:43;:::i;46237:60::-;46331:15;;;46393:6;46434:11;;;46426:20;;46422:29;;;46362:12;;;;46319:3;46463:19;;;46460:39;;;46495:1;46492;46485:12;46460:39;46519:11;;;;46539:1810;46555:6;46550:3;46547:15;46539:1810;;;46635:2;46629:3;46620:7;46616:17;46612:26;46609:116;;;46679:1;46708:2;46704;46697:14;46609:116;46751:22;;:::i;:::-;46800:34;46830:3;46800:34;:::i;:::-;46793:5;46786:49;46871:40;46907:2;46902:3;46898:12;46871:40;:::i;:::-;46866:2;46859:5;46855:14;46848:64;46935:2;46973:40;47009:2;47004:3;47000:12;46973:40;:::i;:::-;46957:14;;;46950:64;47037:2;47075:40;47102:12;;;47075:40;:::i;:::-;47059:14;;;47052:64;47139:3;47178:40;47205:12;;;47178:40;:::i;:::-;47162:14;;;47155:64;47242:3;47281:40;47308:12;;;47281:40;:::i;:::-;47265:14;;;47258:64;47346:3;47386:41;47413:13;;;47386:41;:::i;:::-;47369:15;;;47362:66;47452:3;47492:41;47519:13;;;47492:41;:::i;:::-;47475:15;;;47468:66;47558:3;47598:41;47625:13;;;47598:41;:::i;:::-;47581:15;;;47574:66;47664:3;47704:41;47731:13;;;47704:41;:::i;:::-;47687:15;;;47680:66;47770:3;47810:41;47837:13;;;47810:41;:::i;:::-;47793:15;;;47786:66;47876:3;47916:41;47943:13;;;47916:41;:::i;:::-;47899:15;;;47892:66;47982:3;48022:41;48049:13;;;48022:41;:::i;:::-;48005:15;;;47998:66;48088:3;48128:41;48155:13;;;48128:41;:::i;:::-;48111:15;;;48104:66;48194:3;48234:41;48261:13;;;48234:41;:::i;:::-;48217:15;;;48210:66;48289:18;;46572:12;;;;48327;;;;46539:1810;;;-1:-1:-1;48368:5:7;45771:2608;-1:-1:-1;;;;;;;45771:2608:7:o;49447:125::-;49487:4;49515:1;49512;49509:8;49506:34;;;49520:18;;:::i;:::-;-1:-1:-1;49557:9:7;;49447:125::o;50778:127::-;50839:10;50834:3;50830:20;50827:1;50820:31;50870:4;50867:1;50860:15;50894:4;50891:1;50884:15;50910:217;50950:1;50976;50966:132;;51020:10;51015:3;51011:20;51008:1;51001:31;51055:4;51052:1;51045:15;51083:4;51080:1;51073:15;50966:132;-1:-1:-1;51112:9:7;;50910:217::o

Swarm Source

ipfs://587189e6446d9770b5882175c2d99054862a54212a1cbce1509faf08f0208b9e
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.