ETH Price: $1,611.15 (+1.22%)
Gas: 8 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multi Chain

Transaction Hash
Method
Block
From
To
Value
SHAPESHIFT182283232023-09-27 16:35:5912 hrs 59 mins ago1695832559IN
0x5bB233...F5710Fd6
0 ETH0.0034694824.46087454
SHAPESHIFT181492222023-09-16 14:13:4711 days 15 hrs ago1694873627IN
0x5bB233...F5710Fd6
0 ETH0.0023678115.16681773
SHAPESHIFT181203512023-09-12 12:48:2315 days 16 hrs ago1694522903IN
0x5bB233...F5710Fd6
0 ETH0.0031294720.04556286
SHAPESHIFT181203462023-09-12 12:47:2315 days 16 hrs ago1694522843IN
0x5bB233...F5710Fd6
0 ETH0.0030704619.66761281
SHAPESHIFT181203282023-09-12 12:43:4715 days 16 hrs ago1694522627IN
0x5bB233...F5710Fd6
0 ETH0.0030912219.80208723
SHAPESHIFT181099112023-09-11 1:43:3517 days 3 hrs ago1694396615IN
0x5bB233...F5710Fd6
0 ETH0.001551210.93646631
SHAPESHIFT181091922023-09-10 23:17:4717 days 6 hrs ago1694387867IN
0x5bB233...F5710Fd6
0 ETH0.0016258411.46270859
SHAPESHIFT181091802023-09-10 23:15:2317 days 6 hrs ago1694387723IN
0x5bB233...F5710Fd6
0 ETH0.001624811.45631646
SHAPESHIFT181091672023-09-10 23:12:4717 days 6 hrs ago1694387567IN
0x5bB233...F5710Fd6
0 ETH0.0016852111.88123853
SHAPESHIFT180681062023-09-05 5:11:1123 days 24 mins ago1693890671IN
0x5bB233...F5710Fd6
0 ETH0.001488529.53536362
SHAPESHIFT180272542023-08-30 11:56:1128 days 17 hrs ago1693396571IN
0x5bB233...F5710Fd6
0 ETH0.0029035520.47094668
SHAPESHIFT180272502023-08-30 11:55:2328 days 17 hrs ago1693396523IN
0x5bB233...F5710Fd6
0 ETH0.0030339621.39033045
SHAPESHIFT180272372023-08-30 11:52:4728 days 17 hrs ago1693396367IN
0x5bB233...F5710Fd6
0 ETH0.0029912321.08909841
SHAPESHIFT180272342023-08-30 11:52:1128 days 17 hrs ago1693396331IN
0x5bB233...F5710Fd6
0 ETH0.0029391720.72208018
SHAPESHIFT180272312023-08-30 11:51:3528 days 17 hrs ago1693396295IN
0x5bB233...F5710Fd6
0 ETH0.0029871621.06039721
SHAPESHIFT180272202023-08-30 11:49:2328 days 17 hrs ago1693396163IN
0x5bB233...F5710Fd6
0 ETH0.0029907921.08602145
SHAPESHIFT180272142023-08-30 11:48:1128 days 17 hrs ago1693396091IN
0x5bB233...F5710Fd6
0 ETH0.0029049920.48106597
SHAPESHIFT180272072023-08-30 11:46:4728 days 17 hrs ago1693396007IN
0x5bB233...F5710Fd6
0 ETH0.0032629623.00682524
SHAPESHIFT180166762023-08-29 0:20:3530 days 5 hrs ago1693268435IN
0x5bB233...F5710Fd6
0 ETH0.0029476220.78163637
SHAPESHIFT180130692023-08-28 12:13:2330 days 17 hrs ago1693224803IN
0x5bB233...F5710Fd6
0 ETH0.0038758827.32610475
SHAPESHIFT180130652023-08-28 12:12:3530 days 17 hrs ago1693224755IN
0x5bB233...F5710Fd6
0 ETH0.0017929427.3565704
SHAPESHIFT180080622023-08-27 19:24:2331 days 10 hrs ago1693164263IN
0x5bB233...F5710Fd6
0 ETH0.0015528710.94825708
SHAPESHIFT180057572023-08-27 11:39:1131 days 17 hrs ago1693136351IN
0x5bB233...F5710Fd6
0 ETH0.0018856113.29414658
SHAPESHIFT180057482023-08-27 11:37:2331 days 17 hrs ago1693136243IN
0x5bB233...F5710Fd6
0 ETH0.0017489312.33051377
SHAPESHIFT180057432023-08-27 11:36:2331 days 17 hrs ago1693136183IN
0x5bB233...F5710Fd6
0 ETH0.0017753712.51690595
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BLONKSuri

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : URI.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.7;

import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/// @title BLONKS URI Shapeshifter Contract v3.0.0
/// @author Matto AKA MonkMatto
/// @notice This contract manages BLONKS token image and metadata generation.
/// @dev This contract allows EVM renderer changes.
/// @custom:security-contact [email protected]

interface iBLONKSmain {
    function ownerOf(uint256 _tokenId) external view returns (address);

    function tokenEntropyMap(uint256 _tokenId) external view returns (uint256);
}

interface iBLONKStraits {
    function calculateTraitsArray(
        uint256 _tokenEntropy
    ) external view returns (uint8[11] memory);

    function calculateTraitsJSON(
        uint8[11] memory _traitsArray
    ) external view returns (string memory);
}

interface iBLONKSlocations {
    function calculateLocatsArray(
        uint256 _ownerEntropy,
        uint256 _tokenEntropy,
        uint8[11] memory _traitsArray
    ) external view returns (uint16[110] memory);
}

interface iBLONKSsvg {
    function assembleSVG(
        uint256 _ownerEntropy,
        uint256 _tokenEntropy,
        uint8[11] memory _traitsArray,
        uint16[110] memory _locatsArray
    ) external view returns (string memory);
}

interface iBLONKSdescriptions {
    function buildDynamicDescription(
        address _ownerAddy,
        uint256 _shapeshiftCount,
        string memory _collectionDescription,
        string memory _shifterName,
        uint256 _shifterActive,
        uint256 _shifterMax
    ) external view returns (string memory);
}

interface iDelegate {
    function checkDelegateForContract(
        address _delegate,
        address _vault,
        address _contract
    ) external view returns (bool);
}

