ETH Price: $2,443.37 (+1.74%)

Token

Daughters of Rainbow (DOR)
 

Overview

Max Total Supply

352 DOR

Holders

179

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
8 DOR
0xcde97ca62d0960f8db16a835eb63dfc96c790123
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DORToken

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 3 of 19: DORToken.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

import "./ERC721Enumerable.sol";
import "./ReentrancyGuard.sol";
import "./Ownable.sol";
import "./WhitelistAdminRole.sol";
import "./SafeMath.sol";
import "./Pausable.sol";

contract DORToken is ERC721Enumerable, ReentrancyGuard, Pausable, WhitelistAdminRole {
    using SafeMath for uint256;

    enum TokenType {
        NONE,
        SILVER, // 1. Mix & Match Silver Grade Daughter
        GOLD, // 2. Mix & Match Gold Grade Daughter
        RAINBOW, // 3. Mix & Match Rainbow Grade Daughter
        EBIBLE, // 4. Daughter E-bible
        RANDOM, // 5. NONE
        M3D, // 6. 3D Mother NFT
        AIRDROPS, // 7. Limited Daughter NFT
        SPARK, // 8. SPARK Token NFT
        DAUGHTER, // 9. daughters
        ALIEN, // 10. daughters of alien
        RARE, // 11. rare daughters
        MOTHER // 12. the mother
    }

    uint256 public salePrice = 0.05 ether;
    string private _baseTokenURI;
    mapping(uint256 => uint256) typeMapping;

    // params
    uint256 public SILVER_CLAIM_DAUGHTER_MIN_NUM = 5;
    uint256 public GOLD_CLAIM_DAUGHTER_MIN_NUM = 10;
    uint256 public RAINBOW_CLAIM_DAUGHTER_MIN_NUM = 20;

    // claim flags
    mapping(uint256 => bool) claimFlags; // claim flags for silver/gold/rainbow
    mapping(uint256 => bool) claim3DFlags; // claim flags for m3d
    mapping(uint256 => bool) claimEbibleFlags; // claim flags for ebible
    mapping(address => bool) claimAirdropsFlags; // claim flags for airdrops type
    mapping(address => bool) claimSparkFlags; // claim flags for spark type

    mapping(address => bool) whitelistAirdrops; // whitelist for AIRDROPS type
    mapping(address => bool) whitelistSpark; // whitelist for SPARK type

    ////////////////////////////////////////////////////
    // nft index
    ////////////////////////////////////////////////////
    // daughter index
    uint256 nextDaughterIndex = 1;
    uint256 daughterIndexMin = 1;
    uint256 daughterIndexMax = 999;
    // alien index
    uint256 nextAlienIndex = daughterIndexMax + 1;
    uint256 alienIndexMin = daughterIndexMax + 1;
    uint256 alienIndexMax = daughterIndexMax + 44;
    // silver index
    uint256 nextSilverIndex = alienIndexMax + 1;
    uint256 silverIndexMin = alienIndexMax + 1;
    uint256 silverIndexMax = alienIndexMax + 300;
    // gold index
    uint256 nextGoldIndex = silverIndexMax + 1;
    uint256 goldIndexMin = silverIndexMax + 1;
    uint256 goldIndexMax = silverIndexMax + 150;
    // rainbow index
    uint256 nextRainbowIndex = goldIndexMax + 1;
    uint256 rainbowIndexMin = goldIndexMax + 1;
    uint256 rainbowIndexMax = goldIndexMax + 50;
    // rare index
    uint256 nextRareIndex = rainbowIndexMax + 1;
    uint256 rareIndexMin = rainbowIndexMax + 1;
    uint256 rareIndexMax = rainbowIndexMax + 450;
    // ebible index
    uint256 nextEbibleIndex = rareIndexMax + 1;
    uint256 ebibleIndexMin = rareIndexMax + 1;
    uint256 ebibleIndexMax = rareIndexMax + 500;
    // mother index
    uint256 nextMotherIndex = ebibleIndexMax + 1;
    uint256 motherIndexMin = ebibleIndexMax + 1;
    uint256 motherIndexMax = ebibleIndexMax + 30;
    // m3d index
    uint256 nextM3dIndex = motherIndexMax + 1;
    uint256 m3dIndexMin = motherIndexMax + 1;
    uint256 m3dIndexMax = motherIndexMax + 30;
    // airdrop index
    uint256 nextAirdropsIndex = m3dIndexMax + 1;
    uint256 airdropsIndexMin = m3dIndexMax + 1;
    uint256 airdropsIndexMax = m3dIndexMax + 300;
    // spark index
    uint256 nextSparkIndex = airdropsIndexMax + 1;
    uint256 sparkIndexMin = airdropsIndexMax + 1;
    uint256 sparkIndexMax = airdropsIndexMax + 500;
    ////////////////////////////////////////////////////
    // nft index
    ////////////////////////////////////////////////////

    bool whitelistEnabled = true;  // whitelist switch, for pre-sale
    mapping(address => bool) whitelist; // whitelist for mint
    mapping (address => uint256) public whitelistMintCounts; // limit for pre-sale
    uint256 public whitelistMintMaxCount = 2;

    bool public sgrClaimEnabled; // silver/gold/rainbow switch
    bool public ebibleClaimEnabled; // ebible claim switch
    bool public m3dClaimEnabled;  // m3d claim switch

    /////////////////////////////////////////////////////
    // params
    function setWhitelistMintMaxCount(uint256 value) public onlyWhitelistAdmin {
        whitelistMintMaxCount = value;
    }

    function setSGREnabled(bool flag) public onlyWhitelistAdmin {
        sgrClaimEnabled = flag;
    }

    function setEbileEnabled(bool flag) public onlyWhitelistAdmin {
        ebibleClaimEnabled = flag;
    }

    function set3DEnabled(bool flag) public onlyWhitelistAdmin {
        m3dClaimEnabled = flag;
    }

    function setWhitelistEnabled(bool flag) public onlyWhitelistAdmin {
        whitelistEnabled = flag;
    }

    function setSalePrice(uint256 value) public onlyWhitelistAdmin {
        salePrice = value;
    }

    function setSilverClaimDaughterMinNum(uint256 value) public onlyWhitelistAdmin {
        SILVER_CLAIM_DAUGHTER_MIN_NUM = value;
    }

    function setGoldClaimDaughterMinNum(uint256 value) public onlyWhitelistAdmin {
        GOLD_CLAIM_DAUGHTER_MIN_NUM = value;
    }

    function setRainbowClaimDaughterMinNum(uint256 value) public onlyWhitelistAdmin {
        RAINBOW_CLAIM_DAUGHTER_MIN_NUM = value;
    }
    /////////////////////////////////////////////////////


    constructor() ERC721("Daughters of Rainbow", "DOR") {
        // _baseTokenURI = "ipfs://QmaWSLDeJ3Urn47RX3fNEKcU4Tg7TXHpLy1t4t8z466AUP/";
        // metadata: ipfs://QmaWSLDeJ3Urn47RX3fNEKcU4Tg7TXHpLy1t4t8z466AUP/<tokenId>.json
    }

    function getNextDaughterId() internal returns (uint256 id) {
        id = nextDaughterIndex;
        nextDaughterIndex = nextDaughterIndex.add(1);
    }

    function getNextAlienId() internal returns (uint256 id) {
        id = nextAlienIndex;
        nextAlienIndex = nextAlienIndex.add(1);
    }

    function getNextSilverId() internal returns (uint256 id) {
        id = nextSilverIndex;
        nextSilverIndex = nextSilverIndex.add(1);
    }

    function getNextGoldId() internal returns (uint256 id) {
        id = nextGoldIndex;
        nextGoldIndex = nextGoldIndex.add(1);
    }

    function getNextRainbowId() internal returns (uint256 id) {
        id = nextRainbowIndex;
        nextRainbowIndex = nextRainbowIndex.add(1);
    }

    function getNextRareId() internal returns (uint256 id) {
        id = nextRareIndex;
        nextRareIndex = nextRareIndex.add(1);
    }

    function getNextEbibleId() internal returns (uint256 id) {
        id = nextEbibleIndex;
        nextEbibleIndex = nextEbibleIndex.add(1);
    }

    function getNextMotherId() internal returns (uint256 id) {
        id = nextMotherIndex;
        nextMotherIndex = nextMotherIndex.add(1);
    }

    function getNextM3dId() internal returns (uint256 id) {
        id = nextM3dIndex;
        nextM3dIndex = nextM3dIndex.add(1);
    }

    function getNextAirdropsId() internal returns (uint256 id) {
        id = nextAirdropsIndex;
        nextAirdropsIndex = nextAirdropsIndex.add(1);
    }

    function getNextSparkId() internal returns (uint256 id) {
        id = nextSparkIndex;
        nextSparkIndex = nextSparkIndex.add(1);
    }

    //////////////////////////////////////////////////////////////
    // NFT type and count functions
    function daughterLeftover() public view returns (uint256) {
        if (nextDaughterIndex > daughterIndexMax) {
            return 0;
        }
        return daughterIndexMax.sub(nextDaughterIndex).add(1);
    }

    function getDaughterCount() public view returns (uint256) {
        return daughterCurrentCount();
    }

    function daughterCurrentCount() public view returns (uint256) {
        return nextDaughterIndex.sub(daughterIndexMin);
    }

    function alienLeftover() public view returns (uint256) {
        if (nextAlienIndex > alienIndexMax) {
            return 0;
        }
        return alienIndexMax.sub(nextAlienIndex).add(1);
    }

    function alienCurrentCount() public view returns (uint256) {
        return nextAlienIndex.sub(alienIndexMin);
    }

    function silverLeftover() public view returns (uint256) {
        if (nextSilverIndex > silverIndexMax) {
            return 0;
        }
        return silverIndexMax.sub(nextSilverIndex).add(1);
    }

    function silverCurrentCount() public view returns (uint256) {
        return nextSilverIndex.sub(silverIndexMin);
    }

    function goldLeftover() public view returns (uint256) {
        if (nextGoldIndex > goldIndexMax) {
            return 0;
        }
        return goldIndexMax.sub(nextGoldIndex).add(1);
    }

    function goldCurrentCount() public view returns (uint256) {
        return nextGoldIndex.sub(goldIndexMin);
    }

    function rainbowLeftover() public view returns (uint256) {
        if (nextRainbowIndex > rainbowIndexMax) {
            return 0;
        }
        return rainbowIndexMax.sub(nextRainbowIndex).add(1);
    }

    function rainbowCurrentCount() public view returns (uint256) {
        return nextRainbowIndex.sub(rainbowIndexMin);
    }

    function rareLeftover() public view returns (uint256) {
        if (nextRareIndex > rareIndexMax) {
            return 0;
        }
        return rareIndexMax.sub(nextRareIndex).add(1);
    }

    function rareCurrentCount() public view returns (uint256) {
        return nextRareIndex.sub(rareIndexMin);
    }

    function ebibleLeftover() public view returns (uint256) {
        if (nextEbibleIndex > ebibleIndexMax) {
            return 0;
        }
        return ebibleIndexMax.sub(nextEbibleIndex).add(1);
    }

    function ebibleCurrentCount() public view returns (uint256) {
        return nextEbibleIndex.sub(ebibleIndexMin);
    }

    function motherLeftover() public view returns (uint256) {
        if (nextMotherIndex > motherIndexMax) {
            return 0;
        }
        return motherIndexMax.sub(nextMotherIndex).add(1);
    }

    function motherCurrentCount() public view returns (uint256) {
        return nextMotherIndex.sub(motherIndexMin);
    }

    function m3dLeftover() public view returns (uint256) {
        if (nextM3dIndex > m3dIndexMax) {
            return 0;
        }
        return m3dIndexMax.sub(nextM3dIndex).add(1);
    }

    function m3dCurrentCount() public view returns (uint256) {
        return nextM3dIndex.sub(m3dIndexMin);
    }

    function airdropsLeftover() public view returns (uint256) {
        if (nextAirdropsIndex > airdropsIndexMax) {
            return 0;
        }
        return airdropsIndexMax.sub(nextAirdropsIndex).add(1);
    }

    function airdropsCurrentCount() public view returns (uint256) {
        return nextAirdropsIndex.sub(airdropsIndexMin);
    }

    function sparkLeftover() public view returns (uint256) {
        if (nextSparkIndex > sparkIndexMax) {
            return 0;
        }
        return sparkIndexMax.sub(nextSparkIndex).add(1);
    }

    function sparkCurrentCount() public view returns (uint256) {
        return nextSparkIndex.sub(sparkIndexMin);
    }
    //////////////////////////////////////////////////////////////


    //////////////////////////////////////////////////////////////
    // claim flags
    function setClaimFlag(uint256 tokenId, bool flag) internal {
        claimFlags[tokenId] = flag;
    }

    function setClaim3DFlag(uint256 tokenId, bool flag) internal {
        claim3DFlags[tokenId] = flag;
    }

    function setClaimEbibleFlag(uint256 tokenId, bool flag) internal {
        claimEbibleFlags[tokenId] = flag;
    }

    function setClaimAirdropsFlag(address account, bool flag) internal {
        claimAirdropsFlags[account] = flag;
    }

    function setClaimSparkFlag(address account, bool flag) internal {
        claimSparkFlags[account] = flag;
    }

    function getClaimFlag(uint256 tokenId) public view returns (bool) {
        return claimFlags[tokenId];
    }

    function getClaim3DFlag(uint256 tokenId) public view returns (bool) {
        return claim3DFlags[tokenId];
    }

    function getClaimEbibleFlag(uint256 tokenId) public view returns (bool) {
        return claimEbibleFlags[tokenId];
    }

    function getClaimAirdropsFlag(address account) public view returns (bool) {
        return claimAirdropsFlags[account];
    }

    function getClaimSparkFlag(address account) public view returns (bool) {
        return claimSparkFlags[account];
    }
    //////////////////////////////////////////////////////////////

    function addWhitelist(address[] memory accounts) public onlyWhitelistAdmin {
        for (uint256 i = 0; i < accounts.length; i++) {
            whitelist[accounts[i]] = true;
        }
    }

    function isWhitelist(address account) public view returns (bool) {
        return whitelist[account];
    }

    function addWhitelistAirdrops(address[] memory accounts) public onlyWhitelistAdmin {
        for (uint256 i = 0; i < accounts.length; i++) {
            whitelistAirdrops[accounts[i]] = true;
        }
    }

    function isWhitelistAirdrops(address account) public view returns (bool) {
        return whitelistAirdrops[account];
    }

    function addWhitelistSpark(address[] memory accounts) public onlyWhitelistAdmin {
        for (uint256 i = 0; i < accounts.length; i++) {
            whitelistSpark[accounts[i]] = true;
        }
    }

    function isWhitelistSpark(address account) public view returns (bool) {
        return whitelistSpark[account];
    }

    function removeWhitelistAdmin(address account) public onlyOwner {
        _removeWhitelistAdmin(account);
    }

    function _baseURI() internal view override returns (string memory) {
        return _baseTokenURI;
    }

    function baseURI() external view returns (string memory) {
        return _baseURI();
    }

    function setBaseURI(string memory baseTokenURI) external onlyWhitelistAdmin {
        _baseTokenURI = baseTokenURI;
    }

    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    function burn(uint256 tokenId) public virtual {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "!(owner|approved)");
        _burn(tokenId);
    }

    function getType(uint256 tokenId) public view returns (uint256) {
        return typeMapping[tokenId];
    }

    function getTokenTypes(uint256[] memory tokenIds) public view returns (uint256[] memory types) {
        types = new uint256[](tokenIds.length);
        for (uint256 i = 0; i < tokenIds.length; i++) {
            types[i] = getType(tokenIds[i]);
        }
    }

    function setTokenType(uint256 tokenId, uint256 tp) public onlyWhitelistAdmin {
        setType(tokenId, tp);
    }

    function setType(uint256 tokenId, uint256 tp) internal {
        typeMapping[tokenId] = tp;
    }

    function _mintDaughter(address account, uint256 num) internal {
        require(nextDaughterIndex.add(num) <= daughterIndexMax.add(1), "num limited");
        for (uint256 i; i < num; i++) {
            // get new token id
            uint256 tokenId = getNextDaughterId();
            // mint and set token type
            _safeMint(account, tokenId);
            setType(tokenId, uint256(TokenType.DAUGHTER));
        }
    }

    function _mintAlien(address account, uint256 num) internal {
        require(nextAlienIndex.add(num) <= alienIndexMax.add(1), "num limited");
        for (uint256 i; i < num; i++) {
            // get new token id
            uint256 tokenId = getNextAlienId();
            // mint and set token type
            _safeMint(account, tokenId);
            setType(tokenId, uint256(TokenType.ALIEN));
        }
    }

    function claimSGR(uint256 tp) public {
        require(sgrClaimEnabled, "not start");

        address account = _msgSender();
        // check silver/gold/rainbow
        (uint256[] memory tokenIds, uint256[] memory tokenTypes) = getTokens(account);
        uint256 daughterCount;
        for (uint256 i = 0; i < tokenTypes.length; i++) {
            if (tokenTypes[i] == uint256(TokenType.DAUGHTER) && !getClaimFlag(tokenIds[i])) {
                daughterCount = daughterCount.add(1);
            }
        }

        uint256 cnt;
        if (tp == uint256(TokenType.RAINBOW)) {
            cnt = RAINBOW_CLAIM_DAUGHTER_MIN_NUM;
            require(rainbowLeftover() > 0, "no rainbow leftover");
        } else if (tp == uint256(TokenType.GOLD)) {
            cnt = GOLD_CLAIM_DAUGHTER_MIN_NUM;
            require(goldLeftover() > 0, "no gold leftover");
        } else if (tp == uint256(TokenType.SILVER)) {
            cnt = SILVER_CLAIM_DAUGHTER_MIN_NUM;
            require(silverLeftover() > 0, "no silver leftover");
        } else {
            require(false, "type error");
        }
        require(daughterCount >= cnt, "can't claim SGR");
        // set claim flag
        for (uint256 i = 0; i < tokenTypes.length && cnt > 0; i++) {
            if (tokenTypes[i] == uint256(TokenType.DAUGHTER) && !getClaimFlag(tokenIds[i])) {
                setClaimFlag(tokenIds[i], true);
                cnt = cnt.sub(1);
            }
        }

        // mint
        if (tp == uint256(TokenType.RAINBOW)) {
            _mintRainbow(account, 1);
        } else if (tp == uint256(TokenType.GOLD)) {
            _mintGold(account, 1);
        } else if (tp == uint256(TokenType.SILVER)) {
            _mintSilver(account, 1);
        }
    }

    function _mintSilver(address account, uint256 num) internal {
        require(nextSilverIndex.add(num) <= silverIndexMax.add(1), "num limited");
        for (uint256 i; i < num; i++) {
            // get new token id
            uint256 tokenId = getNextSilverId();
            // mint and set token type
            _safeMint(account, tokenId);
            setType(tokenId, uint256(TokenType.SILVER));
        }
    }

    function _mintGold(address account, uint256 num) internal {
        require(nextGoldIndex.add(num) <= goldIndexMax.add(1), "num limited");
        for (uint256 i; i < num; i++) {
            // get new token id
            uint256 tokenId = getNextGoldId();
            // mint and set token type
            _safeMint(account, tokenId);
            setType(tokenId, uint256(TokenType.GOLD));
        }
    }

    function _mintRainbow(address account, uint256 num) internal {
        require(nextRainbowIndex.add(num) <= rainbowIndexMax.add(1), "num limited");
        for (uint256 i; i < num; i++) {
            // get new token id
            uint256 tokenId = getNextRainbowId();
            // mint and set token type
            _safeMint(account, tokenId);
            setType(tokenId, uint256(TokenType.RAINBOW));
        }
    }

    function _mintRare(address account, uint256 num) internal {
        require(nextRareIndex.add(num) <= rareIndexMax.add(1), "num limited");
        for (uint256 i; i < num; i++) {
            // get new token id
            uint256 tokenId = getNextRareId();
            // mint and set token type
            _safeMint(account, tokenId);
            setType(tokenId, uint256(TokenType.RARE));
        }
    }

    function _mintEbible(address account, uint256 num) internal {
        require(nextEbibleIndex.add(num) <= ebibleIndexMax.add(1), "num limited");
        for (uint256 i; i < num; i++) {
            // get new token id
            uint256 tokenId = getNextEbibleId();
            // mint and set token type
            _safeMint(account, tokenId);
            setType(tokenId, uint256(TokenType.EBIBLE));
        }
    }

    function _mintMother(address account, uint256 num) internal {
        require(nextMotherIndex.add(num) <= motherIndexMax.add(1), "num limited");
        for (uint256 i; i < num; i++) {
            // get new token id
            uint256 tokenId = getNextMotherId();
            // mint and set token type
            _safeMint(account, tokenId);
            setType(tokenId, uint256(TokenType.MOTHER));
        }
    }

    function _mintM3d(address account, uint256 num) internal {
        require(nextM3dIndex.add(num) <= m3dIndexMax.add(1), "num limited");
        for (uint256 i; i < num; i++) {
            // get new token id
            uint256 tokenId = getNextM3dId();
            // mint and set token type
            _safeMint(account, tokenId);
            setType(tokenId, uint256(TokenType.M3D));
        }
    }

    function _mintAirdrops(address account, uint256 num) internal {
        require(nextAirdropsIndex.add(num) <= airdropsIndexMax.add(1), "num limited");
        for (uint256 i; i < num; i++) {
            // get new token id
            uint256 tokenId = getNextAirdropsId();
            // mint and set token type
            _safeMint(account, tokenId);
            setType(tokenId, uint256(TokenType.AIRDROPS));
        }
    }

    function _mintSpark(address account, uint256 num) internal {
        require(nextSparkIndex.add(num) <= sparkIndexMax.add(1), "num limited");
        for (uint256 i; i < num; i++) {
            // get new token id
            uint256 tokenId = getNextSparkId();
            // mint and set token type
            _safeMint(account, tokenId);
            setType(tokenId, uint256(TokenType.SPARK));
        }
    }

    // presale for daughter
    function mint(uint256 num) public payable nonReentrant WhenNotPaused {
        if (whitelistEnabled) { // check whitelist
            require(isWhitelist(_msgSender()), "not in whitelist");
            require(whitelistMintCounts[_msgSender()].add(num) <= whitelistMintMaxCount, "whitelist mint num limited");
            whitelistMintCounts[_msgSender()] =  whitelistMintCounts[_msgSender()].add(num);
        }
        // validate
        require(msg.value >= salePrice.mul(num), "payment invalid");
        // mint daughter
        _mintDaughter(_msgSender(), num);
    }

    // returns (uint256[] tokenIds, uint256[] tokenTypes)
    function getTokens(address owner) public view returns (uint256[] memory, uint256[] memory) {
        uint256 balance = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](balance);
        uint256[] memory tokenTypes = new uint256[](balance);
        for (uint256 i = 0; i < balance; i++) {
            uint256 id = tokenOfOwnerByIndex(owner, i);
            tokenIds[i] = id;
            tokenTypes[i] = getType(id);
        }
        return (tokenIds, tokenTypes);
    }

    function canClaimSGR(address owner) public view returns (bool silver, bool gold, bool rainbow) {
        if (!sgrClaimEnabled) { // not enabled
            return (false, false, false);
        }

        // check silver/gold/rainbow
        (uint256[] memory tokenIds, uint256[] memory tokenTypes) = getTokens(owner);
        uint256 daughterCount;
        for (uint256 i = 0; i < tokenTypes.length; i++) {
            if (tokenTypes[i] == uint256(TokenType.DAUGHTER) && !getClaimFlag(tokenIds[i])) {
                daughterCount = daughterCount.add(1);
            }
        }

        if (daughterCount >= RAINBOW_CLAIM_DAUGHTER_MIN_NUM && rainbowLeftover() > 0) {
            rainbow = true;
        } else if (daughterCount >= GOLD_CLAIM_DAUGHTER_MIN_NUM && goldLeftover() > 0) {
            gold = true;
        } else if (daughterCount >= SILVER_CLAIM_DAUGHTER_MIN_NUM && silverLeftover() > 0) {
            silver = true;
        }
    }

    function canClaim(address account) public view
        returns
        (bool silver, bool gold, bool rainbow, bool ebible, bool random, bool m3d, bool airdrops, bool spark) {
        // check silver/gold/rainbow
        (silver, gold, rainbow) = canClaimSGR(account);

        // check ebible
        ebible = canClaimEbible(account);

        // check random silver/gold/rainbow
        random = false;

        // check m3d
        m3d = canClaim3D(account);

        // check airdrops
        airdrops = canClaimAirdrops(account);

        // check spark
        spark = canClaimSpark(account);
    }

    function canClaim3D(address account) public view returns (bool) {
        if (!m3dClaimEnabled) {
            return false;
        }

        // mint over
        if (m3dLeftover() == 0) {
            return false;
        }

        (uint256[] memory tokenIds, uint256[] memory tokenTypes) = getTokens(account);
        for (uint256 i = 0; i < tokenTypes.length; i++) {
            if (tokenTypes[i] == uint256(TokenType.MOTHER) && !getClaim3DFlag(tokenIds[i])) {
                return true;
            }
        }
        return false;
    }

    function canClaimEbible(address account) public view returns (bool) {
        if (!ebibleClaimEnabled) { // not enabled
            return false;
        }

        // mint over
        if (ebibleLeftover() == 0) {
            return false;
        }

        (uint256[] memory tokenIds, uint256[] memory tokenTypes) = getTokens(account);
        uint256 cnt;
        for (uint256 i = 0; i < tokenTypes.length; i++) {
            if (tokenTypes[i] == uint256(TokenType.RARE) && !getClaimEbibleFlag(tokenIds[i])) {
                cnt = cnt.add(1);
            }
        }

        if (cnt >= 3) {
            return true;
        }
        return false;
    }

    function claim3D() public {
        require(m3dClaimEnabled, "not start");

        (uint256[] memory tokenIds, uint256[] memory tokenTypes) = getTokens(_msgSender());
        bool can;
        for (uint256 i = 0; i < tokenTypes.length; i++) {
            if (tokenTypes[i] == uint256(TokenType.MOTHER) && !getClaim3DFlag(tokenIds[i])) {
                can = true;
                break;
            }
        }
        require(can, "can't claim 3D mother");

        // set claim flag
        for (uint256 i = 0; i < tokenTypes.length; i++) {
            if (tokenTypes[i] == uint256(TokenType.MOTHER) && !getClaim3DFlag(tokenIds[i])) {
                setClaim3DFlag(tokenIds[i], true);
                break;
            }
        }

        // mint
        _mintM3d(_msgSender(), 1);
    }

    function canClaimAirdrops(address account) public view returns (bool) {
        if (isWhitelistAirdrops(account) && !getClaimAirdropsFlag(account) && airdropsLeftover() > 0) {
            return true;
        }
        return false;
    }

    function claimAirdrops() public {
        address account = _msgSender();
        require(canClaimAirdrops(account), "can't claim airdrops");

        // set claim flags
        setClaimAirdropsFlag(account, true);

        // mint
        _mintAirdrops(account, 1);
    }

    function canClaimSpark(address account) public view returns (bool) {
        if (isWhitelistSpark(account) && !getClaimSparkFlag(account) && sparkLeftover() > 0) {
            return true;
        }
        return false;
    }

    function claimSpark() public {
        address account = _msgSender();
        require(canClaimSpark(account), "can't claim spark");

        // set claim flags
        setClaimSparkFlag(account, true);

        // mint
        _mintSpark(account, 1);
    }

    function claim(uint256 tp) public {
        if (tp == uint256(TokenType.SILVER) || tp == uint256(TokenType.GOLD) || tp == uint256(TokenType.RAINBOW)) {
            claimSGR(tp);
        } else if (tp == uint256(TokenType.EBIBLE)) {
            claimEbible();
        } else if (tp == uint256(TokenType.M3D)) {
            claim3D();
        } else if (tp == uint256(TokenType.AIRDROPS)) {
            claimAirdrops();
        } else if (tp == uint256(TokenType.SPARK)) {
            claimSpark();
        }
    }

    function claimEbible() public {
        require(ebibleClaimEnabled, "not start");

        // check and set claim flag
        (uint256[] memory tokenIds, uint256[] memory tokenTypes) = getTokens(_msgSender());
        uint256 cnt;
        for (uint256 i = 0; i < tokenTypes.length; i++) {
            if (tokenTypes[i] == uint256(TokenType.RARE) && !getClaimEbibleFlag(tokenIds[i])) {
                cnt = cnt.add(1);
            }
        }

        require(cnt >= 3, "can claim ebile");

        // set claim flag
        uint256 c = 3;
        for (uint256 i = 0; i < tokenTypes.length && c > 0; i++) {
            if (tokenTypes[i] == uint256(TokenType.RARE) && !getClaimEbibleFlag(tokenIds[i])) {
                setClaimEbibleFlag(tokenIds[i], true);
                c = c.sub(1);
            }
        }

        // mint
        _mintEbible(_msgSender(), 1);
    }

    ////////////////////////////////////////////////////
    // admin operation
    ////////////////////////////////////////////////////

    function adminMintDaughter(address account, uint256 num) public onlyWhitelistAdmin {
        _mintDaughter(account, num);
    }

    // admin mint alien
    function adminMintAlien(address account, uint256 num) public onlyWhitelistAdmin {
        _mintAlien(account, num);
    }

    // admin mint alien
    function adminMintRare(address account, uint256 num) public onlyWhitelistAdmin {
        _mintRare(account, num);
    }

    // admin mint mother
    function adminMintMother(address account, uint256 num) public onlyWhitelistAdmin {
        _mintMother(account, num);
    }

    // admin mint airdrops
    function adminMintAirdrops(address account, uint256 num) public onlyWhitelistAdmin {
        _mintAirdrops(account, num);
    }

    // admin mint spark
    function adminMintSpark(address account, uint256 num) public onlyWhitelistAdmin {
        _mintSpark(account, num);
    }

    function adminMint(address account, uint256 tp, uint256 num) public onlyWhitelistAdmin {
        if (tp == uint256(TokenType.DAUGHTER)) {
            _mintDaughter(account, num);
        } else if (tp == uint256(TokenType.ALIEN)) {
            _mintAlien(account, num);
        } else if (tp == uint256(TokenType.SILVER)) {
            _mintSilver(account, num);
        } else if (tp == uint256(TokenType.GOLD)) {
            _mintGold(account, num);
        } else if (tp == uint256(TokenType.RAINBOW)) {
            _mintRainbow(account, num);
        } else if (tp == uint256(TokenType.RARE)) {
            _mintRare(account, num);
        } else if (tp == uint256(TokenType.EBIBLE)) {
            _mintEbible(account, num);
        } else if (tp == uint256(TokenType.MOTHER)) {
            _mintMother(account, num);
        } else if (tp == uint256(TokenType.M3D)) {
            _mintM3d(account, num);
        } else if (tp == uint256(TokenType.AIRDROPS)) {
            _mintAirdrops(account, num);
        } else if (tp == uint256(TokenType.SPARK)) {
            _mintSpark(account, num);
        }
    }

    function adminMintx(address account, uint256 tp, uint256 tokenId) public onlyWhitelistAdmin {
        // mint and set token type
        _safeMint(account, tokenId);
        setType(tokenId, tp);
    }

    function withdrawAll() public onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
    ////////////////////////////////////////////////////
}

File 1 of 19: Address.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}




File 2 of 19: Context.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

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

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

File 4 of 19: ERC165.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

import "./IERC165.sol";
/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 5 of 19: ERC721.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

import "./Context.sol";
import "./ERC165.sol";
import "./IERC721.sol";
import "./IERC721Metadata.sol";
import "./IERC721Receiver.sol";

import "./Address.sol";
import "./Strings.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
        interfaceId == type(IERC721).interfaceId ||
        interfaceId == type(IERC721Metadata).interfaceId ||
        super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}



File 6 of 19: ERC721Enumerable.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 7 of 19: IERC165.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

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

File 8 of 19: IERC721.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


File 9 of 19: IERC721Enumerable.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 10 of 19: IERC721Metadata.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 11 of 19: IERC721Receiver.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 12 of 19: Migrations.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

contract Migrations {
  address public owner = msg.sender;
  uint public last_completed_migration;

  modifier restricted() {
    require(
      msg.sender == owner,
      "This function is restricted to the contract's owner"
    );
    _;
  }

  function setCompleted(uint completed) public restricted {
    last_completed_migration = completed;
  }
}

File 13 of 19: Ownable.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


File 14 of 19: Pausable.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.0;

import "./Ownable.sol";

abstract contract Pausable is Ownable {
    event Paused(address account);
    event Unpaused(address account);

    bool public paused;

    constructor ()  {
        paused = false;
    }

    modifier WhenNotPaused() {
        require(!paused, "Pausable: paused");
        _;
    }

    modifier WhenPaused() {
        require(paused, "Pausable: not paused");
        _;
    }

    function Pause() public onlyOwner {
        paused = true;
        emit Paused(msg.sender);
    }

    function Unpause() public onlyOwner {
        paused = false;
        emit Unpaused(msg.sender);
    }
}

File 15 of 19: ReentrancyGuard.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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




File 16 of 19: Roles.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

File 17 of 19: SafeMath.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 18 of 19: Strings.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}



File 19 of 19: WhitelistAdminRole.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.0;

import "./Context.sol";
import "./Roles.sol";

/**
 * @title WhitelistAdminRole
 * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts.
 */