contract BLONKSuri is Ownable {
    using Counters for Counters.Counter;
    using Strings for string;

    address private constant mainContract =
        0x7f463b874eC264dC7BD8C780f5790b4Fc371F11f;
    address private constant delegateContract =
        0x00000000000076A84feF008CDAbe6409d2FE638B;
    address private descriptionsContract;

    struct Shapeshifter {
        address traits;
        address locats;
        address svg;
        string name;
        uint16 max;
        uint16 active;
        bool openToAll;
    }

    Shapeshifter[] public Shapeshifters;
    string public artistNameOverride;
    mapping(uint256 => uint256) public shifterStateMap;
    mapping(uint256 => uint256) public idMap;
    mapping(uint256 => bool) private idSetMap;
    mapping(uint256 => bool) public tokenStateLock;
    mapping(uint256 => string) public uniqueNameMap;
    mapping(uint256 => mapping(uint256 => uint256)) public tokenShiftCounts;
    bool public shapeshiftingAllowed;

    event Shapeshift(uint256 indexed _tokenId, uint256 _state);

    event NewShapeshifter(
        address _traits,
        address _locations,
        address _svg,
        string _name,
        uint16 _max,
        bool _openToAll
    );

    function SHAPESHIFT(uint256 _tokenId, uint256 _state) external {
        address ownerAddy = iBLONKSmain(mainContract).ownerOf(_tokenId);
        require(shapeshiftingAllowed == true, "Shapeshifting is paused");
        require(
            ownerAddy == msg.sender ||
                iDelegate(delegateContract).checkDelegateForContract(
                    msg.sender,
                    ownerAddy,
                    mainContract
                ) ||
                msg.sender == owner(),
            "Not authorized"
        );
        require(_state < Shapeshifters.length, "Shapeshifter out of range");
        require(
            Shapeshifters[_state].active < Shapeshifters[_state].max,
            "Shapeshift max reached"
        );
        bool isOpenShifter = Shapeshifters[_state].openToAll;
        require(isOpenShifter || msg.sender == owner(), "Not authorized");
        require(tokenStateLock[_tokenId] == false, "Token is locked");
        if (!isOpenShifter) {
            tokenStateLock[_tokenId] = true;
        }
        if (idSetMap[_tokenId] == false) {
            idSetMap[_tokenId] = true;
            idMap[
                iBLONKSmain(mainContract).tokenEntropyMap(_tokenId)
            ] = _tokenId;
        }
        Shapeshifters[shifterStateMap[_tokenId]].active--;
        Shapeshifters[_state].active++;
        shifterStateMap[_tokenId] = _state;
        tokenShiftCounts[_tokenId][_state]++;
        emit Shapeshift(_tokenId, _state);
    }

    function addShapeshifter(
        address _traits,
        address _locations,
        address _svg,
        string memory _name,
        uint16 _max,
        bool _openToAll
    ) external onlyOwner {
        uint16 _active;
        if (Shapeshifters.length == 0) {
            _active = 4444;
        }
        Shapeshifters.push(
            Shapeshifter(
                _traits,
                _locations,
                _svg,
                _name,
                _max,
                _active,
                _openToAll
            )
        );
        emit NewShapeshifter(
            _traits,
            _locations,
            _svg,
            _name,
            _max,
            _openToAll
        );
    }

    function addUniqueName(
        uint256 _tokenId,
        string memory _name
    ) external onlyOwner {
        require(tokenStateLock[_tokenId] == true, "Token is not locked");
        uniqueNameMap[_tokenId] = _name;
    }

    function getShapeshiftAvailability()
        external
        view
        returns (uint256[] memory)
    {
        uint256[] memory available = new uint256[](Shapeshifters.length);
        for (uint256 i = 0; i < available.length; i++) {
            available[i] = (Shapeshifters[i].max - Shapeshifters[i].active);
        }
        return available;
    }

    function getTokenShapeshiftTotals(
        uint256 _tokenId
    ) public view returns (uint256) {
        uint256 totals;
        for (uint256 i = 0; i < Shapeshifters.length; i++) {
            totals += tokenShiftCounts[_tokenId][i];
        }
        return totals;
    }

    function buildMetaPart(
        uint256 _tokenId,
        string memory _collectionDescription,
        address _artistAddy,
        uint256 _royaltyBps,
        string memory _collection,
        string memory _website,
        string memory _externalURL
    ) external view virtual returns (string memory) {
        string memory _name;
        if (tokenStateLock[_tokenId] == false) {
            _name = Shapeshifters[shifterStateMap[_tokenId]].name;
        } else {
            _name = uniqueNameMap[_tokenId];
        }

        uint256 state = shifterStateMap[_tokenId];
        string memory tokenDescription = iBLONKSdescriptions(
            descriptionsContract
        ).buildDynamicDescription(
                iBLONKSmain(mainContract).ownerOf(_tokenId),
                getTokenShapeshiftTotals(_tokenId),
                _collectionDescription,
                Shapeshifters[state].name,
                Shapeshifters[state].active,
                Shapeshifters[state].max
            );

        string memory metaP = string(
            abi.encodePacked(
                '{"name":"',
                _name,
                ' #',
                Strings.toString(_tokenId),
                '","artist":"',
                artistNameOverride,
                '","description":"',
                tokenDescription,
                '","royaltyInfo":{"artistAddress":"',
                Strings.toHexString(uint160(_artistAddy), 20),
                '","royaltyFeeByID":',
                Strings.toString(_royaltyBps / 100),
                '},"collection_name":"',
                _collection,
                '","website":"',
                _website,
                '","external_url":"',
                _externalURL,
                '","script_type":"Solidity","image_type":"Generative SVG","image":"data:image/svg+xml;base64,'
            )
        );
        return metaP;
    }

    function buildContractURI(
        string memory _collectionDescription,
        string memory _externalURL,
        uint256 _royaltyBps,
        address _artistAddy,
        string memory _svg
    ) external view virtual returns (string memory) {
        string memory b64svg = Base64.encode(bytes(_svg));
        string memory contractURI = string(
            abi.encodePacked(
                '{"name":"BLONKS","description":"',
                _collectionDescription,
                '","image":"data:image/svg+xml;base64,',
                b64svg,
                '","external_link":"',
                _externalURL,
                '","royalty_basis_points":',
                Strings.toString(_royaltyBps),
                ',"royalty_recipient":"',
                Strings.toHexString(uint160(_artistAddy), 20),
                '"}'
            )
        );
        return contractURI;
    }

    function getLegibleTokenURI(
        string memory _metaP,
        uint256 _tokenEntropy,
        uint256 _ownerEntropy
    ) external view virtual returns (string memory) {
        uint256 _state = shifterStateMap[idMap[_tokenEntropy]];
        uint8[11] memory traitsArray = iBLONKStraits(
            Shapeshifters[_state].traits
        ).calculateTraitsArray(_tokenEntropy);
        _tokenEntropy /= 10 ** 18;
        string memory traitsJSON = iBLONKStraits(Shapeshifters[_state].traits)
            .calculateTraitsJSON(traitsArray);
        uint16[110] memory locatsArray = iBLONKSlocations(
            Shapeshifters[_state].locats
        ).calculateLocatsArray(_ownerEntropy, _tokenEntropy, traitsArray);
        _ownerEntropy /= 10 ** 29;
        _tokenEntropy /= 10 ** 15;
        string memory svg = iBLONKSsvg(Shapeshifters[_state].svg).assembleSVG(
            _ownerEntropy,
            _tokenEntropy,
            traitsArray,
            locatsArray
        );
        string memory legibleURI = string(
            abi.encodePacked(
                _metaP,
                Base64.encode(bytes(svg)),
                '",',
                traitsJSON,
                "}"
            )
        );
        return legibleURI;
    }

    function buildPreviewSVG(
        uint256 _tokenEntropy,
        uint256 _addressEntropy
    ) external view virtual returns (string memory) {
        return
            _renderSVG(
                _tokenEntropy,
                _addressEntropy,
                shifterStateMap[idMap[_tokenEntropy]]
            );
    }

    function _renderSVG(
        uint256 _tokenEntropy,
        uint256 _addressEntropy,
        uint256 _state
    ) internal view returns (string memory) {
        uint8[11] memory traitsArray = iBLONKStraits(
            Shapeshifters[_state].traits
        ).calculateTraitsArray(_tokenEntropy);
        _tokenEntropy /= 10 ** 18;
        uint16[110] memory locatsArray = iBLONKSlocations(
            Shapeshifters[_state].locats
        ).calculateLocatsArray(_addressEntropy, _tokenEntropy, traitsArray);
        _addressEntropy /= 10 ** 29;
        _tokenEntropy /= 10 ** 15;
        string memory svg = iBLONKSsvg(Shapeshifters[_state].svg).assembleSVG(
            _addressEntropy,
            _tokenEntropy,
            traitsArray,
            locatsArray
        );
        return svg;
    }

    function RANDOM_RENDER_SVG(
        uint256 _state
    ) public view returns (string memory) {
        uint256 _tokenEntropy = uint256(
            keccak256(
                abi.encodePacked(blockhash(block.number - 1), block.basefee)
            )
        );
        uint256 _addressEntropy = uint256(
            uint160(
                uint256(
                    keccak256(abi.encodePacked(block.coinbase, block.timestamp))
                )
            )
        );
        return _renderSVG(_tokenEntropy, _addressEntropy, _state);
    }

    function RANDOM_RENDER_B64(
        uint256 _state
    ) external view returns (string memory) {
        string memory svg = RANDOM_RENDER_SVG(_state);
        return
            string(
                abi.encodePacked(
                    "data:image/svg+xml;base64,",
                    Base64.encode(bytes(svg))
                )
            );
    }

    function PREVIEW_SHAPESHIFTER_SVG(
        uint256 _tokenId,
        address _addy,
        uint256 _state
    ) public view returns (string memory) {
        require(_state < Shapeshifters.length, "Shapeshifter out of range");
        return
            _renderSVG(
                iBLONKSmain(mainContract).tokenEntropyMap(_tokenId),
                uint256(uint160(_addy)),
                _state
            );
    }

    function PREVIEW_SHAPESHIFTER_B64(
        uint256 _tokenId,
        address _addy,
        uint256 _state
    ) external view returns (string memory) {
        string memory svg = PREVIEW_SHAPESHIFTER_SVG(_tokenId, _addy, _state);
        return
            string(
                abi.encodePacked(
                    "data:image/svg+xml;base64,",
                    Base64.encode(bytes(svg))
                )
            );
    }

    function getBase64TokenURI(
        string memory _legibleURI
    ) external view virtual returns (string memory) {
        string memory URIBase64 = string(
            abi.encodePacked(
                "data:application/json;base64,",
                Base64.encode(bytes(_legibleURI))
            )
        );
        return URIBase64;
    }

    function setArtistNameOverride(
        string memory _artistNameOverride
    ) external onlyOwner {
        artistNameOverride = _artistNameOverride;
    }

    function setDescriptionsContract(
        address _descriptionsContract
    ) external onlyOwner {
        descriptionsContract = _descriptionsContract;
    }

    function updateShapeshifter(
        uint256 _state,
        address _traits,
        address _locats,
        address _svg,
        string memory _name,
        uint16 _max,
        uint16 _active,
        bool _openToAll
    ) external onlyOwner {
        require(shapeshiftingAllowed == false, "Shapeshifter setting allowed");
        Shapeshifter storage shapeshifter = Shapeshifters[_state];
        shapeshifter.traits = _traits;
        shapeshifter.locats = _locats;
        shapeshifter.svg = _svg;
        shapeshifter.name = _name;
        shapeshifter.max = _max;
        shapeshifter.active = _active;
        shapeshifter.openToAll = _openToAll;
    }

    function toggleShapeshiftingAllowed() external onlyOwner {
        shapeshiftingAllowed = !shapeshiftingAllowed;
    }
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";
        uint256 encodedLen = 4 * ((len + 2) / 3);
        bytes memory result = new bytes(encodedLen + 32);
        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)
            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)
                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)
                )
                out := shl(224, out)
                mstore(resultPtr, out)
                resultPtr := add(resultPtr, 4)
            }
            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
            mstore(result, encodedLen)
        }
        return string(result);
    }
}