contract WhitelistAdminRole is Context {
    using Roles for Roles.Role;

    event WhitelistAdminAdded(address indexed account);
    event WhitelistAdminRemoved(address indexed account);

    Roles.Role private _whitelistAdmins;

    constructor () {
        _addWhitelistAdmin(_msgSender());
    }

    modifier onlyWhitelistAdmin() {
        require(isWhitelistAdmin(_msgSender()), "WhitelistAdminRole: caller does not have the WhitelistAdmin role");
        _;
    }

    function isWhitelistAdmin(address account) public view returns (bool) {
        return _whitelistAdmins.has(account);
    }

    function addWhitelistAdmin(address account) public onlyWhitelistAdmin {
        _addWhitelistAdmin(account);
    }

    function renounceWhitelistAdmin() public {
        _removeWhitelistAdmin(_msgSender());
    }

    function _addWhitelistAdmin(address account) internal {
        _whitelistAdmins.add(account);
        emit WhitelistAdminAdded(account);
    }

    function _removeWhitelistAdmin(address account) internal {
        _whitelistAdmins.remove(account);
        emit WhitelistAdminRemoved(account);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"inputs":[],"name":"GOLD_CLAIM_DAUGHTER_MIN_NUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"RAINBOW_CLAIM_DAUGHTER_MIN_NUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SILVER_CLAIM_DAUGHTER_MIN_NUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addWhitelistAirdrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"addWhitelistSpark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"adminMintAirdrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"adminMintAlien","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"adminMintDaughter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"adminMintMother","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"adminMintRare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"adminMintSpark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"tp","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"adminMintx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropsCurrentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"airdropsLeftover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alienCurrentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alienLeftover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"canClaim","outputs":[{"internalType":"bool","name":"silver","type":"bool"},{"internalType":"bool","name":"gold","type":"bool"},{"internalType":"bool","name":"rainbow","type":"bool"},{"internalType":"bool","name":"ebible","type":"bool"},{"internalType":"bool","name":"random","type":"bool"},{"internalType":"bool","name":"m3d","type":"bool"},{"internalType":"bool","name":"airdrops","type":"bool"},{"internalType":"bool","name":"spark","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"canClaim3D","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"canClaimAirdrops","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"canClaimEbible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"canClaimSGR","outputs":[{"internalType":"bool","name":"silver","type":"bool"},{"internalType":"bool","name":"gold","type":"bool"},{"internalType":"bool","name":"rainbow","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"canClaimSpark","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tp","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim3D","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAirdrops","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEbible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tp","type":"uint256"}],"name":"claimSGR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimSpark","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daughterCurrentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daughterLeftover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ebibleClaimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ebibleCurrentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ebibleLeftover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getClaim3DFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getClaimAirdropsFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getClaimEbibleFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getClaimFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getClaimSparkFlag","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDaughterCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"getTokenTypes","outputs":[{"internalType":"uint256[]","name":"types","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goldCurrentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goldLeftover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAirdrops","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistSpark","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"m3dClaimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"m3dCurrentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"m3dLeftover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"motherCurrentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"motherLeftover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rainbowCurrentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rainbowLeftover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rareCurrentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rareLeftover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeWhitelistAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"set3DEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"setEbileEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setGoldClaimDaughterMinNum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setRainbowClaimDaughterMinNum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"setSGREnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setSilverClaimDaughterMinNum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"tp","type":"uint256"}],"name":"setTokenType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"flag","type":"bool"}],"name":"setWhitelistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setWhitelistMintMaxCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sgrClaimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"silverCurrentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"silverLeftover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sparkCurrentCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sparkLeftover","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintMaxCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266b1a2bc2ec50000600d556005601055600a60115560146012556001601a556001601b556103e7601c55601c5460016200003f9190620005aa565b601d55601c5462000052906001620005aa565b601e55601c546200006590602c620005aa565b601f81905562000077906001620005aa565b602055601f546200008a906001620005aa565b602155601f546200009e9061012c620005aa565b6022819055620000b0906001620005aa565b602355602254620000c3906001620005aa565b602455602254620000d6906096620005aa565b6025819055620000e8906001620005aa565b602655602554620000fb906001620005aa565b6027556025546200010e906032620005aa565b602881905562000120906001620005aa565b60295560285462000133906001620005aa565b602a5560285462000147906101c2620005aa565b602b81905562000159906001620005aa565b602c55602b546200016c906001620005aa565b602d55602b5462000180906101f4620005aa565b602e81905562000192906001620005aa565b602f55602e54620001a5906001620005aa565b603055602e54620001b890601e620005aa565b6031819055620001ca906001620005aa565b603255603154620001dd906001620005aa565b603355603154620001f090601e620005aa565b603481905562000202906001620005aa565b60355560345462000215906001620005aa565b603655603454620002299061012c620005aa565b60378190556200023b906001620005aa565b6038556037546200024e906001620005aa565b60395560375462000262906101f4620005aa565b603a55603b805460ff191660011790556002603e553480156200028457600080fd5b50604080518082018252601481527f446175676874657273206f66205261696e626f770000000000000000000000006020808301918252835180850190945260038452622227a960e91b908401528151919291620002e5916000916200048b565b508051620002fb9060019060208401906200048b565b50506001600a555062000317620003116200033e565b62000342565b600b805460ff60a01b1916905562000338620003326200033e565b62000394565b6200060c565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620003af81600c620003e660201b620033d81790919060201c565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b620003f2828262000440565b156200041b5760405162461bcd60e51b8152600401620004129062000531565b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200046b5760405162461bcd60e51b8152600401620004129062000568565b506001600160a01b03166000908152602091909152604090205460ff1690565b8280546200049990620005cf565b90600052602060002090601f016020900481019282620004bd576000855562000508565b82601f10620004d857805160ff191683800117855562000508565b8280016001018555821562000508579182015b8281111562000508578251825591602001919060010190620004eb565b50620005169291506200051a565b5090565b5b808211156200051657600081556001016200051b565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b60008219821115620005ca57634e487b7160e01b81526011600452602481fd5b500190565b600281046001821680620005e457607f821691505b602082108114156200060657634e487b7160e01b600052602260045260246000fd5b50919050565b61582a806200061c6000396000f3fe6080604052600436106106665760003560e01c80637362d9c811610344578063b88d4fde116101b6578063d04c93ea11610102578063edac985b116100a0578063f51f96dd1161007a578063f51f96dd14611202578063f84fe63a14611217578063ffa9fc641461122c578063ffbcba961461124c57610666565b8063edac985b146111ad578063f0486fb2146111cd578063f2fde38b146111e257610666565b8063e0f2f42f116100dc578063e0f2f42f14611138578063e4cd58bb14611158578063e985e9c51461116d578063e9e2ba2d1461118d57610666565b8063d04c93ea146110d8578063d7d88364146110f8578063da2eb6c61461111857610666565b8063c048d1651161016f578063c683630d11610149578063c683630d14611058578063c87b56dd14611078578063cb29136114611098578063cbc42e73146110b857610666565b8063c048d1651461100e578063c35958cc14611023578063c5eb88e71461103857610666565b8063b88d4fde14610f45578063bb5f747b14610f65578063bbf5ed7014610f85578063bc95881014610f9a578063bd8f7a0a14610fba578063bf3506c114610fda57610666565b806390d1c18511610290578063a0b2a5df1161022e578063aec3e06b11610208578063aec3e06b14610ed0578063b5b924d914610ef0578063b5ebe1e414610f10578063b75da4a914610f2557610666565b8063a0b2a5df14610e7b578063a22cb46514610e9b578063aa49186014610ebb57610666565b80639add94341161026a5780639add943414610e1e5780639c08f83614610e3e5780639f2ddb8314610e53578063a0712d6814610e6857610666565b806390d1c18514610dd457806395d89b4114610df457806399b519b814610e0957610666565b8063886c74bb116102fd5780638b4979a7116102d75780638b4979a714610d805780638da5cb5b14610d955780638e78f9c114610daa57806390360f7214610dbf57610666565b8063886c74bb14610d2b578063898d632a14610d4b5780638b2822b014610d6057610666565b80637362d9c814610c9757806374afd0bc14610cb75780637805862f14610cd75780637d15b76614610cec57806384873ac114610d01578063853828b614610d1657610666565b80634036ab78116104dd5780635b749425116104295780636352211e116103c75780636985a022116103a15780636985a02214610c385780636c0360eb14610c4d57806370a0823114610c62578063715018a614610c8257610666565b80636352211e14610bd85780636567e20614610bf85780636897e97414610c1857610666565b80635cef3e2f116104035780635cef3e2f14610b6e5780635dc0f2e814610b835780635f193c2b14610b98578063603d1f3714610bb857610666565b80635b74942514610b195780635c91db3814610b395780635c975abb14610b5957610666565b80634f558e79116104965780635233b197116104705780635233b19714610aba57806354cb792a14610acf57806355f804b314610ae4578063562f6fe714610b0457610666565b80634f558e7914610a655780634f6ccce714610a8557806350d3c82014610aa557610666565b80634036ab781461099557806342842e0e146109b557806342966c68146109d5578063450efe21146109f55780634888930714610a235780634c5a628c14610a5057610666565b80631919fed7116105b75780633004573b116105555780633331d2701161052f5780633331d270146109115780633398393d14610926578063379607f514610955578063379d86021461097557610666565b80633004573b146108c757806331ad14ea146108dc57806331f19a1c146108fc57610666565b80632a231ccf116105915780632a231ccf146108685780632b5c96e01461087d5780632f745c59146108925780632f83876a146108b257610666565b80631919fed7146108135780631a5586841461083357806323b872dd1461084857610666565b8063081812fc116106245780631168a6e5116105fe5780631168a6e51461079e578063145867dd146107be57806318160ddd146107de578063189e398e146107f357610666565b8063081812fc1461073c578063095ea7b3146107695780630b3b269e1461078957610666565b80624a84cb1461066b57806301ffc9a71461068d57806302d4296e146106c3578063052d9e7e146106e557806306fdde03146107055780630714729514610727575b600080fd5b34801561067757600080fd5b5061068b61068636600461491e565b611261565b005b34801561069957600080fd5b506106ad6106a8366004614a8a565b61136c565b6040516106ba9190614c6f565b60405180910390f35b3480156106cf57600080fd5b506106d8611399565b6040516106ba9190615653565b3480156106f157600080fd5b5061068b610700366004614a70565b6113b8565b34801561071157600080fd5b5061071a6113f2565b6040516106ba9190614cd4565b34801561073357600080fd5b506106d8611484565b34801561074857600080fd5b5061075c610757366004614b08565b6114bc565b6040516106ba9190614be6565b34801561077557600080fd5b5061068b6107843660046148f5565b6114ff565b34801561079557600080fd5b506106d8611592565b3480156107aa57600080fd5b506106ad6107b93660046147cc565b6115c4565b3480156107ca57600080fd5b506106ad6107d93660046147cc565b6115e2565b3480156107ea57600080fd5b506106d8611627565b3480156107ff57600080fd5b5061068b61080e366004614a70565b61162d565b34801561081f57600080fd5b5061068b61082e366004614b08565b611670565b34801561083f57600080fd5b506106d861169c565b34801561085457600080fd5b5061068b610863366004614818565b6116ce565b34801561087457600080fd5b5061068b611706565b34801561088957600080fd5b506106d86118d9565b34801561089e57600080fd5b506106d86108ad3660046148f5565b61190b565b3480156108be57600080fd5b506106d8611960565b3480156108d357600080fd5b506106d8611992565b3480156108e857600080fd5b506106ad6108f73660046147cc565b6119ab565b34801561090857600080fd5b506106ad6119c9565b34801561091d57600080fd5b506106d86119d2565b34801561093257600080fd5b506109466109413660046147cc565b611a04565b6040516106ba93929190614c7a565b34801561096157600080fd5b5061068b610970366004614b08565b611b47565b34801561098157600080fd5b5061068b610990366004614950565b611bbb565b3480156109a157600080fd5b506106d86109b0366004614b08565b611c5c565b3480156109c157600080fd5b5061068b6109d0366004614818565b611c6e565b3480156109e157600080fd5b5061068b6109f0366004614b08565b611c89565b348015610a0157600080fd5b50610a15610a103660046147cc565b611cb9565b6040516106ba929190614c4a565b348015610a2f57600080fd5b50610a43610a3e3660046149ec565b611e0c565b6040516106ba9190614c37565b348015610a5c57600080fd5b5061068b611ee1565b348015610a7157600080fd5b506106ad610a80366004614b08565b611ef3565b348015610a9157600080fd5b506106d8610aa0366004614b08565b611efe565b348015610ab157600080fd5b506106d8611f59565b348015610ac657600080fd5b506106d8611f72565b348015610adb57600080fd5b506106d8611f8b565b348015610af057600080fd5b5061068b610aff366004614ac2565b611fa4565b348015610b1057600080fd5b506106d8611fde565b348015610b2557600080fd5b5061068b610b343660046148f5565b611ff7565b348015610b4557600080fd5b5061068b610b54366004614b08565b612028565b348015610b6557600080fd5b506106ad6122dc565b348015610b7a57600080fd5b506106d86122ec565b348015610b8f57600080fd5b506106d861231e565b348015610ba457600080fd5b5061068b610bb3366004614a70565b612337565b348015610bc457600080fd5b5061068b610bd33660046148f5565b612371565b348015610be457600080fd5b5061075c610bf3366004614b08565b6123a2565b348015610c0457600080fd5b506106ad610c133660046147cc565b6123d7565b348015610c2457600080fd5b5061068b610c333660046147cc565b6123f5565b348015610c4457600080fd5b5061068b61243d565b348015610c5957600080fd5b5061071a6124c9565b348015610c6e57600080fd5b506106d8610c7d3660046147cc565b6124d3565b348015610c8e57600080fd5b5061068b612517565b348015610ca357600080fd5b5061068b610cb23660046147cc565b612560565b348015610cc357600080fd5b506106ad610cd2366004614b08565b612590565b348015610ce357600080fd5b5061068b6125a5565b348015610cf857600080fd5b506106d8612621565b348015610d0d57600080fd5b506106ad612653565b348015610d2257600080fd5b5061068b612662565b348015610d3757600080fd5b5061068b610d46366004614b08565b6126c5565b348015610d5757600080fd5b506106d86126f1565b348015610d6c57600080fd5b5061068b610d7b366004614a70565b6126f7565b348015610d8c57600080fd5b506106d8612738565b348015610da157600080fd5b5061075c61273e565b348015610db657600080fd5b506106d861274d565b348015610dcb57600080fd5b506106d8612757565b348015610de057600080fd5b5061068b610def3660046148f5565b612789565b348015610e0057600080fd5b5061071a6127ba565b348015610e1557600080fd5b506106d86127c9565b348015610e2a57600080fd5b5061068b610e39366004614950565b6127e2565b348015610e4a57600080fd5b506106d861287f565b348015610e5f57600080fd5b506106d8612898565b61068b610e76366004614b08565b6128b1565b348015610e8757600080fd5b5061068b610e96366004614b08565b612a02565b348015610ea757600080fd5b5061068b610eb63660046148cc565b612a2e565b348015610ec757600080fd5b5061068b612afc565b348015610edc57600080fd5b5061068b610eeb3660046148f5565b612caa565b348015610efc57600080fd5b5061068b610f0b366004614b20565b612cdb565b348015610f1c57600080fd5b506106d8612d0c565b348015610f3157600080fd5b5061068b610f40366004614b08565b612d3e565b348015610f5157600080fd5b5061068b610f60366004614853565b612d6a565b348015610f7157600080fd5b506106ad610f803660046147cc565b612da3565b348015610f9157600080fd5b5061068b612db0565b348015610fa657600080fd5b5061068b610fb53660046148f5565b612df7565b348015610fc657600080fd5b5061068b610fd53660046148f5565b612e28565b348015610fe657600080fd5b50610ffa610ff53660046147cc565b612e59565b6040516106ba989796959493929190614c94565b34801561101a57600080fd5b506106d8612eb0565b34801561102f57600080fd5b506106d8612eb6565b34801561104457600080fd5b506106ad611053366004614b08565b612ebc565b34801561106457600080fd5b506106ad6110733660046147cc565b612ed1565b34801561108457600080fd5b5061071a611093366004614b08565b612eef565b3480156110a457600080fd5b5061068b6110b3366004614b08565b612f72565b3480156110c457600080fd5b506106ad6110d3366004614b08565b612f9e565b3480156110e457600080fd5b506106d86110f33660046147cc565b612fb3565b34801561110457600080fd5b506106ad6111133660046147cc565b612fc5565b34801561112457600080fd5b506106ad6111333660046147cc565b612ff3565b34801561114457600080fd5b506106ad6111533660046147cc565b6130db565b34801561116457600080fd5b506106d86130f9565b34801561117957600080fd5b506106ad6111883660046147e6565b613112565b34801561119957600080fd5b506106ad6111a83660046147cc565b613140565b3480156111b957600080fd5b5061068b6111c8366004614950565b613205565b3480156111d957600080fd5b506106ad6132a2565b3480156111ee57600080fd5b5061068b6111fd3660046147cc565b6132b0565b34801561120e57600080fd5b506106d861331e565b34801561122357600080fd5b5061068b613324565b34801561123857600080fd5b5061068b61124736600461491e565b61336b565b34801561125857600080fd5b506106d86133a6565b61126c610f80613424565b6112915760405162461bcd60e51b8152600401611288906153b6565b60405180910390fd5b60098214156112a9576112a48382613428565b611367565b600a8214156112bc576112a483826134a1565b60018214156112cf576112a48382613519565b60028214156112e2576112a48382613591565b60038214156112f5576112a48382613609565b600b821415611308576112a48382613681565b600482141561131b576112a483826136f9565b600c82141561132e576112a48382613771565b6006821415611341576112a483826137e9565b6007821415611354576112a48382613861565b60088214156113675761136783826138d9565b505050565b60006001600160e01b0319821663780e9d6360e01b1480611391575061139182613951565b90505b919050565b60006113b260215460205461399190919063ffffffff16565b90505b90565b6113c3610f80613424565b6113df5760405162461bcd60e51b8152600401611288906153b6565b603b805460ff1916911515919091179055565b60606000805461140190615738565b80601f016020809104026020016040519081016040528092919081815260200182805461142d90615738565b801561147a5780601f1061144f5761010080835404028352916020019161147a565b820191906000526020600020905b81548152906001019060200180831161145d57829003601f168201915b5050505050905090565b6000603154602f54111561149a575060006113b5565b6113b260016114b6602f5460315461399190919063ffffffff16565b906139d3565b60006114c782613a02565b6114e35760405162461bcd60e51b8152600401611288906152aa565b506000908152600460205260409020546001600160a01b031690565b600061150a826123a2565b9050806001600160a01b0316836001600160a01b0316141561153e5760405162461bcd60e51b8152600401611288906154bc565b806001600160a01b0316611550613424565b6001600160a01b0316148061156c575061156c81611188613424565b6115885760405162461bcd60e51b8152600401611288906150d7565b6113678383613a1f565b600060255460235411156115a8575060006113b5565b6113b260016114b660235460255461399190919063ffffffff16565b6001600160a01b031660009081526016602052604090205460ff1690565b60006115ed826119ab565b80156115ff57506115fd826130db565b155b80156116125750600061161061169c565b115b1561161f57506001611394565b506000919050565b60085490565b611638610f80613424565b6116545760405162461bcd60e51b8152600401611288906153b6565b603f8054911515620100000262ff000019909216919091179055565b61167b610f80613424565b6116975760405162461bcd60e51b8152600401611288906153b6565b600d55565b6000603a5460385411156116b2575060006113b5565b6113b260016114b6603854603a5461399190919063ffffffff16565b6116df6116d9613424565b82613a8d565b6116fb5760405162461bcd60e51b8152600401611288906154fd565b611367838383613b12565b603f54610100900460ff1661172d5760405162461bcd60e51b815260040161128890614ce7565b60008061173b610a10613424565b90925090506000805b82518110156117d657600b83828151811061176f57634e487b7160e01b600052603260045260246000fd5b60200260200101511480156117b157506117af8482815181106117a257634e487b7160e01b600052603260045260246000fd5b6020026020010151612ebc565b155b156117c4576117c18260016139d3565b91505b806117ce8161576d565b915050611744565b5060038110156117f85760405162461bcd60e51b81526004016112889061505a565b600360005b83518110801561180d5750600082115b156118c057600b84828151811061183457634e487b7160e01b600052603260045260246000fd5b602002602001015114801561186957506118678582815181106117a257634e487b7160e01b600052603260045260246000fd5b155b156118ae576118a085828151811061189157634e487b7160e01b600052603260045260246000fd5b60200260200101516001613c3f565b6118ab826001613991565b91505b806118b88161576d565b9150506117fd565b506118d36118cc613424565b60016136f9565b50505050565b600060225460205411156118ef575060006113b5565b6113b260016114b660205460225461399190919063ffffffff16565b6000611916836124d3565b82106119345760405162461bcd60e51b815260040161128890614d41565b506001600160a01b03821660009081526006602090815260408083208484529091529020545b92915050565b6000602e54602c541115611976575060006113b5565b6113b260016114b6602c54602e5461399190919063ffffffff16565b60006113b2602a5460295461399190919063ffffffff16565b6001600160a01b031660009081526019602052604090205460ff1690565b603f5460ff1681565b6000602b5460295411156119e8575060006113b5565b6113b260016114b6602954602b5461399190919063ffffffff16565b603f546000908190819060ff16611a2357506000915081905080611b40565b600080611a2f86611cb9565b90925090506000805b8251811015611aca576009838281518110611a6357634e487b7160e01b600052603260045260246000fd5b6020026020010151148015611aa55750611aa3848281518110611a9657634e487b7160e01b600052603260045260246000fd5b6020026020010151612590565b155b15611ab857611ab58260016139d3565b91505b80611ac28161576d565b915050611a38565b506012548110158015611ae457506000611ae2612d0c565b115b15611af25760019350611b3c565b6011548110158015611b0b57506000611b09611592565b115b15611b195760019450611b3c565b6010548110158015611b3257506000611b306118d9565b115b15611b3c57600195505b5050505b9193909250565b6001811480611b565750600281145b80611b615750600381145b15611b7457611b6f81612028565b611bb8565b6004811415611b8557611b6f611706565b6006811415611b9657611b6f612afc565b6007811415611ba757611b6f612db0565b6008811415611bb857611bb8613324565b50565b611bc6610f80613424565b611be25760405162461bcd60e51b8152600401611288906153b6565b60005b8151811015611c5857600160196000848481518110611c1457634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611c508161576d565b915050611be5565b5050565b6000908152600f602052604090205490565b61136783838360405180602001604052806000815250612d6a565b611c946116d9613424565b611cb05760405162461bcd60e51b815260040161128890615491565b611bb881613c5f565b6060806000611cc7846124d3565b905060008167ffffffffffffffff811115611cf257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611d1b578160200160208202803683370190505b50905060008267ffffffffffffffff811115611d4757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611d70578160200160208202803683370190505b50905060005b83811015611e00576000611d8a888361190b565b905080848381518110611dad57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050611dc281611c5c565b838381518110611de257634e487b7160e01b600052603260045260246000fd5b60209081029190910101525080611df88161576d565b915050611d76565b50909350915050915091565b6060815167ffffffffffffffff811115611e3657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611e5f578160200160208202803683370190505b50905060005b8251811015611edb57611e9e838281518110611e9157634e487b7160e01b600052603260045260246000fd5b6020026020010151611c5c565b828281518110611ebe57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611ed38161576d565b915050611e65565b50919050565b611ef1611eec613424565b613d06565b565b600061139182613a02565b6000611f08611627565b8210611f265760405162461bcd60e51b81526004016112889061554e565b60088281548110611f4757634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b60006113b2602d54602c5461399190919063ffffffff16565b60006113b2603054602f5461399190919063ffffffff16565b60006113b260395460385461399190919063ffffffff16565b611faf610f80613424565b611fcb5760405162461bcd60e51b8152600401611288906153b6565b8051611c5890600e9060208401906146b4565b60006113b2601e54601d5461399190919063ffffffff16565b612002610f80613424565b61201e5760405162461bcd60e51b8152600401611288906153b6565b611c588282613861565b603f5460ff1661204a5760405162461bcd60e51b815260040161128890614ce7565b6000612054613424565b905060008061206283611cb9565b90925090506000805b82518110156120f057600983828151811061209657634e487b7160e01b600052603260045260246000fd5b60200260200101511480156120cb57506120c9848281518110611a9657634e487b7160e01b600052603260045260246000fd5b155b156120de576120db8260016139d3565b91505b806120e88161576d565b91505061206b565b506000600386141561212c5750601254600061210a612d0c565b116121275760405162461bcd60e51b815260040161128890614f56565b6121ac565b600286141561216057506011546000612143611592565b116121275760405162461bcd60e51b8152600401611288906150ad565b6001861415612194575060105460006121776118d9565b116121275760405162461bcd60e51b815260040161128890615134565b60405162461bcd60e51b815260040161128890614eb7565b808210156121cc5760405162461bcd60e51b815260040161128890615031565b60005b8351811080156121df5750600082115b1561229257600984828151811061220657634e487b7160e01b600052603260045260246000fd5b602002602001015114801561223b5750612239858281518110611a9657634e487b7160e01b600052603260045260246000fd5b155b156122805761227285828151811061226357634e487b7160e01b600052603260045260246000fd5b60200260200101516001613d48565b61227d826001613991565b91505b8061228a8161576d565b9150506121cf565b5060038614156122ac576122a7856001613609565b6122d4565b60028614156122c0576122a7856001613591565b60018614156122d4576122d4856001613519565b505050505050565b600b54600160a01b900460ff1681565b6000601c54601a541115612302575060006113b5565b6113b260016114b6601a54601c5461399190919063ffffffff16565b60006113b2601b54601a5461399190919063ffffffff16565b612342610f80613424565b61235e5760405162461bcd60e51b8152600401611288906153b6565b603f805460ff1916911515919091179055565b61237c610f80613424565b6123985760405162461bcd60e51b8152600401611288906153b6565b611c5882826138d9565b6000818152600260205260408120546001600160a01b0316806113915760405162461bcd60e51b8152600401611288906151aa565b6001600160a01b031660009081526018602052604090205460ff1690565b6123fd613424565b6001600160a01b031661240e61273e565b6001600160a01b0316146124345760405162461bcd60e51b8152600401611288906152f6565b611bb881613d06565b612445613424565b6001600160a01b031661245661273e565b6001600160a01b03161461247c5760405162461bcd60e51b8152600401611288906152f6565b600b805460ff60a01b1916600160a01b1790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906124bf903390614be6565b60405180910390a1565b60606113b2613d68565b60006001600160a01b0382166124fb5760405162461bcd60e51b815260040161128890615160565b506001600160a01b031660009081526003602052604090205490565b61251f613424565b6001600160a01b031661253061273e565b6001600160a01b0316146125565760405162461bcd60e51b8152600401611288906152f6565b611ef16000613d77565b61256b610f80613424565b6125875760405162461bcd60e51b8152600401611288906153b6565b611bb881613dc9565b60009081526013602052604090205460ff1690565b6125ad613424565b6001600160a01b03166125be61273e565b6001600160a01b0316146125e45760405162461bcd60e51b8152600401611288906152f6565b600b805460ff60a01b191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906124bf903390614be6565b6000601f54601d541115612637575060006113b5565b6113b260016114b6601d54601f5461399190919063ffffffff16565b603f5462010000900460ff1681565b61266a613424565b6001600160a01b031661267b61273e565b6001600160a01b0316146126a15760405162461bcd60e51b8152600401611288906152f6565b60405133904780156108fc02916000818181858888f19350505050611ef157600080fd5b6126d0610f80613424565b6126ec5760405162461bcd60e51b8152600401611288906153b6565b601255565b60125481565b612702610f80613424565b61271e5760405162461bcd60e51b8152600401611288906153b6565b603f80549115156101000261ff0019909216919091179055565b603e5481565b600b546001600160a01b031690565b60006113b261231e565b6000603754603554111561276d575060006113b5565b6113b260016114b660355460375461399190919063ffffffff16565b612794610f80613424565b6127b05760405162461bcd60e51b8152600401611288906153b6565b611c588282613428565b60606001805461140190615738565b60006113b260365460355461399190919063ffffffff16565b6127ed610f80613424565b6128095760405162461bcd60e51b8152600401611288906153b6565b60005b8151811015611c585760016018600084848151811061283b57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806128778161576d565b91505061280c565b60006113b260245460235461399190919063ffffffff16565b60006113b260275460265461399190919063ffffffff16565b6002600a5414156128d45760405162461bcd60e51b8152600401611288906155c9565b6002600a55600b54600160a01b900460ff16156129035760405162461bcd60e51b815260040161128890615083565b603b5460ff16156129bd57612919611073613424565b6129355760405162461bcd60e51b815260040161128890615600565b603e5461296882603d6000612948613424565b6001600160a01b03168152602081019190915260400160002054906139d3565b11156129865760405162461bcd60e51b815260040161128890614fae565b61299681603d6000612948613424565b603d60006129a2613424565b6001600160a01b031681526020810191909152604001600020555b600d546129ca9082613e0b565b3410156129e95760405162461bcd60e51b81526004016112889061562a565b6129fa6129f4613424565b82613428565b506001600a55565b612a0d610f80613424565b612a295760405162461bcd60e51b8152600401611288906153b6565b601155565b612a36613424565b6001600160a01b0316826001600160a01b03161415612a675760405162461bcd60e51b815260040161128890614f1f565b8060056000612a74613424565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612ab8613424565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612af09190614c6f565b60405180910390a35050565b603f5462010000900460ff16612b245760405162461bcd60e51b815260040161128890614ce7565b600080612b32610a10613424565b90925090506000805b8251811015612bc857600c838281518110612b6657634e487b7160e01b600052603260045260246000fd5b6020026020010151148015612ba85750612ba6848281518110612b9957634e487b7160e01b600052603260045260246000fd5b6020026020010151612f9e565b155b15612bb65760019150612bc8565b80612bc08161576d565b915050612b3b565b5080612be65760405162461bcd60e51b81526004016112889061559a565b60005b8251811015612c9757600c838281518110612c1457634e487b7160e01b600052603260045260246000fd5b6020026020010151148015612c495750612c47848281518110612b9957634e487b7160e01b600052603260045260246000fd5b155b15612c8557612c80848281518110612c7157634e487b7160e01b600052603260045260246000fd5b60200260200101516001613e50565b612c97565b80612c8f8161576d565b915050612be9565b50611367612ca3613424565b60016137e9565b612cb5610f80613424565b612cd15760405162461bcd60e51b8152600401611288906153b6565b611c588282613681565b612ce6610f80613424565b612d025760405162461bcd60e51b8152600401611288906153b6565b611c588282613e70565b60006028546026541115612d22575060006113b5565b6113b260016114b660265460285461399190919063ffffffff16565b612d49610f80613424565b612d655760405162461bcd60e51b8152600401611288906153b6565b601055565b612d7b612d75613424565b83613a8d565b612d975760405162461bcd60e51b8152600401611288906154fd565b6118d384848484613e82565b6000611391600c83613eb5565b6000612dba613424565b9050612dc581612fc5565b612de15760405162461bcd60e51b815260040161128890615463565b612dec816001613efd565b611bb8816001613861565b612e02610f80613424565b612e1e5760405162461bcd60e51b8152600401611288906153b6565b611c588282613771565b612e33610f80613424565b612e4f5760405162461bcd60e51b8152600401611288906153b6565b611c5882826134a1565b600080600080600080600080612e6e89611a04565b91995097509550612e7e89612ff3565b945060009350612e8d89613140565b9250612e9889612fc5565b9150612ea3896115e2565b9050919395975091939597565b60115481565b60105481565b60009081526015602052604090205460ff1690565b6001600160a01b03166000908152603c602052604090205460ff1690565b6060612efa82613a02565b612f165760405162461bcd60e51b815260040161128890615414565b6000612f20613d68565b90506000815111612f405760405180602001604052806000815250612f6b565b80612f4a84613f28565b604051602001612f5b929190614ba7565b6040516020818303038152906040525b9392505050565b612f7d610f80613424565b612f995760405162461bcd60e51b8152600401611288906153b6565b603e55565b60009081526014602052604090205460ff1690565b603d6020526000908152604090205481565b6000612fd0826123d7565b8015612fe25750612fe0826115c4565b155b801561161257506000611610612757565b603f54600090610100900460ff1661300d57506000611394565b613015611960565b61302157506000611394565b60008061302d84611cb9565b90925090506000805b82518110156130bb57600b83828151811061306157634e487b7160e01b600052603260045260246000fd5b602002602001015114801561309657506130948482815181106117a257634e487b7160e01b600052603260045260246000fd5b155b156130a9576130a68260016139d3565b91505b806130b38161576d565b915050613036565b50600381106130d05760019350505050611394565b506000949350505050565b6001600160a01b031660009081526017602052604090205460ff1690565b60006113b260335460325461399190919063ffffffff16565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b603f5460009062010000900460ff1661315b57506000611394565b6131636133a6565b61316f57506000611394565b60008061317b84611cb9565b9150915060005b81518110156130d057600c8282815181106131ad57634e487b7160e01b600052603260045260246000fd5b60200260200101511480156131e257506131e0838281518110612b9957634e487b7160e01b600052603260045260246000fd5b155b156131f35760019350505050611394565b806131fd8161576d565b915050613182565b613210610f80613424565b61322c5760405162461bcd60e51b8152600401611288906153b6565b60005b8151811015611c58576001603c600084848151811061325e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061329a8161576d565b91505061322f565b603f54610100900460ff1681565b6132b8613424565b6001600160a01b03166132c961273e565b6001600160a01b0316146132ef5760405162461bcd60e51b8152600401611288906152f6565b6001600160a01b0381166133155760405162461bcd60e51b815260040161128890614dde565b611bb881613d77565b600d5481565b600061332e613424565b9050613339816115e2565b6133555760405162461bcd60e51b815260040161128890614f83565b613360816001614043565b611bb88160016138d9565b613376610f80613424565b6133925760405162461bcd60e51b8152600401611288906153b6565b61339c838261406e565b6113678183613e70565b600060345460325411156133bc575060006113b5565b6113b260016114b660325460345461399190919063ffffffff16565b6133e28282613eb5565b156133ff5760405162461bcd60e51b815260040161128890614d0a565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3390565b601c546134369060016139d3565b601a5461344390836139d3565b11156134615760405162461bcd60e51b815260040161128890614e5b565b60005b81811015611367576000613476614088565b9050613482848261406e565b61348e8160095b613e70565b50806134998161576d565b915050613464565b601f546134af9060016139d3565b601d546134bc90836139d3565b11156134da5760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006134ef61409c565b90506134fb848261406e565b61350681600a613489565b50806135118161576d565b9150506134dd565b6022546135279060016139d3565b60205461353490836139d3565b11156135525760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006135676140b0565b9050613573848261406e565b61357e816001613489565b50806135898161576d565b915050613555565b60255461359f9060016139d3565b6023546135ac90836139d3565b11156135ca5760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006135df6140c4565b90506135eb848261406e565b6135f6816002613489565b50806136018161576d565b9150506135cd565b6028546136179060016139d3565b60265461362490836139d3565b11156136425760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006136576140d8565b9050613663848261406e565b61366e816003613489565b50806136798161576d565b915050613645565b602b5461368f9060016139d3565b60295461369c90836139d3565b11156136ba5760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006136cf6140ec565b90506136db848261406e565b6136e681600b613489565b50806136f18161576d565b9150506136bd565b602e546137079060016139d3565b602c5461371490836139d3565b11156137325760405162461bcd60e51b815260040161128890614e5b565b60005b81811015611367576000613747614100565b9050613753848261406e565b61375e816004613489565b50806137698161576d565b915050613735565b60315461377f9060016139d3565b602f5461378c90836139d3565b11156137aa5760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006137bf614114565b90506137cb848261406e565b6137d681600c613489565b50806137e18161576d565b9150506137ad565b6034546137f79060016139d3565b60325461380490836139d3565b11156138225760405162461bcd60e51b815260040161128890614e5b565b60005b81811015611367576000613837614128565b9050613843848261406e565b61384e816006613489565b50806138598161576d565b915050613825565b60375461386f9060016139d3565b60355461387c90836139d3565b111561389a5760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006138af61413c565b90506138bb848261406e565b6138c6816007613489565b50806138d18161576d565b91505061389d565b603a546138e79060016139d3565b6038546138f490836139d3565b11156139125760405162461bcd60e51b815260040161128890614e5b565b60005b81811015611367576000613927614150565b9050613933848261406e565b61393e816008613489565b50806139498161576d565b915050613915565b60006001600160e01b031982166380ac58cd60e01b148061398257506001600160e01b03198216635b5e139f60e01b145b80611391575061139182614164565b6000612f6b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061417d565b6000806139e083856156aa565b905083811015612f6b5760405162461bcd60e51b815260040161128890614e80565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613a54826123a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000613a9882613a02565b613ab45760405162461bcd60e51b815260040161128890614fe5565b6000613abf836123a2565b9050806001600160a01b0316846001600160a01b03161480613afa5750836001600160a01b0316613aef846114bc565b6001600160a01b0316145b80613b0a5750613b0a8185613112565b949350505050565b826001600160a01b0316613b25826123a2565b6001600160a01b031614613b4b5760405162461bcd60e51b81526004016112889061536d565b6001600160a01b038216613b715760405162461bcd60e51b815260040161128890614edb565b613b7c8383836141b7565b613b87600082613a1f565b6001600160a01b0383166000908152600360205260408120805460019290613bb09084906156f5565b90915550506001600160a01b0382166000908152600360205260408120805460019290613bde9084906156aa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600091825260156020526040909120805460ff1916911515919091179055565b6000613c6a826123a2565b9050613c78816000846141b7565b613c83600083613a1f565b6001600160a01b0381166000908152600360205260408120805460019290613cac9084906156f5565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b613d11600c8261423b565b6040516001600160a01b038216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b600091825260136020526040909120805460ff1916911515919091179055565b6060600e805461140190615738565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613dd4600c826133d8565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b600082613e1a5750600061195a565b6000613e2683856156d6565b905082613e3385836156c2565b14612f6b5760405162461bcd60e51b815260040161128890615269565b600091825260146020526040909120805460ff1916911515919091179055565b6000918252600f602052604090912055565b613e8d848484613b12565b613e9984848484614283565b6118d35760405162461bcd60e51b815260040161128890614d8c565b60006001600160a01b038216613edd5760405162461bcd60e51b81526004016112889061532b565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b606081613f4d57506040805180820190915260018152600360fc1b6020820152611394565b8160005b8115613f775780613f618161576d565b9150613f709050600a836156c2565b9150613f51565b60008167ffffffffffffffff811115613fa057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613fca576020820181803683370190505b5090505b8415613b0a57613fdf6001836156f5565b9150613fec600a86615788565b613ff79060306156aa565b60f81b81838151811061401a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061403c600a866156c2565b9450613fce565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b611c5882826040518060200160405280600081525061439e565b601a546140968160016139d3565b601a5590565b601d546140aa8160016139d3565b601d5590565b6020546140be8160016139d3565b60205590565b6023546140d28160016139d3565b60235590565b6026546140e68160016139d3565b60265590565b6029546140fa8160016139d3565b60295590565b602c5461410e8160016139d3565b602c5590565b602f546141228160016139d3565b602f5590565b6032546141368160016139d3565b60325590565b60355461414a8160016139d3565b60355590565b60385461415e8160016139d3565b60385590565b6001600160e01b031981166301ffc9a760e01b14919050565b600081848411156141a15760405162461bcd60e51b81526004016112889190614cd4565b5060006141ae84866156f5565b95945050505050565b6141c2838383611367565b6001600160a01b0383166141de576141d9816143d1565b614201565b816001600160a01b0316836001600160a01b031614614201576142018382614415565b6001600160a01b038216614218576112a4816144b2565b826001600160a01b0316826001600160a01b03161461136757611367828261458b565b6142458282613eb5565b6142615760405162461bcd60e51b8152600401611288906151f3565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000614297846001600160a01b03166145cf565b1561439357836001600160a01b031663150b7a026142b3613424565b8786866040518563ffffffff1660e01b81526004016142d59493929190614bfa565b602060405180830381600087803b1580156142ef57600080fd5b505af192505050801561431f575060408051601f3d908101601f1916820190925261431c91810190614aa6565b60015b614379573d80801561434d576040519150601f19603f3d011682016040523d82523d6000602084013e614352565b606091505b5080516143715760405162461bcd60e51b815260040161128890614d8c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613b0a565b506001949350505050565b6143a883836145d5565b6143b56000848484614283565b6113675760405162461bcd60e51b815260040161128890614d8c565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001614422846124d3565b61442c91906156f5565b60008381526007602052604090205490915080821461447f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906144c4906001906156f5565b600083815260096020526040812054600880549394509092849081106144fa57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061452957634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061456f57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000614596836124d3565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b6001600160a01b0382166145fb5760405162461bcd60e51b815260040161128890615234565b61460481613a02565b156146215760405162461bcd60e51b815260040161128890614e24565b61462d600083836141b7565b6001600160a01b03821660009081526003602052604081208054600192906146569084906156aa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546146c090615738565b90600052602060002090601f0160209004810192826146e25760008555614728565b82601f106146fb57805160ff1916838001178555614728565b82800160010185558215614728579182015b8281111561472857825182559160200191906001019061470d565b50614734929150614738565b5090565b5b808211156147345760008155600101614739565b600067ffffffffffffffff831115614767576147676157c8565b61477a601f8401601f191660200161565c565b905082815283838301111561478e57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461139457600080fd5b8035801515811461139457600080fd5b6000602082840312156147dd578081fd5b612f6b826147a5565b600080604083850312156147f8578081fd5b614801836147a5565b915061480f602084016147a5565b90509250929050565b60008060006060848603121561482c578081fd5b614835846147a5565b9250614843602085016147a5565b9150604084013590509250925092565b60008060008060808587031215614868578081fd5b614871856147a5565b935061487f602086016147a5565b925060408501359150606085013567ffffffffffffffff8111156148a1578182fd5b8501601f810187136148b1578182fd5b6148c08782356020840161474d565b91505092959194509250565b600080604083850312156148de578182fd5b6148e7836147a5565b915061480f602084016147bc565b60008060408385031215614907578182fd5b614910836147a5565b946020939093013593505050565b600080600060608486031215614932578283fd5b61493b846147a5565b95602085013595506040909401359392505050565b60006020808385031215614962578182fd5b823567ffffffffffffffff811115614978578283fd5b8301601f81018513614988578283fd5b803561499b61499682615686565b61565c565b81815283810190838501858402850186018910156149b7578687fd5b8694505b838510156149e0576149cc816147a5565b8352600194909401939185019185016149bb565b50979650505050505050565b600060208083850312156149fe578182fd5b823567ffffffffffffffff811115614a14578283fd5b8301601f81018513614a24578283fd5b8035614a3261499682615686565b8181528381019083850185840285018601891015614a4e578687fd5b8694505b838510156149e0578035835260019490940193918501918501614a52565b600060208284031215614a81578081fd5b612f6b826147bc565b600060208284031215614a9b578081fd5b8135612f6b816157de565b600060208284031215614ab7578081fd5b8151612f6b816157de565b600060208284031215614ad3578081fd5b813567ffffffffffffffff811115614ae9578182fd5b8201601f81018413614af9578182fd5b613b0a8482356020840161474d565b600060208284031215614b19578081fd5b5035919050565b60008060408385031215614b32578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015614b7057815187529582019590820190600101614b54565b509495945050505050565b60008151808452614b9381602086016020860161570c565b601f01601f19169290920160200192915050565b60008351614bb981846020880161570c565b835190830190614bcd81836020880161570c565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614c2d90830184614b7b565b9695505050505050565b600060208252612f6b6020830184614b41565b600060408252614c5d6040830185614b41565b82810360208401526141ae8185614b41565b901515815260200190565b921515835290151560208301521515604082015260600190565b971515885295151560208801529315156040870152911515606086015215156080850152151560a0840152151560c0830152151560e08201526101000190565b600060208252612f6b6020830184614b7b565b6020808252600990820152681b9bdd081cdd185c9d60ba1b604082015260600190565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252600b908201526a1b9d5b481b1a5b5a5d195960aa1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600a90820152693a3cb8329032b93937b960b11b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601390820152723737903930b4b73137bb903632b33a37bb32b960691b604082015260600190565b60208082526011908201527063616e277420636c61696d20737061726b60781b604082015260600190565b6020808252601a908201527f77686974656c697374206d696e74206e756d206c696d69746564000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600f908201526e31b0b713ba1031b630b4b69029a3a960891b604082015260600190565b6020808252600f908201526e63616e20636c61696d206562696c6560881b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526010908201526f37379033b7b632103632b33a37bb32b960811b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526012908201527137379039b4b63b32b9103632b33a37bb32b960711b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526021908201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6040820152606560f81b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b602080825260409082018190527f57686974656c69737441646d696e526f6c653a2063616c6c657220646f657320908201527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c65606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526014908201527363616e277420636c61696d2061697264726f707360601b604082015260600190565b60208082526011908201527021286f776e65727c617070726f7665642960781b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526015908201527431b0b713ba1031b630b4b69019a21036b7ba3432b960591b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526010908201526f1b9bdd081a5b881dda1a5d195b1a5cdd60821b604082015260600190565b6020808252600f908201526e1c185e5b595b9d081a5b9d985b1a59608a1b604082015260600190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561567e5761567e6157c8565b604052919050565b600067ffffffffffffffff8211156156a0576156a06157c8565b5060209081020190565b600082198211156156bd576156bd61579c565b500190565b6000826156d1576156d16157b2565b500490565b60008160001904831182151516156156f0576156f061579c565b500290565b6000828210156157075761570761579c565b500390565b60005b8381101561572757818101518382015260200161570f565b838111156118d35750506000910152565b60028104600182168061574c57607f821691505b60208210811415611edb57634e487b7160e01b600052602260045260246000fd5b60006000198214156157815761578161579c565b5060010190565b600082615797576157976157b2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611bb857600080fdfea2646970667358221220c6662bff5039695f42d42241af537893464966062f2f862dc49e69369643f01e64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106106665760003560e01c80637362d9c811610344578063b88d4fde116101b6578063d04c93ea11610102578063edac985b116100a0578063f51f96dd1161007a578063f51f96dd14611202578063f84fe63a14611217578063ffa9fc641461122c578063ffbcba961461124c57610666565b8063edac985b146111ad578063f0486fb2146111cd578063f2fde38b146111e257610666565b8063e0f2f42f116100dc578063e0f2f42f14611138578063e4cd58bb14611158578063e985e9c51461116d578063e9e2ba2d1461118d57610666565b8063d04c93ea146110d8578063d7d88364146110f8578063da2eb6c61461111857610666565b8063c048d1651161016f578063c683630d11610149578063c683630d14611058578063c87b56dd14611078578063cb29136114611098578063cbc42e73146110b857610666565b8063c048d1651461100e578063c35958cc14611023578063c5eb88e71461103857610666565b8063b88d4fde14610f45578063bb5f747b14610f65578063bbf5ed7014610f85578063bc95881014610f9a578063bd8f7a0a14610fba578063bf3506c114610fda57610666565b806390d1c18511610290578063a0b2a5df1161022e578063aec3e06b11610208578063aec3e06b14610ed0578063b5b924d914610ef0578063b5ebe1e414610f10578063b75da4a914610f2557610666565b8063a0b2a5df14610e7b578063a22cb46514610e9b578063aa49186014610ebb57610666565b80639add94341161026a5780639add943414610e1e5780639c08f83614610e3e5780639f2ddb8314610e53578063a0712d6814610e6857610666565b806390d1c18514610dd457806395d89b4114610df457806399b519b814610e0957610666565b8063886c74bb116102fd5780638b4979a7116102d75780638b4979a714610d805780638da5cb5b14610d955780638e78f9c114610daa57806390360f7214610dbf57610666565b8063886c74bb14610d2b578063898d632a14610d4b5780638b2822b014610d6057610666565b80637362d9c814610c9757806374afd0bc14610cb75780637805862f14610cd75780637d15b76614610cec57806384873ac114610d01578063853828b614610d1657610666565b80634036ab78116104dd5780635b749425116104295780636352211e116103c75780636985a022116103a15780636985a02214610c385780636c0360eb14610c4d57806370a0823114610c62578063715018a614610c8257610666565b80636352211e14610bd85780636567e20614610bf85780636897e97414610c1857610666565b80635cef3e2f116104035780635cef3e2f14610b6e5780635dc0f2e814610b835780635f193c2b14610b98578063603d1f3714610bb857610666565b80635b74942514610b195780635c91db3814610b395780635c975abb14610b5957610666565b80634f558e79116104965780635233b197116104705780635233b19714610aba57806354cb792a14610acf57806355f804b314610ae4578063562f6fe714610b0457610666565b80634f558e7914610a655780634f6ccce714610a8557806350d3c82014610aa557610666565b80634036ab781461099557806342842e0e146109b557806342966c68146109d5578063450efe21146109f55780634888930714610a235780634c5a628c14610a5057610666565b80631919fed7116105b75780633004573b116105555780633331d2701161052f5780633331d270146109115780633398393d14610926578063379607f514610955578063379d86021461097557610666565b80633004573b146108c757806331ad14ea146108dc57806331f19a1c146108fc57610666565b80632a231ccf116105915780632a231ccf146108685780632b5c96e01461087d5780632f745c59146108925780632f83876a146108b257610666565b80631919fed7146108135780631a5586841461083357806323b872dd1461084857610666565b8063081812fc116106245780631168a6e5116105fe5780631168a6e51461079e578063145867dd146107be57806318160ddd146107de578063189e398e146107f357610666565b8063081812fc1461073c578063095ea7b3146107695780630b3b269e1461078957610666565b80624a84cb1461066b57806301ffc9a71461068d57806302d4296e146106c3578063052d9e7e146106e557806306fdde03146107055780630714729514610727575b600080fd5b34801561067757600080fd5b5061068b61068636600461491e565b611261565b005b34801561069957600080fd5b506106ad6106a8366004614a8a565b61136c565b6040516106ba9190614c6f565b60405180910390f35b3480156106cf57600080fd5b506106d8611399565b6040516106ba9190615653565b3480156106f157600080fd5b5061068b610700366004614a70565b6113b8565b34801561071157600080fd5b5061071a6113f2565b6040516106ba9190614cd4565b34801561073357600080fd5b506106d8611484565b34801561074857600080fd5b5061075c610757366004614b08565b6114bc565b6040516106ba9190614be6565b34801561077557600080fd5b5061068b6107843660046148f5565b6114ff565b34801561079557600080fd5b506106d8611592565b3480156107aa57600080fd5b506106ad6107b93660046147cc565b6115c4565b3480156107ca57600080fd5b506106ad6107d93660046147cc565b6115e2565b3480156107ea57600080fd5b506106d8611627565b3480156107ff57600080fd5b5061068b61080e366004614a70565b61162d565b34801561081f57600080fd5b5061068b61082e366004614b08565b611670565b34801561083f57600080fd5b506106d861169c565b34801561085457600080fd5b5061068b610863366004614818565b6116ce565b34801561087457600080fd5b5061068b611706565b34801561088957600080fd5b506106d86118d9565b34801561089e57600080fd5b506106d86108ad3660046148f5565b61190b565b3480156108be57600080fd5b506106d8611960565b3480156108d357600080fd5b506106d8611992565b3480156108e857600080fd5b506106ad6108f73660046147cc565b6119ab565b34801561090857600080fd5b506106ad6119c9565b34801561091d57600080fd5b506106d86119d2565b34801561093257600080fd5b506109466109413660046147cc565b611a04565b6040516106ba93929190614c7a565b34801561096157600080fd5b5061068b610970366004614b08565b611b47565b34801561098157600080fd5b5061068b610990366004614950565b611bbb565b3480156109a157600080fd5b506106d86109b0366004614b08565b611c5c565b3480156109c157600080fd5b5061068b6109d0366004614818565b611c6e565b3480156109e157600080fd5b5061068b6109f0366004614b08565b611c89565b348015610a0157600080fd5b50610a15610a103660046147cc565b611cb9565b6040516106ba929190614c4a565b348015610a2f57600080fd5b50610a43610a3e3660046149ec565b611e0c565b6040516106ba9190614c37565b348015610a5c57600080fd5b5061068b611ee1565b348015610a7157600080fd5b506106ad610a80366004614b08565b611ef3565b348015610a9157600080fd5b506106d8610aa0366004614b08565b611efe565b348015610ab157600080fd5b506106d8611f59565b348015610ac657600080fd5b506106d8611f72565b348015610adb57600080fd5b506106d8611f8b565b348015610af057600080fd5b5061068b610aff366004614ac2565b611fa4565b348015610b1057600080fd5b506106d8611fde565b348015610b2557600080fd5b5061068b610b343660046148f5565b611ff7565b348015610b4557600080fd5b5061068b610b54366004614b08565b612028565b348015610b6557600080fd5b506106ad6122dc565b348015610b7a57600080fd5b506106d86122ec565b348015610b8f57600080fd5b506106d861231e565b348015610ba457600080fd5b5061068b610bb3366004614a70565b612337565b348015610bc457600080fd5b5061068b610bd33660046148f5565b612371565b348015610be457600080fd5b5061075c610bf3366004614b08565b6123a2565b348015610c0457600080fd5b506106ad610c133660046147cc565b6123d7565b348015610c2457600080fd5b5061068b610c333660046147cc565b6123f5565b348015610c4457600080fd5b5061068b61243d565b348015610c5957600080fd5b5061071a6124c9565b348015610c6e57600080fd5b506106d8610c7d3660046147cc565b6124d3565b348015610c8e57600080fd5b5061068b612517565b348015610ca357600080fd5b5061068b610cb23660046147cc565b612560565b348015610cc357600080fd5b506106ad610cd2366004614b08565b612590565b348015610ce357600080fd5b5061068b6125a5565b348015610cf857600080fd5b506106d8612621565b348015610d0d57600080fd5b506106ad612653565b348015610d2257600080fd5b5061068b612662565b348015610d3757600080fd5b5061068b610d46366004614b08565b6126c5565b348015610d5757600080fd5b506106d86126f1565b348015610d6c57600080fd5b5061068b610d7b366004614a70565b6126f7565b348015610d8c57600080fd5b506106d8612738565b348015610da157600080fd5b5061075c61273e565b348015610db657600080fd5b506106d861274d565b348015610dcb57600080fd5b506106d8612757565b348015610de057600080fd5b5061068b610def3660046148f5565b612789565b348015610e0057600080fd5b5061071a6127ba565b348015610e1557600080fd5b506106d86127c9565b348015610e2a57600080fd5b5061068b610e39366004614950565b6127e2565b348015610e4a57600080fd5b506106d861287f565b348015610e5f57600080fd5b506106d8612898565b61068b610e76366004614b08565b6128b1565b348015610e8757600080fd5b5061068b610e96366004614b08565b612a02565b348015610ea757600080fd5b5061068b610eb63660046148cc565b612a2e565b348015610ec757600080fd5b5061068b612afc565b348015610edc57600080fd5b5061068b610eeb3660046148f5565b612caa565b348015610efc57600080fd5b5061068b610f0b366004614b20565b612cdb565b348015610f1c57600080fd5b506106d8612d0c565b348015610f3157600080fd5b5061068b610f40366004614b08565b612d3e565b348015610f5157600080fd5b5061068b610f60366004614853565b612d6a565b348015610f7157600080fd5b506106ad610f803660046147cc565b612da3565b348015610f9157600080fd5b5061068b612db0565b348015610fa657600080fd5b5061068b610fb53660046148f5565b612df7565b348015610fc657600080fd5b5061068b610fd53660046148f5565b612e28565b348015610fe657600080fd5b50610ffa610ff53660046147cc565b612e59565b6040516106ba989796959493929190614c94565b34801561101a57600080fd5b506106d8612eb0565b34801561102f57600080fd5b506106d8612eb6565b34801561104457600080fd5b506106ad611053366004614b08565b612ebc565b34801561106457600080fd5b506106ad6110733660046147cc565b612ed1565b34801561108457600080fd5b5061071a611093366004614b08565b612eef565b3480156110a457600080fd5b5061068b6110b3366004614b08565b612f72565b3480156110c457600080fd5b506106ad6110d3366004614b08565b612f9e565b3480156110e457600080fd5b506106d86110f33660046147cc565b612fb3565b34801561110457600080fd5b506106ad6111133660046147cc565b612fc5565b34801561112457600080fd5b506106ad6111333660046147cc565b612ff3565b34801561114457600080fd5b506106ad6111533660046147cc565b6130db565b34801561116457600080fd5b506106d86130f9565b34801561117957600080fd5b506106ad6111883660046147e6565b613112565b34801561119957600080fd5b506106ad6111a83660046147cc565b613140565b3480156111b957600080fd5b5061068b6111c8366004614950565b613205565b3480156111d957600080fd5b506106ad6132a2565b3480156111ee57600080fd5b5061068b6111fd3660046147cc565b6132b0565b34801561120e57600080fd5b506106d861331e565b34801561122357600080fd5b5061068b613324565b34801561123857600080fd5b5061068b61124736600461491e565b61336b565b34801561125857600080fd5b506106d86133a6565b61126c610f80613424565b6112915760405162461bcd60e51b8152600401611288906153b6565b60405180910390fd5b60098214156112a9576112a48382613428565b611367565b600a8214156112bc576112a483826134a1565b60018214156112cf576112a48382613519565b60028214156112e2576112a48382613591565b60038214156112f5576112a48382613609565b600b821415611308576112a48382613681565b600482141561131b576112a483826136f9565b600c82141561132e576112a48382613771565b6006821415611341576112a483826137e9565b6007821415611354576112a48382613861565b60088214156113675761136783826138d9565b505050565b60006001600160e01b0319821663780e9d6360e01b1480611391575061139182613951565b90505b919050565b60006113b260215460205461399190919063ffffffff16565b90505b90565b6113c3610f80613424565b6113df5760405162461bcd60e51b8152600401611288906153b6565b603b805460ff1916911515919091179055565b60606000805461140190615738565b80601f016020809104026020016040519081016040528092919081815260200182805461142d90615738565b801561147a5780601f1061144f5761010080835404028352916020019161147a565b820191906000526020600020905b81548152906001019060200180831161145d57829003601f168201915b5050505050905090565b6000603154602f54111561149a575060006113b5565b6113b260016114b6602f5460315461399190919063ffffffff16565b906139d3565b60006114c782613a02565b6114e35760405162461bcd60e51b8152600401611288906152aa565b506000908152600460205260409020546001600160a01b031690565b600061150a826123a2565b9050806001600160a01b0316836001600160a01b0316141561153e5760405162461bcd60e51b8152600401611288906154bc565b806001600160a01b0316611550613424565b6001600160a01b0316148061156c575061156c81611188613424565b6115885760405162461bcd60e51b8152600401611288906150d7565b6113678383613a1f565b600060255460235411156115a8575060006113b5565b6113b260016114b660235460255461399190919063ffffffff16565b6001600160a01b031660009081526016602052604090205460ff1690565b60006115ed826119ab565b80156115ff57506115fd826130db565b155b80156116125750600061161061169c565b115b1561161f57506001611394565b506000919050565b60085490565b611638610f80613424565b6116545760405162461bcd60e51b8152600401611288906153b6565b603f8054911515620100000262ff000019909216919091179055565b61167b610f80613424565b6116975760405162461bcd60e51b8152600401611288906153b6565b600d55565b6000603a5460385411156116b2575060006113b5565b6113b260016114b6603854603a5461399190919063ffffffff16565b6116df6116d9613424565b82613a8d565b6116fb5760405162461bcd60e51b8152600401611288906154fd565b611367838383613b12565b603f54610100900460ff1661172d5760405162461bcd60e51b815260040161128890614ce7565b60008061173b610a10613424565b90925090506000805b82518110156117d657600b83828151811061176f57634e487b7160e01b600052603260045260246000fd5b60200260200101511480156117b157506117af8482815181106117a257634e487b7160e01b600052603260045260246000fd5b6020026020010151612ebc565b155b156117c4576117c18260016139d3565b91505b806117ce8161576d565b915050611744565b5060038110156117f85760405162461bcd60e51b81526004016112889061505a565b600360005b83518110801561180d5750600082115b156118c057600b84828151811061183457634e487b7160e01b600052603260045260246000fd5b602002602001015114801561186957506118678582815181106117a257634e487b7160e01b600052603260045260246000fd5b155b156118ae576118a085828151811061189157634e487b7160e01b600052603260045260246000fd5b60200260200101516001613c3f565b6118ab826001613991565b91505b806118b88161576d565b9150506117fd565b506118d36118cc613424565b60016136f9565b50505050565b600060225460205411156118ef575060006113b5565b6113b260016114b660205460225461399190919063ffffffff16565b6000611916836124d3565b82106119345760405162461bcd60e51b815260040161128890614d41565b506001600160a01b03821660009081526006602090815260408083208484529091529020545b92915050565b6000602e54602c541115611976575060006113b5565b6113b260016114b6602c54602e5461399190919063ffffffff16565b60006113b2602a5460295461399190919063ffffffff16565b6001600160a01b031660009081526019602052604090205460ff1690565b603f5460ff1681565b6000602b5460295411156119e8575060006113b5565b6113b260016114b6602954602b5461399190919063ffffffff16565b603f546000908190819060ff16611a2357506000915081905080611b40565b600080611a2f86611cb9565b90925090506000805b8251811015611aca576009838281518110611a6357634e487b7160e01b600052603260045260246000fd5b6020026020010151148015611aa55750611aa3848281518110611a9657634e487b7160e01b600052603260045260246000fd5b6020026020010151612590565b155b15611ab857611ab58260016139d3565b91505b80611ac28161576d565b915050611a38565b506012548110158015611ae457506000611ae2612d0c565b115b15611af25760019350611b3c565b6011548110158015611b0b57506000611b09611592565b115b15611b195760019450611b3c565b6010548110158015611b3257506000611b306118d9565b115b15611b3c57600195505b5050505b9193909250565b6001811480611b565750600281145b80611b615750600381145b15611b7457611b6f81612028565b611bb8565b6004811415611b8557611b6f611706565b6006811415611b9657611b6f612afc565b6007811415611ba757611b6f612db0565b6008811415611bb857611bb8613324565b50565b611bc6610f80613424565b611be25760405162461bcd60e51b8152600401611288906153b6565b60005b8151811015611c5857600160196000848481518110611c1457634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611c508161576d565b915050611be5565b5050565b6000908152600f602052604090205490565b61136783838360405180602001604052806000815250612d6a565b611c946116d9613424565b611cb05760405162461bcd60e51b815260040161128890615491565b611bb881613c5f565b6060806000611cc7846124d3565b905060008167ffffffffffffffff811115611cf257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611d1b578160200160208202803683370190505b50905060008267ffffffffffffffff811115611d4757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611d70578160200160208202803683370190505b50905060005b83811015611e00576000611d8a888361190b565b905080848381518110611dad57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050611dc281611c5c565b838381518110611de257634e487b7160e01b600052603260045260246000fd5b60209081029190910101525080611df88161576d565b915050611d76565b50909350915050915091565b6060815167ffffffffffffffff811115611e3657634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611e5f578160200160208202803683370190505b50905060005b8251811015611edb57611e9e838281518110611e9157634e487b7160e01b600052603260045260246000fd5b6020026020010151611c5c565b828281518110611ebe57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611ed38161576d565b915050611e65565b50919050565b611ef1611eec613424565b613d06565b565b600061139182613a02565b6000611f08611627565b8210611f265760405162461bcd60e51b81526004016112889061554e565b60088281548110611f4757634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b60006113b2602d54602c5461399190919063ffffffff16565b60006113b2603054602f5461399190919063ffffffff16565b60006113b260395460385461399190919063ffffffff16565b611faf610f80613424565b611fcb5760405162461bcd60e51b8152600401611288906153b6565b8051611c5890600e9060208401906146b4565b60006113b2601e54601d5461399190919063ffffffff16565b612002610f80613424565b61201e5760405162461bcd60e51b8152600401611288906153b6565b611c588282613861565b603f5460ff1661204a5760405162461bcd60e51b815260040161128890614ce7565b6000612054613424565b905060008061206283611cb9565b90925090506000805b82518110156120f057600983828151811061209657634e487b7160e01b600052603260045260246000fd5b60200260200101511480156120cb57506120c9848281518110611a9657634e487b7160e01b600052603260045260246000fd5b155b156120de576120db8260016139d3565b91505b806120e88161576d565b91505061206b565b506000600386141561212c5750601254600061210a612d0c565b116121275760405162461bcd60e51b815260040161128890614f56565b6121ac565b600286141561216057506011546000612143611592565b116121275760405162461bcd60e51b8152600401611288906150ad565b6001861415612194575060105460006121776118d9565b116121275760405162461bcd60e51b815260040161128890615134565b60405162461bcd60e51b815260040161128890614eb7565b808210156121cc5760405162461bcd60e51b815260040161128890615031565b60005b8351811080156121df5750600082115b1561229257600984828151811061220657634e487b7160e01b600052603260045260246000fd5b602002602001015114801561223b5750612239858281518110611a9657634e487b7160e01b600052603260045260246000fd5b155b156122805761227285828151811061226357634e487b7160e01b600052603260045260246000fd5b60200260200101516001613d48565b61227d826001613991565b91505b8061228a8161576d565b9150506121cf565b5060038614156122ac576122a7856001613609565b6122d4565b60028614156122c0576122a7856001613591565b60018614156122d4576122d4856001613519565b505050505050565b600b54600160a01b900460ff1681565b6000601c54601a541115612302575060006113b5565b6113b260016114b6601a54601c5461399190919063ffffffff16565b60006113b2601b54601a5461399190919063ffffffff16565b612342610f80613424565b61235e5760405162461bcd60e51b8152600401611288906153b6565b603f805460ff1916911515919091179055565b61237c610f80613424565b6123985760405162461bcd60e51b8152600401611288906153b6565b611c5882826138d9565b6000818152600260205260408120546001600160a01b0316806113915760405162461bcd60e51b8152600401611288906151aa565b6001600160a01b031660009081526018602052604090205460ff1690565b6123fd613424565b6001600160a01b031661240e61273e565b6001600160a01b0316146124345760405162461bcd60e51b8152600401611288906152f6565b611bb881613d06565b612445613424565b6001600160a01b031661245661273e565b6001600160a01b03161461247c5760405162461bcd60e51b8152600401611288906152f6565b600b805460ff60a01b1916600160a01b1790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906124bf903390614be6565b60405180910390a1565b60606113b2613d68565b60006001600160a01b0382166124fb5760405162461bcd60e51b815260040161128890615160565b506001600160a01b031660009081526003602052604090205490565b61251f613424565b6001600160a01b031661253061273e565b6001600160a01b0316146125565760405162461bcd60e51b8152600401611288906152f6565b611ef16000613d77565b61256b610f80613424565b6125875760405162461bcd60e51b8152600401611288906153b6565b611bb881613dc9565b60009081526013602052604090205460ff1690565b6125ad613424565b6001600160a01b03166125be61273e565b6001600160a01b0316146125e45760405162461bcd60e51b8152600401611288906152f6565b600b805460ff60a01b191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906124bf903390614be6565b6000601f54601d541115612637575060006113b5565b6113b260016114b6601d54601f5461399190919063ffffffff16565b603f5462010000900460ff1681565b61266a613424565b6001600160a01b031661267b61273e565b6001600160a01b0316146126a15760405162461bcd60e51b8152600401611288906152f6565b60405133904780156108fc02916000818181858888f19350505050611ef157600080fd5b6126d0610f80613424565b6126ec5760405162461bcd60e51b8152600401611288906153b6565b601255565b60125481565b612702610f80613424565b61271e5760405162461bcd60e51b8152600401611288906153b6565b603f80549115156101000261ff0019909216919091179055565b603e5481565b600b546001600160a01b031690565b60006113b261231e565b6000603754603554111561276d575060006113b5565b6113b260016114b660355460375461399190919063ffffffff16565b612794610f80613424565b6127b05760405162461bcd60e51b8152600401611288906153b6565b611c588282613428565b60606001805461140190615738565b60006113b260365460355461399190919063ffffffff16565b6127ed610f80613424565b6128095760405162461bcd60e51b8152600401611288906153b6565b60005b8151811015611c585760016018600084848151811061283b57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806128778161576d565b91505061280c565b60006113b260245460235461399190919063ffffffff16565b60006113b260275460265461399190919063ffffffff16565b6002600a5414156128d45760405162461bcd60e51b8152600401611288906155c9565b6002600a55600b54600160a01b900460ff16156129035760405162461bcd60e51b815260040161128890615083565b603b5460ff16156129bd57612919611073613424565b6129355760405162461bcd60e51b815260040161128890615600565b603e5461296882603d6000612948613424565b6001600160a01b03168152602081019190915260400160002054906139d3565b11156129865760405162461bcd60e51b815260040161128890614fae565b61299681603d6000612948613424565b603d60006129a2613424565b6001600160a01b031681526020810191909152604001600020555b600d546129ca9082613e0b565b3410156129e95760405162461bcd60e51b81526004016112889061562a565b6129fa6129f4613424565b82613428565b506001600a55565b612a0d610f80613424565b612a295760405162461bcd60e51b8152600401611288906153b6565b601155565b612a36613424565b6001600160a01b0316826001600160a01b03161415612a675760405162461bcd60e51b815260040161128890614f1f565b8060056000612a74613424565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155612ab8613424565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612af09190614c6f565b60405180910390a35050565b603f5462010000900460ff16612b245760405162461bcd60e51b815260040161128890614ce7565b600080612b32610a10613424565b90925090506000805b8251811015612bc857600c838281518110612b6657634e487b7160e01b600052603260045260246000fd5b6020026020010151148015612ba85750612ba6848281518110612b9957634e487b7160e01b600052603260045260246000fd5b6020026020010151612f9e565b155b15612bb65760019150612bc8565b80612bc08161576d565b915050612b3b565b5080612be65760405162461bcd60e51b81526004016112889061559a565b60005b8251811015612c9757600c838281518110612c1457634e487b7160e01b600052603260045260246000fd5b6020026020010151148015612c495750612c47848281518110612b9957634e487b7160e01b600052603260045260246000fd5b155b15612c8557612c80848281518110612c7157634e487b7160e01b600052603260045260246000fd5b60200260200101516001613e50565b612c97565b80612c8f8161576d565b915050612be9565b50611367612ca3613424565b60016137e9565b612cb5610f80613424565b612cd15760405162461bcd60e51b8152600401611288906153b6565b611c588282613681565b612ce6610f80613424565b612d025760405162461bcd60e51b8152600401611288906153b6565b611c588282613e70565b60006028546026541115612d22575060006113b5565b6113b260016114b660265460285461399190919063ffffffff16565b612d49610f80613424565b612d655760405162461bcd60e51b8152600401611288906153b6565b601055565b612d7b612d75613424565b83613a8d565b612d975760405162461bcd60e51b8152600401611288906154fd565b6118d384848484613e82565b6000611391600c83613eb5565b6000612dba613424565b9050612dc581612fc5565b612de15760405162461bcd60e51b815260040161128890615463565b612dec816001613efd565b611bb8816001613861565b612e02610f80613424565b612e1e5760405162461bcd60e51b8152600401611288906153b6565b611c588282613771565b612e33610f80613424565b612e4f5760405162461bcd60e51b8152600401611288906153b6565b611c5882826134a1565b600080600080600080600080612e6e89611a04565b91995097509550612e7e89612ff3565b945060009350612e8d89613140565b9250612e9889612fc5565b9150612ea3896115e2565b9050919395975091939597565b60115481565b60105481565b60009081526015602052604090205460ff1690565b6001600160a01b03166000908152603c602052604090205460ff1690565b6060612efa82613a02565b612f165760405162461bcd60e51b815260040161128890615414565b6000612f20613d68565b90506000815111612f405760405180602001604052806000815250612f6b565b80612f4a84613f28565b604051602001612f5b929190614ba7565b6040516020818303038152906040525b9392505050565b612f7d610f80613424565b612f995760405162461bcd60e51b8152600401611288906153b6565b603e55565b60009081526014602052604090205460ff1690565b603d6020526000908152604090205481565b6000612fd0826123d7565b8015612fe25750612fe0826115c4565b155b801561161257506000611610612757565b603f54600090610100900460ff1661300d57506000611394565b613015611960565b61302157506000611394565b60008061302d84611cb9565b90925090506000805b82518110156130bb57600b83828151811061306157634e487b7160e01b600052603260045260246000fd5b602002602001015114801561309657506130948482815181106117a257634e487b7160e01b600052603260045260246000fd5b155b156130a9576130a68260016139d3565b91505b806130b38161576d565b915050613036565b50600381106130d05760019350505050611394565b506000949350505050565b6001600160a01b031660009081526017602052604090205460ff1690565b60006113b260335460325461399190919063ffffffff16565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b603f5460009062010000900460ff1661315b57506000611394565b6131636133a6565b61316f57506000611394565b60008061317b84611cb9565b9150915060005b81518110156130d057600c8282815181106131ad57634e487b7160e01b600052603260045260246000fd5b60200260200101511480156131e257506131e0838281518110612b9957634e487b7160e01b600052603260045260246000fd5b155b156131f35760019350505050611394565b806131fd8161576d565b915050613182565b613210610f80613424565b61322c5760405162461bcd60e51b8152600401611288906153b6565b60005b8151811015611c58576001603c600084848151811061325e57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061329a8161576d565b91505061322f565b603f54610100900460ff1681565b6132b8613424565b6001600160a01b03166132c961273e565b6001600160a01b0316146132ef5760405162461bcd60e51b8152600401611288906152f6565b6001600160a01b0381166133155760405162461bcd60e51b815260040161128890614dde565b611bb881613d77565b600d5481565b600061332e613424565b9050613339816115e2565b6133555760405162461bcd60e51b815260040161128890614f83565b613360816001614043565b611bb88160016138d9565b613376610f80613424565b6133925760405162461bcd60e51b8152600401611288906153b6565b61339c838261406e565b6113678183613e70565b600060345460325411156133bc575060006113b5565b6113b260016114b660325460345461399190919063ffffffff16565b6133e28282613eb5565b156133ff5760405162461bcd60e51b815260040161128890614d0a565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3390565b601c546134369060016139d3565b601a5461344390836139d3565b11156134615760405162461bcd60e51b815260040161128890614e5b565b60005b81811015611367576000613476614088565b9050613482848261406e565b61348e8160095b613e70565b50806134998161576d565b915050613464565b601f546134af9060016139d3565b601d546134bc90836139d3565b11156134da5760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006134ef61409c565b90506134fb848261406e565b61350681600a613489565b50806135118161576d565b9150506134dd565b6022546135279060016139d3565b60205461353490836139d3565b11156135525760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006135676140b0565b9050613573848261406e565b61357e816001613489565b50806135898161576d565b915050613555565b60255461359f9060016139d3565b6023546135ac90836139d3565b11156135ca5760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006135df6140c4565b90506135eb848261406e565b6135f6816002613489565b50806136018161576d565b9150506135cd565b6028546136179060016139d3565b60265461362490836139d3565b11156136425760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006136576140d8565b9050613663848261406e565b61366e816003613489565b50806136798161576d565b915050613645565b602b5461368f9060016139d3565b60295461369c90836139d3565b11156136ba5760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006136cf6140ec565b90506136db848261406e565b6136e681600b613489565b50806136f18161576d565b9150506136bd565b602e546137079060016139d3565b602c5461371490836139d3565b11156137325760405162461bcd60e51b815260040161128890614e5b565b60005b81811015611367576000613747614100565b9050613753848261406e565b61375e816004613489565b50806137698161576d565b915050613735565b60315461377f9060016139d3565b602f5461378c90836139d3565b11156137aa5760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006137bf614114565b90506137cb848261406e565b6137d681600c613489565b50806137e18161576d565b9150506137ad565b6034546137f79060016139d3565b60325461380490836139d3565b11156138225760405162461bcd60e51b815260040161128890614e5b565b60005b81811015611367576000613837614128565b9050613843848261406e565b61384e816006613489565b50806138598161576d565b915050613825565b60375461386f9060016139d3565b60355461387c90836139d3565b111561389a5760405162461bcd60e51b815260040161128890614e5b565b60005b818110156113675760006138af61413c565b90506138bb848261406e565b6138c6816007613489565b50806138d18161576d565b91505061389d565b603a546138e79060016139d3565b6038546138f490836139d3565b11156139125760405162461bcd60e51b815260040161128890614e5b565b60005b81811015611367576000613927614150565b9050613933848261406e565b61393e816008613489565b50806139498161576d565b915050613915565b60006001600160e01b031982166380ac58cd60e01b148061398257506001600160e01b03198216635b5e139f60e01b145b80611391575061139182614164565b6000612f6b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061417d565b6000806139e083856156aa565b905083811015612f6b5760405162461bcd60e51b815260040161128890614e80565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613a54826123a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000613a9882613a02565b613ab45760405162461bcd60e51b815260040161128890614fe5565b6000613abf836123a2565b9050806001600160a01b0316846001600160a01b03161480613afa5750836001600160a01b0316613aef846114bc565b6001600160a01b0316145b80613b0a5750613b0a8185613112565b949350505050565b826001600160a01b0316613b25826123a2565b6001600160a01b031614613b4b5760405162461bcd60e51b81526004016112889061536d565b6001600160a01b038216613b715760405162461bcd60e51b815260040161128890614edb565b613b7c8383836141b7565b613b87600082613a1f565b6001600160a01b0383166000908152600360205260408120805460019290613bb09084906156f5565b90915550506001600160a01b0382166000908152600360205260408120805460019290613bde9084906156aa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600091825260156020526040909120805460ff1916911515919091179055565b6000613c6a826123a2565b9050613c78816000846141b7565b613c83600083613a1f565b6001600160a01b0381166000908152600360205260408120805460019290613cac9084906156f5565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b613d11600c8261423b565b6040516001600160a01b038216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b600091825260136020526040909120805460ff1916911515919091179055565b6060600e805461140190615738565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613dd4600c826133d8565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b600082613e1a5750600061195a565b6000613e2683856156d6565b905082613e3385836156c2565b14612f6b5760405162461bcd60e51b815260040161128890615269565b600091825260146020526040909120805460ff1916911515919091179055565b6000918252600f602052604090912055565b613e8d848484613b12565b613e9984848484614283565b6118d35760405162461bcd60e51b815260040161128890614d8c565b60006001600160a01b038216613edd5760405162461bcd60e51b81526004016112889061532b565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b606081613f4d57506040805180820190915260018152600360fc1b6020820152611394565b8160005b8115613f775780613f618161576d565b9150613f709050600a836156c2565b9150613f51565b60008167ffffffffffffffff811115613fa057634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015613fca576020820181803683370190505b5090505b8415613b0a57613fdf6001836156f5565b9150613fec600a86615788565b613ff79060306156aa565b60f81b81838151811061401a57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061403c600a866156c2565b9450613fce565b6001600160a01b03919091166000908152601760205260409020805460ff1916911515919091179055565b611c5882826040518060200160405280600081525061439e565b601a546140968160016139d3565b601a5590565b601d546140aa8160016139d3565b601d5590565b6020546140be8160016139d3565b60205590565b6023546140d28160016139d3565b60235590565b6026546140e68160016139d3565b60265590565b6029546140fa8160016139d3565b60295590565b602c5461410e8160016139d3565b602c5590565b602f546141228160016139d3565b602f5590565b6032546141368160016139d3565b60325590565b60355461414a8160016139d3565b60355590565b60385461415e8160016139d3565b60385590565b6001600160e01b031981166301ffc9a760e01b14919050565b600081848411156141a15760405162461bcd60e51b81526004016112889190614cd4565b5060006141ae84866156f5565b95945050505050565b6141c2838383611367565b6001600160a01b0383166141de576141d9816143d1565b614201565b816001600160a01b0316836001600160a01b031614614201576142018382614415565b6001600160a01b038216614218576112a4816144b2565b826001600160a01b0316826001600160a01b03161461136757611367828261458b565b6142458282613eb5565b6142615760405162461bcd60e51b8152600401611288906151f3565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000614297846001600160a01b03166145cf565b1561439357836001600160a01b031663150b7a026142b3613424565b8786866040518563ffffffff1660e01b81526004016142d59493929190614bfa565b602060405180830381600087803b1580156142ef57600080fd5b505af192505050801561431f575060408051601f3d908101601f1916820190925261431c91810190614aa6565b60015b614379573d80801561434d576040519150601f19603f3d011682016040523d82523d6000602084013e614352565b606091505b5080516143715760405162461bcd60e51b815260040161128890614d8c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613b0a565b506001949350505050565b6143a883836145d5565b6143b56000848484614283565b6113675760405162461bcd60e51b815260040161128890614d8c565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b60006001614422846124d3565b61442c91906156f5565b60008381526007602052604090205490915080821461447f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906144c4906001906156f5565b600083815260096020526040812054600880549394509092849081106144fa57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061452957634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061456f57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000614596836124d3565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b3b151590565b6001600160a01b0382166145fb5760405162461bcd60e51b815260040161128890615234565b61460481613a02565b156146215760405162461bcd60e51b815260040161128890614e24565b61462d600083836141b7565b6001600160a01b03821660009081526003602052604081208054600192906146569084906156aa565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546146c090615738565b90600052602060002090601f0160209004810192826146e25760008555614728565b82601f106146fb57805160ff1916838001178555614728565b82800160010185558215614728579182015b8281111561472857825182559160200191906001019061470d565b50614734929150614738565b5090565b5b808211156147345760008155600101614739565b600067ffffffffffffffff831115614767576147676157c8565b61477a601f8401601f191660200161565c565b905082815283838301111561478e57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461139457600080fd5b8035801515811461139457600080fd5b6000602082840312156147dd578081fd5b612f6b826147a5565b600080604083850312156147f8578081fd5b614801836147a5565b915061480f602084016147a5565b90509250929050565b60008060006060848603121561482c578081fd5b614835846147a5565b9250614843602085016147a5565b9150604084013590509250925092565b60008060008060808587031215614868578081fd5b614871856147a5565b935061487f602086016147a5565b925060408501359150606085013567ffffffffffffffff8111156148a1578182fd5b8501601f810187136148b1578182fd5b6148c08782356020840161474d565b91505092959194509250565b600080604083850312156148de578182fd5b6148e7836147a5565b915061480f602084016147bc565b60008060408385031215614907578182fd5b614910836147a5565b946020939093013593505050565b600080600060608486031215614932578283fd5b61493b846147a5565b95602085013595506040909401359392505050565b60006020808385031215614962578182fd5b823567ffffffffffffffff811115614978578283fd5b8301601f81018513614988578283fd5b803561499b61499682615686565b61565c565b81815283810190838501858402850186018910156149b7578687fd5b8694505b838510156149e0576149cc816147a5565b8352600194909401939185019185016149bb565b50979650505050505050565b600060208083850312156149fe578182fd5b823567ffffffffffffffff811115614a14578283fd5b8301601f81018513614a24578283fd5b8035614a3261499682615686565b8181528381019083850185840285018601891015614a4e578687fd5b8694505b838510156149e0578035835260019490940193918501918501614a52565b600060208284031215614a81578081fd5b612f6b826147bc565b600060208284031215614a9b578081fd5b8135612f6b816157de565b600060208284031215614ab7578081fd5b8151612f6b816157de565b600060208284031215614ad3578081fd5b813567ffffffffffffffff811115614ae9578182fd5b8201601f81018413614af9578182fd5b613b0a8482356020840161474d565b600060208284031215614b19578081fd5b5035919050565b60008060408385031215614b32578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015614b7057815187529582019590820190600101614b54565b509495945050505050565b60008151808452614b9381602086016020860161570c565b601f01601f19169290920160200192915050565b60008351614bb981846020880161570c565b835190830190614bcd81836020880161570c565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614c2d90830184614b7b565b9695505050505050565b600060208252612f6b6020830184614b41565b600060408252614c5d6040830185614b41565b82810360208401526141ae8185614b41565b901515815260200190565b921515835290151560208301521515604082015260600190565b971515885295151560208801529315156040870152911515606086015215156080850152151560a0840152151560c0830152151560e08201526101000190565b600060208252612f6b6020830184614b7b565b6020808252600990820152681b9bdd081cdd185c9d60ba1b604082015260600190565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252600b908201526a1b9d5b481b1a5b5a5d195960aa1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600a90820152693a3cb8329032b93937b960b11b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601390820152723737903930b4b73137bb903632b33a37bb32b960691b604082015260600190565b60208082526011908201527063616e277420636c61696d20737061726b60781b604082015260600190565b6020808252601a908201527f77686974656c697374206d696e74206e756d206c696d69746564000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252600f908201526e31b0b713ba1031b630b4b69029a3a960891b604082015260600190565b6020808252600f908201526e63616e20636c61696d206562696c6560881b604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526010908201526f37379033b7b632103632b33a37bb32b960811b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b60208082526012908201527137379039b4b63b32b9103632b33a37bb32b960711b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526021908201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6040820152606560f81b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b602080825260409082018190527f57686974656c69737441646d696e526f6c653a2063616c6c657220646f657320908201527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c65606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526014908201527363616e277420636c61696d2061697264726f707360601b604082015260600190565b60208082526011908201527021286f776e65727c617070726f7665642960781b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b60208082526015908201527431b0b713ba1031b630b4b69019a21036b7ba3432b960591b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526010908201526f1b9bdd081a5b881dda1a5d195b1a5cdd60821b604082015260600190565b6020808252600f908201526e1c185e5b595b9d081a5b9d985b1a59608a1b604082015260600190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561567e5761567e6157c8565b604052919050565b600067ffffffffffffffff8211156156a0576156a06157c8565b5060209081020190565b600082198211156156bd576156bd61579c565b500190565b6000826156d1576156d16157b2565b500490565b60008160001904831182151516156156f0576156f061579c565b500290565b6000828210156157075761570761579c565b500390565b60005b8381101561572757818101518382015260200161570f565b838111156118d35750506000910152565b60028104600182168061574c57607f821691505b60208210811415611edb57634e487b7160e01b600052602260045260246000fd5b60006000198214156157815761578161579c565b5060010190565b600082615797576157976157b2565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611bb857600080fdfea2646970667358221220c6662bff5039695f42d42241af537893464966062f2f862dc49e69369643f01e64736f6c63430008000033

Deployed Bytecode Sourcemap

236:30731:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29470:1112;;;;;;;;;;-1:-1:-1;29470:1112:2;;;;;:::i;:::-;;:::i;:::-;;912:222:5;;;;;;;;;;-1:-1:-1;912:222:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8410:119:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4752:106::-;;;;;;;;;;-1:-1:-1;4752:106:2;;;;;:::i;:::-;;:::i;2341:98:4:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9843:202:2:-;;;;;;;;;;;;;:::i;3861:217:4:-;;;;;;;;;;-1:-1:-1;3861:217:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3399:401::-;;;;;;;;;;-1:-1:-1;3399:401:4;;;;;:::i;:::-;;:::i;8535:192:2:-;;;;;;;;;;;;;:::i;12256:125::-;;;;;;;;;;-1:-1:-1;12256:125:2;;;;;:::i;:::-;;:::i;26542:226::-;;;;;;;;;;-1:-1:-1;26542:226:2;;;;;:::i;:::-;;:::i;1537:111:5:-;;;;;;;;;;;;;:::i;4648:98:2:-;;;;;;;;;;-1:-1:-1;4648:98:2;;;;;:::i;:::-;;:::i;4864:97::-;;;;;;;;;;-1:-1:-1;4864:97:2;;;;;:::i;:::-;;:::i;10834:197::-;;;;;;;;;;;;;:::i;4725:330:4:-;;;;;;;;;;-1:-1:-1;4725:330:4;;;;;:::i;:::-;;:::i;27555:873:2:-;;;;;;;;;;;;;:::i;8202:202::-;;;;;;;;;;;;;:::i;1213:253:5:-;;;;;;;;;;-1:-1:-1;1213:253:5;;;;;:::i;:::-;;:::i;9510:202:2:-;;;;;;;;;;;;;:::i;9391:113::-;;;;;;;;;;;;;:::i;13438:117::-;;;;;;;;;;-1:-1:-1;13438:117:2;;;;;:::i;:::-;;:::i;4057:27::-;;;;;;;;;;;;;:::i;9193:192::-;;;;;;;;;;;;;:::i;22442:946::-;;;;;;;;;;-1:-1:-1;22442:946:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;27037:512::-;;;;;;;;;;-1:-1:-1;27037:512:2;;;;;:::i;:::-;;:::i;13231:201::-;;;;;;;;;;-1:-1:-1;13231:201:2;;;;;:::i;:::-;;:::i;14282:108::-;;;;;;;;;;-1:-1:-1;14282:108:2;;;;;:::i;:::-;;:::i;5121:179:4:-;;;;;;;;;;-1:-1:-1;5121:179:4;;;;;:::i;:::-;;:::i;14118:158:2:-;;;;;;;;;;-1:-1:-1;14118:158:2;;;;;:::i;:::-;;:::i;21948:488::-;;;;;;;;;;-1:-1:-1;21948:488:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;14396:261::-;;;;;;;;;;-1:-1:-1;14396:261:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;960:93:18:-;;;;;;;;;;;;;:::i;14012:100:2:-;;;;;;;;;;-1:-1:-1;14012:100:2;;;;;:::i;:::-;;:::i;1720:230:5:-;;;;;;;;;;-1:-1:-1;1720:230:5;;;;;:::i;:::-;;:::i;9718:119:2:-;;;;;;;;;;;;;:::i;10051:::-;;;;;;;;;;;;;:::i;11037:116::-;;;;;;;;;;;;;:::i;13885:121::-;;;;;;;;;;-1:-1:-1;13885:121:2;;;;;:::i;:::-;;:::i;8080:116::-;;;;;;;;;;;;;:::i;29186:127::-;;;;;;;;;;-1:-1:-1;29186:127:2;;;;;:::i;:::-;;:::i;15739:1746::-;;;;;;;;;;-1:-1:-1;15739:1746:2;;;;;:::i;:::-;;:::i;203:18:13:-;;;;;;;;;;;;;:::i;7418:212:2:-;;;;;;;;;;;;;:::i;7746:125::-;;;;;;;;;;;;;:::i;4433:99::-;;;;;;;;;;-1:-1:-1;4433:99:2;;;;;:::i;:::-;;:::i;29343:121::-;;;;;;;;;;-1:-1:-1;29343:121:2;;;;;:::i;:::-;;:::i;2044:235:4:-;;;;;;;;;;-1:-1:-1;2044:235:4;;;;;:::i;:::-;;:::i;13102:123:2:-;;;;;;;;;;-1:-1:-1;13102:123:2;;;;;:::i;:::-;;:::i;13561:111::-;;;;;;;;;;-1:-1:-1;13561:111:2;;;;;:::i;:::-;;:::i;471:97:13:-;;;;;;;;;;;;;:::i;13788:91:2:-;;;;;;;;;;;;;:::i;1782:205:4:-;;;;;;;;;;-1:-1:-1;1782:205:4;;;;;:::i;:::-;;:::i;1601:92:12:-;;;;;;;;;;;;;:::i;840:114:18:-;;;;;;;;;;-1:-1:-1;840:114:18;;;;;:::i;:::-;;:::i;11895:109:2:-;;;;;;;;;;-1:-1:-1;11895:109:2;;;;;:::i;:::-;;:::i;574:102:13:-;;;;;;;;;;;;;:::i;7877:197:2:-;;;;;;;;;;;;;:::i;4179:27::-;;;;;;;;;;;;;:::i;30795:113::-;;;;;;;;;;;;;:::i;5241:135::-;;;;;;;;;;-1:-1:-1;5241:135:2;;;;;:::i;:::-;;:::i;1137:50::-;;;;;;;;;;;;;:::i;4538:104::-;;;;;;;;;;-1:-1:-1;4538:104:2;;;;;:::i;:::-;;:::i;4010:40::-;;;;;;;;;;;;;:::i;969:85:12:-;;;;;;;;;;;;;:::i;7636:104:2:-;;;;;;;;;;;;;:::i;10485:212::-;;;;;;;;;;;;;:::i;28572:127::-;;;;;;;;;;-1:-1:-1;28572:127:2;;;;;:::i;:::-;;:::i;2503:102:4:-;;;;;;;;;;;;;:::i;10703:125:2:-;;;;;;;;;;;;;:::i;12889:207::-;;;;;;;;;;-1:-1:-1;12889:207:2;;;;;:::i;:::-;;:::i;8733:113::-;;;;;;;;;;;;;:::i;9065:122::-;;;;;;;;;;;;;:::i;21310:574::-;;;;;;:::i;:::-;;:::i;5106:129::-;;;;;;;;;;-1:-1:-1;5106:129:2;;;;;:::i;:::-;;:::i;4145:290:4:-;;;;;;;;;;-1:-1:-1;4145:290:4;;;;;:::i;:::-;;:::i;25220:794:2:-;;;;;;;;;;;;;:::i;28880:119::-;;;;;;;;;;-1:-1:-1;28880:119:2;;;;;:::i;:::-;;:::i;14663:114::-;;;;;;;;;;-1:-1:-1;14663:114:2;;;;;:::i;:::-;;:::i;8852:207::-;;;;;;;;;;;;;:::i;4967:133::-;;;;;;;;;;-1:-1:-1;4967:133:2;;;;;:::i;:::-;;:::i;5366:320:4:-;;;;;;;;;;-1:-1:-1;5366:320:4;;;;;:::i;:::-;;:::i;711:123:18:-;;;;;;;;;;-1:-1:-1;711:123:18;;;;;:::i;:::-;;:::i;26264:272:2:-;;;;;;;;;;;;;:::i;29030:123::-;;;;;;;;;;-1:-1:-1;29030:123:2;;;;;:::i;:::-;;:::i;28729:121::-;;;;;;;;;;-1:-1:-1;28729:121:2;;;;;:::i;:::-;;:::i;23394:603::-;;;;;;;;;;-1:-1:-1;23394:603:2;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;1084:47::-;;;;;;;;;;;;;:::i;1030:48::-;;;;;;;;;;;;;:::i;12129:121::-;;;;;;;;;;-1:-1:-1;12129:121:2;;;;;:::i;:::-;;:::i;12776:107::-;;;;;;;;;;-1:-1:-1;12776:107:2;;;;;:::i;:::-;;:::i;2671:338:4:-;;;;;;;;;;-1:-1:-1;2671:338:4;;;;;:::i;:::-;;:::i;4306:121:2:-;;;;;;;;;;-1:-1:-1;4306:121:2;;;;;:::i;:::-;;:::i;12010:113::-;;;;;;;;;;-1:-1:-1;12010:113:2;;;;;:::i;:::-;;:::i;3927:55::-;;;;;;;;;;-1:-1:-1;3927:55:2;;;;;:::i;:::-;;:::i;26020:238::-;;;;;;;;;;-1:-1:-1;26020:238:2;;;;;:::i;:::-;;:::i;24555:659::-;;;;;;;;;;-1:-1:-1;24555:659:2;;;;;:::i;:::-;;:::i;12387:119::-;;;;;;;;;;-1:-1:-1;12387:119:2;;;;;:::i;:::-;;:::i;10369:110::-;;;;;;;;;;;;;:::i;4501:162:4:-;;;;;;;;;;-1:-1:-1;4501:162:4;;;;;:::i;:::-;;:::i;24003:546:2:-;;;;;;;;;;-1:-1:-1;24003:546:2;;;;;:::i;:::-;;:::i;12579:191::-;;;;;;;;;;-1:-1:-1;12579:191:2;;;;;:::i;:::-;;:::i;4120:30::-;;;;;;;;;;;;;:::i;1842:189:12:-;;;;;;;;;;-1:-1:-1;1842:189:12;;;;;:::i;:::-;;:::i;893:37:2:-;;;;;;;;;;;;;:::i;26774:257::-;;;;;;;;;;;;;:::i;30588:201::-;;;;;;;;;;-1:-1:-1;30588:201:2;;;;;:::i;:::-;;:::i;10176:187::-;;;;;;;;;;;;;:::i;29470:1112::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;;;;;;;;;29585:18:2::1;29571:2;:33;29567:1009;;;29620:27;29634:7;29643:3;29620:13;:27::i;:::-;29567:1009;;;29682:15;29668:2;:30;29664:912;;;29714:24;29725:7;29734:3;29714:10;:24::i;29664:912::-;29773:16;29759:2;:31;29755:821;;;29806:25;29818:7;29827:3;29806:11;:25::i;29755:821::-;29866:14;29852:2;:29;29848:728;;;29897:23;29907:7;29916:3;29897:9;:23::i;29848:728::-;29955:17;29941:2;:32;29937:639;;;29989:26;30002:7;30011:3;29989:12;:26::i;29937:639::-;30050:14;30036:2;:29;30032:544;;;30081:23;30091:7;30100:3;30081:9;:23::i;30032:544::-;30139:16;30125:2;:31;30121:455;;;30172:25;30184:7;30193:3;30172:11;:25::i;30121:455::-;30232:16;30218:2;:31;30214:362;;;30265:25;30277:7;30286:3;30265:11;:25::i;30214:362::-;30325:13;30311:2;:28;30307:269;;;30355:22;30364:7;30373:3;30355:8;:22::i;30307:269::-;30412:18;30398:2;:33;30394:182;;;30447:27;30461:7;30470:3;30447:13;:27::i;30394:182::-;30509:15;30495:2;:30;30491:85;;;30541:24;30552:7;30561:3;30541:10;:24::i;:::-;29470:1112:::0;;;:::o;912:222:5:-;1014:4;-1:-1:-1;;;;;;1037:50:5;;-1:-1:-1;;;1037:50:5;;:90;;;1091:36;1115:11;1091:23;:36::i;:::-;1030:97;;912:222;;;;:::o;8410:119:2:-;8461:7;8487:35;8507:14;;8487:15;;:19;;:35;;;;:::i;:::-;8480:42;;8410:119;;:::o;4752:106::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;4828:16:2::1;:23:::0;;-1:-1:-1;;4828:23:2::1;::::0;::::1;;::::0;;;::::1;::::0;;4752:106::o;2341:98:4:-;2395:13;2427:5;2420:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2341:98;:::o;9843:202:2:-;9890:7;9931:14;;9913:15;;:32;9909:71;;;-1:-1:-1;9968:1:2;9961:8;;9909:71;9996:42;10036:1;9996:35;10015:15;;9996:14;;:18;;:35;;;;:::i;:::-;:39;;:42::i;3861:217:4:-;3937:7;3964:16;3972:7;3964;:16::i;:::-;3956:73;;;;-1:-1:-1;;;3956:73:4;;;;;;;:::i;:::-;-1:-1:-1;4047:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4047:24:4;;3861:217::o;3399:401::-;3479:13;3495:23;3510:7;3495:14;:23::i;:::-;3479:39;;3542:5;-1:-1:-1;;;;;3536:11:4;:2;-1:-1:-1;;;;;3536:11:4;;;3528:57;;;;-1:-1:-1;;;3528:57:4;;;;;;;:::i;:::-;3633:5;-1:-1:-1;;;;;3617:21:4;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3617:21:4;;:62;;;;3642:37;3659:5;3666:12;:10;:12::i;3642:37::-;3596:165;;;;-1:-1:-1;;;3596:165:4;;;;;;;:::i;:::-;3772:21;3781:2;3785:7;3772:8;:21::i;8535:192:2:-;8580:7;8619:12;;8603:13;;:28;8599:67;;;-1:-1:-1;8654:1:2;8647:8;;8599:67;8682:38;8718:1;8682:31;8699:13;;8682:12;;:16;;:31;;;;:::i;12256:125::-;-1:-1:-1;;;;;12347:27:2;12324:4;12347:27;;;:18;:27;;;;;;;;;12256:125::o;26542:226::-;26603:4;26623:25;26640:7;26623:16;:25::i;:::-;:56;;;;;26653:26;26671:7;26653:17;:26::i;:::-;26652:27;26623:56;:79;;;;;26701:1;26683:15;:13;:15::i;:::-;:19;26623:79;26619:121;;;-1:-1:-1;26725:4:2;26718:11;;26619:121;-1:-1:-1;26756:5:2;26542:226;;;:::o;1537:111:5:-;1624:10;:17;1537:111;:::o;4648:98:2:-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;4717:15:2::1;:22:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;4717:22:2;;::::1;::::0;;;::::1;::::0;;4648:98::o;4864:97::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;4937:9:2::1;:17:::0;4864:97::o;10834:197::-;10880:7;10920:13;;10903:14;;:30;10899:69;;;-1:-1:-1;10956:1:2;10949:8;;10899:69;10984:40;11022:1;10984:33;11002:14;;10984:13;;:17;;:33;;;;:::i;4725:330:4:-;4914:41;4933:12;:10;:12::i;:::-;4947:7;4914:18;:41::i;:::-;4906:103;;;;-1:-1:-1;;;4906:103:4;;;;;;;:::i;:::-;5020:28;5030:4;5036:2;5040:7;5020:9;:28::i;27555:873:2:-;27603:18;;;;;;;27595:40;;;;-1:-1:-1;;;27595:40:2;;;;;;;:::i;:::-;27683:25;27710:27;27741:23;27751:12;:10;:12::i;27741:23::-;27682:82;;-1:-1:-1;27682:82:2;-1:-1:-1;27774:11:2;;27795:203;27819:10;:17;27815:1;:21;27795:203;;;27886:14;27861:10;27872:1;27861:13;;;;;;-1:-1:-1;;;27861:13:2;;;;;;;;;;;;;;;:40;:76;;;;;27906:31;27925:8;27934:1;27925:11;;;;;;-1:-1:-1;;;27925:11:2;;;;;;;;;;;;;;;27906:18;:31::i;:::-;27905:32;27861:76;27857:131;;;27963:10;:3;27971:1;27963:7;:10::i;:::-;27957:16;;27857:131;27838:3;;;;:::i;:::-;;;;27795:203;;;;28023:1;28016:3;:8;;28008:36;;;;-1:-1:-1;;;28008:36:2;;;;;;;:::i;:::-;28093:1;28081:9;28104:263;28128:10;:17;28124:1;:21;:30;;;;;28153:1;28149;:5;28124:30;28104:263;;;28204:14;28179:10;28190:1;28179:13;;;;;;-1:-1:-1;;;28179:13:2;;;;;;;;;;;;;;;:40;:76;;;;;28224:31;28243:8;28252:1;28243:11;;;;;;-1:-1:-1;;;28243:11:2;;;;;;;;28224:31;28223:32;28179:76;28175:182;;;28275:37;28294:8;28303:1;28294:11;;;;;;-1:-1:-1;;;28294:11:2;;;;;;;;;;;;;;;28307:4;28275:18;:37::i;:::-;28334:8;:1;28340;28334:5;:8::i;:::-;28330:12;;28175:182;28156:3;;;;:::i;:::-;;;;28104:263;;;;28393:28;28405:12;:10;:12::i;:::-;28419:1;28393:11;:28::i;:::-;27555:873;;;;:::o;8202:202::-;8249:7;8290:14;;8272:15;;:32;8268:71;;;-1:-1:-1;8327:1:2;8320:8;;8268:71;8355:42;8395:1;8355:35;8374:15;;8355:14;;:18;;:35;;;;:::i;1213:253:5:-;1310:7;1345:23;1362:5;1345:16;:23::i;:::-;1337:5;:31;1329:87;;;;-1:-1:-1;;;1329:87:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1433:19:5;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1213:253;;;;;:::o;9510:202:2:-;9557:7;9598:14;;9580:15;;:32;9576:71;;;-1:-1:-1;9635:1:2;9628:8;;9576:71;9663:42;9703:1;9663:35;9682:15;;9663:14;;:18;;:35;;;;:::i;9391:113::-;9440:7;9466:31;9484:12;;9466:13;;:17;;:31;;;;:::i;13438:117::-;-1:-1:-1;;;;;13525:23:2;13502:4;13525:23;;;:14;:23;;;;;;;;;13438:117::o;4057:27::-;;;;;;:::o;9193:192::-;9238:7;9277:12;;9261:13;;:28;9257:67;;;-1:-1:-1;9312:1:2;9305:8;;9257:67;9340:38;9376:1;9340:31;9357:13;;9340:12;;:16;;:31;;;;:::i;22442:946::-;22552:15;;22499:11;;;;;;22552:15;;22547:90;;-1:-1:-1;22606:5:2;;-1:-1:-1;22606:5:2;;-1:-1:-1;22606:5:2;22598:28;;22547:90;22685:25;22712:27;22743:16;22753:5;22743:9;:16::i;:::-;22684:75;;-1:-1:-1;22684:75:2;-1:-1:-1;22769:21:2;;22800:221;22824:10;:17;22820:1;:21;22800:221;;;22891:18;22866:10;22877:1;22866:13;;;;;;-1:-1:-1;;;22866:13:2;;;;;;;;;;;;;;;:44;:74;;;;;22915:25;22928:8;22937:1;22928:11;;;;;;-1:-1:-1;;;22928:11:2;;;;;;;;;;;;;;;22915:12;:25::i;:::-;22914:26;22866:74;22862:149;;;22976:20;:13;22994:1;22976:17;:20::i;:::-;22960:36;;22862:149;22843:3;;;;:::i;:::-;;;;22800:221;;;;23052:30;;23035:13;:47;;:72;;;;;23106:1;23086:17;:15;:17::i;:::-;:21;23035:72;23031:351;;;23133:4;23123:14;;23031:351;;;23175:27;;23158:13;:44;;:66;;;;;23223:1;23206:14;:12;:14::i;:::-;:18;23158:66;23154:228;;;23247:4;23240:11;;23154:228;;;23289:29;;23272:13;:46;;:70;;;;;23341:1;23322:16;:14;:16::i;:::-;:20;23272:70;23268:114;;;23367:4;23358:13;;23268:114;22442:946;;;;;;;;;:::o;27037:512::-;27099:16;27085:2;:31;:64;;;-1:-1:-1;27134:14:2;27120:2;:29;27085:64;:100;;;-1:-1:-1;27167:17:2;27153:2;:32;27085:100;27081:462;;;27201:12;27210:2;27201:8;:12::i;:::-;27081:462;;;27248:16;27234:2;:31;27230:313;;;27281:13;:11;:13::i;27230:313::-;27329:13;27315:2;:28;27311:232;;;27359:9;:7;:9::i;27311:232::-;27403:18;27389:2;:33;27385:158;;;27438:15;:13;:15::i;27385:158::-;27488:15;27474:2;:30;27470:73;;;27520:12;:10;:12::i;:::-;27037:512;:::o;13231:201::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;13326:9:2::1;13321:105;13345:8;:15;13341:1;:19;13321:105;;;13411:4;13381:14;:27;13396:8;13405:1;13396:11;;;;;;-1:-1:-1::0;;;13396:11:2::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;13381:27:2::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;13381:27:2;:34;;-1:-1:-1;;13381:34:2::1;::::0;::::1;;::::0;;;::::1;::::0;;13362:3;::::1;::::0;::::1;:::i;:::-;;;;13321:105;;;;13231:201:::0;:::o;14282:108::-;14337:7;14363:20;;;:11;:20;;;;;;;14282:108::o;5121:179:4:-;5254:39;5271:4;5277:2;5281:7;5254:39;;;;;;;;;;;;:16;:39::i;14118:158:2:-;14182:41;14201:12;:10;:12::i;14182:41::-;14174:71;;;;-1:-1:-1;;;14174:71:2;;;;;;;:::i;:::-;14255:14;14261:7;14255:5;:14::i;21948:488::-;22003:16;22021;22049:15;22067:16;22077:5;22067:9;:16::i;:::-;22049:34;;22093:25;22135:7;22121:22;;;;;;-1:-1:-1;;;22121:22:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22121:22:2;;22093:50;;22153:27;22197:7;22183:22;;;;;;-1:-1:-1;;;22183:22:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22183:22:2;;22153:52;;22220:9;22215:176;22239:7;22235:1;:11;22215:176;;;22267:10;22280:29;22300:5;22307:1;22280:19;:29::i;:::-;22267:42;;22337:2;22323:8;22332:1;22323:11;;;;;;-1:-1:-1;;;22323:11:2;;;;;;;;;;;;;;:16;;;;;22369:11;22377:2;22369:7;:11::i;:::-;22353:10;22364:1;22353:13;;;;;;-1:-1:-1;;;22353:13:2;;;;;;;;;;;;;;;;;;:27;-1:-1:-1;22248:3:2;;;;:::i;:::-;;;;22215:176;;;-1:-1:-1;22408:8:2;;-1:-1:-1;22418:10:2;-1:-1:-1;;21948:488:2;;;:::o;14396:261::-;14467:22;14523:8;:15;14509:30;;;;;;-1:-1:-1;;;14509:30:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14509:30:2;;14501:38;;14554:9;14549:102;14573:8;:15;14569:1;:19;14549:102;;;14620:20;14628:8;14637:1;14628:11;;;;;;-1:-1:-1;;;14628:11:2;;;;;;;;;;;;;;;14620:7;:20::i;:::-;14609:5;14615:1;14609:8;;;;;;-1:-1:-1;;;14609:8:2;;;;;;;;;;;;;;;;;;:31;14590:3;;;;:::i;:::-;;;;14549:102;;;;14396:261;;;:::o;960:93:18:-;1011:35;1033:12;:10;:12::i;:::-;1011:21;:35::i;:::-;960:93::o;14012:100:2:-;14066:4;14089:16;14097:7;14089;:16::i;1720:230:5:-;1795:7;1830:30;:28;:30::i;:::-;1822:5;:38;1814:95;;;;-1:-1:-1;;;1814:95:5;;;;;;;:::i;:::-;1926:10;1937:5;1926:17;;;;;;-1:-1:-1;;;1926:17:5;;;;;;;;;;;;;;;;;1919:24;;1720:230;;;:::o;9718:119:2:-;9769:7;9795:35;9815:14;;9795:15;;:19;;:35;;;;:::i;10051:119::-;10102:7;10128:35;10148:14;;10128:15;;:19;;:35;;;;:::i;11037:116::-;11087:7;11113:33;11132:13;;11113:14;;:18;;:33;;;;:::i;13885:121::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;13971:28:2;;::::1;::::0;:13:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;8080:116::-:0;8130:7;8156:33;8175:13;;8156:14;;:18;;:33;;;;:::i;29186:127::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;29279:27:2::1;29293:7;29302:3;29279:13;:27::i;15739:1746::-:0;15794:15;;;;15786:37;;;;-1:-1:-1;;;15786:37:2;;;;;;;:::i;:::-;15834:15;15852:12;:10;:12::i;:::-;15834:30;;15912:25;15939:27;15970:18;15980:7;15970:9;:18::i;:::-;15911:77;;-1:-1:-1;15911:77:2;-1:-1:-1;15998:21:2;;16029:221;16053:10;:17;16049:1;:21;16029:221;;;16120:18;16095:10;16106:1;16095:13;;;;;;-1:-1:-1;;;16095:13:2;;;;;;;;;;;;;;;:44;:74;;;;;16144:25;16157:8;16166:1;16157:11;;;;;;-1:-1:-1;;;16157:11:2;;;;;;;;16144:25;16143:26;16095:74;16091:149;;;16205:20;:13;16223:1;16205:17;:20::i;:::-;16189:36;;16091:149;16072:3;;;;:::i;:::-;;;;16029:221;;;-1:-1:-1;16260:11:2;16299:17;16285:2;:32;16281:553;;;-1:-1:-1;16339:30:2;;16411:1;16391:17;:15;:17::i;:::-;:21;16383:53;;;;-1:-1:-1;;;16383:53:2;;;;;;;:::i;:::-;16281:553;;;16471:14;16457:2;:29;16453:381;;;-1:-1:-1;16508:27:2;;16574:1;16557:14;:12;:14::i;:::-;:18;16549:47;;;;-1:-1:-1;;;16549:47:2;;;;;;;:::i;16453:381::-;16631:16;16617:2;:31;16613:221;;;-1:-1:-1;16670:29:2;;16740:1;16721:16;:14;:16::i;:::-;:20;16713:51;;;;-1:-1:-1;;;16713:51:2;;;;;;;:::i;16613:221::-;16795:28;;-1:-1:-1;;;16795:28:2;;;;;;;:::i;:::-;16868:3;16851:13;:20;;16843:48;;;;-1:-1:-1;;;16843:48:2;;;;;;;:::i;:::-;16932:9;16927:261;16951:10;:17;16947:1;:21;:32;;;;;16978:1;16972:3;:7;16947:32;16927:261;;;17029:18;17004:10;17015:1;17004:13;;;;;;-1:-1:-1;;;17004:13:2;;;;;;;;;;;;;;;:44;:74;;;;;17053:25;17066:8;17075:1;17066:11;;;;;;-1:-1:-1;;;17066:11:2;;;;;;;;17053:25;17052:26;17004:74;17000:178;;;17098:31;17111:8;17120:1;17111:11;;;;;;-1:-1:-1;;;17111:11:2;;;;;;;;;;;;;;;17124:4;17098:12;:31::i;:::-;17153:10;:3;17161:1;17153:7;:10::i;:::-;17147:16;;17000:178;16981:3;;;;:::i;:::-;;;;16927:261;;;-1:-1:-1;17232:17:2;17218:2;:32;17214:265;;;17266:24;17279:7;17288:1;17266:12;:24::i;:::-;17214:265;;;17325:14;17311:2;:29;17307:172;;;17356:21;17366:7;17375:1;17356:9;:21::i;17307:172::-;17412:16;17398:2;:31;17394:85;;;17445:23;17457:7;17466:1;17445:11;:23::i;:::-;15739:1746;;;;;;:::o;203:18:13:-;;;-1:-1:-1;;;203:18:13;;;;;:::o;7418:212:2:-;7467:7;7510:16;;7490:17;;:36;7486:75;;;-1:-1:-1;7549:1:2;7542:8;;7486:75;7577:46;7621:1;7577:39;7598:17;;7577:16;;:20;;:39;;;;:::i;7746:125::-;7799:7;7825:39;7847:16;;7825:17;;:21;;:39;;;;:::i;4433:99::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;4503:15:2::1;:22:::0;;-1:-1:-1;;4503:22:2::1;::::0;::::1;;::::0;;;::::1;::::0;;4433:99::o;29343:121::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;29433:24:2::1;29444:7;29453:3;29433:10;:24::i;2044:235:4:-:0;2116:7;2151:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2151:16:4;2185:19;2177:73;;;;-1:-1:-1;;;2177:73:4;;;;;;;:::i;13102:123:2:-;-1:-1:-1;;;;;13192:26:2;13169:4;13192:26;;;:17;:26;;;;;;;;;13102:123::o;13561:111::-;1192:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1181:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1181:23:12;;1173:68;;;;-1:-1:-1;;;1173:68:12;;;;;;;:::i;:::-;13635:30:2::1;13657:7;13635:21;:30::i;471:97:13:-:0;1192:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1181:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1181:23:12;;1173:68;;;;-1:-1:-1;;;1173:68:12;;;;;;;:::i;:::-;515:6:13::1;:13:::0;;-1:-1:-1;;;;515:13:13::1;-1:-1:-1::0;;;515:13:13::1;::::0;;543:18:::1;::::0;::::1;::::0;::::1;::::0;550:10:::1;::::0;543:18:::1;:::i;:::-;;;;;;;;471:97::o:0;13788:91:2:-;13830:13;13862:10;:8;:10::i;1782:205:4:-;1854:7;-1:-1:-1;;;;;1881:19:4;;1873:74;;;;-1:-1:-1;;;1873:74:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1964:16:4;;;;;:9;:16;;;;;;;1782:205::o;1601:92:12:-;1192:12;:10;:12::i;:::-;-1:-1:-1;;;;;1181:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1181:23:12;;1173:68;;;;-1:-1:-1;;;1173:68:12;;;;;;;:::i;:::-;1665:21:::1;1683:1;1665:9;:21::i;840:114:18:-:0;588:30;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;920:27:::1;939:7;920:18;:27::i;11895:109:2:-:0;11955:4;11978:19;;;:10;:19;;;;;;;;;11895:109::o;574:102:13:-;1192:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1181:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1181:23:12;;1173:68;;;;-1:-1:-1;;;1173:68:12;;;;;;;:::i;:::-;620:6:13::1;:14:::0;;-1:-1:-1;;;;620:14:13::1;::::0;;649:20:::1;::::0;::::1;::::0;::::1;::::0;658:10:::1;::::0;649:20:::1;:::i;7877:197:2:-:0;7923:7;7963:13;;7946:14;;:30;7942:69;;;-1:-1:-1;7999:1:2;7992:8;;7942:69;8027:40;8065:1;8027:33;8045:14;;8027:13;;:17;;:33;;;;:::i;4179:27::-;;;;;;;;;:::o;30795:113::-;1192:12:12;:10;:12::i;:::-;-1:-1:-1;;;;;1181:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1181:23:12;;1173:68;;;;-1:-1:-1;;;1173:68:12;;;;;;;:::i;:::-;30853:47:2::1;::::0;30861:10:::1;::::0;30878:21:::1;30853:47:::0;::::1;;;::::0;::::1;::::0;;;30878:21;30861:10;30853:47;::::1;;;;;;30845:56;;;::::0;::::1;5241:135:::0;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;5331:30:2::1;:38:::0;5241:135::o;1137:50::-;;;;:::o;4538:104::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;4610:18:2::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;4610:25:2;;::::1;::::0;;;::::1;::::0;;4538:104::o;4010:40::-;;;;:::o;969:85:12:-;1041:6;;-1:-1:-1;;;;;1041:6:12;969:85;:::o;7636:104:2:-;7685:7;7711:22;:20;:22::i;10485:212::-;10534:7;10577:16;;10557:17;;:36;10553:75;;;-1:-1:-1;10616:1:2;10609:8;;10553:75;10644:46;10688:1;10644:39;10665:17;;10644:16;;:20;;:39;;;;:::i;28572:127::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;28665:27:2::1;28679:7;28688:3;28665:13;:27::i;2503:102:4:-:0;2559:13;2591:7;2584:14;;;;;:::i;10703:125:2:-;10756:7;10782:39;10804:16;;10782:17;;:21;;:39;;;;:::i;12889:207::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;12987:9:2::1;12982:108;13006:8;:15;13002:1;:19;12982:108;;;13075:4;13042:17;:30;13060:8;13069:1;13060:11;;;;;;-1:-1:-1::0;;;13060:11:2::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;13042:30:2::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;13042:30:2;:37;;-1:-1:-1;;13042:37:2::1;::::0;::::1;;::::0;;;::::1;::::0;;13023:3;::::1;::::0;::::1;:::i;:::-;;;;12982:108;;8733:113:::0;8782:7;8808:31;8826:12;;8808:13;;:17;;:31;;;;:::i;9065:122::-;9117:7;9143:37;9164:15;;9143:16;;:20;;:37;;;;:::i;21310:574::-;1684:1:14;2263:7;;:19;;2255:63;;;;-1:-1:-1;;;2255:63:14;;;;;;;:::i;:::-;1684:1;2393:7;:18;325:6:13::1;::::0;-1:-1:-1;;;325:6:13;::::1;;;324:7;316:36;;;;-1:-1:-1::0;;;316:36:13::1;;;;;;;:::i;:::-;21393:16:2::2;::::0;::::2;;21389:333;;;21452:25;21464:12;:10;:12::i;21452:25::-;21444:54;;;;-1:-1:-1::0;;;21444:54:2::2;;;;;;;:::i;:::-;21566:21;;21520:42;21558:3;21520:19;:33;21540:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;21520:33:2::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;21520:33:2;;;:37:::2;:42::i;:::-;:67;;21512:106;;;;-1:-1:-1::0;;;21512:106:2::2;;;;;;;:::i;:::-;21669:42;21707:3;21669:19;:33;21689:12;:10;:12::i;21669:42::-;21632:19;:33;21652:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;21632:33:2::2;::::0;;::::2;::::0;::::2;::::0;;;;;;-1:-1:-1;21632:33:2;:79;21389:333:::2;21772:9;::::0;:18:::2;::::0;21786:3;21772:13:::2;:18::i;:::-;21759:9;:31;;21751:59;;;;-1:-1:-1::0;;;21751:59:2::2;;;;;;;:::i;:::-;21845:32;21859:12;:10;:12::i;:::-;21873:3;21845:13;:32::i;:::-;-1:-1:-1::0;1641:1:14;2566:7;:22;21310:574:2:o;5106:129::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;5193:27:2::1;:35:::0;5106:129::o;4145:290:4:-;4259:12;:10;:12::i;:::-;-1:-1:-1;;;;;4247:24:4;:8;-1:-1:-1;;;;;4247:24:4;;;4239:62;;;;-1:-1:-1;;;4239:62:4;;;;;;;:::i;:::-;4357:8;4312:18;:32;4331:12;:10;:12::i;:::-;-1:-1:-1;;;;;4312:32:4;;;;;;;;;;;;;;;;;-1:-1:-1;4312:32:4;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4312:53:4;;;;;;;;;;;4395:12;:10;:12::i;:::-;-1:-1:-1;;;;;4380:48:4;;4419:8;4380:48;;;;;;:::i;:::-;;;;;;;;4145:290;;:::o;25220:794:2:-;25264:15;;;;;;;25256:37;;;;-1:-1:-1;;;25256:37:2;;;;;;;:::i;:::-;25305:25;25332:27;25363:23;25373:12;:10;:12::i;25363:23::-;25304:82;;-1:-1:-1;25304:82:2;-1:-1:-1;25396:8:2;;25414:218;25438:10;:17;25434:1;:21;25414:218;;;25505:16;25480:10;25491:1;25480:13;;;;;;-1:-1:-1;;;25480:13:2;;;;;;;;;;;;;;;:42;:74;;;;;25527:27;25542:8;25551:1;25542:11;;;;;;-1:-1:-1;;;25542:11:2;;;;;;;;;;;;;;;25527:14;:27::i;:::-;25526:28;25480:74;25476:146;;;25580:4;25574:10;;25602:5;;25476:146;25457:3;;;;:::i;:::-;;;;25414:218;;;;25649:3;25641:37;;;;-1:-1:-1;;;25641:37:2;;;;;;;:::i;:::-;25720:9;25715:241;25739:10;:17;25735:1;:21;25715:241;;;25806:16;25781:10;25792:1;25781:13;;;;;;-1:-1:-1;;;25781:13:2;;;;;;;;;;;;;;;:42;:74;;;;;25828:27;25843:8;25852:1;25843:11;;;;;;-1:-1:-1;;;25843:11:2;;;;;;;;25828:27;25827:28;25781:74;25777:169;;;25875:33;25890:8;25899:1;25890:11;;;;;;-1:-1:-1;;;25890:11:2;;;;;;;;;;;;;;;25903:4;25875:14;:33::i;:::-;25926:5;;25777:169;25758:3;;;;:::i;:::-;;;;25715:241;;;;25982:25;25991:12;:10;:12::i;:::-;26005:1;25982:8;:25::i;28880:119::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;28969:23:2::1;28979:7;28988:3;28969:9;:23::i;14663:114::-:0;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;14750:20:2::1;14758:7;14767:2;14750:7;:20::i;8852:207::-:0;8900:7;8942:15;;8923:16;;:34;8919:73;;;-1:-1:-1;8980:1:2;8973:8;;8919:73;9008:44;9050:1;9008:37;9028:16;;9008:15;;:19;;:37;;;;:::i;4967:133::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;5056:29:2::1;:37:::0;4967:133::o;5366:320:4:-;5535:41;5554:12;:10;:12::i;:::-;5568:7;5535:18;:41::i;:::-;5527:103;;;;-1:-1:-1;;;5527:103:4;;;;;;;:::i;:::-;5640:39;5654:4;5660:2;5664:7;5673:5;5640:13;:39::i;711:123:18:-;775:4;798:29;:16;819:7;798:20;:29::i;26264:272:2:-;26306:15;26324:12;:10;:12::i;:::-;26306:30;;26354:25;26371:7;26354:16;:25::i;:::-;26346:58;;;;-1:-1:-1;;;26346:58:2;;;;;;;:::i;:::-;26442:35;26463:7;26472:4;26442:20;:35::i;:::-;26504:25;26518:7;26527:1;26504:13;:25::i;29030:123::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;29121:25:2::1;29133:7;29142:3;29121:11;:25::i;28729:121::-:0;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;28819:24:2::1;28830:7;28839:3;28819:10;:24::i;23394:603::-:0;23466:11;23479:9;23490:12;23504:11;23517;23530:8;23540:13;23555:10;23640:20;23652:7;23640:11;:20::i;:::-;23614:46;;-1:-1:-1;23614:46:2;-1:-1:-1;23614:46:2;-1:-1:-1;23704:23:2;23719:7;23704:14;:23::i;:::-;23695:32;;23791:5;23782:14;;23834:19;23845:7;23834:10;:19::i;:::-;23828:25;;23901;23918:7;23901:16;:25::i;:::-;23890:36;;23968:22;23982:7;23968:13;:22::i;:::-;23960:30;;23394:603;;;;;;;;;:::o;1084:47::-;;;;:::o;1030:48::-;;;;:::o;12129:121::-;12195:4;12218:25;;;:16;:25;;;;;;;;;12129:121::o;12776:107::-;-1:-1:-1;;;;;12858:18:2;12835:4;12858:18;;;:9;:18;;;;;;;;;12776:107::o;2671:338:4:-;2744:13;2777:16;2785:7;2777;:16::i;:::-;2769:76;;;;-1:-1:-1;;;2769:76:4;;;;;;;:::i;:::-;2856:21;2880:10;:8;:10::i;:::-;2856:34;;2931:1;2913:7;2907:21;:25;:95;;;;;;;;;;;;;;;;;2959:7;2968:18;:7;:16;:18::i;:::-;2942:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2907:95;2900:102;2671:338;-1:-1:-1;;;2671:338:4:o;4306:121:2:-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;4391:21:2::1;:29:::0;4306:121::o;12010:113::-;12072:4;12095:21;;;:12;:21;;;;;;;;;12010:113::o;3927:55::-;;;;;;;;;;;;;:::o;26020:238::-;26084:4;26104:28;26124:7;26104:19;:28::i;:::-;:62;;;;;26137:29;26158:7;26137:20;:29::i;:::-;26136:30;26104:62;:88;;;;;26191:1;26170:18;:16;:18::i;24555:659::-;24638:18;;24617:4;;24638:18;;;;;24633:77;;-1:-1:-1;24694:5:2;24687:12;;24633:77;24745:16;:14;:16::i;:::-;24741:64;;-1:-1:-1;24789:5:2;24782:12;;24741:64;24816:25;24843:27;24874:18;24884:7;24874:9;:18::i;:::-;24815:77;;-1:-1:-1;24815:77:2;-1:-1:-1;24902:11:2;;24923:203;24947:10;:17;24943:1;:21;24923:203;;;25014:14;24989:10;25000:1;24989:13;;;;;;-1:-1:-1;;;24989:13:2;;;;;;;;;;;;;;;:40;:76;;;;;25034:31;25053:8;25062:1;25053:11;;;;;;-1:-1:-1;;;25053:11:2;;;;;;;;25034:31;25033:32;24989:76;24985:131;;;25091:10;:3;25099:1;25091:7;:10::i;:::-;25085:16;;24985:131;24966:3;;;;:::i;:::-;;;;24923:203;;;;25147:1;25140:3;:8;25136:50;;25171:4;25164:11;;;;;;;25136:50;-1:-1:-1;25202:5:2;;24555:659;-1:-1:-1;;;;24555:659:2:o;12387:119::-;-1:-1:-1;;;;;12475:24:2;12452:4;12475:24;;;:15;:24;;;;;;;;;12387:119::o;10369:110::-;10417:7;10443:29;10460:11;;10443:12;;:16;;:29;;;;:::i;4501:162:4:-;-1:-1:-1;;;;;4621:25:4;;;4598:4;4621:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4501:162::o;24003:546:2:-;24082:15;;24061:4;;24082:15;;;;;24077:59;;-1:-1:-1;24120:5:2;24113:12;;24077:59;24171:13;:11;:13::i;:::-;24167:61;;-1:-1:-1;24212:5:2;24205:12;;24167:61;24239:25;24266:27;24297:18;24307:7;24297:9;:18::i;:::-;24238:77;;;;24330:9;24325:196;24349:10;:17;24345:1;:21;24325:196;;;24416:16;24391:10;24402:1;24391:13;;;;;;-1:-1:-1;;;24391:13:2;;;;;;;;;;;;;;;:42;:74;;;;;24438:27;24453:8;24462:1;24453:11;;;;;;-1:-1:-1;;;24453:11:2;;;;;;;;24438:27;24437:28;24391:74;24387:124;;;24492:4;24485:11;;;;;;;24387:124;24368:3;;;;:::i;:::-;;;;24325:196;;12579:191;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;12669:9:2::1;12664:100;12688:8;:15;12684:1;:19;12664:100;;;12749:4;12724:9;:22;12734:8;12743:1;12734:11;;;;;;-1:-1:-1::0;;;12734:11:2::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;12724:22:2::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;12724:22:2;:29;;-1:-1:-1;;12724:29:2::1;::::0;::::1;;::::0;;;::::1;::::0;;12705:3;::::1;::::0;::::1;:::i;:::-;;;;12664:100;;4120:30:::0;;;;;;;;;:::o;1842:189:12:-;1192:12;:10;:12::i;:::-;-1:-1:-1;;;;;1181:23:12;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1181:23:12;;1173:68;;;;-1:-1:-1;;;1173:68:12;;;;;;;:::i;:::-;-1:-1:-1;;;;;1930:22:12;::::1;1922:73;;;;-1:-1:-1::0;;;1922:73:12::1;;;;;;;:::i;:::-;2005:19;2015:8;2005:9;:19::i;893:37:2:-:0;;;;:::o;26774:257::-;26813:15;26831:12;:10;:12::i;:::-;26813:30;;26861:22;26875:7;26861:13;:22::i;:::-;26853:52;;;;-1:-1:-1;;;26853:52:2;;;;;;;:::i;:::-;26943:32;26961:7;26970:4;26943:17;:32::i;:::-;27002:22;27013:7;27022:1;27002:10;:22::i;30588:201::-;588:30:18;605:12;:10;:12::i;588:30::-;580:107;;;;-1:-1:-1;;;580:107:18;;;;;;;:::i;:::-;30725:27:2::1;30735:7;30744;30725:9;:27::i;:::-;30762:20;30770:7;30779:2;30762:7;:20::i;10176:187::-:0;10220:7;10258:11;;10243:12;;:26;10239:65;;;-1:-1:-1;10292:1:2;10285:8;;10239:65;10320:36;10354:1;10320:29;10336:12;;10320:11;;:15;;:29;;;;:::i;297:175:15:-;374:18;378:4;384:7;374:3;:18::i;:::-;373:19;365:63;;;;-1:-1:-1;;;365:63:15;;;;;;;:::i;:::-;-1:-1:-1;;;;;438:20:15;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;438:27:15;461:4;438:27;;;297:175::o;589:96:1:-;668:10;589:96;:::o;14886:428:2:-;14996:16;;:23;;15017:1;14996:20;:23::i;:::-;14966:17;;:26;;14988:3;14966:21;:26::i;:::-;:53;;14958:77;;;;-1:-1:-1;;;14958:77:2;;;;;;;:::i;:::-;15050:9;15045:263;15065:3;15061:1;:7;15045:263;;;15121:15;15139:19;:17;:19::i;:::-;15121:37;;15211:27;15221:7;15230;15211:9;:27::i;:::-;15252:45;15260:7;15277:18;15269:27;15252:7;:45::i;:::-;-1:-1:-1;15070:3:2;;;;:::i;:::-;;;;15045:263;;15320:413;15424:13;;:20;;15442:1;15424:17;:20::i;:::-;15397:14;;:23;;15416:3;15397:18;:23::i;:::-;:47;;15389:71;;;;-1:-1:-1;;;15389:71:2;;;;;;;:::i;:::-;15475:9;15470:257;15490:3;15486:1;:7;15470:257;;;15546:15;15564:16;:14;:16::i;:::-;15546:34;;15633:27;15643:7;15652;15633:9;:27::i;:::-;15674:42;15682:7;15699:15;15691:24;;15674:42;-1:-1:-1;15495:3:2;;;;:::i;:::-;;;;15470:257;;17491:418;17597:14;;:21;;17616:1;17597:18;:21::i;:::-;17569:15;;:24;;17589:3;17569:19;:24::i;:::-;:49;;17561:73;;;;-1:-1:-1;;;17561:73:2;;;;;;;:::i;:::-;17649:9;17644:259;17664:3;17660:1;:7;17644:259;;;17720:15;17738:17;:15;:17::i;:::-;17720:35;;17808:27;17818:7;17827;17808:9;:27::i;:::-;17849:43;17857:7;17874:16;17866:25;;17849:43;-1:-1:-1;17669:3:2;;;;:::i;:::-;;;;17644:259;;17915:408;18017:12;;:19;;18034:1;18017:16;:19::i;:::-;17991:13;;:22;;18009:3;17991:17;:22::i;:::-;:45;;17983:69;;;;-1:-1:-1;;;17983:69:2;;;;;;;:::i;:::-;18067:9;18062:255;18082:3;18078:1;:7;18062:255;;;18138:15;18156;:13;:15::i;:::-;18138:33;;18224:27;18234:7;18243;18224:9;:27::i;:::-;18265:41;18273:7;18290:14;18282:23;;18265:41;-1:-1:-1;18087:3:2;;;;:::i;:::-;;;;18062:255;;18329:423;18437:15;;:22;;18457:1;18437:19;:22::i;:::-;18408:16;;:25;;18429:3;18408:20;:25::i;:::-;:51;;18400:75;;;;-1:-1:-1;;;18400:75:2;;;;;;;:::i;:::-;18490:9;18485:261;18505:3;18501:1;:7;18485:261;;;18561:15;18579:18;:16;:18::i;:::-;18561:36;;18650:27;18660:7;18669;18650:9;:27::i;:::-;18691:44;18699:7;18716:17;18708:26;;18691:44;-1:-1:-1;18510:3:2;;;;:::i;:::-;;;;18485:261;;18758:408;18860:12;;:19;;18877:1;18860:16;:19::i;:::-;18834:13;;:22;;18852:3;18834:17;:22::i;:::-;:45;;18826:69;;;;-1:-1:-1;;;18826:69:2;;;;;;;:::i;:::-;18910:9;18905:255;18925:3;18921:1;:7;18905:255;;;18981:15;18999;:13;:15::i;:::-;18981:33;;19067:27;19077:7;19086;19067:9;:27::i;:::-;19108:41;19116:7;19133:14;19125:23;;19108:41;-1:-1:-1;18930:3:2;;;;:::i;:::-;;;;18905:255;;19172:418;19278:14;;:21;;19297:1;19278:18;:21::i;:::-;19250:15;;:24;;19270:3;19250:19;:24::i;:::-;:49;;19242:73;;;;-1:-1:-1;;;19242:73:2;;;;;;;:::i;:::-;19330:9;19325:259;19345:3;19341:1;:7;19325:259;;;19401:15;19419:17;:15;:17::i;:::-;19401:35;;19489:27;19499:7;19508;19489:9;:27::i;:::-;19530:43;19538:7;19555:16;19547:25;;19530:43;-1:-1:-1;19350:3:2;;;;:::i;:::-;;;;19325:259;;19596:418;19702:14;;:21;;19721:1;19702:18;:21::i;:::-;19674:15;;:24;;19694:3;19674:19;:24::i;:::-;:49;;19666:73;;;;-1:-1:-1;;;19666:73:2;;;;;;;:::i;:::-;19754:9;19749:259;19769:3;19765:1;:7;19749:259;;;19825:15;19843:17;:15;:17::i;:::-;19825:35;;19913:27;19923:7;19932;19913:9;:27::i;:::-;19954:43;19962:7;19979:16;19971:25;;19954:43;-1:-1:-1;19774:3:2;;;;:::i;:::-;;;;19749:259;;20020:403;20120:11;;:18;;20136:1;20120:15;:18::i;:::-;20095:12;;:21;;20112:3;20095:16;:21::i;:::-;:43;;20087:67;;;;-1:-1:-1;;;20087:67:2;;;;;;;:::i;:::-;20169:9;20164:253;20184:3;20180:1;:7;20164:253;;;20240:15;20258:14;:12;:14::i;:::-;20240:32;;20325:27;20335:7;20344;20325:9;:27::i;:::-;20366:40;20374:7;20391:13;20383:22;;20366:40;-1:-1:-1;20189:3:2;;;;:::i;:::-;;;;20164:253;;20429:428;20539:16;;:23;;20560:1;20539:20;:23::i;:::-;20509:17;;:26;;20531:3;20509:21;:26::i;:::-;:53;;20501:77;;;;-1:-1:-1;;;20501:77:2;;;;;;;:::i;:::-;20593:9;20588:263;20608:3;20604:1;:7;20588:263;;;20664:15;20682:19;:17;:19::i;:::-;20664:37;;20754:27;20764:7;20773;20754:9;:27::i;:::-;20795:45;20803:7;20820:18;20812:27;;20795:45;-1:-1:-1;20613:3:2;;;;:::i;:::-;;;;20588:263;;20863:413;20967:13;;:20;;20985:1;20967:17;:20::i;:::-;20940:14;;:23;;20959:3;20940:18;:23::i;:::-;:47;;20932:71;;;;-1:-1:-1;;;20932:71:2;;;;;;;:::i;:::-;21018:9;21013:257;21033:3;21029:1;:7;21013:257;;;21089:15;21107:16;:14;:16::i;:::-;21089:34;;21176:27;21186:7;21195;21176:9;:27::i;:::-;21217:42;21225:7;21242:15;21234:24;;21217:42;-1:-1:-1;21038:3:2;;;;:::i;:::-;;;;21013:257;;1435:288:4;1537:4;-1:-1:-1;;;;;;1568:40:4;;-1:-1:-1;;;1568:40:4;;:100;;-1:-1:-1;;;;;;;1620:48:4;;-1:-1:-1;;;1620:48:4;1568:100;:148;;;;1680:36;1704:11;1680:23;:36::i;747:134:16:-;805:7;831:43;835:1;838;831:43;;;;;;;;;;;;;;;;;:3;:43::i;307:176::-;365:7;;396:5;400:1;396;:5;:::i;:::-;384:17;;424:1;419;:6;;411:46;;;;-1:-1:-1;;;411:46:16;;;;;;;:::i;7158:125:4:-;7223:4;7246:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7246:16:4;:30;;;7158:125::o;11009:171::-;11083:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11083:29:4;-1:-1:-1;;;;;11083:29:4;;;;;;;;:24;;11136:23;11083:24;11136:14;:23::i;:::-;-1:-1:-1;;;;;11127:46:4;;;;;;;;;;;11009:171;;:::o;7441:344::-;7534:4;7558:16;7566:7;7558;:16::i;:::-;7550:73;;;;-1:-1:-1;;;7550:73:4;;;;;;;:::i;:::-;7633:13;7649:23;7664:7;7649:14;:23::i;:::-;7633:39;;7701:5;-1:-1:-1;;;;;7690:16:4;:7;-1:-1:-1;;;;;7690:16:4;;:51;;;;7734:7;-1:-1:-1;;;;;7710:31:4;:20;7722:7;7710:11;:20::i;:::-;-1:-1:-1;;;;;7710:31:4;;7690:51;:87;;;;7745:32;7762:5;7769:7;7745:16;:32::i;:::-;7682:96;7441:344;-1:-1:-1;;;;7441:344:4:o;10338:560::-;10492:4;-1:-1:-1;;;;;10465:31:4;:23;10480:7;10465:14;:23::i;:::-;-1:-1:-1;;;;;10465:31:4;;10457:85;;;;-1:-1:-1;;;10457:85:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;10560:16:4;;10552:65;;;;-1:-1:-1;;;10552:65:4;;;;;;;:::i;:::-;10628:39;10649:4;10655:2;10659:7;10628:20;:39::i;:::-;10729:29;10746:1;10750:7;10729:8;:29::i;:::-;-1:-1:-1;;;;;10769:15:4;;;;;;:9;:15;;;;;:20;;10788:1;;10769:15;:20;;10788:1;;10769:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10799:13:4;;;;;;:9;:13;;;;;:18;;10816:1;;10799:13;:18;;10816:1;;10799:18;:::i;:::-;;;;-1:-1:-1;;10827:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10827:21:4;-1:-1:-1;;;;;10827:21:4;;;;;;;;;10864:27;;10827:16;;10864:27;;;;;;;10338:560;;;:::o;11533:114:2:-;11608:25;;;;:16;:25;;;;;;:32;;-1:-1:-1;;11608:32:2;;;;;;;;;;11533:114::o;9666:348:4:-;9725:13;9741:23;9756:7;9741:14;:23::i;:::-;9725:39;;9775:48;9796:5;9811:1;9815:7;9775:20;:48::i;:::-;9861:29;9878:1;9882:7;9861:8;:29::i;:::-;-1:-1:-1;;;;;9901:16:4;;;;;;:9;:16;;;;;:21;;9921:1;;9901:16;:21;;9921:1;;9901:21;:::i;:::-;;;;-1:-1:-1;;9939:16:4;;;;:7;:16;;;;;;9932:23;;-1:-1:-1;;;;;;9932:23:4;;;9971:36;9947:7;;9939:16;-1:-1:-1;;;;;9971:36:4;;;;;9939:16;;9971:36;9666:348;;:::o;1208:151:18:-;1275:32;:16;1299:7;1275:23;:32::i;:::-;1322:30;;-1:-1:-1;;;;;1322:30:18;;;;;;;;1208:151;:::o;11313:102:2:-;11382:19;;;;:10;:19;;;;;;:26;;-1:-1:-1;;11382:26:2;;;;;;;;;;11313:102::o;13678:104::-;13730:13;13762;13755:20;;;;;:::i;2037:169:12:-;2111:6;;;-1:-1:-1;;;;;2127:17:12;;;-1:-1:-1;;;;;;2127:17:12;;;;;;;2159:40;;2111:6;;;2127:17;2111:6;;2159:40;;2092:16;;2159:40;2037:169;;:::o;1059:143:18:-;1123:29;:16;1144:7;1123:20;:29::i;:::-;1167:28;;-1:-1:-1;;;;;1167:28:18;;;;;;;;1059:143;:::o;1592:459:16:-;1650:7;1891:6;1887:45;;-1:-1:-1;1920:1:16;1913:8;;1887:45;1942:9;1954:5;1958:1;1954;:5;:::i;:::-;1942:17;-1:-1:-1;1986:1:16;1977:5;1981:1;1942:17;1977:5;:::i;:::-;:10;1969:56;;;;-1:-1:-1;;;1969:56:16;;;;;;;:::i;11421:106:2:-;11492:21;;;;:12;:21;;;;;;:28;;-1:-1:-1;;11492:28:2;;;;;;;;;;11421:106::o;14783:97::-;14848:20;;;;:11;:20;;;;;;:25;14783:97::o;6548:307:4:-;6699:28;6709:4;6715:2;6719:7;6699:9;:28::i;:::-;6745:48;6768:4;6774:2;6778:7;6787:5;6745:22;:48::i;:::-;6737:111;;;;-1:-1:-1;;;6737:111:4;;;;;;;:::i;816:200:15:-;888:4;-1:-1:-1;;;;;912:21:15;;904:68;;;;-1:-1:-1;;;904:68:15;;;;;;;:::i;:::-;-1:-1:-1;;;;;;989:20:15;:11;:20;;;;;;;;;;;;;;;816:200::o;11653:118:2:-;-1:-1:-1;;;;;11730:27:2;;;;;;;;:18;:27;;;;;:34;;-1:-1:-1;;11730:34:2;;;;;;;;;;11653:118::o;279:703:17:-;335:13;552:10;548:51;;-1:-1:-1;578:10:17;;;;;;;;;;;;-1:-1:-1;;;578:10:17;;;;;;548:51;623:5;608:12;662:75;669:9;;662:75;;694:8;;;;:::i;:::-;;-1:-1:-1;716:10:17;;-1:-1:-1;724:2:17;716:10;;:::i;:::-;;;662:75;;;746:19;778:6;768:17;;;;;;-1:-1:-1;;;768:17:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;768:17:17;;746:39;;795:150;802:10;;795:150;;828:11;838:1;828:11;;:::i;:::-;;-1:-1:-1;896:10:17;904:2;896:5;:10;:::i;:::-;883:24;;:2;:24;:::i;:::-;870:39;;853:6;860;853:14;;;;;;-1:-1:-1;;;853:14:17;;;;;;;;;;;;:56;-1:-1:-1;;;;;853:56:17;;;;;;;;-1:-1:-1;923:11:17;932:2;923:11;;:::i;:::-;;;795:150;;11777:112:2;-1:-1:-1;;;;;11851:24:2;;;;;;;;:15;:24;;;;;:31;;-1:-1:-1;;11851:31:2;;;;;;;;;;11777:112::o;8115:108:4:-;8190:26;8200:2;8204:7;8190:26;;;;;;;;;;;;:9;:26::i;5681:152:2:-;5755:17;;5802:24;5755:17;5824:1;5802:21;:24::i;:::-;5782:17;:44;5681:152;:::o;5839:140::-;5910:14;;5951:21;5910:14;5970:1;5951:18;:21::i;:::-;5934:14;:38;5839:140;:::o;5985:144::-;6057:15;;6100:22;6057:15;6120:1;6100:19;:22::i;:::-;6082:15;:40;5985:144;:::o;6135:136::-;6205:13;;6244:20;6205:13;6262:1;6244:17;:20::i;:::-;6228:13;:36;6135:136;:::o;6277:148::-;6350:16;;6395:23;6350:16;6416:1;6395:20;:23::i;:::-;6376:16;:42;6277:148;:::o;6431:136::-;6501:13;;6540:20;6501:13;6558:1;6540:17;:20::i;:::-;6524:13;:36;6431:136;:::o;6573:144::-;6645:15;;6688:22;6645:15;6708:1;6688:19;:22::i;:::-;6670:15;:40;6573:144;:::o;6723:::-;6795:15;;6838:22;6795:15;6858:1;6838:19;:22::i;:::-;6820:15;:40;6723:144;:::o;6873:132::-;6942:12;;6979:19;6942:12;6996:1;6979:16;:19::i;:::-;6964:12;:34;6873:132;:::o;7011:152::-;7085:17;;7132:24;7085:17;7154:1;7132:21;:24::i;:::-;7112:17;:44;7011:152;:::o;7169:140::-;7240:14;;7281:21;7240:14;7300:1;7281:18;:21::i;:::-;7264:14;:38;7169:140;:::o;765:155:3:-;-1:-1:-1;;;;;;873:40:3;;-1:-1:-1;;;873:40:3;765:155;;;:::o;1165:187:16:-;1251:7;1286:12;1278:6;;;;1270:29;;;;-1:-1:-1;;;1270:29:16;;;;;;;;:::i;:::-;-1:-1:-1;1309:9:16;1321:5;1325:1;1321;:5;:::i;:::-;1309:17;1165:187;-1:-1:-1;;;;;1165:187:16:o;2546:572:5:-;2685:45;2712:4;2718:2;2722:7;2685:26;:45::i;:::-;-1:-1:-1;;;;;2745:18:5;;2741:183;;2779:40;2811:7;2779:31;:40::i;:::-;2741:183;;;2848:2;-1:-1:-1;;;;;2840:10:5;:4;-1:-1:-1;;;;;2840:10:5;;2836:88;;2866:47;2899:4;2905:7;2866:32;:47::i;:::-;-1:-1:-1;;;;;2937:16:5;;2933:179;;2969:45;3006:7;2969:36;:45::i;2933:179::-;3041:4;-1:-1:-1;;;;;3035:10:5;:2;-1:-1:-1;;;;;3035:10:5;;3031:81;;3061:40;3089:2;3093:7;3061:27;:40::i;547:180:15:-;626:18;630:4;636:7;626:3;:18::i;:::-;618:64;;;;-1:-1:-1;;;618:64:15;;;;;;;:::i;:::-;-1:-1:-1;;;;;692:20:15;715:5;692:20;;;;;;;;;;;:28;;-1:-1:-1;;692:28:15;;;547:180::o;11733:782:4:-;11883:4;11903:15;:2;-1:-1:-1;;;;;11903:13:4;;:15::i;:::-;11899:610;;;11954:2;-1:-1:-1;;;;;11938:36:4;;11975:12;:10;:12::i;:::-;11989:4;11995:7;12004:5;11938:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11938:72:4;;;;;;;;-1:-1:-1;;11938:72:4;;;;;;;;;;;;:::i;:::-;;;11934:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12181:13:4;;12177:266;;12223:60;;-1:-1:-1;;;12223:60:4;;;;;;;:::i;12177:266::-;12395:6;12389:13;12380:6;12376:2;12372:15;12365:38;11934:523;-1:-1:-1;;;;;;12060:55:4;-1:-1:-1;;;12060:55:4;;-1:-1:-1;12053:62:4;;11899:610;-1:-1:-1;12494:4:4;11733:782;;;;;;:::o;8444:311::-;8569:18;8575:2;8579:7;8569:5;:18::i;:::-;8618:54;8649:1;8653:2;8657:7;8666:5;8618:22;:54::i;:::-;8597:151;;;;-1:-1:-1;;;8597:151:4;;;;;;;:::i;3824:161:5:-;3927:10;:17;;3900:24;;;;:15;:24;;;;;:44;;;3954:24;;;;;;;;;;;;3824:161::o;4602:970::-;4864:22;4914:1;4889:22;4906:4;4889:16;:22::i;:::-;:26;;;;:::i;:::-;4925:18;4946:26;;;:17;:26;;;;;;4864:51;;-1:-1:-1;5076:28:5;;;5072:323;;-1:-1:-1;;;;;5142:18:5;;5120:19;5142:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5191:30;;;;;;:44;;;5307:30;;:17;:30;;;;;:43;;;5072:323;-1:-1:-1;5488:26:5;;;;:17;:26;;;;;;;;5481:33;;;-1:-1:-1;;;;;5531:18:5;;;;;:12;:18;;;;;:34;;;;;;;5524:41;4602:970::o;5860:1061::-;6134:10;:17;6109:22;;6134:21;;6154:1;;6134:21;:::i;:::-;6165:18;6186:24;;;:15;:24;;;;;;6554:10;:26;;6109:46;;-1:-1:-1;6186:24:5;;6109:46;;6554:26;;;;-1:-1:-1;;;6554:26:5;;;;;;;;;;;;;;;;;6532:48;;6616:11;6591:10;6602;6591:22;;;;;;-1:-1:-1;;;6591:22:5;;;;;;;;;;;;;;;;;;;;:36;;;;6695:28;;;:15;:28;;;;;;;:41;;;6864:24;;;;;6857:31;6898:10;:16;;;;;-1:-1:-1;;;6898:16:5;;;;;;;;;;;;;;;;;;;;;;;;;;5860:1061;;;;:::o;3412:217::-;3496:14;3513:20;3530:2;3513:16;:20::i;:::-;-1:-1:-1;;;;;3543:16:5;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3587:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3412:217:5:o;721:377:0:-;1037:20;1083:8;;;721:377::o;9077:372:4:-;-1:-1:-1;;;;;9156:16:4;;9148:61;;;;-1:-1:-1;;;9148:61:4;;;;;;;:::i;:::-;9228:16;9236:7;9228;:16::i;:::-;9227:17;9219:58;;;;-1:-1:-1;;;9219:58:4;;;;;;;:::i;:::-;9288:45;9317:1;9321:2;9325:7;9288:20;:45::i;:::-;-1:-1:-1;;;;;9344:13:4;;;;;;:9;:13;;;;;:18;;9361:1;;9344:13;:18;;9361:1;;9344:18;:::i;:::-;;;;-1:-1:-1;;9372:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9372:21:4;-1:-1:-1;;;;;9372:21:4;;;;;;;;9409:33;;9372:16;;;9409:33;;9372:16;;9409:33;9077:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:409:19;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:19;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:19;;537:42;;527:2;;593:1;590;583:12;608:162;675:20;;731:13;;724:21;714:32;;704:2;;760:1;757;750:12;775:198;;887:2;875:9;866:7;862:23;858:32;855:2;;;908:6;900;893:22;855:2;936:31;957:9;936:31;:::i;978:274::-;;;1107:2;1095:9;1086:7;1082:23;1078:32;1075:2;;;1128:6;1120;1113:22;1075:2;1156:31;1177:9;1156:31;:::i;:::-;1146:41;;1206:40;1242:2;1231:9;1227:18;1206:40;:::i;:::-;1196:50;;1065:187;;;;;:::o;1257:342::-;;;;1403:2;1391:9;1382:7;1378:23;1374:32;1371:2;;;1424:6;1416;1409:22;1371:2;1452:31;1473:9;1452:31;:::i;:::-;1442:41;;1502:40;1538:2;1527:9;1523:18;1502:40;:::i;:::-;1492:50;;1589:2;1578:9;1574:18;1561:32;1551:42;;1361:238;;;;;:::o;1604:702::-;;;;;1776:3;1764:9;1755:7;1751:23;1747:33;1744:2;;;1798:6;1790;1783:22;1744:2;1826:31;1847:9;1826:31;:::i;:::-;1816:41;;1876:40;1912:2;1901:9;1897:18;1876:40;:::i;:::-;1866:50;;1963:2;1952:9;1948:18;1935:32;1925:42;;2018:2;2007:9;2003:18;1990:32;2045:18;2037:6;2034:30;2031:2;;;2082:6;2074;2067:22;2031:2;2110:22;;2163:4;2155:13;;2151:27;-1:-1:-1;2141:2:19;;2197:6;2189;2182:22;2141:2;2225:75;2292:7;2287:2;2274:16;2269:2;2265;2261:11;2225:75;:::i;:::-;2215:85;;;1734:572;;;;;;;:::o;2311:268::-;;;2437:2;2425:9;2416:7;2412:23;2408:32;2405:2;;;2458:6;2450;2443:22;2405:2;2486:31;2507:9;2486:31;:::i;:::-;2476:41;;2536:37;2569:2;2558:9;2554:18;2536:37;:::i;2584:266::-;;;2713:2;2701:9;2692:7;2688:23;2684:32;2681:2;;;2734:6;2726;2719:22;2681:2;2762:31;2783:9;2762:31;:::i;:::-;2752:41;2840:2;2825:18;;;;2812:32;;-1:-1:-1;;;2671:179:19:o;2855:334::-;;;;3001:2;2989:9;2980:7;2976:23;2972:32;2969:2;;;3022:6;3014;3007:22;2969:2;3050:31;3071:9;3050:31;:::i;:::-;3040:41;3128:2;3113:18;;3100:32;;-1:-1:-1;3179:2:19;3164:18;;;3151:32;;2959:230;-1:-1:-1;;;2959:230:19:o;3194:961::-;;3309:2;3352;3340:9;3331:7;3327:23;3323:32;3320:2;;;3373:6;3365;3358:22;3320:2;3418:9;3405:23;3451:18;3443:6;3440:30;3437:2;;;3488:6;3480;3473:22;3437:2;3516:22;;3569:4;3561:13;;3557:27;-1:-1:-1;3547:2:19;;3603:6;3595;3588:22;3547:2;3644;3631:16;3667:65;3682:49;3728:2;3682:49;:::i;:::-;3667:65;:::i;:::-;3766:15;;;3797:12;;;;3829:11;;;3867;;;3859:20;;3855:29;;3852:42;-1:-1:-1;3849:2:19;;;3912:6;3904;3897:22;3849:2;3939:6;3930:15;;3954:171;3968:2;3965:1;3962:9;3954:171;;;4025:25;4046:3;4025:25;:::i;:::-;4013:38;;3986:1;3979:9;;;;;4071:12;;;;4103;;3954:171;;;-1:-1:-1;4144:5:19;3289:866;-1:-1:-1;;;;;;;3289:866:19:o;4160:953::-;;4275:2;4318;4306:9;4297:7;4293:23;4289:32;4286:2;;;4339:6;4331;4324:22;4286:2;4384:9;4371:23;4417:18;4409:6;4406:30;4403:2;;;4454:6;4446;4439:22;4403:2;4482:22;;4535:4;4527:13;;4523:27;-1:-1:-1;4513:2:19;;4569:6;4561;4554:22;4513:2;4610;4597:16;4633:65;4648:49;4694:2;4648:49;:::i;4633:65::-;4732:15;;;4763:12;;;;4795:11;;;4833;;;4825:20;;4821:29;;4818:42;-1:-1:-1;4815:2:19;;;4878:6;4870;4863:22;4815:2;4905:6;4896:15;;4920:163;4934:2;4931:1;4928:9;4920:163;;;4991:17;;4979:30;;4952:1;4945:9;;;;;5029:12;;;;5061;;4920:163;;5118:192;;5227:2;5215:9;5206:7;5202:23;5198:32;5195:2;;;5248:6;5240;5233:22;5195:2;5276:28;5294:9;5276:28;:::i;5315:257::-;;5426:2;5414:9;5405:7;5401:23;5397:32;5394:2;;;5447:6;5439;5432:22;5394:2;5491:9;5478:23;5510:32;5536:5;5510:32;:::i;5577:261::-;;5699:2;5687:9;5678:7;5674:23;5670:32;5667:2;;;5720:6;5712;5705:22;5667:2;5757:9;5751:16;5776:32;5802:5;5776:32;:::i;5843:482::-;;5965:2;5953:9;5944:7;5940:23;5936:32;5933:2;;;5986:6;5978;5971:22;5933:2;6031:9;6018:23;6064:18;6056:6;6053:30;6050:2;;;6101:6;6093;6086:22;6050:2;6129:22;;6182:4;6174:13;;6170:27;-1:-1:-1;6160:2:19;;6216:6;6208;6201:22;6160:2;6244:75;6311:7;6306:2;6293:16;6288:2;6284;6280:11;6244:75;:::i;6330:190::-;;6442:2;6430:9;6421:7;6417:23;6413:32;6410:2;;;6463:6;6455;6448:22;6410:2;-1:-1:-1;6491:23:19;;6400:120;-1:-1:-1;6400:120:19:o;6525:258::-;;;6654:2;6642:9;6633:7;6629:23;6625:32;6622:2;;;6675:6;6667;6660:22;6622:2;-1:-1:-1;;6703:23:19;;;6773:2;6758:18;;;6745:32;;-1:-1:-1;6612:171:19:o;6788:443::-;;6885:5;6879:12;6912:6;6907:3;6900:19;6938:4;6967:2;6962:3;6958:12;6951:19;;7004:2;6997:5;6993:14;7025:3;7037:169;7051:6;7048:1;7045:13;7037:169;;;7112:13;;7100:26;;7146:12;;;;7181:15;;;;7073:1;7066:9;7037:169;;;-1:-1:-1;7222:3:19;;6855:376;-1:-1:-1;;;;;6855:376:19:o;7236:259::-;;7317:5;7311:12;7344:6;7339:3;7332:19;7360:63;7416:6;7409:4;7404:3;7400:14;7393:4;7386:5;7382:16;7360:63;:::i;:::-;7477:2;7456:15;-1:-1:-1;;7452:29:19;7443:39;;;;7484:4;7439:50;;7287:208;-1:-1:-1;;7287:208:19:o;7500:637::-;;7818:6;7812:13;7834:53;7880:6;7875:3;7868:4;7860:6;7856:17;7834:53;:::i;:::-;7950:13;;7909:16;;;;7972:57;7950:13;7909:16;8006:4;7994:17;;7972:57;:::i;:::-;-1:-1:-1;;;8051:20:19;;8080:22;;;8129:1;8118:13;;7788:349;-1:-1:-1;;;;7788:349:19:o;8142:203::-;-1:-1:-1;;;;;8306:32:19;;;;8288:51;;8276:2;8261:18;;8243:102::o;8350:490::-;-1:-1:-1;;;;;8619:15:19;;;8601:34;;8671:15;;8666:2;8651:18;;8644:43;8718:2;8703:18;;8696:34;;;8766:3;8761:2;8746:18;;8739:31;;;8350:490;;8787:47;;8814:19;;8806:6;8787:47;:::i;:::-;8779:55;8553:287;-1:-1:-1;;;;;;8553:287:19:o;8845:267::-;;9024:2;9013:9;9006:21;9044:62;9102:2;9091:9;9087:18;9079:6;9044:62;:::i;9117:477::-;;9374:2;9363:9;9356:21;9400:62;9458:2;9447:9;9443:18;9435:6;9400:62;:::i;:::-;9510:9;9502:6;9498:22;9493:2;9482:9;9478:18;9471:50;9538;9581:6;9573;9538:50;:::i;9599:187::-;9764:14;;9757:22;9739:41;;9727:2;9712:18;;9694:92::o;9791:349::-;10000:14;;9993:22;9975:41;;10059:14;;10052:22;10047:2;10032:18;;10025:50;10118:14;10111:22;10106:2;10091:18;;10084:50;9963:2;9948:18;;9930:210::o;10145:759::-;10465:14;;10458:22;10440:41;;10524:14;;10517:22;10512:2;10497:18;;10490:50;10583:14;;10576:22;10571:2;10556:18;;10549:50;10642:14;;10635:22;10630:2;10615:18;;10608:50;10702:14;10695:22;10689:3;10674:19;;10667:51;10762:14;10755:22;10749:3;10734:19;;10727:51;10822:14;10815:22;10809:3;10794:19;;10787:51;10882:14;10875:22;10869:3;10854:19;;10847:51;10427:3;10412:19;;10394:510::o;10909:221::-;;11058:2;11047:9;11040:21;11078:46;11120:2;11109:9;11105:18;11097:6;11078:46;:::i;11135:332::-;11337:2;11319:21;;;11376:1;11356:18;;;11349:29;-1:-1:-1;;;11409:2:19;11394:18;;11387:39;11458:2;11443:18;;11309:158::o;11472:355::-;11674:2;11656:21;;;11713:2;11693:18;;;11686:30;11752:33;11747:2;11732:18;;11725:61;11818:2;11803:18;;11646:181::o;11832:407::-;12034:2;12016:21;;;12073:2;12053:18;;;12046:30;12112:34;12107:2;12092:18;;12085:62;-1:-1:-1;;;12178:2:19;12163:18;;12156:41;12229:3;12214:19;;12006:233::o;12244:414::-;12446:2;12428:21;;;12485:2;12465:18;;;12458:30;12524:34;12519:2;12504:18;;12497:62;-1:-1:-1;;;12590:2:19;12575:18;;12568:48;12648:3;12633:19;;12418:240::o;12663:402::-;12865:2;12847:21;;;12904:2;12884:18;;;12877:30;12943:34;12938:2;12923:18;;12916:62;-1:-1:-1;;;13009:2:19;12994:18;;12987:36;13055:3;13040:19;;12837:228::o;13070:352::-;13272:2;13254:21;;;13311:2;13291:18;;;13284:30;13350;13345:2;13330:18;;13323:58;13413:2;13398:18;;13244:178::o;13427:335::-;13629:2;13611:21;;;13668:2;13648:18;;;13641:30;-1:-1:-1;;;13702:2:19;13687:18;;13680:41;13753:2;13738:18;;13601:161::o;13767:351::-;13969:2;13951:21;;;14008:2;13988:18;;;13981:30;14047:29;14042:2;14027:18;;14020:57;14109:2;14094:18;;13941:177::o;14123:334::-;14325:2;14307:21;;;14364:2;14344:18;;;14337:30;-1:-1:-1;;;14398:2:19;14383:18;;14376:40;14448:2;14433:18;;14297:160::o;14462:400::-;14664:2;14646:21;;;14703:2;14683:18;;;14676:30;14742:34;14737:2;14722:18;;14715:62;-1:-1:-1;;;14808:2:19;14793:18;;14786:34;14852:3;14837:19;;14636:226::o;14867:349::-;15069:2;15051:21;;;15108:2;15088:18;;;15081:30;15147:27;15142:2;15127:18;;15120:55;15207:2;15192:18;;15041:175::o;15221:343::-;15423:2;15405:21;;;15462:2;15442:18;;;15435:30;-1:-1:-1;;;15496:2:19;15481:18;;15474:49;15555:2;15540:18;;15395:169::o;15569:341::-;15771:2;15753:21;;;15810:2;15790:18;;;15783:30;-1:-1:-1;;;15844:2:19;15829:18;;15822:47;15901:2;15886:18;;15743:167::o;15915:350::-;16117:2;16099:21;;;16156:2;16136:18;;;16129:30;16195:28;16190:2;16175:18;;16168:56;16256:2;16241:18;;16089:176::o;16270:408::-;16472:2;16454:21;;;16511:2;16491:18;;;16484:30;16550:34;16545:2;16530:18;;16523:62;-1:-1:-1;;;16616:2:19;16601:18;;16594:42;16668:3;16653:19;;16444:234::o;16683:339::-;16885:2;16867:21;;;16924:2;16904:18;;;16897:30;-1:-1:-1;;;16958:2:19;16943:18;;16936:45;17013:2;16998:18;;16857:165::o;17027:339::-;17229:2;17211:21;;;17268:2;17248:18;;;17241:30;-1:-1:-1;;;17302:2:19;17287:18;;17280:45;17357:2;17342:18;;17201:165::o;17371:340::-;17573:2;17555:21;;;17612:2;17592:18;;;17585:30;-1:-1:-1;;;17646:2:19;17631:18;;17624:46;17702:2;17687:18;;17545:166::o;17716:340::-;17918:2;17900:21;;;17957:2;17937:18;;;17930:30;-1:-1:-1;;;17991:2:19;17976:18;;17969:46;18047:2;18032:18;;17890:166::o;18061:420::-;18263:2;18245:21;;;18302:2;18282:18;;;18275:30;18341:34;18336:2;18321:18;;18314:62;18412:26;18407:2;18392:18;;18385:54;18471:3;18456:19;;18235:246::o;18486:342::-;18688:2;18670:21;;;18727:2;18707:18;;;18700:30;-1:-1:-1;;;18761:2:19;18746:18;;18739:48;18819:2;18804:18;;18660:168::o;18833:406::-;19035:2;19017:21;;;19074:2;19054:18;;;19047:30;19113:34;19108:2;19093:18;;19086:62;-1:-1:-1;;;19179:2:19;19164:18;;19157:40;19229:3;19214:19;;19007:232::o;19244:405::-;19446:2;19428:21;;;19485:2;19465:18;;;19458:30;19524:34;19519:2;19504:18;;19497:62;-1:-1:-1;;;19590:2:19;19575:18;;19568:39;19639:3;19624:19;;19418:231::o;19654:397::-;19856:2;19838:21;;;19895:2;19875:18;;;19868:30;19934:34;19929:2;19914:18;;19907:62;-1:-1:-1;;;20000:2:19;19985:18;;19978:31;20041:3;20026:19;;19828:223::o;20056:356::-;20258:2;20240:21;;;20277:18;;;20270:30;20336:34;20331:2;20316:18;;20309:62;20403:2;20388:18;;20230:182::o;20417:397::-;20619:2;20601:21;;;20658:2;20638:18;;;20631:30;20697:34;20692:2;20677:18;;20670:62;-1:-1:-1;;;20763:2:19;20748:18;;20741:31;20804:3;20789:19;;20591:223::o;20819:408::-;21021:2;21003:21;;;21060:2;21040:18;;;21033:30;21099:34;21094:2;21079:18;;21072:62;-1:-1:-1;;;21165:2:19;21150:18;;21143:42;21217:3;21202:19;;20993:234::o;21232:356::-;21434:2;21416:21;;;21453:18;;;21446:30;21512:34;21507:2;21492:18;;21485:62;21579:2;21564:18;;21406:182::o;21593:398::-;21795:2;21777:21;;;21834:2;21814:18;;;21807:30;21873:34;21868:2;21853:18;;21846:62;-1:-1:-1;;;21939:2:19;21924:18;;21917:32;21981:3;21966:19;;21767:224::o;21996:405::-;22198:2;22180:21;;;22237:2;22217:18;;;22210:30;22276:34;22271:2;22256:18;;22249:62;-1:-1:-1;;;22342:2:19;22327:18;;22320:39;22391:3;22376:19;;22170:231::o;22406:428::-;22608:2;22590:21;;;22647:2;22627:18;;;22620:30;;;22686:34;22666:18;;;22659:62;22757:34;22752:2;22737:18;;22730:62;22824:3;22809:19;;22580:254::o;22839:411::-;23041:2;23023:21;;;23080:2;23060:18;;;23053:30;23119:34;23114:2;23099:18;;23092:62;-1:-1:-1;;;23185:2:19;23170:18;;23163:45;23240:3;23225:19;;23013:237::o;23255:344::-;23457:2;23439:21;;;23496:2;23476:18;;;23469:30;-1:-1:-1;;;23530:2:19;23515:18;;23508:50;23590:2;23575:18;;23429:170::o;23604:341::-;23806:2;23788:21;;;23845:2;23825:18;;;23818:30;-1:-1:-1;;;23879:2:19;23864:18;;23857:47;23936:2;23921:18;;23778:167::o;23950:397::-;24152:2;24134:21;;;24191:2;24171:18;;;24164:30;24230:34;24225:2;24210:18;;24203:62;-1:-1:-1;;;24296:2:19;24281:18;;24274:31;24337:3;24322:19;;24124:223::o;24352:413::-;24554:2;24536:21;;;24593:2;24573:18;;;24566:30;24632:34;24627:2;24612:18;;24605:62;-1:-1:-1;;;24698:2:19;24683:18;;24676:47;24755:3;24740:19;;24526:239::o;24770:408::-;24972:2;24954:21;;;25011:2;24991:18;;;24984:30;25050:34;25045:2;25030:18;;25023:62;-1:-1:-1;;;25116:2:19;25101:18;;25094:42;25168:3;25153:19;;24944:234::o;25183:345::-;25385:2;25367:21;;;25424:2;25404:18;;;25397:30;-1:-1:-1;;;25458:2:19;25443:18;;25436:51;25519:2;25504:18;;25357:171::o;25533:355::-;25735:2;25717:21;;;25774:2;25754:18;;;25747:30;25813:33;25808:2;25793:18;;25786:61;25879:2;25864:18;;25707:181::o;25893:340::-;26095:2;26077:21;;;26134:2;26114:18;;;26107:30;-1:-1:-1;;;26168:2:19;26153:18;;26146:46;26224:2;26209:18;;26067:166::o;26238:339::-;26440:2;26422:21;;;26479:2;26459:18;;;26452:30;-1:-1:-1;;;26513:2:19;26498:18;;26491:45;26568:2;26553:18;;26412:165::o;26582:177::-;26728:25;;;26716:2;26701:18;;26683:76::o;26764:251::-;26834:2;26828:9;26864:17;;;26911:18;26896:34;;26932:22;;;26893:62;26890:2;;;26958:18;;:::i;:::-;26994:2;26987:22;26808:207;;-1:-1:-1;26808:207:19:o;27020:192::-;;27119:18;27111:6;27108:30;27105:2;;;27141:18;;:::i;:::-;-1:-1:-1;27201:4:19;27182:17;;;27178:28;;27095:117::o;27217:128::-;;27288:1;27284:6;27281:1;27278:13;27275:2;;;27294:18;;:::i;:::-;-1:-1:-1;27330:9:19;;27265:80::o;27350:120::-;;27416:1;27406:2;;27421:18;;:::i;:::-;-1:-1:-1;27455:9:19;;27396:74::o;27475:168::-;;27581:1;27577;27573:6;27569:14;27566:1;27563:21;27558:1;27551:9;27544:17;27540:45;27537:2;;;27588:18;;:::i;:::-;-1:-1:-1;27628:9:19;;27527:116::o;27648:125::-;;27716:1;27713;27710:8;27707:2;;;27721:18;;:::i;:::-;-1:-1:-1;27758:9:19;;27697:76::o;27778:258::-;27850:1;27860:113;27874:6;27871:1;27868:13;27860:113;;;27950:11;;;27944:18;27931:11;;;27924:39;27896:2;27889:10;27860:113;;;27991:6;27988:1;27985:13;27982:2;;;-1:-1:-1;;28026:1:19;28008:16;;28001:27;27831:205::o;28041:380::-;28126:1;28116:12;;28173:1;28163:12;;;28184:2;;28238:4;28230:6;28226:17;28216:27;;28184:2;28291;28283:6;28280:14;28260:18;28257:38;28254:2;;;28337:10;28332:3;28328:20;28325:1;28318:31;28372:4;28369:1;28362:15;28400:4;28397:1;28390:15;28426:135;;-1:-1:-1;;28486:17:19;;28483:2;;;28506:18;;:::i;:::-;-1:-1:-1;28553:1:19;28542:13;;28473:88::o;28566:112::-;;28624:1;28614:2;;28629:18;;:::i;:::-;-1:-1:-1;28663:9:19;;28604:74::o;28683:127::-;28744:10;28739:3;28735:20;28732:1;28725:31;28775:4;28772:1;28765:15;28799:4;28796:1;28789:15;28815:127;28876:10;28871:3;28867:20;28864:1;28857:31;28907:4;28904:1;28897:15;28931:4;28928:1;28921:15;28947:127;29008:10;29003:3;28999:20;28996:1;28989:31;29039:4;29036:1;29029:15;29063:4;29060:1;29053:15;29079:133;-1:-1:-1;;;;;;29155:32:19;;29145:43;;29135:2;;29202:1;29199;29192:12

Swarm Source

ipfs://c6662bff5039695f42d42241af537893464966062f2f862dc49e69369643f01e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.