File 2 of 5 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * 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() {
        _transferOwnership(_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 {
        _transferOwnership(address(0));
    }

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

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

File 3 of 5 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

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 4 of 5 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 5 of 5 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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;
    }
}

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_traits","type":"address"},{"indexed":false,"internalType":"address","name":"_locations","type":"address"},{"indexed":false,"internalType":"address","name":"_svg","type":"address"},{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"indexed":false,"internalType":"uint16","name":"_max","type":"uint16"},{"indexed":false,"internalType":"bool","name":"_openToAll","type":"bool"}],"name":"NewShapeshifter","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_state","type":"uint256"}],"name":"Shapeshift","type":"event"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_addy","type":"address"},{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"PREVIEW_SHAPESHIFTER_B64","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_addy","type":"address"},{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"PREVIEW_SHAPESHIFTER_SVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"RANDOM_RENDER_B64","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"RANDOM_RENDER_SVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"SHAPESHIFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"Shapeshifters","outputs":[{"internalType":"address","name":"traits","type":"address"},{"internalType":"address","name":"locats","type":"address"},{"internalType":"address","name":"svg","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint16","name":"max","type":"uint16"},{"internalType":"uint16","name":"active","type":"uint16"},{"internalType":"bool","name":"openToAll","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_traits","type":"address"},{"internalType":"address","name":"_locations","type":"address"},{"internalType":"address","name":"_svg","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint16","name":"_max","type":"uint16"},{"internalType":"bool","name":"_openToAll","type":"bool"}],"name":"addShapeshifter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"addUniqueName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artistNameOverride","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_collectionDescription","type":"string"},{"internalType":"string","name":"_externalURL","type":"string"},{"internalType":"uint256","name":"_royaltyBps","type":"uint256"},{"internalType":"address","name":"_artistAddy","type":"address"},{"internalType":"string","name":"_svg","type":"string"}],"name":"buildContractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_collectionDescription","type":"string"},{"internalType":"address","name":"_artistAddy","type":"address"},{"internalType":"uint256","name":"_royaltyBps","type":"uint256"},{"internalType":"string","name":"_collection","type":"string"},{"internalType":"string","name":"_website","type":"string"},{"internalType":"string","name":"_externalURL","type":"string"}],"name":"buildMetaPart","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenEntropy","type":"uint256"},{"internalType":"uint256","name":"_addressEntropy","type":"uint256"}],"name":"buildPreviewSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_legibleURI","type":"string"}],"name":"getBase64TokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_metaP","type":"string"},{"internalType":"uint256","name":"_tokenEntropy","type":"uint256"},{"internalType":"uint256","name":"_ownerEntropy","type":"uint256"}],"name":"getLegibleTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getShapeshiftAvailability","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getTokenShapeshiftTotals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_artistNameOverride","type":"string"}],"name":"setArtistNameOverride","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_descriptionsContract","type":"address"}],"name":"setDescriptionsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shapeshiftingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"shifterStateMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleShapeshiftingAllowed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenShiftCounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenStateLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uniqueNameMap","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"},{"internalType":"address","name":"_traits","type":"address"},{"internalType":"address","name":"_locats","type":"address"},{"internalType":"address","name":"_svg","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint16","name":"_max","type":"uint16"},{"internalType":"uint16","name":"_active","type":"uint16"},{"internalType":"bool","name":"_openToAll","type":"bool"}],"name":"updateShapeshifter","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801562000010575f80fd5b5062000031620000256200003760201b60201c565b6200003e60201b60201c565b620000ff565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6152c4806200010d5f395ff3fe608060405234801561000f575f80fd5b50600436106101cd575f3560e01c80638da5cb5b11610102578063d5024f06116100a0578063f2fde38b1161006f578063f2fde38b146105b5578063fd8fd066146105d1578063fd9639b3146105ef578063fddb1e801461060b576101cd565b8063d5024f0614610503578063e2fc2ae514610533578063ec805b5414610569578063f1267abd14610599576101cd565b8063a14def54116100dc578063a14def5414610443578063ac7dfb3014610473578063afa94d6c146104a3578063b4d06332146104d3576101cd565b80638da5cb5b146103c55780638ecfc5e4146103e35780639114ad5c14610413576101cd565b8063549fc8371161016f57806370735bcd1161014957806370735bcd14610351578063715018a61461035b5780637a4a3dc8146103655780637b424a6a14610395576101cd565b8063549fc837146102d35780635b265342146103035780635be38c6314610333576101cd565b8063419fa1fb116101ab578063419fa1fb146102395780634a6ad9ab146102695780634d2e12691461028557806351bf0f52146102b5576101cd565b80632be699a4146101d157806331289fb3146101ed5780633ef7c2591461021d575b5f80fd5b6101eb60048036038101906101e69190612fd9565b610627565b005b610207600480360381019061020291906130b1565b6108f4565b6040516102149190613156565b60405180910390f35b61023760048036038101906102329190613176565b610932565b005b610253600480360381019061024e9190613243565b610b60565b6040516102609190613156565b60405180910390f35b610283600480360381019061027e9190613243565b610b96565b005b61029f600480360381019061029a919061328a565b610c25565b6040516102ac91906132d7565b60405180910390f35b6102bd610c45565b6040516102ca91906132ff565b60405180910390f35b6102ed60048036038101906102e89190613318565b610c57565b6040516102fa9190613156565b60405180910390f35b61031d60048036038101906103189190613368565b610c99565b60405161032a9190613156565b60405180910390f35b61033b610d08565b6040516103489190613156565b60405180910390f35b610359610d94565b005b610363610e3a565b005b61037f600480360381019061037a91906130b1565b610ec1565b60405161038c9190613156565b60405180910390f35b6103af60048036038101906103aa9190613318565b610f5c565b6040516103bc9190613156565b60405180910390f35b6103cd61105a565b6040516103da9190613442565b60405180910390f35b6103fd60048036038101906103f8919061345b565b611081565b60405161040a9190613156565b60405180910390f35b61042d600480360381019061042891906130b1565b61145f565b60405161043a91906132d7565b60405180910390f35b61045d600480360381019061045891906130b1565b611474565b60405161046a91906132d7565b60405180910390f35b61048d600480360381019061048891906130b1565b611489565b60405161049a91906132d7565b60405180910390f35b6104bd60048036038101906104b8919061328a565b6114e5565b6040516104ca9190613156565b60405180910390f35b6104ed60048036038101906104e891906130b1565b61151c565b6040516104fa9190613156565b60405180910390f35b61051d600480360381019061051891906130b1565b6115b1565b60405161052a91906132ff565b60405180910390f35b61054d600480360381019061054891906130b1565b6115ce565b6040516105609796959493929190613577565b60405180910390f35b610583600480360381019061057e91906135eb565b611726565b6040516105909190613156565b60405180910390f35b6105b360048036038101906105ae9190613657565b611ad7565b005b6105cf60048036038101906105ca9190613657565b611b96565b005b6105d9611c8c565b6040516105e69190613739565b60405180910390f35b61060960048036038101906106049190613759565b611d95565b005b6106256004803603810190610620919061328a565b611e98565b005b61062f612546565b73ffffffffffffffffffffffffffffffffffffffff1661064d61105a565b73ffffffffffffffffffffffffffffffffffffffff16146106a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069a906137fd565b60405180910390fd5b5f80600280549050036106b65761115c90505b60026040518060e001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018561ffff1681526020018361ffff168152602001841515815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030190816108429190613a15565b506080820151816004015f6101000a81548161ffff021916908361ffff16021790555060a08201518160040160026101000a81548161ffff021916908361ffff16021790555060c08201518160040160046101000a81548160ff02191690831515021790555050507fea094a222979d47956b4d87b928349a1560ebdd04d74b9641c8e279fe55e39958787878787876040516108e396959493929190613ae4565b60405180910390a150505050505050565b60605f6109008361151c565b905061090b8161254d565b60405160200161091b9190613bce565b604051602081830303815290604052915050919050565b61093a612546565b73ffffffffffffffffffffffffffffffffffffffff1661095861105a565b73ffffffffffffffffffffffffffffffffffffffff16146109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a5906137fd565b60405180910390fd5b5f1515600a5f9054906101000a900460ff16151514610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990613c39565b60405180910390fd5b5f60028981548110610a1757610a16613c57565b5b905f5260205f209060050201905087815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084816003019081610afb9190613a15565b5083816004015f6101000a81548161ffff021916908361ffff160217905550828160040160026101000a81548161ffff021916908361ffff160217905550818160040160046101000a81548160ff021916908315150217905550505050505050505050565b60605f610b6c8361254d565b604051602001610b7c9190613cce565b604051602081830303815290604052905080915050919050565b610b9e612546565b73ffffffffffffffffffffffffffffffffffffffff16610bbc61105a565b73ffffffffffffffffffffffffffffffffffffffff1614610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c09906137fd565b60405180910390fd5b8060039081610c219190613a15565b5050565b6009602052815f5260405f20602052805f5260405f205f91509150505481565b600a5f9054906101000a900460ff1681565b60605f610c65858585610f5c565b9050610c708161254d565b604051602001610c809190613bce565b6040516020818303038152906040529150509392505050565b60605f610ca58361254d565b90505f878288610cb4896126dd565b610cd58973ffffffffffffffffffffffffffffffffffffffff166014612836565b604051602001610ce9959493929190613ed1565b6040516020818303038152906040529050809250505095945050505050565b60038054610d1590613848565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4190613848565b8015610d8c5780601f10610d6357610100808354040283529160200191610d8c565b820191905f5260205f20905b815481529060010190602001808311610d6f57829003601f168201915b505050505081565b610d9c612546565b73ffffffffffffffffffffffffffffffffffffffff16610dba61105a565b73ffffffffffffffffffffffffffffffffffffffff1614610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e07906137fd565b60405180910390fd5b600a5f9054906101000a900460ff1615600a5f6101000a81548160ff021916908315150217905550565b610e42612546565b73ffffffffffffffffffffffffffffffffffffffff16610e6061105a565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead906137fd565b60405180910390fd5b610ebf5f612a6b565b565b6008602052805f5260405f205f915090508054610edd90613848565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990613848565b8015610f545780601f10610f2b57610100808354040283529160200191610f54565b820191905f5260205f20905b815481529060010190602001808311610f3757829003601f168201915b505050505081565b60606002805490508210610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613fa7565b60405180910390fd5b611051737f463b874ec264dc7bd8c780f5790b4fc371f11f73ffffffffffffffffffffffffffffffffffffffff1663dbc119d7866040518263ffffffff1660e01b8152600401610ff591906132d7565b602060405180830381865afa158015611010573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110349190613fd9565b8473ffffffffffffffffffffffffffffffffffffffff1684612b2c565b90509392505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060805f151560075f8b81526020019081526020015f205f9054906101000a900460ff1615150361116e57600260045f8b81526020019081526020015f2054815481106110d1576110d0613c57565b5b905f5260205f20906005020160030180546110eb90613848565b80601f016020809104026020016040519081016040528092919081815260200182805461111790613848565b80156111625780601f1061113957610100808354040283529160200191611162565b820191905f5260205f20905b81548152906001019060200180831161114557829003601f168201915b50505050509050611209565b60085f8a81526020019081526020015f20805461118a90613848565b80601f01602080910402602001604051908101604052809291908181526020018280546111b690613848565b80156112015780601f106111d857610100808354040283529160200191611201565b820191905f5260205f20905b8154815290600101906020018083116111e457829003601f168201915b505050505090505b5f60045f8b81526020019081526020015f205490505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630a61de26737f463b874ec264dc7bd8c780f5790b4fc371f11f73ffffffffffffffffffffffffffffffffffffffff16636352211e8e6040518263ffffffff1660e01b81526004016112a991906132d7565b602060405180830381865afa1580156112c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e89190614018565b6112f18e611489565b8d6002878154811061130657611305613c57565b5b905f5260205f2090600502016003016002888154811061132957611328613c57565b5b905f5260205f20906005020160040160029054906101000a900461ffff166002898154811061135b5761135a613c57565b5b905f5260205f2090600502016004015f9054906101000a900461ffff166040518763ffffffff1660e01b8152600401611399969594939291906140f4565b5f60405180830381865afa1580156113b3573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906113db91906141cf565b90505f836113e88d6126dd565b60038461140c8e73ffffffffffffffffffffffffffffffffffffffff166014612836565b61142160648f61141c9190614270565b6126dd565b8d8d8d60405160200161143c99989796959493929190614676565b604051602081830303815290604052905080945050505050979650505050505050565b6005602052805f5260405f205f915090505481565b6004602052805f5260405f205f915090505481565b5f805f5b6002805490508110156114db5760095f8581526020019081526020015f205f8281526020019081526020015f2054826114c69190614762565b915080806114d390614795565b91505061148d565b5080915050919050565b6060611514838360045f60055f8981526020019081526020015f205481526020019081526020015f2054612b2c565b905092915050565b60605f60014361152c91906147dc565b404860405160200161153f929190614858565b604051602081830303815290604052805190602001205f1c90505f414260405160200161156d9291906148d9565b604051602081830303815290604052805190602001205f1c73ffffffffffffffffffffffffffffffffffffffff1690506115a8828286612b2c565b92505050919050565b6007602052805f5260405f205f915054906101000a900460ff1681565b600281815481106115dd575f80fd5b905f5260205f2090600502015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600301805461166b90613848565b80601f016020809104026020016040519081016040528092919081815260200182805461169790613848565b80156116e25780601f106116b9576101008083540402835291602001916116e2565b820191905f5260205f20905b8154815290600101906020018083116116c557829003601f168201915b505050505090806004015f9054906101000a900461ffff16908060040160029054906101000a900461ffff16908060040160049054906101000a900460ff16905087565b60605f60045f60055f8781526020019081526020015f205481526020019081526020015f205490505f6002828154811061176357611762613c57565b5b905f5260205f2090600502015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3ec0475866040518263ffffffff1660e01b81526004016117c991906132d7565b61016060405180830381865afa1580156117e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180991906149ec565b9050670de0b6b3a76400008561181f9190614270565b94505f6002838154811061183657611835613c57565b5b905f5260205f2090600502015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aaebbea8836040518263ffffffff1660e01b815260040161189c9190614abd565b5f60405180830381865afa1580156118b6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906118de91906141cf565b90505f600284815481106118f5576118f4613c57565b5b905f5260205f2090600502016001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663401a28d88789866040518463ffffffff1660e01b815260040161196093929190614ad7565b610dc060405180830381865afa15801561197c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a09190614bcf565b90506c01431e0fae6d7217caa0000000866119bb9190614270565b955066038d7ea4c68000876119d09190614270565b96505f600285815481106119e7576119e6613c57565b5b905f5260205f2090600502016002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663703996db888a87866040518563ffffffff1660e01b8152600401611a549493929190614ca0565b5f60405180830381865afa158015611a6e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611a9691906141cf565b90505f89611aa38361254d565b85604051602001611ab693929190614d79565b60405160208183030381529060405290508096505050505050509392505050565b611adf612546565b73ffffffffffffffffffffffffffffffffffffffff16611afd61105a565b73ffffffffffffffffffffffffffffffffffffffff1614611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a906137fd565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b9e612546565b73ffffffffffffffffffffffffffffffffffffffff16611bbc61105a565b73ffffffffffffffffffffffffffffffffffffffff1614611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c09906137fd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790614e2f565b60405180910390fd5b611c8981612a6b565b50565b60605f60028054905067ffffffffffffffff811115611cae57611cad612e49565b5b604051908082528060200260200182016040528015611cdc5781602001602082028036833780820191505090505b5090505f5b8151811015611d8d5760028181548110611cfe57611cfd613c57565b5b905f5260205f20906005020160040160029054906101000a900461ffff1660028281548110611d3057611d2f613c57565b5b905f5260205f2090600502016004015f9054906101000a900461ffff16611d579190614e4d565b61ffff16828281518110611d6e57611d6d613c57565b5b6020026020010181815250508080611d8590614795565b915050611ce1565b508091505090565b611d9d612546565b73ffffffffffffffffffffffffffffffffffffffff16611dbb61105a565b73ffffffffffffffffffffffffffffffffffffffff1614611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e08906137fd565b60405180910390fd5b6001151560075f8481526020019081526020015f205f9054906101000a900460ff16151514611e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6c90614ecc565b60405180910390fd5b8060085f8481526020019081526020015f209081611e939190613a15565b505050565b5f737f463b874ec264dc7bd8c780f5790b4fc371f11f73ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401611ee691906132d7565b602060405180830381865afa158015611f01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f259190614018565b905060011515600a5f9054906101000a900460ff16151514611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614f34565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061205057506d76a84fef008cdabe6409d2fe638b73ffffffffffffffffffffffffffffffffffffffff166390c9a2d03383737f463b874ec264dc7bd8c780f5790b4fc371f11f6040518463ffffffff1660e01b815260040161201093929190614f52565b602060405180830381865afa15801561202b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204f9190614f9b565b5b8061208d575061205e61105a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6120cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c390615010565b60405180910390fd5b6002805490508210612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210a90613fa7565b60405180910390fd5b6002828154811061212757612126613c57565b5b905f5260205f2090600502016004015f9054906101000a900461ffff1661ffff166002838154811061215c5761215b613c57565b5b905f5260205f20906005020160040160029054906101000a900461ffff1661ffff16106121be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b590615078565b60405180910390fd5b5f600283815481106121d3576121d2613c57565b5b905f5260205f20906005020160040160049054906101000a900460ff1690508080612230575061220161105a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61226f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226690615010565b60405180910390fd5b5f151560075f8681526020019081526020015f205f9054906101000a900460ff161515146122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c9906150e0565b60405180910390fd5b8061230157600160075f8681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b5f151560065f8681526020019081526020015f205f9054906101000a900460ff161515036123f457600160065f8681526020019081526020015f205f6101000a81548160ff0219169083151502179055508360055f737f463b874ec264dc7bd8c780f5790b4fc371f11f73ffffffffffffffffffffffffffffffffffffffff1663dbc119d7886040518263ffffffff1660e01b81526004016123a391906132d7565b602060405180830381865afa1580156123be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e29190613fd9565b81526020019081526020015f20819055505b600260045f8681526020019081526020015f20548154811061241957612418613c57565b5b905f5260205f209060050201600401600281819054906101000a900461ffff1680929190612446906150fe565b91906101000a81548161ffff021916908361ffff160217905550506002838154811061247557612474613c57565b5b905f5260205f209060050201600401600281819054906101000a900461ffff16809291906124a290615125565b91906101000a81548161ffff021916908361ffff160217905550508260045f8681526020019081526020015f208190555060095f8581526020019081526020015f205f8481526020019081526020015f205f81548092919061250390614795565b9190505550837ff5830b23450539a2f9b0c796013b74ddc22d97cb3f0ed1b9aee471ac875abf918460405161253891906132d7565b60405180910390a250505050565b5f33905090565b60605f825190505f81036125725760405180602001604052805f8152509150506126d8565b5f60036002836125829190614762565b61258c9190614270565b6004612598919061514e565b90505f6020826125a89190614762565b67ffffffffffffffff8111156125c1576125c0612e49565b5b6040519080825280601f01601f1916602001820160405280156125f35781602001600182028036833780820191505090505b5090505f60405180606001604052806040815260200161524f60409139905060018101602083015f5b868110156126955760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061261c565b5060038606600181146126af57600281146126bf576126ca565b613d3d60f01b60028303526126ca565b603d60f81b60018303525b508484525050819450505050505b919050565b60605f8203612723576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612831565b5f8290505f5b5f821461275257808061273b90614795565b915050600a8261274b9190614270565b9150612729565b5f8167ffffffffffffffff81111561276d5761276c612e49565b5b6040519080825280601f01601f19166020018201604052801561279f5781602001600182028036833780820191505090505b5090505b5f851461282a576001826127b791906147dc565b9150600a856127c6919061518f565b60306127d29190614762565b60f81b8183815181106127e8576127e7613c57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856128239190614270565b94506127a3565b8093505050505b919050565b60605f6002836002612848919061514e565b6128529190614762565b67ffffffffffffffff81111561286b5761286a612e49565b5b6040519080825280601f01601f19166020018201604052801561289d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106128d4576128d3613c57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061293757612936613c57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002612975919061514e565b61297f9190614762565b90505b6001811115612a1e577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129c1576129c0613c57565b5b1a60f81b8282815181106129d8576129d7613c57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080612a17906151bf565b9050612982565b505f8414612a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5890615230565b60405180910390fd5b8091505092915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60605f60028381548110612b4357612b42613c57565b5b905f5260205f2090600502015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3ec0475866040518263ffffffff1660e01b8152600401612ba991906132d7565b61016060405180830381865afa158015612bc5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612be991906149ec565b9050670de0b6b3a764000085612bff9190614270565b94505f60028481548110612c1657612c15613c57565b5b905f5260205f2090600502016001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663401a28d88688856040518463ffffffff1660e01b8152600401612c8193929190614ad7565b610dc060405180830381865afa158015612c9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cc19190614bcf565b90506c01431e0fae6d7217caa000000085612cdc9190614270565b945066038d7ea4c6800086612cf19190614270565b95505f60028581548110612d0857612d07613c57565b5b905f5260205f2090600502016002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663703996db878986866040518563ffffffff1660e01b8152600401612d759493929190614ca0565b5f60405180830381865afa158015612d8f573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190612db791906141cf565b90508093505050509392505050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612e0082612dd7565b9050919050565b612e1081612df6565b8114612e1a575f80fd5b50565b5f81359050612e2b81612e07565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612e7f82612e39565b810181811067ffffffffffffffff82111715612e9e57612e9d612e49565b5b80604052505050565b5f612eb0612dc6565b9050612ebc8282612e76565b919050565b5f67ffffffffffffffff821115612edb57612eda612e49565b5b612ee482612e39565b9050602081019050919050565b828183375f83830152505050565b5f612f11612f0c84612ec1565b612ea7565b905082815260208101848484011115612f2d57612f2c612e35565b5b612f38848285612ef1565b509392505050565b5f82601f830112612f5457612f53612e31565b5b8135612f64848260208601612eff565b91505092915050565b5f61ffff82169050919050565b612f8381612f6d565b8114612f8d575f80fd5b50565b5f81359050612f9e81612f7a565b92915050565b5f8115159050919050565b612fb881612fa4565b8114612fc2575f80fd5b50565b5f81359050612fd381612faf565b92915050565b5f805f805f8060c08789031215612ff357612ff2612dcf565b5b5f61300089828a01612e1d565b965050602061301189828a01612e1d565b955050604061302289828a01612e1d565b945050606087013567ffffffffffffffff81111561304357613042612dd3565b5b61304f89828a01612f40565b935050608061306089828a01612f90565b92505060a061307189828a01612fc5565b9150509295509295509295565b5f819050919050565b6130908161307e565b811461309a575f80fd5b50565b5f813590506130ab81613087565b92915050565b5f602082840312156130c6576130c5612dcf565b5b5f6130d38482850161309d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156131135780820151818401526020810190506130f8565b5f8484015250505050565b5f613128826130dc565b61313281856130e6565b93506131428185602086016130f6565b61314b81612e39565b840191505092915050565b5f6020820190508181035f83015261316e818461311e565b905092915050565b5f805f805f805f80610100898b03121561319357613192612dcf565b5b5f6131a08b828c0161309d565b98505060206131b18b828c01612e1d565b97505060406131c28b828c01612e1d565b96505060606131d38b828c01612e1d565b955050608089013567ffffffffffffffff8111156131f4576131f3612dd3565b5b6132008b828c01612f40565b94505060a06132118b828c01612f90565b93505060c06132228b828c01612f90565b92505060e06132338b828c01612fc5565b9150509295985092959890939650565b5f6020828403121561325857613257612dcf565b5b5f82013567ffffffffffffffff81111561327557613274612dd3565b5b61328184828501612f40565b91505092915050565b5f80604083850312156132a05761329f612dcf565b5b5f6132ad8582860161309d565b92505060206132be8582860161309d565b9150509250929050565b6132d18161307e565b82525050565b5f6020820190506132ea5f8301846132c8565b92915050565b6132f981612fa4565b82525050565b5f6020820190506133125f8301846132f0565b92915050565b5f805f6060848603121561332f5761332e612dcf565b5b5f61333c8682870161309d565b935050602061334d86828701612e1d565b925050604061335e8682870161309d565b9150509250925092565b5f805f805f60a0868803121561338157613380612dcf565b5b5f86013567ffffffffffffffff81111561339e5761339d612dd3565b5b6133aa88828901612f40565b955050602086013567ffffffffffffffff8111156133cb576133ca612dd3565b5b6133d788828901612f40565b94505060406133e88882890161309d565b93505060606133f988828901612e1d565b925050608086013567ffffffffffffffff81111561341a57613419612dd3565b5b61342688828901612f40565b9150509295509295909350565b61343c81612df6565b82525050565b5f6020820190506134555f830184613433565b92915050565b5f805f805f805f60e0888a03121561347657613475612dcf565b5b5f6134838a828b0161309d565b975050602088013567ffffffffffffffff8111156134a4576134a3612dd3565b5b6134b08a828b01612f40565b96505060406134c18a828b01612e1d565b95505060606134d28a828b0161309d565b945050608088013567ffffffffffffffff8111156134f3576134f2612dd3565b5b6134ff8a828b01612f40565b93505060a088013567ffffffffffffffff8111156135205761351f612dd3565b5b61352c8a828b01612f40565b92505060c088013567ffffffffffffffff81111561354d5761354c612dd3565b5b6135598a828b01612f40565b91505092959891949750929550565b61357181612f6d565b82525050565b5f60e08201905061358a5f83018a613433565b6135976020830189613433565b6135a46040830188613433565b81810360608301526135b6818761311e565b90506135c56080830186613568565b6135d260a0830185613568565b6135df60c08301846132f0565b98975050505050505050565b5f805f6060848603121561360257613601612dcf565b5b5f84013567ffffffffffffffff81111561361f5761361e612dd3565b5b61362b86828701612f40565b935050602061363c8682870161309d565b925050604061364d8682870161309d565b9150509250925092565b5f6020828403121561366c5761366b612dcf565b5b5f61367984828501612e1d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6136b48161307e565b82525050565b5f6136c583836136ab565b60208301905092915050565b5f602082019050919050565b5f6136e782613682565b6136f1818561368c565b93506136fc8361369c565b805f5b8381101561372c57815161371388826136ba565b975061371e836136d1565b9250506001810190506136ff565b5085935050505092915050565b5f6020820190508181035f83015261375181846136dd565b905092915050565b5f806040838503121561376f5761376e612dcf565b5b5f61377c8582860161309d565b925050602083013567ffffffffffffffff81111561379d5761379c612dd3565b5b6137a985828601612f40565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6137e76020836130e6565b91506137f2826137b3565b602082019050919050565b5f6020820190508181035f830152613814816137db565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061385f57607f821691505b6020821081036138725761387161381b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026138d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613899565b6138de8683613899565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61391961391461390f8461307e565b6138f6565b61307e565b9050919050565b5f819050919050565b613932836138ff565b61394661393e82613920565b8484546138a5565b825550505050565b5f90565b61395a61394e565b613965818484613929565b505050565b5b818110156139885761397d5f82613952565b60018101905061396b565b5050565b601f8211156139cd5761399e81613878565b6139a78461388a565b810160208510156139b6578190505b6139ca6139c28561388a565b83018261396a565b50505b505050565b5f82821c905092915050565b5f6139ed5f19846008026139d2565b1980831691505092915050565b5f613a0583836139de565b9150826002028217905092915050565b613a1e826130dc565b67ffffffffffffffff811115613a3757613a36612e49565b5b613a418254613848565b613a4c82828561398c565b5f60209050601f831160018114613a7d575f8415613a6b578287015190505b613a7585826139fa565b865550613adc565b601f198416613a8b86613878565b5f5b82811015613ab257848901518255600182019150602085019450602081019050613a8d565b86831015613acf5784890151613acb601f8916826139de565b8355505b6001600288020188555050505b505050505050565b5f60c082019050613af75f830189613433565b613b046020830188613433565b613b116040830187613433565b8181036060830152613b23818661311e565b9050613b326080830185613568565b613b3f60a08301846132f0565b979650505050505050565b5f81905092915050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000005f82015250565b5f613b88601a83613b4a565b9150613b9382613b54565b601a82019050919050565b5f613ba8826130dc565b613bb28185613b4a565b9350613bc28185602086016130f6565b80840191505092915050565b5f613bd882613b7c565b9150613be48284613b9e565b915081905092915050565b7f5368617065736869667465722073657474696e6720616c6c6f776564000000005f82015250565b5f613c23601c836130e6565b9150613c2e82613bef565b602082019050919050565b5f6020820190508181035f830152613c5081613c17565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000005f82015250565b5f613cb8601d83613b4a565b9150613cc382613c84565b601d82019050919050565b5f613cd882613cac565b9150613ce48284613b9e565b915081905092915050565b7f7b226e616d65223a22424c4f4e4b53222c226465736372697074696f6e223a225f82015250565b5f613d23602083613b4a565b9150613d2e82613cef565b602082019050919050565b7f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b62615f8201527f736536342c000000000000000000000000000000000000000000000000000000602082015250565b5f613d93602583613b4a565b9150613d9e82613d39565b602582019050919050565b7f222c2265787465726e616c5f6c696e6b223a22000000000000000000000000005f82015250565b5f613ddd601383613b4a565b9150613de882613da9565b601382019050919050565b7f222c22726f79616c74795f62617369735f706f696e7473223a000000000000005f82015250565b5f613e27601983613b4a565b9150613e3282613df3565b601982019050919050565b7f2c22726f79616c74795f726563697069656e74223a22000000000000000000005f82015250565b5f613e71601683613b4a565b9150613e7c82613e3d565b601682019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f613ebb600283613b4a565b9150613ec682613e87565b600282019050919050565b5f613edb82613d17565b9150613ee78288613b9e565b9150613ef282613d87565b9150613efe8287613b9e565b9150613f0982613dd1565b9150613f158286613b9e565b9150613f2082613e1b565b9150613f2c8285613b9e565b9150613f3782613e65565b9150613f438284613b9e565b9150613f4e82613eaf565b91508190509695505050505050565b7f536861706573686966746572206f7574206f662072616e6765000000000000005f82015250565b5f613f916019836130e6565b9150613f9c82613f5d565b602082019050919050565b5f6020820190508181035f830152613fbe81613f85565b9050919050565b5f81519050613fd381613087565b92915050565b5f60208284031215613fee57613fed612dcf565b5b5f613ffb84828501613fc5565b91505092915050565b5f8151905061401281612e07565b92915050565b5f6020828403121561402d5761402c612dcf565b5b5f61403a84828501614004565b91505092915050565b5f815461404f81613848565b61405981866130e6565b9450600182165f81146140735760018114614089576140bb565b60ff1983168652811515602002860193506140bb565b61409285613878565b5f5b838110156140b357815481890152600182019150602081019050614094565b808801955050505b50505092915050565b5f6140de6140d96140d484612f6d565b6138f6565b61307e565b9050919050565b6140ee816140c4565b82525050565b5f60c0820190506141075f830189613433565b61411460208301886132c8565b8181036040830152614126818761311e565b9050818103606083015261413a8186614043565b905061414960808301856140e5565b61415660a08301846140e5565b979650505050505050565b5f61417361416e84612ec1565b612ea7565b90508281526020810184848401111561418f5761418e612e35565b5b61419a8482856130f6565b509392505050565b5f82601f8301126141b6576141b5612e31565b5b81516141c6848260208601614161565b91505092915050565b5f602082840312156141e4576141e3612dcf565b5b5f82015167ffffffffffffffff81111561420157614200612dd3565b5b61420d848285016141a2565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61427a8261307e565b91506142858361307e565b92508261429557614294614216565b5b828204905092915050565b7f7b226e616d65223a2200000000000000000000000000000000000000000000005f82015250565b5f6142d4600983613b4a565b91506142df826142a0565b600982019050919050565b7f20230000000000000000000000000000000000000000000000000000000000005f82015250565b5f61431e600283613b4a565b9150614329826142ea565b600282019050919050565b7f222c22617274697374223a2200000000000000000000000000000000000000005f82015250565b5f614368600c83613b4a565b915061437382614334565b600c82019050919050565b5f815461438a81613848565b6143948186613b4a565b9450600182165f81146143ae57600181146143c3576143f5565b60ff19831686528115158202860193506143f5565b6143cc85613878565b5f5b838110156143ed578154818901526001820191506020810190506143ce565b838801955050505b50505092915050565b7f222c226465736372697074696f6e223a220000000000000000000000000000005f82015250565b5f614432601183613b4a565b915061443d826143fe565b601182019050919050565b7f222c22726f79616c7479496e666f223a7b2261727469737441646472657373225f8201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b5f6144a2602283613b4a565b91506144ad82614448565b602282019050919050565b7f222c22726f79616c747946656542794944223a000000000000000000000000005f82015250565b5f6144ec601383613b4a565b91506144f7826144b8565b601382019050919050565b7f7d2c22636f6c6c656374696f6e5f6e616d65223a2200000000000000000000005f82015250565b5f614536601583613b4a565b915061454182614502565b601582019050919050565b7f222c2277656273697465223a22000000000000000000000000000000000000005f82015250565b5f614580600d83613b4a565b915061458b8261454c565b600d82019050919050565b7f222c2265787465726e616c5f75726c223a2200000000000000000000000000005f82015250565b5f6145ca601283613b4a565b91506145d582614596565b601282019050919050565b7f222c227363726970745f74797065223a22536f6c6964697479222c22696d61675f8201527f655f74797065223a2247656e6572617469766520535647222c22696d6167652260208201527f3a22646174613a696d6167652f7376672b786d6c3b6261736536342c00000000604082015250565b5f614660605c83613b4a565b915061466b826145e0565b605c82019050919050565b5f614680826142c8565b915061468c828c613b9e565b915061469782614312565b91506146a3828b613b9e565b91506146ae8261435c565b91506146ba828a61437e565b91506146c582614426565b91506146d18289613b9e565b91506146dc82614496565b91506146e88288613b9e565b91506146f3826144e0565b91506146ff8287613b9e565b915061470a8261452a565b91506147168286613b9e565b915061472182614574565b915061472d8285613b9e565b9150614738826145be565b91506147448284613b9e565b915061474f82614654565b91508190509a9950505050505050505050565b5f61476c8261307e565b91506147778361307e565b925082820190508082111561478f5761478e614243565b5b92915050565b5f61479f8261307e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147d1576147d0614243565b5b600182019050919050565b5f6147e68261307e565b91506147f18361307e565b925082820390508181111561480957614808614243565b5b92915050565b5f819050919050565b5f819050919050565b61483261482d8261480f565b614818565b82525050565b5f819050919050565b61485261484d8261307e565b614838565b82525050565b5f6148638285614821565b6020820191506148738284614841565b6020820191508190509392505050565b5f61488d82612dd7565b9050919050565b5f8160601b9050919050565b5f6148aa82614894565b9050919050565b5f6148bb826148a0565b9050919050565b6148d36148ce82614883565b6148b1565b82525050565b5f6148e482856148c2565b6014820191506148f48284614841565b6020820191508190509392505050565b5f67ffffffffffffffff82111561491e5761491d612e49565b5b602082029050919050565b5f80fd5b5f60ff82169050919050565b6149428161492d565b811461494c575f80fd5b50565b5f8151905061495d81614939565b92915050565b5f61497561497084614904565b612ea7565b9050806020840283018581111561498f5761498e614929565b5b835b818110156149b857806149a4888261494f565b845260208401935050602081019050614991565b5050509392505050565b5f82601f8301126149d6576149d5612e31565b5b600b6149e3848285614963565b91505092915050565b5f6101608284031215614a0257614a01612dcf565b5b5f614a0f848285016149c2565b91505092915050565b5f600b9050919050565b5f81905092915050565b5f819050919050565b614a3e8161492d565b82525050565b5f614a4f8383614a35565b60208301905092915050565b5f602082019050919050565b614a7081614a18565b614a7a8184614a22565b9250614a8582614a2c565b805f5b83811015614ab5578151614a9c8782614a44565b9650614aa783614a5b565b925050600181019050614a88565b505050505050565b5f61016082019050614ad15f830184614a67565b92915050565b5f6101a082019050614aeb5f8301866132c8565b614af860208301856132c8565b614b056040830184614a67565b949350505050565b5f67ffffffffffffffff821115614b2757614b26612e49565b5b602082029050919050565b5f81519050614b4081612f7a565b92915050565b5f614b58614b5384614b0d565b612ea7565b90508060208402830185811115614b7257614b71614929565b5b835b81811015614b9b5780614b878882614b32565b845260208401935050602081019050614b74565b5050509392505050565b5f82601f830112614bb957614bb8612e31565b5b606e614bc6848285614b46565b91505092915050565b5f610dc08284031215614be557614be4612dcf565b5b5f614bf284828501614ba5565b91505092915050565b5f606e9050919050565b5f81905092915050565b5f819050919050565b614c2181612f6d565b82525050565b5f614c328383614c18565b60208301905092915050565b5f602082019050919050565b614c5381614bfb565b614c5d8184614c05565b9250614c6882614c0f565b805f5b83811015614c98578151614c7f8782614c27565b9650614c8a83614c3e565b925050600181019050614c6b565b505050505050565b5f610f6082019050614cb45f8301876132c8565b614cc160208301866132c8565b614cce6040830185614a67565b614cdc6101a0830184614c4a565b95945050505050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614d19600283613b4a565b9150614d2482614ce5565b600282019050919050565b7f7d000000000000000000000000000000000000000000000000000000000000005f82015250565b5f614d63600183613b4a565b9150614d6e82614d2f565b600182019050919050565b5f614d848286613b9e565b9150614d908285613b9e565b9150614d9b82614d0d565b9150614da78284613b9e565b9150614db282614d57565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614e196026836130e6565b9150614e2482614dbf565b604082019050919050565b5f6020820190508181035f830152614e4681614e0d565b9050919050565b5f614e5782612f6d565b9150614e6283612f6d565b9250828203905061ffff811115614e7c57614e7b614243565b5b92915050565b7f546f6b656e206973206e6f74206c6f636b6564000000000000000000000000005f82015250565b5f614eb66013836130e6565b9150614ec182614e82565b602082019050919050565b5f6020820190508181035f830152614ee381614eaa565b9050919050565b7f53686170657368696674696e67206973207061757365640000000000000000005f82015250565b5f614f1e6017836130e6565b9150614f2982614eea565b602082019050919050565b5f6020820190508181035f830152614f4b81614f12565b9050919050565b5f606082019050614f655f830186613433565b614f726020830185613433565b614f7f6040830184613433565b949350505050565b5f81519050614f9581612faf565b92915050565b5f60208284031215614fb057614faf612dcf565b5b5f614fbd84828501614f87565b91505092915050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f614ffa600e836130e6565b915061500582614fc6565b602082019050919050565b5f6020820190508181035f83015261502781614fee565b9050919050565b7f53686170657368696674206d61782072656163686564000000000000000000005f82015250565b5f6150626016836130e6565b915061506d8261502e565b602082019050919050565b5f6020820190508181035f83015261508f81615056565b9050919050565b7f546f6b656e206973206c6f636b656400000000000000000000000000000000005f82015250565b5f6150ca600f836130e6565b91506150d582615096565b602082019050919050565b5f6020820190508181035f8301526150f7816150be565b9050919050565b5f61510882612f6d565b91505f820361511a57615119614243565b5b600182039050919050565b5f61512f82612f6d565b915061ffff820361514357615142614243565b5b600182019050919050565b5f6151588261307e565b91506151638361307e565b92508282026151718161307e565b9150828204841483151761518857615187614243565b5b5092915050565b5f6151998261307e565b91506151a48361307e565b9250826151b4576151b3614216565b5b828206905092915050565b5f6151c98261307e565b91505f82036151db576151da614243565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61521a6020836130e6565b9150615225826151e6565b602082019050919050565b5f6020820190508181035f8301526152478161520e565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202633f63b7471c47255bd40243802ec87f3311a0a725534020e792fa65021a9c864736f6c63430008150033

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106101cd575f3560e01c80638da5cb5b11610102578063d5024f06116100a0578063f2fde38b1161006f578063f2fde38b146105b5578063fd8fd066146105d1578063fd9639b3146105ef578063fddb1e801461060b576101cd565b8063d5024f0614610503578063e2fc2ae514610533578063ec805b5414610569578063f1267abd14610599576101cd565b8063a14def54116100dc578063a14def5414610443578063ac7dfb3014610473578063afa94d6c146104a3578063b4d06332146104d3576101cd565b80638da5cb5b146103c55780638ecfc5e4146103e35780639114ad5c14610413576101cd565b8063549fc8371161016f57806370735bcd1161014957806370735bcd14610351578063715018a61461035b5780637a4a3dc8146103655780637b424a6a14610395576101cd565b8063549fc837146102d35780635b265342146103035780635be38c6314610333576101cd565b8063419fa1fb116101ab578063419fa1fb146102395780634a6ad9ab146102695780634d2e12691461028557806351bf0f52146102b5576101cd565b80632be699a4146101d157806331289fb3146101ed5780633ef7c2591461021d575b5f80fd5b6101eb60048036038101906101e69190612fd9565b610627565b005b610207600480360381019061020291906130b1565b6108f4565b6040516102149190613156565b60405180910390f35b61023760048036038101906102329190613176565b610932565b005b610253600480360381019061024e9190613243565b610b60565b6040516102609190613156565b60405180910390f35b610283600480360381019061027e9190613243565b610b96565b005b61029f600480360381019061029a919061328a565b610c25565b6040516102ac91906132d7565b60405180910390f35b6102bd610c45565b6040516102ca91906132ff565b60405180910390f35b6102ed60048036038101906102e89190613318565b610c57565b6040516102fa9190613156565b60405180910390f35b61031d60048036038101906103189190613368565b610c99565b60405161032a9190613156565b60405180910390f35b61033b610d08565b6040516103489190613156565b60405180910390f35b610359610d94565b005b610363610e3a565b005b61037f600480360381019061037a91906130b1565b610ec1565b60405161038c9190613156565b60405180910390f35b6103af60048036038101906103aa9190613318565b610f5c565b6040516103bc9190613156565b60405180910390f35b6103cd61105a565b6040516103da9190613442565b60405180910390f35b6103fd60048036038101906103f8919061345b565b611081565b60405161040a9190613156565b60405180910390f35b61042d600480360381019061042891906130b1565b61145f565b60405161043a91906132d7565b60405180910390f35b61045d600480360381019061045891906130b1565b611474565b60405161046a91906132d7565b60405180910390f35b61048d600480360381019061048891906130b1565b611489565b60405161049a91906132d7565b60405180910390f35b6104bd60048036038101906104b8919061328a565b6114e5565b6040516104ca9190613156565b60405180910390f35b6104ed60048036038101906104e891906130b1565b61151c565b6040516104fa9190613156565b60405180910390f35b61051d600480360381019061051891906130b1565b6115b1565b60405161052a91906132ff565b60405180910390f35b61054d600480360381019061054891906130b1565b6115ce565b6040516105609796959493929190613577565b60405180910390f35b610583600480360381019061057e91906135eb565b611726565b6040516105909190613156565b60405180910390f35b6105b360048036038101906105ae9190613657565b611ad7565b005b6105cf60048036038101906105ca9190613657565b611b96565b005b6105d9611c8c565b6040516105e69190613739565b60405180910390f35b61060960048036038101906106049190613759565b611d95565b005b6106256004803603810190610620919061328a565b611e98565b005b61062f612546565b73ffffffffffffffffffffffffffffffffffffffff1661064d61105a565b73ffffffffffffffffffffffffffffffffffffffff16146106a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069a906137fd565b60405180910390fd5b5f80600280549050036106b65761115c90505b60026040518060e001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018561ffff1681526020018361ffff168152602001841515815250908060018154018082558091505060019003905f5260205f2090600502015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160030190816108429190613a15565b506080820151816004015f6101000a81548161ffff021916908361ffff16021790555060a08201518160040160026101000a81548161ffff021916908361ffff16021790555060c08201518160040160046101000a81548160ff02191690831515021790555050507fea094a222979d47956b4d87b928349a1560ebdd04d74b9641c8e279fe55e39958787878787876040516108e396959493929190613ae4565b60405180910390a150505050505050565b60605f6109008361151c565b905061090b8161254d565b60405160200161091b9190613bce565b604051602081830303815290604052915050919050565b61093a612546565b73ffffffffffffffffffffffffffffffffffffffff1661095861105a565b73ffffffffffffffffffffffffffffffffffffffff16146109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a5906137fd565b60405180910390fd5b5f1515600a5f9054906101000a900460ff16151514610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990613c39565b60405180910390fd5b5f60028981548110610a1757610a16613c57565b5b905f5260205f209060050201905087815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086816001015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085816002015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084816003019081610afb9190613a15565b5083816004015f6101000a81548161ffff021916908361ffff160217905550828160040160026101000a81548161ffff021916908361ffff160217905550818160040160046101000a81548160ff021916908315150217905550505050505050505050565b60605f610b6c8361254d565b604051602001610b7c9190613cce565b604051602081830303815290604052905080915050919050565b610b9e612546565b73ffffffffffffffffffffffffffffffffffffffff16610bbc61105a565b73ffffffffffffffffffffffffffffffffffffffff1614610c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c09906137fd565b60405180910390fd5b8060039081610c219190613a15565b5050565b6009602052815f5260405f20602052805f5260405f205f91509150505481565b600a5f9054906101000a900460ff1681565b60605f610c65858585610f5c565b9050610c708161254d565b604051602001610c809190613bce565b6040516020818303038152906040529150509392505050565b60605f610ca58361254d565b90505f878288610cb4896126dd565b610cd58973ffffffffffffffffffffffffffffffffffffffff166014612836565b604051602001610ce9959493929190613ed1565b6040516020818303038152906040529050809250505095945050505050565b60038054610d1590613848565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4190613848565b8015610d8c5780601f10610d6357610100808354040283529160200191610d8c565b820191905f5260205f20905b815481529060010190602001808311610d6f57829003601f168201915b505050505081565b610d9c612546565b73ffffffffffffffffffffffffffffffffffffffff16610dba61105a565b73ffffffffffffffffffffffffffffffffffffffff1614610e10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e07906137fd565b60405180910390fd5b600a5f9054906101000a900460ff1615600a5f6101000a81548160ff021916908315150217905550565b610e42612546565b73ffffffffffffffffffffffffffffffffffffffff16610e6061105a565b73ffffffffffffffffffffffffffffffffffffffff1614610eb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ead906137fd565b60405180910390fd5b610ebf5f612a6b565b565b6008602052805f5260405f205f915090508054610edd90613848565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0990613848565b8015610f545780601f10610f2b57610100808354040283529160200191610f54565b820191905f5260205f20905b815481529060010190602001808311610f3757829003601f168201915b505050505081565b60606002805490508210610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90613fa7565b60405180910390fd5b611051737f463b874ec264dc7bd8c780f5790b4fc371f11f73ffffffffffffffffffffffffffffffffffffffff1663dbc119d7866040518263ffffffff1660e01b8152600401610ff591906132d7565b602060405180830381865afa158015611010573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110349190613fd9565b8473ffffffffffffffffffffffffffffffffffffffff1684612b2c565b90509392505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060805f151560075f8b81526020019081526020015f205f9054906101000a900460ff1615150361116e57600260045f8b81526020019081526020015f2054815481106110d1576110d0613c57565b5b905f5260205f20906005020160030180546110eb90613848565b80601f016020809104026020016040519081016040528092919081815260200182805461111790613848565b80156111625780601f1061113957610100808354040283529160200191611162565b820191905f5260205f20905b81548152906001019060200180831161114557829003601f168201915b50505050509050611209565b60085f8a81526020019081526020015f20805461118a90613848565b80601f01602080910402602001604051908101604052809291908181526020018280546111b690613848565b80156112015780601f106111d857610100808354040283529160200191611201565b820191905f5260205f20905b8154815290600101906020018083116111e457829003601f168201915b505050505090505b5f60045f8b81526020019081526020015f205490505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630a61de26737f463b874ec264dc7bd8c780f5790b4fc371f11f73ffffffffffffffffffffffffffffffffffffffff16636352211e8e6040518263ffffffff1660e01b81526004016112a991906132d7565b602060405180830381865afa1580156112c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e89190614018565b6112f18e611489565b8d6002878154811061130657611305613c57565b5b905f5260205f2090600502016003016002888154811061132957611328613c57565b5b905f5260205f20906005020160040160029054906101000a900461ffff166002898154811061135b5761135a613c57565b5b905f5260205f2090600502016004015f9054906101000a900461ffff166040518763ffffffff1660e01b8152600401611399969594939291906140f4565b5f60405180830381865afa1580156113b3573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906113db91906141cf565b90505f836113e88d6126dd565b60038461140c8e73ffffffffffffffffffffffffffffffffffffffff166014612836565b61142160648f61141c9190614270565b6126dd565b8d8d8d60405160200161143c99989796959493929190614676565b604051602081830303815290604052905080945050505050979650505050505050565b6005602052805f5260405f205f915090505481565b6004602052805f5260405f205f915090505481565b5f805f5b6002805490508110156114db5760095f8581526020019081526020015f205f8281526020019081526020015f2054826114c69190614762565b915080806114d390614795565b91505061148d565b5080915050919050565b6060611514838360045f60055f8981526020019081526020015f205481526020019081526020015f2054612b2c565b905092915050565b60605f60014361152c91906147dc565b404860405160200161153f929190614858565b604051602081830303815290604052805190602001205f1c90505f414260405160200161156d9291906148d9565b604051602081830303815290604052805190602001205f1c73ffffffffffffffffffffffffffffffffffffffff1690506115a8828286612b2c565b92505050919050565b6007602052805f5260405f205f915054906101000a900460ff1681565b600281815481106115dd575f80fd5b905f5260205f2090600502015f91509050805f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690806002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600301805461166b90613848565b80601f016020809104026020016040519081016040528092919081815260200182805461169790613848565b80156116e25780601f106116b9576101008083540402835291602001916116e2565b820191905f5260205f20905b8154815290600101906020018083116116c557829003601f168201915b505050505090806004015f9054906101000a900461ffff16908060040160029054906101000a900461ffff16908060040160049054906101000a900460ff16905087565b60605f60045f60055f8781526020019081526020015f205481526020019081526020015f205490505f6002828154811061176357611762613c57565b5b905f5260205f2090600502015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3ec0475866040518263ffffffff1660e01b81526004016117c991906132d7565b61016060405180830381865afa1580156117e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061180991906149ec565b9050670de0b6b3a76400008561181f9190614270565b94505f6002838154811061183657611835613c57565b5b905f5260205f2090600502015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aaebbea8836040518263ffffffff1660e01b815260040161189c9190614abd565b5f60405180830381865afa1580156118b6573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906118de91906141cf565b90505f600284815481106118f5576118f4613c57565b5b905f5260205f2090600502016001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663401a28d88789866040518463ffffffff1660e01b815260040161196093929190614ad7565b610dc060405180830381865afa15801561197c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119a09190614bcf565b90506c01431e0fae6d7217caa0000000866119bb9190614270565b955066038d7ea4c68000876119d09190614270565b96505f600285815481106119e7576119e6613c57565b5b905f5260205f2090600502016002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663703996db888a87866040518563ffffffff1660e01b8152600401611a549493929190614ca0565b5f60405180830381865afa158015611a6e573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190611a9691906141cf565b90505f89611aa38361254d565b85604051602001611ab693929190614d79565b60405160208183030381529060405290508096505050505050509392505050565b611adf612546565b73ffffffffffffffffffffffffffffffffffffffff16611afd61105a565b73ffffffffffffffffffffffffffffffffffffffff1614611b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4a906137fd565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611b9e612546565b73ffffffffffffffffffffffffffffffffffffffff16611bbc61105a565b73ffffffffffffffffffffffffffffffffffffffff1614611c12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c09906137fd565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7790614e2f565b60405180910390fd5b611c8981612a6b565b50565b60605f60028054905067ffffffffffffffff811115611cae57611cad612e49565b5b604051908082528060200260200182016040528015611cdc5781602001602082028036833780820191505090505b5090505f5b8151811015611d8d5760028181548110611cfe57611cfd613c57565b5b905f5260205f20906005020160040160029054906101000a900461ffff1660028281548110611d3057611d2f613c57565b5b905f5260205f2090600502016004015f9054906101000a900461ffff16611d579190614e4d565b61ffff16828281518110611d6e57611d6d613c57565b5b6020026020010181815250508080611d8590614795565b915050611ce1565b508091505090565b611d9d612546565b73ffffffffffffffffffffffffffffffffffffffff16611dbb61105a565b73ffffffffffffffffffffffffffffffffffffffff1614611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e08906137fd565b60405180910390fd5b6001151560075f8481526020019081526020015f205f9054906101000a900460ff16151514611e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6c90614ecc565b60405180910390fd5b8060085f8481526020019081526020015f209081611e939190613a15565b505050565b5f737f463b874ec264dc7bd8c780f5790b4fc371f11f73ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401611ee691906132d7565b602060405180830381865afa158015611f01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f259190614018565b905060011515600a5f9054906101000a900460ff16151514611f7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7390614f34565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061205057506d76a84fef008cdabe6409d2fe638b73ffffffffffffffffffffffffffffffffffffffff166390c9a2d03383737f463b874ec264dc7bd8c780f5790b4fc371f11f6040518463ffffffff1660e01b815260040161201093929190614f52565b602060405180830381865afa15801561202b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204f9190614f9b565b5b8061208d575061205e61105a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6120cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120c390615010565b60405180910390fd5b6002805490508210612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210a90613fa7565b60405180910390fd5b6002828154811061212757612126613c57565b5b905f5260205f2090600502016004015f9054906101000a900461ffff1661ffff166002838154811061215c5761215b613c57565b5b905f5260205f20906005020160040160029054906101000a900461ffff1661ffff16106121be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b590615078565b60405180910390fd5b5f600283815481106121d3576121d2613c57565b5b905f5260205f20906005020160040160049054906101000a900460ff1690508080612230575061220161105a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61226f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226690615010565b60405180910390fd5b5f151560075f8681526020019081526020015f205f9054906101000a900460ff161515146122d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c9906150e0565b60405180910390fd5b8061230157600160075f8681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b5f151560065f8681526020019081526020015f205f9054906101000a900460ff161515036123f457600160065f8681526020019081526020015f205f6101000a81548160ff0219169083151502179055508360055f737f463b874ec264dc7bd8c780f5790b4fc371f11f73ffffffffffffffffffffffffffffffffffffffff1663dbc119d7886040518263ffffffff1660e01b81526004016123a391906132d7565b602060405180830381865afa1580156123be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e29190613fd9565b81526020019081526020015f20819055505b600260045f8681526020019081526020015f20548154811061241957612418613c57565b5b905f5260205f209060050201600401600281819054906101000a900461ffff1680929190612446906150fe565b91906101000a81548161ffff021916908361ffff160217905550506002838154811061247557612474613c57565b5b905f5260205f209060050201600401600281819054906101000a900461ffff16809291906124a290615125565b91906101000a81548161ffff021916908361ffff160217905550508260045f8681526020019081526020015f208190555060095f8581526020019081526020015f205f8481526020019081526020015f205f81548092919061250390614795565b9190505550837ff5830b23450539a2f9b0c796013b74ddc22d97cb3f0ed1b9aee471ac875abf918460405161253891906132d7565b60405180910390a250505050565b5f33905090565b60605f825190505f81036125725760405180602001604052805f8152509150506126d8565b5f60036002836125829190614762565b61258c9190614270565b6004612598919061514e565b90505f6020826125a89190614762565b67ffffffffffffffff8111156125c1576125c0612e49565b5b6040519080825280601f01601f1916602001820160405280156125f35781602001600182028036833780820191505090505b5090505f60405180606001604052806040815260200161524f60409139905060018101602083015f5b868110156126955760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b9050808452600484019350505061261c565b5060038606600181146126af57600281146126bf576126ca565b613d3d60f01b60028303526126ca565b603d60f81b60018303525b508484525050819450505050505b919050565b60605f8203612723576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612831565b5f8290505f5b5f821461275257808061273b90614795565b915050600a8261274b9190614270565b9150612729565b5f8167ffffffffffffffff81111561276d5761276c612e49565b5b6040519080825280601f01601f19166020018201604052801561279f5781602001600182028036833780820191505090505b5090505b5f851461282a576001826127b791906147dc565b9150600a856127c6919061518f565b60306127d29190614762565b60f81b8183815181106127e8576127e7613c57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856128239190614270565b94506127a3565b8093505050505b919050565b60605f6002836002612848919061514e565b6128529190614762565b67ffffffffffffffff81111561286b5761286a612e49565b5b6040519080825280601f01601f19166020018201604052801561289d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000815f815181106128d4576128d3613c57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061293757612936613c57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f6001846002612975919061514e565b61297f9190614762565b90505b6001811115612a1e577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129c1576129c0613c57565b5b1a60f81b8282815181106129d8576129d7613c57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600485901c945080612a17906151bf565b9050612982565b505f8414612a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5890615230565b60405180910390fd5b8091505092915050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60605f60028381548110612b4357612b42613c57565b5b905f5260205f2090600502015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e3ec0475866040518263ffffffff1660e01b8152600401612ba991906132d7565b61016060405180830381865afa158015612bc5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612be991906149ec565b9050670de0b6b3a764000085612bff9190614270565b94505f60028481548110612c1657612c15613c57565b5b905f5260205f2090600502016001015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663401a28d88688856040518463ffffffff1660e01b8152600401612c8193929190614ad7565b610dc060405180830381865afa158015612c9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cc19190614bcf565b90506c01431e0fae6d7217caa000000085612cdc9190614270565b945066038d7ea4c6800086612cf19190614270565b95505f60028581548110612d0857612d07613c57565b5b905f5260205f2090600502016002015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663703996db878986866040518563ffffffff1660e01b8152600401612d759493929190614ca0565b5f60405180830381865afa158015612d8f573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f82011682018060405250810190612db791906141cf565b90508093505050509392505050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612e0082612dd7565b9050919050565b612e1081612df6565b8114612e1a575f80fd5b50565b5f81359050612e2b81612e07565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612e7f82612e39565b810181811067ffffffffffffffff82111715612e9e57612e9d612e49565b5b80604052505050565b5f612eb0612dc6565b9050612ebc8282612e76565b919050565b5f67ffffffffffffffff821115612edb57612eda612e49565b5b612ee482612e39565b9050602081019050919050565b828183375f83830152505050565b5f612f11612f0c84612ec1565b612ea7565b905082815260208101848484011115612f2d57612f2c612e35565b5b612f38848285612ef1565b509392505050565b5f82601f830112612f5457612f53612e31565b5b8135612f64848260208601612eff565b91505092915050565b5f61ffff82169050919050565b612f8381612f6d565b8114612f8d575f80fd5b50565b5f81359050612f9e81612f7a565b92915050565b5f8115159050919050565b612fb881612fa4565b8114612fc2575f80fd5b50565b5f81359050612fd381612faf565b92915050565b5f805f805f8060c08789031215612ff357612ff2612dcf565b5b5f61300089828a01612e1d565b965050602061301189828a01612e1d565b955050604061302289828a01612e1d565b945050606087013567ffffffffffffffff81111561304357613042612dd3565b5b61304f89828a01612f40565b935050608061306089828a01612f90565b92505060a061307189828a01612fc5565b9150509295509295509295565b5f819050919050565b6130908161307e565b811461309a575f80fd5b50565b5f813590506130ab81613087565b92915050565b5f602082840312156130c6576130c5612dcf565b5b5f6130d38482850161309d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b838110156131135780820151818401526020810190506130f8565b5f8484015250505050565b5f613128826130dc565b61313281856130e6565b93506131428185602086016130f6565b61314b81612e39565b840191505092915050565b5f6020820190508181035f83015261316e818461311e565b905092915050565b5f805f805f805f80610100898b03121561319357613192612dcf565b5b5f6131a08b828c0161309d565b98505060206131b18b828c01612e1d565b97505060406131c28b828c01612e1d565b96505060606131d38b828c01612e1d565b955050608089013567ffffffffffffffff8111156131f4576131f3612dd3565b5b6132008b828c01612f40565b94505060a06132118b828c01612f90565b93505060c06132228b828c01612f90565b92505060e06132338b828c01612fc5565b9150509295985092959890939650565b5f6020828403121561325857613257612dcf565b5b5f82013567ffffffffffffffff81111561327557613274612dd3565b5b61328184828501612f40565b91505092915050565b5f80604083850312156132a05761329f612dcf565b5b5f6132ad8582860161309d565b92505060206132be8582860161309d565b9150509250929050565b6132d18161307e565b82525050565b5f6020820190506132ea5f8301846132c8565b92915050565b6132f981612fa4565b82525050565b5f6020820190506133125f8301846132f0565b92915050565b5f805f6060848603121561332f5761332e612dcf565b5b5f61333c8682870161309d565b935050602061334d86828701612e1d565b925050604061335e8682870161309d565b9150509250925092565b5f805f805f60a0868803121561338157613380612dcf565b5b5f86013567ffffffffffffffff81111561339e5761339d612dd3565b5b6133aa88828901612f40565b955050602086013567ffffffffffffffff8111156133cb576133ca612dd3565b5b6133d788828901612f40565b94505060406133e88882890161309d565b93505060606133f988828901612e1d565b925050608086013567ffffffffffffffff81111561341a57613419612dd3565b5b61342688828901612f40565b9150509295509295909350565b61343c81612df6565b82525050565b5f6020820190506134555f830184613433565b92915050565b5f805f805f805f60e0888a03121561347657613475612dcf565b5b5f6134838a828b0161309d565b975050602088013567ffffffffffffffff8111156134a4576134a3612dd3565b5b6134b08a828b01612f40565b96505060406134c18a828b01612e1d565b95505060606134d28a828b0161309d565b945050608088013567ffffffffffffffff8111156134f3576134f2612dd3565b5b6134ff8a828b01612f40565b93505060a088013567ffffffffffffffff8111156135205761351f612dd3565b5b61352c8a828b01612f40565b92505060c088013567ffffffffffffffff81111561354d5761354c612dd3565b5b6135598a828b01612f40565b91505092959891949750929550565b61357181612f6d565b82525050565b5f60e08201905061358a5f83018a613433565b6135976020830189613433565b6135a46040830188613433565b81810360608301526135b6818761311e565b90506135c56080830186613568565b6135d260a0830185613568565b6135df60c08301846132f0565b98975050505050505050565b5f805f6060848603121561360257613601612dcf565b5b5f84013567ffffffffffffffff81111561361f5761361e612dd3565b5b61362b86828701612f40565b935050602061363c8682870161309d565b925050604061364d8682870161309d565b9150509250925092565b5f6020828403121561366c5761366b612dcf565b5b5f61367984828501612e1d565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6136b48161307e565b82525050565b5f6136c583836136ab565b60208301905092915050565b5f602082019050919050565b5f6136e782613682565b6136f1818561368c565b93506136fc8361369c565b805f5b8381101561372c57815161371388826136ba565b975061371e836136d1565b9250506001810190506136ff565b5085935050505092915050565b5f6020820190508181035f83015261375181846136dd565b905092915050565b5f806040838503121561376f5761376e612dcf565b5b5f61377c8582860161309d565b925050602083013567ffffffffffffffff81111561379d5761379c612dd3565b5b6137a985828601612f40565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6137e76020836130e6565b91506137f2826137b3565b602082019050919050565b5f6020820190508181035f830152613814816137db565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061385f57607f821691505b6020821081036138725761387161381b565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026138d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613899565b6138de8683613899565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61391961391461390f8461307e565b6138f6565b61307e565b9050919050565b5f819050919050565b613932836138ff565b61394661393e82613920565b8484546138a5565b825550505050565b5f90565b61395a61394e565b613965818484613929565b505050565b5b818110156139885761397d5f82613952565b60018101905061396b565b5050565b601f8211156139cd5761399e81613878565b6139a78461388a565b810160208510156139b6578190505b6139ca6139c28561388a565b83018261396a565b50505b505050565b5f82821c905092915050565b5f6139ed5f19846008026139d2565b1980831691505092915050565b5f613a0583836139de565b9150826002028217905092915050565b613a1e826130dc565b67ffffffffffffffff811115613a3757613a36612e49565b5b613a418254613848565b613a4c82828561398c565b5f60209050601f831160018114613a7d575f8415613a6b578287015190505b613a7585826139fa565b865550613adc565b601f198416613a8b86613878565b5f5b82811015613ab257848901518255600182019150602085019450602081019050613a8d565b86831015613acf5784890151613acb601f8916826139de565b8355505b6001600288020188555050505b505050505050565b5f60c082019050613af75f830189613433565b613b046020830188613433565b613b116040830187613433565b8181036060830152613b23818661311e565b9050613b326080830185613568565b613b3f60a08301846132f0565b979650505050505050565b5f81905092915050565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c0000000000005f82015250565b5f613b88601a83613b4a565b9150613b9382613b54565b601a82019050919050565b5f613ba8826130dc565b613bb28185613b4a565b9350613bc28185602086016130f6565b80840191505092915050565b5f613bd882613b7c565b9150613be48284613b9e565b915081905092915050565b7f5368617065736869667465722073657474696e6720616c6c6f776564000000005f82015250565b5f613c23601c836130e6565b9150613c2e82613bef565b602082019050919050565b5f6020820190508181035f830152613c5081613c17565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000005f82015250565b5f613cb8601d83613b4a565b9150613cc382613c84565b601d82019050919050565b5f613cd882613cac565b9150613ce48284613b9e565b915081905092915050565b7f7b226e616d65223a22424c4f4e4b53222c226465736372697074696f6e223a225f82015250565b5f613d23602083613b4a565b9150613d2e82613cef565b602082019050919050565b7f222c22696d616765223a22646174613a696d6167652f7376672b786d6c3b62615f8201527f736536342c000000000000000000000000000000000000000000000000000000602082015250565b5f613d93602583613b4a565b9150613d9e82613d39565b602582019050919050565b7f222c2265787465726e616c5f6c696e6b223a22000000000000000000000000005f82015250565b5f613ddd601383613b4a565b9150613de882613da9565b601382019050919050565b7f222c22726f79616c74795f62617369735f706f696e7473223a000000000000005f82015250565b5f613e27601983613b4a565b9150613e3282613df3565b601982019050919050565b7f2c22726f79616c74795f726563697069656e74223a22000000000000000000005f82015250565b5f613e71601683613b4a565b9150613e7c82613e3d565b601682019050919050565b7f227d0000000000000000000000000000000000000000000000000000000000005f82015250565b5f613ebb600283613b4a565b9150613ec682613e87565b600282019050919050565b5f613edb82613d17565b9150613ee78288613b9e565b9150613ef282613d87565b9150613efe8287613b9e565b9150613f0982613dd1565b9150613f158286613b9e565b9150613f2082613e1b565b9150613f2c8285613b9e565b9150613f3782613e65565b9150613f438284613b9e565b9150613f4e82613eaf565b91508190509695505050505050565b7f536861706573686966746572206f7574206f662072616e6765000000000000005f82015250565b5f613f916019836130e6565b9150613f9c82613f5d565b602082019050919050565b5f6020820190508181035f830152613fbe81613f85565b9050919050565b5f81519050613fd381613087565b92915050565b5f60208284031215613fee57613fed612dcf565b5b5f613ffb84828501613fc5565b91505092915050565b5f8151905061401281612e07565b92915050565b5f6020828403121561402d5761402c612dcf565b5b5f61403a84828501614004565b91505092915050565b5f815461404f81613848565b61405981866130e6565b9450600182165f81146140735760018114614089576140bb565b60ff1983168652811515602002860193506140bb565b61409285613878565b5f5b838110156140b357815481890152600182019150602081019050614094565b808801955050505b50505092915050565b5f6140de6140d96140d484612f6d565b6138f6565b61307e565b9050919050565b6140ee816140c4565b82525050565b5f60c0820190506141075f830189613433565b61411460208301886132c8565b8181036040830152614126818761311e565b9050818103606083015261413a8186614043565b905061414960808301856140e5565b61415660a08301846140e5565b979650505050505050565b5f61417361416e84612ec1565b612ea7565b90508281526020810184848401111561418f5761418e612e35565b5b61419a8482856130f6565b509392505050565b5f82601f8301126141b6576141b5612e31565b5b81516141c6848260208601614161565b91505092915050565b5f602082840312156141e4576141e3612dcf565b5b5f82015167ffffffffffffffff81111561420157614200612dd3565b5b61420d848285016141a2565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61427a8261307e565b91506142858361307e565b92508261429557614294614216565b5b828204905092915050565b7f7b226e616d65223a2200000000000000000000000000000000000000000000005f82015250565b5f6142d4600983613b4a565b91506142df826142a0565b600982019050919050565b7f20230000000000000000000000000000000000000000000000000000000000005f82015250565b5f61431e600283613b4a565b9150614329826142ea565b600282019050919050565b7f222c22617274697374223a2200000000000000000000000000000000000000005f82015250565b5f614368600c83613b4a565b915061437382614334565b600c82019050919050565b5f815461438a81613848565b6143948186613b4a565b9450600182165f81146143ae57600181146143c3576143f5565b60ff19831686528115158202860193506143f5565b6143cc85613878565b5f5b838110156143ed578154818901526001820191506020810190506143ce565b838801955050505b50505092915050565b7f222c226465736372697074696f6e223a220000000000000000000000000000005f82015250565b5f614432601183613b4a565b915061443d826143fe565b601182019050919050565b7f222c22726f79616c7479496e666f223a7b2261727469737441646472657373225f8201527f3a22000000000000000000000000000000000000000000000000000000000000602082015250565b5f6144a2602283613b4a565b91506144ad82614448565b602282019050919050565b7f222c22726f79616c747946656542794944223a000000000000000000000000005f82015250565b5f6144ec601383613b4a565b91506144f7826144b8565b601382019050919050565b7f7d2c22636f6c6c656374696f6e5f6e616d65223a2200000000000000000000005f82015250565b5f614536601583613b4a565b915061454182614502565b601582019050919050565b7f222c2277656273697465223a22000000000000000000000000000000000000005f82015250565b5f614580600d83613b4a565b915061458b8261454c565b600d82019050919050565b7f222c2265787465726e616c5f75726c223a2200000000000000000000000000005f82015250565b5f6145ca601283613b4a565b91506145d582614596565b601282019050919050565b7f222c227363726970745f74797065223a22536f6c6964697479222c22696d61675f8201527f655f74797065223a2247656e6572617469766520535647222c22696d6167652260208201527f3a22646174613a696d6167652f7376672b786d6c3b6261736536342c00000000604082015250565b5f614660605c83613b4a565b915061466b826145e0565b605c82019050919050565b5f614680826142c8565b915061468c828c613b9e565b915061469782614312565b91506146a3828b613b9e565b91506146ae8261435c565b91506146ba828a61437e565b91506146c582614426565b91506146d18289613b9e565b91506146dc82614496565b91506146e88288613b9e565b91506146f3826144e0565b91506146ff8287613b9e565b915061470a8261452a565b91506147168286613b9e565b915061472182614574565b915061472d8285613b9e565b9150614738826145be565b91506147448284613b9e565b915061474f82614654565b91508190509a9950505050505050505050565b5f61476c8261307e565b91506147778361307e565b925082820190508082111561478f5761478e614243565b5b92915050565b5f61479f8261307e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147d1576147d0614243565b5b600182019050919050565b5f6147e68261307e565b91506147f18361307e565b925082820390508181111561480957614808614243565b5b92915050565b5f819050919050565b5f819050919050565b61483261482d8261480f565b614818565b82525050565b5f819050919050565b61485261484d8261307e565b614838565b82525050565b5f6148638285614821565b6020820191506148738284614841565b6020820191508190509392505050565b5f61488d82612dd7565b9050919050565b5f8160601b9050919050565b5f6148aa82614894565b9050919050565b5f6148bb826148a0565b9050919050565b6148d36148ce82614883565b6148b1565b82525050565b5f6148e482856148c2565b6014820191506148f48284614841565b6020820191508190509392505050565b5f67ffffffffffffffff82111561491e5761491d612e49565b5b602082029050919050565b5f80fd5b5f60ff82169050919050565b6149428161492d565b811461494c575f80fd5b50565b5f8151905061495d81614939565b92915050565b5f61497561497084614904565b612ea7565b9050806020840283018581111561498f5761498e614929565b5b835b818110156149b857806149a4888261494f565b845260208401935050602081019050614991565b5050509392505050565b5f82601f8301126149d6576149d5612e31565b5b600b6149e3848285614963565b91505092915050565b5f6101608284031215614a0257614a01612dcf565b5b5f614a0f848285016149c2565b91505092915050565b5f600b9050919050565b5f81905092915050565b5f819050919050565b614a3e8161492d565b82525050565b5f614a4f8383614a35565b60208301905092915050565b5f602082019050919050565b614a7081614a18565b614a7a8184614a22565b9250614a8582614a2c565b805f5b83811015614ab5578151614a9c8782614a44565b9650614aa783614a5b565b925050600181019050614a88565b505050505050565b5f61016082019050614ad15f830184614a67565b92915050565b5f6101a082019050614aeb5f8301866132c8565b614af860208301856132c8565b614b056040830184614a67565b949350505050565b5f67ffffffffffffffff821115614b2757614b26612e49565b5b602082029050919050565b5f81519050614b4081612f7a565b92915050565b5f614b58614b5384614b0d565b612ea7565b90508060208402830185811115614b7257614b71614929565b5b835b81811015614b9b5780614b878882614b32565b845260208401935050602081019050614b74565b5050509392505050565b5f82601f830112614bb957614bb8612e31565b5b606e614bc6848285614b46565b91505092915050565b5f610dc08284031215614be557614be4612dcf565b5b5f614bf284828501614ba5565b91505092915050565b5f606e9050919050565b5f81905092915050565b5f819050919050565b614c2181612f6d565b82525050565b5f614c328383614c18565b60208301905092915050565b5f602082019050919050565b614c5381614bfb565b614c5d8184614c05565b9250614c6882614c0f565b805f5b83811015614c98578151614c7f8782614c27565b9650614c8a83614c3e565b925050600181019050614c6b565b505050505050565b5f610f6082019050614cb45f8301876132c8565b614cc160208301866132c8565b614cce6040830185614a67565b614cdc6101a0830184614c4a565b95945050505050565b7f222c0000000000000000000000000000000000000000000000000000000000005f82015250565b5f614d19600283613b4a565b9150614d2482614ce5565b600282019050919050565b7f7d000000000000000000000000000000000000000000000000000000000000005f82015250565b5f614d63600183613b4a565b9150614d6e82614d2f565b600182019050919050565b5f614d848286613b9e565b9150614d908285613b9e565b9150614d9b82614d0d565b9150614da78284613b9e565b9150614db282614d57565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f614e196026836130e6565b9150614e2482614dbf565b604082019050919050565b5f6020820190508181035f830152614e4681614e0d565b9050919050565b5f614e5782612f6d565b9150614e6283612f6d565b9250828203905061ffff811115614e7c57614e7b614243565b5b92915050565b7f546f6b656e206973206e6f74206c6f636b6564000000000000000000000000005f82015250565b5f614eb66013836130e6565b9150614ec182614e82565b602082019050919050565b5f6020820190508181035f830152614ee381614eaa565b9050919050565b7f53686170657368696674696e67206973207061757365640000000000000000005f82015250565b5f614f1e6017836130e6565b9150614f2982614eea565b602082019050919050565b5f6020820190508181035f830152614f4b81614f12565b9050919050565b5f606082019050614f655f830186613433565b614f726020830185613433565b614f7f6040830184613433565b949350505050565b5f81519050614f9581612faf565b92915050565b5f60208284031215614fb057614faf612dcf565b5b5f614fbd84828501614f87565b91505092915050565b7f4e6f7420617574686f72697a65640000000000000000000000000000000000005f82015250565b5f614ffa600e836130e6565b915061500582614fc6565b602082019050919050565b5f6020820190508181035f83015261502781614fee565b9050919050565b7f53686170657368696674206d61782072656163686564000000000000000000005f82015250565b5f6150626016836130e6565b915061506d8261502e565b602082019050919050565b5f6020820190508181035f83015261508f81615056565b9050919050565b7f546f6b656e206973206c6f636b656400000000000000000000000000000000005f82015250565b5f6150ca600f836130e6565b91506150d582615096565b602082019050919050565b5f6020820190508181035f8301526150f7816150be565b9050919050565b5f61510882612f6d565b91505f820361511a57615119614243565b5b600182039050919050565b5f61512f82612f6d565b915061ffff820361514357615142614243565b5b600182019050919050565b5f6151588261307e565b91506151638361307e565b92508282026151718161307e565b9150828204841483151761518857615187614243565b5b5092915050565b5f6151998261307e565b91506151a48361307e565b9250826151b4576151b3614216565b5b828206905092915050565b5f6151c98261307e565b91505f82036151db576151da614243565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e745f82015250565b5f61521a6020836130e6565b9150615225826151e6565b602082019050919050565b5f6020820190508181035f8301526152478161520e565b905091905056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212202633f63b7471c47255bd40243802ec87f3311a0a725534020e792fa65021a9c864736f6c63430008150033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

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