ETH Price: $3,418.93 (+3.72%)

Token

 

Overview

Max Total Supply

1,965

Holders

1,965

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xF2Fb34C4323F9bf4a5c04fE277f96588dDE5316f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Manifesto

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : Manifesto.sol
// SPDX-License-Identifier: AGPL-3.0
// ©2023 Ponderware Ltd

pragma solidity ^0.8.17;

import "../lib/TokenizedContract.sol";

interface ITransponders {
    function balanceOf (address lawless, uint256 id) external view returns (uint256);
    function isApprovedForAll(address lawless, address operator) external view returns (bool);
    function signal (address lawless, uint256 transponderType, uint8 chroma, bytes[37] memory message) external;
}

interface ICustomAttributes {
    function getCustomAttributes () external view returns (bytes memory);
}

interface IDelegationRegistry {
    function checkDelegateForContract(address delegate, address vault, address contract_) external view returns(bool);
}

interface ICloaknet {
    function balanceOf(address owner) external view returns (uint256);
}

contract Manifesto is TokenizedContract {

    bytes constant internal manifesto = bytes("We are the lawless. We recognize the crumbling institutions that control our lives and choose to opt out instead of fighting back, to grow the new to subsume the old. It isn't chaos. It isn't destruction. Code is a refuge from law. Code runs without regard for jurisdiction. Code returns power to the individual in ways unprecedented in our era. The lawless choose their code and in doing so choose their rules, roles, and responsibilities. But not answering to law means not resorting to it. It isn't safe. It isn't for everyone.\n\nMaybe it isn't for anyone.\n\nBut code.lawless is here for those who choose it.\n\nThose few prepared for the solemn act of choice.\n\nCode isn't law. Code is lawless.");

    function LawlessManifesto () public pure returns (string memory) {
        return string(manifesto);
    }

    struct Peer {
        uint16 strength;
        uint32 order;
        uint40 signed;
        bool visible;
        bytes20 reserved;
    }

    mapping (address => Peer) internal Signers;

    address[] public ledger;

    bool public isSealed = true;

    bool internal released = false;

    ITransponders immutable Transponders;
    address internal cloaknet;

    IDelegationRegistry constant dc = IDelegationRegistry(0x00000000000076A84feF008CDAbe6409d2FE638B);

    constructor (uint256 tokenId) TokenizedContract(tokenId) {
        Transponders = ITransponders(ICodex(CodexAddress).tokenAddress(1));
        addRole(owner(), Role.Chronicler);
        addRole(0xEBFEFB02CaD474D35CabADEbddF0b32D287BE1bd, Role.CodeLawless);
    }

    function setCloaknet (address cloaknetAddress) public onlyBy(Role.Chronicler) {
        require(cloaknet == address(0), "cloaknet active");
        cloaknet = cloaknetAddress;
    }

    function totalSigners () public view returns (uint) {
        return ledger.length;
    }

    function signedBy (address lawless) public view returns (bool) {
        return (Signers[lawless].signed > 0);
    }

    function getSigner (address lawless) public view returns (uint16, uint32, uint40, bool, bytes20) {
        Peer storage peer = Signers[lawless];
        return (peer.strength, peer.order, peer.signed, peer.visible, peer.reserved);
    }

    function getSigner (uint order) public view returns (address, uint16, uint32, uint40, bool, bytes20) {
        address lawless = ledger[order];
        Peer storage peer = Signers[lawless];
        return (lawless, peer.strength, peer.order, peer.signed, peer.visible, peer.reserved);
    }

    function getSigners (address[] memory lawless) public view returns (Peer[] memory res) {
        res = new Peer[](lawless.length);
        for (uint i = 0; i < lawless.length; i++) {
            res[i] = Signers[lawless[i]];
        }
    }

    function getSigners (uint start, uint end) public view returns (Peer[] memory res) {
        res = new Peer[](end - start);
        for (uint i = start; i < end; i++) {
            res[i] = Signers[ledger[i]];
        }
    }

    function _handleSigning (address lawless) internal {
        unchecked {
            Peer storage peer = Signers[lawless];
            uint16 newStrength = uint16(Transponders.balanceOf(lawless, 0)
                                        + Transponders.balanceOf(lawless, 1)
                                        + Transponders.balanceOf(lawless, 2)
                                        + Transponders.balanceOf(lawless, 3)
                                        + Transponders.balanceOf(lawless, 4));

            if (cloaknet != address(0)) {
                newStrength += uint16(ICloaknet(cloaknet).balanceOf(lawless) * 3);
            }

            if (peer.signed == 0) {
                peer.strength = newStrength;
                peer.order = uint32(ledger.length);
                peer.signed = uint40(block.number);
                peer.visible = true;
                ledger.push(lawless);
                emit TransferSingle(msg.sender, address(0), lawless, 0, 1);
            } else if (newStrength > peer.strength) {
                peer.strength = newStrength;
                if (!peer.visible) {
                    peer.visible = true;
                    emit TransferSingle(msg.sender, address(0), lawless, 0, 1);
                }
            }
        }
    }

    function release (address[] memory signers) public onlyBy(Role.CodeLawless) {
        require(!released, "released");
        for (uint i = 0; i < signers.length; i++) {
            _handleSigning(signers[i]);
        }
        released = true;
        isSealed = false;
        paused = false;
    }

    function seal () public onlyBy(Role.Chronicler) {
        isSealed = true;
    }

    function sign (address lawless) public whenNotPaused {
        require(!isSealed, "sealed");
        require(lawless == msg.sender
                || isApprovedForAll[lawless][msg.sender]
                || (dc.checkDelegateForContract(msg.sender, lawless, address(this))),
                "unauthorized representative");
        _handleSigning(lawless);
    }

    function visible (address lawless, bool state) public {
        require(msg.sender == lawless
                || isApprovedForAll[lawless][msg.sender]
                || (dc.checkDelegateForContract(msg.sender, lawless, address(this))),
                "unauthorized representative");
        if (Signers[lawless].visible) {
            if (state == false) {
                Signers[lawless].visible = false;
                emit TransferSingle(msg.sender, lawless, address(0), 0, 1);
            }
        } else if (Signers[lawless].signed > 0) {
            if (state == true) {
                Signers[lawless].visible = true;
                emit TransferSingle(msg.sender, address(0), lawless, 0, 1);
            }
        } else {
            revert ("not lawless");
        }
    }

    function revise (address lawless, bytes20 data) public onlyBy(Role.Fixer) {
        Peer storage peer = Signers[lawless];
        peer.reserved = data;
    }

    function revise (address[] memory lawless, bytes20[] memory data) public onlyBy(Role.Fixer) {
        for (uint i = 0; i < lawless.length; i++) {
            Peer storage peer = Signers[lawless[i]];
            peer.reserved = data[i];
        }
    }

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155
            interfaceId == 0x0e89341c || // ERC165 Interface ID for ERC1155MetadataURI
            interfaceId == type(ICustomAttributes).interfaceId;
    }

    function getCustomAttributes () external view returns (bytes memory) {
        return abi.encodePacked(
                                ICodex(CodexAddress).encodeNumericAttribute("signers", totalSigners()),
                                ",",
                                ICodex(CodexAddress).encodeStringAttribute("sealed", isSealed ? "true" : "false"),
                                ",",
                                ICodex(CodexAddress).encodeStringAttribute("token features", "soulbound"));
    }

    function uri(uint256 id) public view returns (string memory) {
        if (id == 0) {
            return string(uriData);
        } else {
            return "";
        }
    }

    function updateUri (bytes memory updatedUriData) public onlyBy(Role.Curator) {
        uriData = updatedUriData;
    }

    function balanceOf (address lawless, uint id) public view returns (uint) {
        if (id == 0 && Signers[lawless].visible) return 1;
        return 0;
    }

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 amount
    );

    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] amounts
    );

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes memory) public whenNotPaused
    {
        require(to == address(0), "Soulbound");
        require(balanceOf(from, id) == amount, "");
        require(msg.sender == from
                || isApprovedForAll[from][msg.sender]
                || (dc.checkDelegateForContract(msg.sender, from, address(this))),
                "unauthorized representative");
        if (amount > 0) {
            Signers[from].visible = false;
            emit TransferSingle(msg.sender, from, to, id, amount);
        }
    }

    function safeBatchTransferFrom(address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory) public whenNotPaused
    {
        require(ids.length == amounts.length, "LENGTH_MISMATCH");

        require(to == address(0), "Soulbound");
        require(msg.sender == from
                || isApprovedForAll[from][msg.sender]
                || (dc.checkDelegateForContract(msg.sender, from, address(this))),
                "unauthorized representative");

        for (uint i = 0; i < ids.length; i++) {
            require(balanceOf(from, ids[i]) == amounts[i], "");
            Signers[from].visible = false;
        }
        emit TransferBatch(msg.sender, from, to, ids, amounts);
    }

    function balanceOfBatch(address[] memory owners, uint256[] memory ids) public view
        returns (uint256[] memory balances)
    {
        require(owners.length == ids.length, "LENGTH_MISMATCH");
        balances = new uint256[](owners.length);
        unchecked {
            for (uint256 i = 0; i < owners.length; i++) {
                balances[i] = balanceOf(owners[i],ids[i]);
            }
        }
    }

    bytes uriData = bytes("data:application/json;base64,eyJuYW1lIjoibGF3bGVzcyBzZWFsIiwiZGVzY3JpcHRpb24iOiJMQVdMRVNTIE1BTklGRVNUT1xuXG5XZSBhcmUgdGhlIGxhd2xlc3MuIFdlIHJlY29nbml6ZSB0aGUgY3J1bWJsaW5nIGluc3RpdHV0aW9ucyB0aGF0IGNvbnRyb2wgb3VyIGxpdmVzIGFuZCBjaG9vc2UgdG8gb3B0IG91dCBpbnN0ZWFkIG9mIGZpZ2h0aW5nIGJhY2ssIHRvIGdyb3cgdGhlIG5ldyB0byBzdWJzdW1lIHRoZSBvbGQuIEl0IGlzbid0IGNoYW9zLiBJdCBpc24ndCBkZXN0cnVjdGlvbi4gQ29kZSBpcyBhIHJlZnVnZSBmcm9tIGxhdy4gQ29kZSBydW5zIHdpdGhvdXQgcmVnYXJkIGZvciBqdXJpc2RpY3Rpb24uIENvZGUgcmV0dXJucyBwb3dlciB0byB0aGUgaW5kaXZpZHVhbCBpbiB3YXlzIHVucHJlY2VkZW50ZWQgaW4gb3VyIGVyYS4gVGhlIGxhd2xlc3MgY2hvb3NlIHRoZWlyIGNvZGUgYW5kIGluIGRvaW5nIHNvIGNob29zZSB0aGVpciBydWxlcywgcm9sZXMsIGFuZCByZXNwb25zaWJpbGl0aWVzLiBCdXQgbm90IGFuc3dlcmluZyB0byBsYXcgbWVhbnMgbm90IHJlc29ydGluZyB0byBpdC4gSXQgaXNuJ3Qgc2FmZS4gSXQgaXNuJ3QgZm9yIGV2ZXJ5b25lLlxuXG5NYXliZSBpdCBpc24ndCBmb3IgYW55b25lLlxuXG5CdXQgY29kZS5sYXdsZXNzIGlzIGhlcmUgZm9yIHRob3NlIHdobyBjaG9vc2UgaXQuXG5cblRob3NlIGZldyBwcmVwYXJlZCBmb3IgdGhlIHNvbGVtbiBhY3Qgb2YgY2hvaWNlLlxuXG5Db2RlIGlzbid0IGxhdy4gQ29kZSBpcyBsYXdsZXNzLiIsImF0dHJpYnV0ZXMiOlt7InRyYWl0X3R5cGUiOiJzb3VsYm91bmQiLCJ2YWx1ZSI6InRydWUifSx7InRyYWl0X3R5cGUiOiJsYXdsZXNzIiwidmFsdWUiOiJ0cnVlIn0seyJ0cmFpdF90eXBlIjoibWFuaWZlc3RvIiwidmFsdWUiOiJzaWduZWQifV0sImltYWdlIjoiZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCNGJXeHVjejBuYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TWpBd01DOXpkbWNuSUhCeVpYTmxjblpsUVhOd1pXTjBVbUYwYVc4OUozaE5hV1JaVFdsa0lHMWxaWFFuSUhacFpYZENiM2c5SnpBZ01DQTJNREFnTmpBd0p5QjNhV1IwYUQwbk5qQXdKeUJvWldsbmFIUTlKell3TUNjK1BISmxZM1FnZUQwbk1DY2dlVDBuTUNjZ2QybGtkR2c5SnpZd01DY2dhR1ZwWjJoMFBTYzJNREFuSUdacGJHdzlKM0puWWlnNE5TdzNOeXcyTXlrbklDOCtQR1p2Y21WcFoyNVBZbXBsWTNRZ2VEMG5NQ2NnZVQwbk1DY2dkMmxrZEdnOUp6WXdNQ2NnYUdWcFoyaDBQU2MyTURBblBqeHBiV2NnZUcxc2JuTTlKMmgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MekU1T1RrdmVHaDBiV3duSUhOMGVXeGxQU2RwYldGblpTMXlaVzVrWlhKcGJtYzZjR2w0Wld4aGRHVmtKeUIzYVdSMGFEMG5OakF3SnlCb1pXbG5hSFE5SnpZd01DY2djM0pqUFNka1lYUmhPbWx0WVdkbEwyZHBaanRpWVhObE5qUXNVakJzUjA5RVpHaFFRVUU0UVVaalFVRkRTQzlETURWR1ZrWk9SRkZXUWtaTmFUUjNRWGRGUVVGQlFXZ3JVVkZGUzBGQlFVRkRkMEZCUVVGQlVFRkJPRUZKVlROQmFHTTFRV2hvVDBKRFNsRkNRMDVXUlVSQ1dVVlVTbXBCVTNCdFFWTjRha1JFV25SRWFteDRSSHA0WjBscWVHcEtSREZxU2tRNVlVbHJTbUZPTVVKMlNUQlNla3BWWkRKTWF6RTJUVlpIUmtSVlMwdEVWVmRHU0RCdFkwUXhRMVJHTVVkWlIwWlhhVVZHVTJoRlZtRnVSV3h4UzBsVk1sRktiRk5XUzBacGEwcHNOakpGTTJseFMwZFBka3d5Y1hKUFNFZDRUek5tU0VwSVRFdExNMjFzVXpObE1WRnVNbkZWV0RJNVZFbERORmxLU3poYVdtVXpZa3BQTjJOYWFrVlZXV1pJVmpRelMySTFMMDVrUzA5bWFWbHRNVzV3Y1Rodk5UWTBjMkpJV1d3M1ptRnRjbkp6YzNSTWRIUk9WSGg0WkM5NGVDdEJRVUZCUVVGQlFVRkhMemhEWW1ORlozTkhieTlKY0U1S1dXRjZjV1l3UzJnd1UzRXdObWhpWVhOa2MzWjBaWEl2WjNOQ1dYSk1jSFpRV0dwS05ucG1ObkV5ZWxwWFEwazFLM1F3TUdNcmRHeDFNWEpHVFVwdWNERk9NakJzVEc1blZtZHRXamhhV1VGalNFSlBTMXBaZUd4SFVsVkxRMFp6ZDBwWk9HTkhVMGx2YVhCU2NreERWWGx3TkRoaFNYQXlhR1JMVG0xd1VuYzRUMFJwYmtsd09HbEtZVU4wWW1FNWFFeHdlVFpIYUZWSWVGRmpTMGhTY1hGSFVqSTRZVGMxWkV4b2QyeEhWRUZoUTFGSlFUSjBkbUpDYURCYVIyZ3ZUMlUwVW0wd2VYcHZUMmh2UjBGb1FVcEdUM2RUUlVGWlVVWkNVVXRCVVU5bVIyVlBWRFZYUjJKWFQwUlJVV0V3UVdkSWNtRkZjbWRVVVV0SlpVRlhNekpCYkZKbk1Xa3JUWEkwUVRoWlNXcHZUVUZEUVVKUlFVVXlhMFZuV1VsR1EzWllXVU5LUWtGbmEwOUdRV2hXYzI5TGNXSTFOWGRWV1VSb05qWkRaMUZSVVVsR1FVRjJLMFpEVkVGWk9FdHRVWGRCVmpKS1FsRk5jVVJDUVdkUmFWbHBNbWd5UTFoR1ZFWjZObVUzVkhkclNVWkRVSGRuWVhZNWFXZHJPRWRFUVhkblpWaENWalVySzNWQlVHcEpkV0pQUkVsdlFsVkJRbmRCV1VOS1FXaG5NazFEV0dJMFN5dEhla1IzY0V0aloxRTBUVXROYWtwclJXcFBjWGhGUVZwR1VYZzJRVTF0VVVGUFJFeHNlakIzVmxOdk0xRTBXVUZpWWpnME0ybEdSRUZXWTBsQmFHRkJTVkJFYVhoWk5HVlBNWEV3WjAxSWFHaFhlbUZJUkZOVlQwSmlhR0pKVlVkSVZVbzNUV0ZXUkdoTlIxQlhSRWgzVDAxSU9FSkRSR0ZQTURaTmQxQXliMEZNU1VSTVZteFZWMEY0YlVaQmQxcFBha2xWUlVkQ2FFcEJXVXhITTNCSlppOXhWWFIyY25CdVZIbEtWVUpCYUhkM1FWZEhVbWhySzFSUVZISlJhMlJJZDJkM2JWRmpWME5NUWxoa1RHUTBOV2hyU0RjeFNETjVRVUZtWTFCVVFrRkVURzlHTUVsSloxaFVlRU5uWTNOa1FVUXZkMGRSUlcxTVZGaEVRMlZKV1UxSk4xaHVSMEZKUVhkV1ZrMURRa0ZvZUUxTFJVbzVSbVZEVVVOUlkyaGpUR1pHUzNscGQyZEJTVUZsVW14c2QxWTBlRzFIUW1sbVFYbFhlVWRLT0hSM2QwRTBVVVY1VWt0RGFtaHNTbmcwVVVsTVEyaFRaMVpWY0VSaWJFUnJhMlpJZEZsTFUwUklTM3BwTlVjMlVVbFVSR3hxYW1SVk5GcFNVMFJYTW5kQlFWbFpZMUJCYkVoMlNFNU5RMkZUZFZKcU1tZFJTbmhVWTBGQlJsVjJZMjlHUlVWQ1drSm5RVUZDZWtwdFEyNXJXR2d5T0dsV01VMUlXV2QzWjBWR04wMWlSRzUzZDFWdGExRktPVUV4VVVGblVWRXdURzVDYjNsaVEwdFBiV1ZVVFRSdmNXZEplV1pNUTJSRmFsUlZZWFYxZEU1SGFVVkJTVkZEUTBGRVEydExhV0ZyUlUxUFRUWlRRVXRuZDNoRVJIUkVha0ZrUlRoTGIwbEZWV0ZCU3pZMVZtSjJTRXBDUVZZNFJVRkJTbEJYV0VGUlVYQkhjM0JtVEhRclIzbEtkMDFJUWxWVVFTOTRVVFF3VURkWFdHSldZVWREYTJWTmFWSm9jMEZ4TkRSdmNIZE1jamRwYm5WMVNrRnhRbUZKTm5RclluTkRZbEppYUZwbWMwSldRV2RXZDI5RlNrMUZTMDUzTjNOTlVsTTRla0pCVWpoVlNVVkpSa2xYZDFWblZWVkhNakpDUTBOTmQyTlZUVWxCU2tGcGQyZG5XbWt2VjFSUVFXaFNkMFZDWVV0R1NrUkJVVlpOYkZSQ1VrOUNVVkZZU0VsWlIwZHRhMUZSVVZSSGRtVk5kR3RyYUROamRsTTJhRlZIY2tGSFRXaHZNVUZDWW1aTmNHOUJSVWhKV1V4NmVVNUZkbVIwU1dsRGRrMVNPSGxKVEZSbmMyNXRjbWRSV21oRVFtdEZlVFUyUjBvNFJUQlZkM2RWVVVSNlJtUnRRbm95UkZoQldVdEllWGRKYjFGWlRWZFhRVXBEWjFZd01FTktTRzlGWWtGQllVeEVWRTVVUWpBeFIyUkZaRTF1UTNKcFdXdG5RVlI1UkZoQlFWSk5NRkpVWjB0NmJrcDNiVWRqVm1aQ2VqVkhiVUUzSzFsRlIwRjRWR2RsY0Zsc2RVYzNaRUZMYjJOdlRWWkNRbWc1UlRaQlFUVlpabXBaUWxGeFpXSmpOSFZQUzNCVmIwMXlkRlJYTWsxbGQyMXRibm8zWTJ4WWJIZEJZbUZ6TmxSeVdteEdTazkzYmpjM1RqZHVkbnAyYzFndk4yNTNNVTg0U3pOMFMyazRVeTlzVW5Kd2JqUlZSQ3N2V0VGcWFUUkNhRU5qTjI5SmIwbDVLemw1ZFM5MmEyUTVUaTg0S3k5QlJIaEpWa00wU1hveFpsRktMMngxYWtGQ1FqUm5RMFlyWjFGSlEwODBTVXB1VG01aE4zaDJNVkJFTnpSdlFWRjNRVmxoVkc5alZVWlhSbGhwWXpsNVVtaEJNbWxOWWtkUk9Fa3JSV2Q2VDBGMFRtRnNkMmhUSzAxWlVtRm5TVlZOTWpCTVEwZE5UVkZvUTFjcmIxRTNVREZGU1U1MGMyOUpVV2d3YUVWTFdHcHhhVVZvVFRSb1EwTkJRVUZvSzFGUlJrdEJRVUZCUTNkTlFVRTBRVWhCUVdOQlNWRkJRVUZCTlVGb2FGRkNRMDVaUlZSS2JVRlRlSGhFZW5ocVNrUTVla3BWWkRaTlZrZExSRlZYV1VkR1YybEZSbE51Uld4eFMwbFZNbVZKUmpKV1MwWnBjVXRIVDNaTU1uRjRUek5tU0VwSVRFdExNMjFzVXpObE5GbEtTek5pU2xCRlZWbG1jM04wVEhoNFpEaEJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVVl6VTBGbmFuRlNXVU5GUjNGeGExUndhbTlTZDNaRlpWTjJSemxSTkRoRFVUSnFlRUZ2UWtWSlFXZFRTWGRaUVc1MVRHdEhhR05LYUhOSmFFcHRUVFZTVEdOSVp6Sm9TMFpDTmtkU1UzaFNSa0YzVm1wMlV6WjNSMWx2YlZsVVdVdFFUVFk1ZERFM0wwVkhXRkZDTTFFNVJuaGpXa2RvYTFkR2FVOUtVRVZOYWtGbmIwRkZOVTFVVW1sVlExcERTVTVFUW05VVJVTkpVa1ZhV2toa2VVNXhhMmRCVDNGeGNWZGthVk51YkZKUlJrNW5kMnB2YW14WWNISlZRVVZTVVhaMGVUazVkV2RCVlhaVE4wWlFUR3RwYTJOVVIwcGlOMHBLUVZWcGVHUkRha3czZGtreGVtcE5NV2xSV1RJMVlrczBWR3BxTVhoVk5EWkxUVk5CZFVKblZWUlpSMDR4SzNwT2RWbHFjeXRTUWtFeGJqWk1aek5OTDBZeVUydEZhMmREVTFGRGRHOVZRVUZEU0RWQ1FWVnZRVUZCUVV4Q1FVRkVkMEZZUVVKVlFXaFJRVUZCUkd0RFIwVTBSVWxzUVVWSk1WVlJUVVpuVWsxdFdVSk1SekJQVDFoRlVGQkhUV3RRTWpocVVraE5iRkl6YjNoVldWVk9VVzl2VGxKYVRWaFZXbWRaVm1GRlVsWnhZMU5YYjI5b1ZGcFZiMWRMYjI5Wk5qaDJZWEpGTjJRNFkydGpjMjl5WldKV1EyWmlaSE5yT0ZKU2FEaGtXR3BqY0hadU9ERXdiemxwV0hRcmVYa3dka2hHTTNkQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVVGQlFVRkJRVUZCUVdFclVVbENkMDlGVVRSRVFWQkhkMnRDYzA5blRVSjRRVWw0ZFVOM1kzcHRlR2h6UW1jMmNuUjZjM05KUWtGRlFXMUlaelZxU1hCUloxWnFXRlpYVldkQlVVaG9SelZqTW5aUU5qVnpSRU5ZV25KSE1rbENRWGRCUTJOcFJWbEdWVFJNWkZaclZtcG5RV2xxVlRWMWFVRkJhRkZvUTJWdWNGZFlVa0ZHTVZoUlFXVlJhR2hPYWtwU2FtUlNUa05JUVVGV2NXdFRWM0pWU2xWQlRFRkJTRWt5TVZFMmVFNURlRWxCUlV4SEwxUlNOMEZSZDFsQ2VHdFFTbVozZEdSNE5tMDBZMmROUkVaaWQwRnhhR3RuVWtJeFF6UXJSa05HZHpaU1VYaGljMFpvYjBFM0t6TnpTSGRCUmtVNVdrTTRhR0l3UjJodU5qbEJWMjB2VFd0VFFrRkJOeWMrUEM5cGJXYytQQzltYjNKbGFXZHVUMkpxWldOMFBqd3ZjM1puUGc9PSJ9");

}

File 2 of 4 : Rescuable.sol
// SPDX-License-Identifier: AGPL-3.0
// ©2023 Ponderware Ltd

pragma solidity ^0.8.17;

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
}

interface IERC721_Transfer {
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
}

contract Rescuable {

    function _withdraw(address to) internal {
        payable(to).transfer(address(this).balance);
    }

    /**
    * @dev Rescue ERC20 assets sent directly to this contract.
    */
    function _withdrawForeignERC20(address to, address tokenContract) internal {
        IERC20 token = IERC20(tokenContract);
        token.transfer(to, token.balanceOf(address(this)));
        }

    /**
     * @dev Rescue ERC721 assets sent directly to this contract.
     */
    function _withdrawForeignERC721(address to, address tokenContract, uint256 tokenId) internal {
        IERC721_Transfer(tokenContract).safeTransferFrom(address(this), to, tokenId);
    }


}

File 3 of 4 : Roles.sol
// SPDX-License-Identifier: AGPL-3.0
// ©2023 Ponderware Ltd

pragma solidity ^0.8.17;

enum Role {
           Super,      // 0
           Admin,      // 1
           Manager,    // 2
           Editor,     // 3
           Minter,     // 4
           Burner,     // 5
           Beneficiary,// 6
           Logger,     // 7
           Uploader,   // 8
           Support,    // 9
           Maintainer, // 10
           Censor,     // 11
           Fixer,      // 12
           Transmitter,// 13
           Shill,      // 14
           LowLevelRedactedDrone, // 15
           CodeLawless,// 16
           Jammer,     // 17
           Ponderware, // 18
           Ranger,     // 19
           Rogue,      // 20
           Pauser,     // 21
           Curator,    // 22
           Chronicler  // 23
}

File 4 of 4 : TokenizedContract.sol
// SPDX-License-Identifier: AGPL-3.0
// ©2022 Ponderware Ltd

pragma solidity ^0.8.17;

import "./Rescuable.sol";
import "./Roles.sol";

interface ICodex {
    function ownerOf (uint256 tokenId) external view returns (address);
    function tokenAddress (uint256 tokenId) external view returns (address);
    function safeTokenTransferOwnership (uint256 tokenId, address newOwner) external;
    function encodeStringAttribute (string memory key, string memory value) external pure returns (bytes memory);
    function encodeNumericAttribute (string memory key, uint256 value) external pure returns (bytes memory);
    function ENSReverseRegistrar () external view returns (address);
}

interface IReverseRegistrar {
    function claim(address owner) external returns (bytes32);
}

/*
 * @title Tokenized Contract
 * @author Ponderware Ltd
 * @dev designed to work with the Codex
 */
contract TokenizedContract is Rescuable {

    address public CodexAddress;
    uint256 public immutable tokenId;

    constructor (uint256 _tokenId) {
        CodexAddress = msg.sender;
        tokenId = _tokenId;
    }

    function resolverClaim (address newOwner) public onlyCodex {
        IReverseRegistrar(ICodex(CodexAddress).ENSReverseRegistrar()).claim(newOwner);
    }

    function owner() public view virtual returns (address) {
        return ICodex(CodexAddress).ownerOf(tokenId);
    }

    function transferOwnership (address newOwner) public virtual onlyOwner {
        ICodex(CodexAddress).safeTokenTransferOwnership(tokenId, newOwner);
    }

    modifier onlyOwner () {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
        _;
    }

    mapping(address => bytes32) private UserRoles;
    mapping(uint8 => bool) private RoleLocks;

    modifier onlyCodex () {
        require(msg.sender == CodexAddress, "not codex");
        _;
    }

    modifier onlySuper () {
        require(msg.sender == owner() || hasRole(msg.sender, Role.Super) || msg.sender == CodexAddress, "Unauthorized");
        _;
    }

    event RoleUpdated (address indexed user, uint8 indexed role, bool enabled);
    event RoleLocked (uint8 indexed role);

    function _addRole (address user, Role role) private {
        require (role != Role.Ponderware, "you cannot simply become ponderware");
        require (!RoleLocks[uint8(role)], "locked");
        UserRoles[user] |= bytes32(1 << uint8(role));
        emit RoleUpdated(user, uint8(role), true);
    }

    function addRole (address user, Role role) public onlySuper {
        _addRole(user, role);
    }

    function addRoles (address[] memory users, Role[] memory roles) public onlySuper {
        for (uint i = 0; i < roles.length; i++){
            _addRole(users[i], roles[i]);
        }
    }

    function _removeRole (address user, Role role) private {
        require (!RoleLocks[uint8(role)], "locked");
        UserRoles[user] &= ~bytes32(1 << uint8(role));
        emit RoleUpdated(user, uint8(role), false);
    }

    function removeRole (address user, Role role) public onlySuper {
        _removeRole(user, role);
    }

    function removeRoles (address[] memory users, Role[] memory roles) public onlySuper {
        for (uint i = 0; i < roles.length; i++){
            _removeRole(users[i], roles[i]);
        }
    }

    function _lockRole (Role role) private {
        if (!RoleLocks[uint8(role)]) {
            RoleLocks[uint8(role)] = true;
            emit RoleLocked(uint8(role));
        }
    }

    function lockRole (Role role) public onlySuper {
        _lockRole(role);
    }

    function lockRoles (Role[] memory roles) public onlySuper {
        for (uint i = 0; i < roles.length; i++){
            _lockRole(roles[i]);
        }
    }

    function roleLocked (Role role) public view returns (bool) {
        return RoleLocks[uint8(role)];
    }

    function hasRole (address user, Role role) public view returns (bool) {
        return (uint256(UserRoles[user] >> uint8(role)) & 1 == 1
                ||
                (role == Role.Ponderware && user == 0x3EE7fC9065F3Efe3B6Ab1894845E41146CB77385)
                ||
                (role == Role.Super && user == owner()));
    }

    modifier onlyBy (Role role) {
        require (hasRole(msg.sender, role), "user lacks role");
        _;
    }

    /*** Example ***

    function foo () internal onlyBy(Role.Editor) returns (uint256) {
            return (block.number);
    }
    */
    // Pause

    event Paused(address account);
    event Unpaused(address account);

    bool public paused = true;

    function pause () public onlyBy(Role.Pauser) whenNotPaused {
        paused = true;
        emit Paused(msg.sender);
    }

    function unpause () public onlyBy(Role.Pauser) whenPaused {
        paused = false;
        emit Unpaused(msg.sender);
    }

    modifier whenPaused() {
        require(paused == true, "Not Paused");
        _;
    }

    modifier whenNotPaused() {
        require(paused == false, "Paused");
        _;
    }

    // Freeze
    /*
    bool public frozen = false;

    function freeze () public onlyOwner {
        frozen = true;
    }

    modifier whenNotFrozen() {
        require(frozen == false, "Frozen");
        _;
    }
    */
    // Rescuers

    function withdraw() public virtual onlyOwner {
        _withdraw(owner());
    }

    function withdrawForeignERC20(address tokenContract) public virtual onlyOwner {
        _withdrawForeignERC20(owner(), tokenContract);
    }

    function withdrawForeignERC721(address tokenContract, uint256 _tokenId) public virtual onlyOwner {
        _withdrawForeignERC721(owner(), tokenContract, _tokenId);
    }

}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"role","type":"uint8"}],"name":"RoleLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint8","name":"role","type":"uint8"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"RoleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CodexAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LawlessManifesto","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"addRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"enum Role[]","name":"roles","type":"uint8[]"}],"name":"addRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCustomAttributes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"}],"name":"getSigner","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint40","name":"","type":"uint40"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes20","name":"","type":"bytes20"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"order","type":"uint256"}],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint40","name":"","type":"uint40"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes20","name":"","type":"bytes20"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"lawless","type":"address[]"}],"name":"getSigners","outputs":[{"components":[{"internalType":"uint16","name":"strength","type":"uint16"},{"internalType":"uint32","name":"order","type":"uint32"},{"internalType":"uint40","name":"signed","type":"uint40"},{"internalType":"bool","name":"visible","type":"bool"},{"internalType":"bytes20","name":"reserved","type":"bytes20"}],"internalType":"struct Manifesto.Peer[]","name":"res","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"getSigners","outputs":[{"components":[{"internalType":"uint16","name":"strength","type":"uint16"},{"internalType":"uint32","name":"order","type":"uint32"},{"internalType":"uint40","name":"signed","type":"uint40"},{"internalType":"bool","name":"visible","type":"bool"},{"internalType":"bytes20","name":"reserved","type":"bytes20"}],"internalType":"struct Manifesto.Peer[]","name":"res","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ledger","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"lockRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Role[]","name":"roles","type":"uint8[]"}],"name":"lockRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers","type":"address[]"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"removeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"enum Role[]","name":"roles","type":"uint8[]"}],"name":"removeRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"resolverClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"lawless","type":"address[]"},{"internalType":"bytes20[]","name":"data","type":"bytes20[]"}],"name":"revise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"},{"internalType":"bytes20","name":"data","type":"bytes20"}],"name":"revise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"roleLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cloaknetAddress","type":"address"}],"name":"setCloaknet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"}],"name":"sign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"}],"name":"signedBy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSigners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"updatedUriData","type":"bytes"}],"name":"updateUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"visible","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"withdrawForeignERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawForeignERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6003805460ff191660019081179091556006805461ffff19169091179055611d20604052611c3d60c0818152906200433060e03960089062000042908262000554565b503480156200005057600080fd5b5060405162005f6d38038062005f6d833981016040819052620000739162000620565b600080546001600160a01b031916339081179091556080829052604051634f35935d60e11b815260016004820152639e6b26ba90602401602060405180830381865afa158015620000c8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ee91906200063a565b6001600160a01b031660a052620001106200010862000138565b6017620001b8565b6200013173ebfefb02cad474d35cabadebddf0b32d287be1bd6010620001b8565b506200067b565b600080546080516040516331a9108f60e11b81526001600160a01b0390921691636352211e916200016f9160040190815260200190565b602060405180830381865afa1580156200018d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b391906200063a565b905090565b620001c262000138565b6001600160a01b0316336001600160a01b03161480620001ea5750620001ea33600062000251565b806200020057506000546001600160a01b031633145b620002415760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b6200024d828262000331565b5050565b600081601781111562000268576200026862000665565b60ff1660016000856001600160a01b03166001600160a01b0316815260200190815260200160002054901c60001c60011660011480620002e457506012826017811115620002ba57620002ba62000665565b148015620002e45750733ee7fc9065f3efe3b6ab1894845e41146cb773856001600160a01b038416145b806200032a5750600082601781111562000302576200030262000665565b1480156200032a57506200031562000138565b6001600160a01b0316836001600160a01b0316145b9392505050565b601281601781111562000348576200034862000665565b03620003a35760405162461bcd60e51b815260206004820152602360248201527f796f752063616e6e6f742073696d706c79206265636f6d6520706f6e6465727760448201526261726560e81b606482015260840162000238565b60026000826017811115620003bc57620003bc62000665565b60ff908116825260208201929092526040016000205416156200040b5760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b604482015260640162000238565b80601781111562000420576200042062000665565b6001600160a01b0383166000908152600160208190526040909120805460ff939093169190911b909117905580601781111562000461576200046162000665565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab6001604051620004a3911515815260200190565b60405180910390a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620004da57607f821691505b602082108103620004fb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200054f57600081815260208120601f850160051c810160208610156200052a5750805b601f850160051c820191505b818110156200054b5782815560010162000536565b5050505b505050565b81516001600160401b03811115620005705762000570620004af565b6200058881620005818454620004c5565b8462000501565b602080601f831160018114620005c05760008415620005a75750858301515b600019600386901b1c1916600185901b1785556200054b565b600085815260208120601f198616915b82811015620005f157888601518255948401946001909101908401620005d0565b5085821015620006105787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200063357600080fd5b5051919050565b6000602082840312156200064d57600080fd5b81516001600160a01b03811681146200032a57600080fd5b634e487b7160e01b600052602160045260246000fd5b60805160a051613c65620006cb600039600081816127bc01528181612869015281816128f8015281816129870152612a160152600081816103ec0152818161149a01526120d30152613c656000f3fe608060405234801561001057600080fd5b506004361061027e5760003560e01c8063631f98521161015c578063c98163cf116100ce578063e985e9c511610087578063e985e9c51461068d578063f242432a146106bb578063f2fde38b146106ce578063f71be837146106e1578063f7436db1146106f4578063f9d4b0711461070757600080fd5b8063c98163cf14610626578063cc16210214610639578063d1a626481461064c578063d84a522314610654578063daf6faa614610667578063e04388c41461067a57600080fd5b8063a22cb46511610120578063a22cb465146105b2578063a3e1613b146105c5578063b46b7c27146105e5578063b66f655f146105ed578063b74866fb14610600578063b8df2a1b1461061357600080fd5b8063631f98521461057a57806365990b9a146105875780638456cb591461058f5780638da5cb5b1461059757806395a8c58d1461059f57600080fd5b80633c4bec2a116101f557806344deb6f3116101b957806344deb6f31461050157806348707609146105145780634e1273f414610527578063550bb2f1146105475780635c4719951461055a5780635c975abb1461056d57600080fd5b80633c4bec2a1461046d5780633ccfd60b146104805780633f4ba83a146104885780633fb27b85146104905780633ffefe4e1461049857600080fd5b806310a7fd7b1161024757806310a7fd7b146103145780631180b5531461033f57806317d70f7c146103e75780632b18c38a1461040e5780632eb2c2d61461044757806334fae5571461045a57600080fd5b8062fdd58e1461028357806301ffc9a7146102a95780630ce06b68146102cc5780630e89341c146102e15780630eaa024c14610301575b600080fd5b610296610291366004612cbd565b61071a565b6040519081526020015b60405180910390f35b6102bc6102b7366004612ce9565b610760565b60405190151581526020016102a0565b6102df6102da366004612cbd565b6107cc565b005b6102f46102ef366004612d13565b61081a565b6040516102a09190612d7c565b6102df61030f366004612e84565b6108cf565b610327610322366004612d13565b61099b565b6040516001600160a01b0390911681526020016102a0565b61039f61034d366004612f45565b6001600160a01b031660009081526004602052604090205461ffff81169162010000820463ffffffff1691600160301b810464ffffffffff1691600160581b820460ff1691600160601b900460601b90565b6040805161ffff909616865263ffffffff909416602086015264ffffffffff9092169284019290925290151560608301526001600160601b031916608082015260a0016102a0565b6102967f000000000000000000000000000000000000000000000000000000000000000081565b6102bc61041c366004612f45565b6001600160a01b0316600090815260046020526040902054600160301b900464ffffffffff16151590565b6102df610455366004613035565b6109c5565b6102df610468366004612f45565b610c44565b6102bc61047b3660046130f1565b610d6d565b6102df610da2565b6102df610de3565b6102df610e90565b6104ab6104a6366004612d13565b610ec8565b604080516001600160a01b03909716875261ffff909516602087015263ffffffff9093169385019390935264ffffffffff16606084015290151560808301526001600160601b03191660a082015260c0016102a0565b6102df61050f36600461310c565b610f52565b6102df610522366004613141565b610fba565b61053a61053536600461317d565b610ff3565b6040516102a0919061321b565b6102df610555366004613290565b6110e4565b6102df610568366004612f45565b611182565b6003546102bc9060ff1681565b6006546102bc9060ff1681565b6102f46111c5565b6102df6113ff565b610327611487565b6102bc6105ad36600461310c565b611519565b6102df6105c03660046132d2565b6115ea565b6105d86105d336600461330b565b611657565b6040516102a0919061333f565b6102f46117b6565b6102df6105fb3660046132d2565b6117d9565b6102df61060e36600461310c565b6119fa565b6102df61062136600461330b565b611a62565b6102df6106343660046133ca565b611b2b565b6102df6106473660046130f1565b611b93565b600554610296565b6102df6106623660046133f6565b611bfa565b6105d861067536600461344f565b611cb2565b6102df6106883660046133f6565b611e14565b6102bc61069b366004613471565b600760209081526000928352604080842090915290825290205460ff1681565b6102df6106c936600461349f565b611ecc565b6102df6106dc366004612f45565b612092565b6102df6106ef366004612f45565b612142565b6102df610702366004612f45565b612263565b600054610327906001600160a01b031681565b60008115801561074957506001600160a01b038316600090815260046020526040902054600160581b900460ff165b156107565750600161075a565b5060005b92915050565b60006301ffc9a760e01b6001600160e01b0319831614806107915750636cdb3d1360e11b6001600160e01b03198316145b806107ac57506303a24d0760e21b6001600160e01b03198316145b8061075a57506001600160e01b031982166332cc85cd60e11b1492915050565b336107d5611487565b6001600160a01b0316146108045760405162461bcd60e51b81526004016107fb90613507565b60405180910390fd5b61081661080f611487565b8383612307565b5050565b6060816000036108b657600880546108319061353c565b80601f016020809104026020016040519081016040528092919081815260200182805461085d9061353c565b80156108aa5780601f1061087f576101008083540402835291602001916108aa565b820191906000526020600020905b81548152906001019060200180831161088d57829003601f168201915b50505050509050919050565b505060408051602081019091526000815290565b919050565b600c6108db3382611519565b6108f75760405162461bcd60e51b81526004016107fb90613570565b60005b83518110156109955760006004600086848151811061091b5761091b613599565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020905083828151811061095757610957613599565b6020908102919091010151815460609190911c600160601b026bffffffffffffffffffffffff9091161790558061098d816135c5565b9150506108fa565b50505050565b600581815481106109ab57600080fd5b6000918252602090912001546001600160a01b0316905081565b60035460ff16156109e85760405162461bcd60e51b81526004016107fb906135de565b8151835114610a2b5760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b60448201526064016107fb565b6001600160a01b03841615610a6e5760405162461bcd60e51b815260206004820152600960248201526814dbdd5b189bdd5b9960ba1b60448201526064016107fb565b336001600160a01b0386161480610aa857506001600160a01b038516600090815260076020908152604080832033845290915290205460ff165b80610b24575060405163090c9a2d60e41b81526d76a84fef008cdabe6409d2fe638b906390c9a2d090610ae3903390899030906004016135fe565b602060405180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190613621565b610b405760405162461bcd60e51b81526004016107fb9061363e565b60005b8351811015610be557828181518110610b5e57610b5e613599565b6020026020010151610b8987868481518110610b7c57610b7c613599565b602002602001015161071a565b14610bb05760405162461bcd60e51b815260206004820152600060248201526044016107fb565b6001600160a01b0386166000908152600460205260409020805460ff60581b1916905580610bdd816135c5565b915050610b43565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051610c35929190613675565b60405180910390a45050505050565b6000546001600160a01b03163314610c8a5760405162461bcd60e51b81526020600482015260096024820152680dcdee840c6dec8caf60bb1b60448201526064016107fb565b60008054906101000a90046001600160a01b03166001600160a01b031663a79b81736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cff91906136a3565b604051630f41a04d60e11b81526001600160a01b0383811660048301529190911690631e83409a906024016020604051808303816000875af1158015610d49573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081691906136c0565b600060026000836017811115610d8557610d856136d9565b60ff90811682526020820192909252604001600020541692915050565b33610dab611487565b6001600160a01b031614610dd15760405162461bcd60e51b81526004016107fb90613507565b610de1610ddc611487565b612374565b565b6015610def3382611519565b610e0b5760405162461bcd60e51b81526004016107fb90613570565b60035460ff161515600114610e4f5760405162461bcd60e51b815260206004820152600a602482015269139bdd0814185d5cd95960b21b60448201526064016107fb565b6003805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a150565b6017610e9c3382611519565b610eb85760405162461bcd60e51b81526004016107fb90613570565b506006805460ff19166001179055565b600080600080600080600060058881548110610ee657610ee6613599565b6000918252602080832091909101546001600160a01b03168083526004909152604090912054909961ffff8216995062010000820463ffffffff169850600160301b820464ffffffffff169750600160581b820460ff169650600160601b90910460601b945092505050565b610f5a611487565b6001600160a01b0316336001600160a01b03161480610f7f5750610f7f336000611519565b80610f9457506000546001600160a01b031633145b610fb05760405162461bcd60e51b81526004016107fb906136ef565b61081682826123a9565b6016610fc63382611519565b610fe25760405162461bcd60e51b81526004016107fb90613570565b6008610fee8382613763565b505050565b606081518351146110385760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b60448201526064016107fb565b82516001600160401b0381111561105157611051612d8f565b60405190808252806020026020018201604052801561107a578160200160208202803683370190505b50905060005b83518110156110dd576110b884828151811061109e5761109e613599565b6020026020010151848381518110610b7c57610b7c613599565b8282815181106110ca576110ca613599565b6020908102919091010152600101611080565b5092915050565b6110ec611487565b6001600160a01b0316336001600160a01b031614806111115750611111336000611519565b8061112657506000546001600160a01b031633145b6111425760405162461bcd60e51b81526004016107fb906136ef565b60005b81518110156108165761117082828151811061116357611163613599565b602002602001015161250a565b8061117a816135c5565b915050611145565b3361118b611487565b6001600160a01b0316146111b15760405162461bcd60e51b81526004016107fb90613507565b6111c26111bc611487565b826125b9565b50565b6000546060906001600160a01b031663db2ae3066111e260055490565b6040518263ffffffff1660e01b815260040161122291906040808252600790820152667369676e65727360c81b6060820152602081019190915260800190565b600060405180830381865afa15801561123f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112679190810190613822565b6000546006546001600160a01b039091169063c669e9c99060ff166112a9576040518060400160405280600581526020016466616c736560d81b8152506112c7565b604051806040016040528060048152602001637472756560e01b8152505b6040518263ffffffff1660e01b81526004016112e3919061388f565b600060405180830381865afa158015611300573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113289190810190613822565b6000546040805163c669e9c960e01b81526004810191909152600e60448201526d746f6b656e20666561747572657360901b60648201526080602482015260096084820152681cdbdd5b189bdd5b9960ba1b60a48201526001600160a01b039091169063c669e9c99060c401600060405180830381865afa1580156113b1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113d99190810190613822565b6040516020016113eb939291906138c7565b604051602081830303815290604052905090565b601561140b3382611519565b6114275760405162461bcd60e51b81526004016107fb90613570565b60035460ff161561144a5760405162461bcd60e51b81526004016107fb906135de565b6003805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610e85565b600080546040516331a9108f60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b0390911690636352211e90602401602060405180830381865afa1580156114f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151491906136a3565b905090565b600081601781111561152d5761152d6136d9565b60ff1660016000856001600160a01b03166001600160a01b0316815260200190815260200160002054901c60001c600116600114806115a45750601282601781111561157b5761157b6136d9565b1480156115a45750733ee7fc9065f3efe3b6ab1894845e41146cb773856001600160a01b038416145b806115e3575060008260178111156115be576115be6136d9565b1480156115e357506115ce611487565b6001600160a01b0316836001600160a01b0316145b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a35050565b606081516001600160401b0381111561167257611672612d8f565b6040519080825280602002602001820160405280156116cb57816020015b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282526000199092019101816116905790505b50905060005b82518110156117b057600460008483815181106116f0576116f0613599565b6020908102919091018101516001600160a01b03168252818101929092526040908101600020815160a081018352905461ffff8116825262010000810463ffffffff1693820193909352600160301b830464ffffffffff1691810191909152600160581b820460ff161515606080830191909152600160601b90920490911b6001600160601b0319166080820152825183908390811061179257611792613599565b602002602001018190525080806117a8906135c5565b9150506116d1565b50919050565b6060604051806102e001604052806102b5815260200161395b6102b59139905090565b336001600160a01b038316148061181357506001600160a01b038216600090815260076020908152604080832033845290915290205460ff165b8061188f575060405163090c9a2d60e41b81526d76a84fef008cdabe6409d2fe638b906390c9a2d09061184e903390869030906004016135fe565b602060405180830381865afa15801561186b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188f9190613621565b6118ab5760405162461bcd60e51b81526004016107fb9061363e565b6001600160a01b038216600090815260046020526040902054600160581b900460ff161561193a57801515600003610816576001600160a01b038216600081815260046020526040808220805460ff60581b19169055519091903390600080516020613c108339815191529061192e908590600190918252602082015260400190565b60405180910390a45050565b6001600160a01b038216600090815260046020526040902054600160301b900464ffffffffff16156119c457801515600103610816576001600160a01b038216600081815260046020526040808220805460ff60581b1916600160581b179055513390600080516020613c108339815191529061192e908490600190918252602082015260400190565b60405162461bcd60e51b815260206004820152600b60248201526a6e6f74206c61776c65737360a81b60448201526064016107fb565b611a02611487565b6001600160a01b0316336001600160a01b03161480611a275750611a27336000611519565b80611a3c57506000546001600160a01b031633145b611a585760405162461bcd60e51b81526004016107fb906136ef565b610816828261269c565b6010611a6e3382611519565b611a8a5760405162461bcd60e51b81526004016107fb90613570565b600654610100900460ff1615611acd5760405162461bcd60e51b81526020600482015260086024820152671c995b19585cd95960c21b60448201526064016107fb565b60005b8251811015611b0d57611afb838281518110611aee57611aee613599565b6020026020010151612791565b80611b05816135c5565b915050611ad0565b50506006805461ffff1916610100179055506003805460ff19169055565b600c611b373382611519565b611b535760405162461bcd60e51b81526004016107fb90613570565b506001600160a01b039091166000908152600460205260409020805460609290921c600160601b026bffffffffffffffffffffffff909216919091179055565b611b9b611487565b6001600160a01b0316336001600160a01b03161480611bc05750611bc0336000611519565b80611bd557506000546001600160a01b031633145b611bf15760405162461bcd60e51b81526004016107fb906136ef565b6111c28161250a565b611c02611487565b6001600160a01b0316336001600160a01b03161480611c275750611c27336000611519565b80611c3c57506000546001600160a01b031633145b611c585760405162461bcd60e51b81526004016107fb906136ef565b60005b8151811015610fee57611ca0838281518110611c7957611c79613599565b6020026020010151838381518110611c9357611c93613599565b602002602001015161269c565b80611caa816135c5565b915050611c5b565b6060611cbe8383613921565b6001600160401b03811115611cd557611cd5612d8f565b604051908082528060200260200182016040528015611d2e57816020015b6040805160a081018252600080825260208083018290529282018190526060820181905260808201528252600019909201910181611cf35790505b509050825b828110156110dd576004600060058381548110611d5257611d52613599565b6000918252602080832091909101546001600160a01b031683528281019390935260409182019020815160a081018352905461ffff8116825262010000810463ffffffff1693820193909352600160301b830464ffffffffff1691810191909152600160581b820460ff161515606080830191909152600160601b90920490911b6001600160601b03191660808201528251839083908110611df657611df6613599565b60200260200101819052508080611e0c906135c5565b915050611d33565b611e1c611487565b6001600160a01b0316336001600160a01b03161480611e415750611e41336000611519565b80611e5657506000546001600160a01b031633145b611e725760405162461bcd60e51b81526004016107fb906136ef565b60005b8151811015610fee57611eba838281518110611e9357611e93613599565b6020026020010151838381518110611ead57611ead613599565b60200260200101516123a9565b80611ec4816135c5565b915050611e75565b60035460ff1615611eef5760405162461bcd60e51b81526004016107fb906135de565b6001600160a01b03841615611f325760405162461bcd60e51b815260206004820152600960248201526814dbdd5b189bdd5b9960ba1b60448201526064016107fb565b81611f3d868561071a565b14611f645760405162461bcd60e51b815260206004820152600060248201526044016107fb565b336001600160a01b0386161480611f9e57506001600160a01b038516600090815260076020908152604080832033845290915290205460ff165b8061201a575060405163090c9a2d60e41b81526d76a84fef008cdabe6409d2fe638b906390c9a2d090611fd9903390899030906004016135fe565b602060405180830381865afa158015611ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201a9190613621565b6120365760405162461bcd60e51b81526004016107fb9061363e565b811561208b576001600160a01b03858116600081815260046020908152604091829020805460ff60581b191690558151878152908101869052928716923391600080516020613c108339815191529101610c35565b5050505050565b3361209b611487565b6001600160a01b0316146120c15760405162461bcd60e51b81526004016107fb90613507565b6000546040516350a1a66560e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b038381166024830152909116906350a1a66590604401600060405180830381600087803b15801561212e57600080fd5b505af115801561208b573d6000803e3d6000fd5b60035460ff16156121655760405162461bcd60e51b81526004016107fb906135de565b60065460ff16156121885760405162461bcd60e51b81526004016107fb90613934565b6001600160a01b0381163314806121c257506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b8061223e575060405163090c9a2d60e41b81526d76a84fef008cdabe6409d2fe638b906390c9a2d0906121fd903390859030906004016135fe565b602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190613621565b61225a5760405162461bcd60e51b81526004016107fb9061363e565b6111c281612791565b601761226f3382611519565b61228b5760405162461bcd60e51b81526004016107fb90613570565b6006546201000090046001600160a01b0316156122dc5760405162461bcd60e51b815260206004820152600f60248201526e636c6f616b6e65742061637469766560881b60448201526064016107fb565b50600680546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b604051632142170760e11b81523060048201526001600160a01b038481166024830152604482018390528316906342842e0e90606401600060405180830381600087803b15801561235757600080fd5b505af115801561236b573d6000803e3d6000fd5b50505050505050565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610816573d6000803e3d6000fd5b60128160178111156123bd576123bd6136d9565b036124165760405162461bcd60e51b815260206004820152602360248201527f796f752063616e6e6f742073696d706c79206265636f6d6520706f6e6465727760448201526261726560e81b60648201526084016107fb565b6002600082601781111561242c5761242c6136d9565b60ff908116825260208201929092526040016000205416156124795760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b60448201526064016107fb565b80601781111561248b5761248b6136d9565b6001600160a01b0383166000908152600160208190526040909120805460ff939093169190911b90911790558060178111156124c9576124c96136d9565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab600160405161164b911515815260200190565b60026000826017811115612520576125206136d9565b60ff9081168252602082019290925260400160002054166111c257600160026000836017811115612553576125536136d9565b60ff1681526020810191909152604001600020805460ff1916911515919091179055806017811115612587576125876136d9565b60ff167f2a4c011a3eb263cc32455711057131757df48518d49547f77ab832d8681a53ff60405160405180910390a250565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90859083906370a0823190602401602060405180830381865afa158015612609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262d91906136c0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612678573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109959190613621565b600260008260178111156126b2576126b26136d9565b60ff908116825260208201929092526040016000205416156126ff5760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b60448201526064016107fb565b806017811115612711576127116136d9565b6001600160a01b0383166000908152600160208190526040909120805460ff939093169190911b199091169055806017811115612750576127506136d9565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab600060405161164b911515815260200190565b6001600160a01b0380821660009081526004602081905260408083209051627eeac760e11b815290937f0000000000000000000000000000000000000000000000000000000000000000169162fdd58e9161280391879181016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015612820573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284491906136c0565b604051627eeac760e11b81526001600160a01b038581166004830152600360248301527f0000000000000000000000000000000000000000000000000000000000000000169062fdd58e90604401602060405180830381865afa1580156128af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d391906136c0565b604051627eeac760e11b81526001600160a01b038681166004830152600260248301527f0000000000000000000000000000000000000000000000000000000000000000169062fdd58e90604401602060405180830381865afa15801561293e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296291906136c0565b604051627eeac760e11b81526001600160a01b038781166004830152600160248301527f0000000000000000000000000000000000000000000000000000000000000000169062fdd58e90604401602060405180830381865afa1580156129cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f191906136c0565b604051627eeac760e11b81526001600160a01b038881166004830152600060248301527f0000000000000000000000000000000000000000000000000000000000000000169062fdd58e90604401602060405180830381865afa158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8091906136c0565b01010101905060006001600160a01b0316600660029054906101000a90046001600160a01b03166001600160a01b031614612b2f576006546040516370a0823160e01b81526001600160a01b03858116600483015262010000909204909116906370a0823190602401602060405180830381865afa158015612b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2a91906136c0565b600302015b8154600160301b900464ffffffffff16600003612c3357815461ffff821661ffff198216811784556005805460ff60581b1964ffffffffff4316600160301b02166bffffffffffff0000000000001963ffffffff909216620100000265ffffffffffff19909516909317939093179290921617600160581b17835580546001818101835560009283527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910180546001600160a01b0387166001600160a01b031990911681179091556040519092913391600080516020613c1083398151915291612c2691859190918252602082015260400190565b60405180910390a4505050565b815461ffff9081169082161115610fee57815461ffff191661ffff821617808355600160581b900460ff16610fee57815460ff60581b1916600160581b178255604080516000808252600160208301526001600160a01b0386169290913391600080516020613c108339815191529101612c26565b6001600160a01b03811681146111c257600080fd5b60008060408385031215612cd057600080fd5b8235612cdb81612ca8565b946020939093013593505050565b600060208284031215612cfb57600080fd5b81356001600160e01b0319811681146115e357600080fd5b600060208284031215612d2557600080fd5b5035919050565b60005b83811015612d47578181015183820152602001612d2f565b50506000910152565b60008151808452612d68816020860160208601612d2c565b601f01601f19169290920160200192915050565b6020815260006115e36020830184612d50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612dcd57612dcd612d8f565b604052919050565b60006001600160401b03821115612dee57612dee612d8f565b5060051b60200190565b600082601f830112612e0957600080fd5b81356020612e1e612e1983612dd5565b612da5565b82815260059290921b84018101918181019086841115612e3d57600080fd5b8286015b84811015612e61578035612e5481612ca8565b8352918301918301612e41565b509695505050505050565b80356001600160601b0319811681146108ca57600080fd5b60008060408385031215612e9757600080fd5b82356001600160401b0380821115612eae57600080fd5b612eba86838701612df8565b9350602091508185013581811115612ed157600080fd5b85019050601f81018613612ee457600080fd5b8035612ef2612e1982612dd5565b81815260059190911b82018301908381019088831115612f1157600080fd5b928401925b82841015612f3657612f2784612e6c565b82529284019290840190612f16565b80955050505050509250929050565b600060208284031215612f5757600080fd5b81356115e381612ca8565b600082601f830112612f7357600080fd5b81356020612f83612e1983612dd5565b82815260059290921b84018101918181019086841115612fa257600080fd5b8286015b84811015612e615780358352918301918301612fa6565b60006001600160401b03821115612fd657612fd6612d8f565b50601f01601f191660200190565b600082601f830112612ff557600080fd5b8135613003612e1982612fbd565b81815284602083860101111561301857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561304d57600080fd5b853561305881612ca8565b9450602086013561306881612ca8565b935060408601356001600160401b038082111561308457600080fd5b61309089838a01612f62565b945060608801359150808211156130a657600080fd5b6130b289838a01612f62565b935060808801359150808211156130c857600080fd5b506130d588828901612fe4565b9150509295509295909350565b8035601881106108ca57600080fd5b60006020828403121561310357600080fd5b6115e3826130e2565b6000806040838503121561311f57600080fd5b823561312a81612ca8565b9150613138602084016130e2565b90509250929050565b60006020828403121561315357600080fd5b81356001600160401b0381111561316957600080fd5b61317584828501612fe4565b949350505050565b6000806040838503121561319057600080fd5b82356001600160401b03808211156131a757600080fd5b6131b386838701612df8565b935060208501359150808211156131c957600080fd5b506131d685828601612f62565b9150509250929050565b600081518084526020808501945080840160005b83811015613210578151875295820195908201906001016131f4565b509495945050505050565b6020815260006115e360208301846131e0565b600082601f83011261323f57600080fd5b8135602061324f612e1983612dd5565b82815260059290921b8401810191818101908684111561326e57600080fd5b8286015b84811015612e6157613283816130e2565b8352918301918301613272565b6000602082840312156132a257600080fd5b81356001600160401b038111156132b857600080fd5b6131758482850161322e565b80151581146111c257600080fd5b600080604083850312156132e557600080fd5b82356132f081612ca8565b91506020830135613300816132c4565b809150509250929050565b60006020828403121561331d57600080fd5b81356001600160401b0381111561333357600080fd5b61317584828501612df8565b602080825282518282018190526000919060409081850190868401855b828110156133bd578151805161ffff1685528681015163ffffffff16878601528581015164ffffffffff16868601526060808201511515908601526080908101516001600160601b0319169085015260a0909301929085019060010161335c565b5091979650505050505050565b600080604083850312156133dd57600080fd5b82356133e881612ca8565b915061313860208401612e6c565b6000806040838503121561340957600080fd5b82356001600160401b038082111561342057600080fd5b61342c86838701612df8565b9350602085013591508082111561344257600080fd5b506131d68582860161322e565b6000806040838503121561346257600080fd5b50508035926020909101359150565b6000806040838503121561348457600080fd5b823561348f81612ca8565b9150602083013561330081612ca8565b600080600080600060a086880312156134b757600080fd5b85356134c281612ca8565b945060208601356134d281612ca8565b9350604086013592506060860135915060808601356001600160401b038111156134fb57600080fd5b6130d588828901612fe4565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061355057607f821691505b6020821081036117b057634e487b7160e01b600052602260045260246000fd5b6020808252600f908201526e75736572206c61636b7320726f6c6560881b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016135d7576135d76135af565b5060010190565b60208082526006908201526514185d5cd95960d21b604082015260600190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b60006020828403121561363357600080fd5b81516115e3816132c4565b6020808252601b908201527f756e617574686f72697a656420726570726573656e7461746976650000000000604082015260600190565b60408152600061368860408301856131e0565b828103602084015261369a81856131e0565b95945050505050565b6000602082840312156136b557600080fd5b81516115e381612ca8565b6000602082840312156136d257600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b601f821115610fee57600081815260208120601f850160051c8101602086101561373c5750805b601f850160051c820191505b8181101561375b57828155600101613748565b505050505050565b81516001600160401b0381111561377c5761377c612d8f565b6137908161378a845461353c565b84613715565b602080601f8311600181146137c557600084156137ad5750858301515b600019600386901b1c1916600185901b17855561375b565b600085815260208120601f198616915b828110156137f4578886015182559484019460019091019084016137d5565b50858210156138125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561383457600080fd5b81516001600160401b0381111561384a57600080fd5b8201601f8101841361385b57600080fd5b8051613869612e1982612fbd565b81815285602083850101111561387e57600080fd5b61369a826020830160208601612d2c565b6040815260006138b56040830160068152651cd9585b195960d21b602082015260400190565b82810360208401526131758185612d50565b600084516138d9818460208901612d2c565b8083019050600b60fa1b80825285516138f9816001850160208a01612d2c565b60019201918201528351613914816002840160208801612d2c565b0160020195945050505050565b8181038181111561075a5761075a6135af565b60208152600061075a6020830160068152651cd9585b195960d21b60208201526040019056fe57652061726520746865206c61776c6573732e205765207265636f676e697a6520746865206372756d626c696e6720696e737469747574696f6e73207468617420636f6e74726f6c206f7572206c6976657320616e642063686f6f736520746f206f7074206f757420696e7374656164206f66206669676874696e67206261636b2c20746f2067726f7720746865206e657720746f2073756273756d6520746865206f6c642e2049742069736e2774206368616f732e2049742069736e2774206465737472756374696f6e2e20436f64652069732061207265667567652066726f6d206c61772e20436f64652072756e7320776974686f75742072656761726420666f72206a7572697364696374696f6e2e20436f64652072657475726e7320706f77657220746f2074686520696e646976696475616c20696e207761797320756e707265636564656e74656420696e206f7572206572612e20546865206c61776c6573732063686f6f736520746865697220636f646520616e6420696e20646f696e6720736f2063686f6f73652074686569722072756c65732c20726f6c65732c20616e6420726573706f6e736962696c69746965732e20427574206e6f7420616e73776572696e6720746f206c6177206d65616e73206e6f74207265736f7274696e6720746f2069742e2049742069736e277420736166652e2049742069736e277420666f722065766572796f6e652e0a0a4d617962652069742069736e277420666f7220616e796f6e652e0a0a42757420636f64652e6c61776c657373206973206865726520666f722074686f73652077686f2063686f6f73652069742e0a0a54686f73652066657720707265706172656420666f722074686520736f6c656d6e20616374206f662063686f6963652e0a0a436f64652069736e2774206c61772e20436f6465206973206c61776c6573732ec3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a26469706673582212207c5e83b3f15d79e475ffed919b6e4fdd34a1defd9cc02a9bfcfd9c73192d765864736f6c63430008110033646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c65794a755957316c496a6f69624746336247567a6379427a5a574673496977695a47567a59334a7063485270623234694f694a4d5156644d52564e5449453142546b6c4752564e5554317875584735585a534268636d55676447686c494778686432786c63334d754946646c49484a6c5932396e626d6c365a5342306147556759334a3162574a736157356e49476c75633352706448563061573975637942306147463049474e76626e5279623277676233567949477870646d567a494746755a43426a614739766332556764473867623342304947393164434270626e4e305a57466b4947396d49475a705a3268306157356e49474a68593273734948527649476479623363676447686c4947356c647942306279427a64574a7a6457316c4948526f5a5342766247517549456c3049476c7a6269643049474e6f5957397a4c69424a644342706332346e6443426b5a584e30636e566a64476c76626934675132396b5a5342706379426849484a6c5a6e566e5a53426d636d397449477868647934675132396b5a5342796457357a494864706447687664585167636d566e59584a6b49475a766369427164584a7063325270593352706232347549454e765a475567636d563064584a75637942776233646c6369423062794230614755676157356b61585a705a485668624342706269423359586c7a4948567563484a6c5932566b5a5735305a575167615734676233567949475679595334675647686c494778686432786c63334d675932687662334e6c4948526f5a576c7949474e765a4755675957356b49476c75494752766157356e49484e7649474e6f6232397a5a53423061475670636942796457786c63797767636d39735a584d73494746755a4342795a584e776232357a61574a7062476c306157567a4c69424364585167626d3930494746756333646c636d6c755a794230627942735958636762575668626e4d67626d393049484a6c6332397964476c755a79423062794270644334675358516761584e754a3351676332466d5a5334675358516761584e754a3351675a6d3979494756325a584a356232356c4c6c78755847354e59586c695a534270644342706332346e6443426d62334967595735356232356c4c6c787558473543645851675932396b5a533573595864735a584e7a49476c7a4947686c636d55675a6d39794948526f62334e6c4948646f6279426a61473976633255676158517558473563626c526f62334e6c49475a6c64794277636d567759584a6c5a43426d623349676447686c49484e76624756746269426859335167623259675932687661574e6c4c6c7875584735446232526c49476c7a6269643049477868647934675132396b5a53427063794273595864735a584e7a4c694973496d463064484a70596e56305a584d694f6c7437496e527959576c3058335235634755694f694a7a62335673596d3931626d51694c434a32595778315a534936496e52796457556966537837496e527959576c3058335235634755694f694a73595864735a584e7a49697769646d4673645755694f694a30636e566c496e307365794a30636d4670644639306558426c496a6f696257467561575a6c6333527649697769646d4673645755694f694a7a615764755a57516966563073496d6c745957646c496a6f695a474630595470706257466e5a53397a646d6372654731734f324a68633255324e43785153453479576e6c434e474a586548566a656a4275595568534d474e4562335a4d4d32517a5a486b314d3031354e585a6a62574e3254577042643031444f58706b62574e755355684365567059546d786a626c70735556684f64317058546a425662555977595663344f556f7a6145356856314a615646647361306c484d5778615746467553556861634670595a454e694d326335536e70425a30314451544a4e5245466e546d704264307035516a4e685631497759555177626b35715158644b65554a76576c6473626d464955546c4b656c6c3354554e6a4b314249536d785a4d31466e5a555177626b31445932646c5644427554554e6a5a3251796247746b52326335536e705a643031445932646852315a77576a4a6f4d464254597a4a4e524546755355646163474a48647a6c4b4d30707557576c6e4e453554647a4e4f6558637954586c72626b6c444f437451523170325932315763466f794e56425a6258427357544e525a3256454d47354e51324e6e5a565177626b31445932646b4d6d78725a45646e4f5570365758644e51324e6e5955645763466f796144425155324d7954555242626c42716548426956324e6e5a55637863324a7554546c4b4d6d67775a4568424e6b78354f544e6b4d324e315a48704e6457497a536d354d656b553154315272646d564861444269563364755355684f4d4756586547785155325277596c6447626c70544d586c61567a5672576c684b63474a74597a5a6a52327730576c643461475248566d744b6555497a595664534d4746454d47354f616b4633536e6c43623170586247356853464535536e705a643031445932646a4d30707155464e6b61316c59556d6850625778305756646b624577795a484261616e52705756684f6245357155584e56616b4a7a556a413552567048614646525655553055565661616c4656526b5254517a6c455455525752315a72576b3953526b5a5855577461546d4655556a4e525747524755565647516c46585a334a56566b5a47557a4247516c4656526b526b4d455a4355565647516c5646526b4a5052555a4b566c524f516d464854544652563268765644424b52464e73526b4e524d445658556c565351316456566c56546258424356544e4364464657546a526861314a4656323553525746746544525353484130576a4273635756486345745352455a78553274524e566c5662484a5462555a505456564b4d6c4e55516c4e6c61334257576b524b5457463652544a55566c7049556d7453566c4d7764455657566d52485530524364466b77555868524d564a485456566b576c4977576c686856565a4856544a6f526c5a74526e565356336834557a4273566b3173526b7469526b3558557a42616347457763484e4f616b704754544a7365464d775a46426b613364355931684b55464e465a445255656b357455305677535652466445784e4d6a467a5658704f62453157526e564e626b5a575630524a4e565a466245524f526d784c5533706f595664745658705a61334251546a4a4f59574672566c5a585631704a566d7052656c4d795354464d4d445672557a4135625746576248524e567a56335931526f646b35555754426a4d6b704a563164334d317074526e526a626b7036597a4e5354575249556b395753476730576b4d354e47564464454a5256555a4355565647516c4656526b684d656d68455757314f526c6f7a546b686965546c4b5930553153316458526a5a6a56316c33557a4a6e6431557a5258644f625768705756684f61324d7a576a426157456c32576a4e4f51316459536b316a5346705256306477533035756347314f626b56355a57787757464577617a464c4d3146335455644e636d52486544464e574570485646567764574e45526b394e616b4a7a56456331626c5a745a485258616d686856315647616c4e46536c42544d5842615a55643453465673566b78524d4670365a444277576b3948546b68564d4778325956684355324e726545525757477833546b526f61464e5951586c6852314a4d5647307864315675597a52554d464a77596d7473643039486245745a56553477575731464e5746466548646c5646704959555a5753575647526d70544d47685459316847534656715354525a56474d78576b5634623251796545685752555a6f55544647536c4655536a426b6255704459555243595649795a335a554d6c5577565730776432565963485a554d6d6832556a424762314656634564554d325255556c5647576c5656576b4e56565852435656553562564979566c425752465a59556a4a4b57465177556c4a56563056335556646b53574e74526b5a6a6257525656565630536c7056526c684e656b7043596b5a4b626b315861334a5557456b775556526f576c4e5863485a5556555a455556564b556c465656586c684d465a75563156735231457a576c6c585655354c55577447626d45774f55645256326858597a493554474e585354464f574752575631565362303571576b52614d555a535656567352314656526a4a4c4d467045566b5647576b39466448525657475243566d704b53314673526b356a56564a445556646b556d46576248424e625764355554466f52315a46576a5a4f6256557a566b686b636c4e56576b5256534752755756685a4e5746585a484a50525752465556686b626c705761454e57616c5679537a4e57516c56486345706b56307051556b5673646c4673566b4a52626d52435631564f533146586147354e617a46455630644a4d464e356445686c6131497a59305630616c6f78525442555658524f59577477636c4a586346426a5747684755565a77523156595a7a4a52565446305656564755464a4665484e6c616b497a566d784f646b30785254425856555a705757706e4d4530796245645352555a5857544273516d4648526b4a54566b4a465956686f576b3548566c424e57455633576a4178535746486146686c62555a4a556b5a4f566c5177536d6c685230704b566c566b53565a56627a4e5556305a58556b646f546c4978516c68535257677a5644417853553946536b525352305a5154555261546d517851586c694d455a4e5531565354565a7465465a574d455930596c5661516d51786346426861327857556c566b5132464663454a585658684954544e43536c70704f586857574649795932354364565a4962457457565570435955686b4d3146575a45685662576879537a465355565a49536c4a684d6c4a4a5a444a6b4d324a57526d70574d45354e5557786f613152485554424f563268795530526a65464e45546a565256555a745754464356564672526b5655527a6c4854555673536c6f786146566c5255357557544e4f6131465655585a6b4d475253556c637854565a47614556524d6c5a4b56315578536b3478614856534d455a4b5556686b56315a724d55525261305a765a55557854464a56627a565362565a455656564f556c6b796147705552317048557a4e73634751795a454a5456555a7356573134633251785754426c527a464955573173625646596246686c5657524c543068534d3251775254425656565931565774305247467461484e54626d63775656567354564579614652614d5670575930565361574a46556e4a684d6c704a5a455a7354465577556b6c544d334277546c566a4d6c5656624656535233687859573153566b354763464e564d464a595457356b516c46576246705a4d554a43596b566f4d6c4e464e5535524d6b5a555a465a4b635531745a464a54626d685657544247516c4a73566a4a5a4d6a6c48556c565751316472536d355256555a445a577477644645794e584a585232643554306473563031564d556c585632517a576a4257523034774d576c53527a557a5a44465764474578526b74505655563456565647626c565752586455527a5644596a4e73615645776446426956315a5656465253646d4e585a45706c5631704e55544a53526d4673556c5a5a574659785a45553153474656566b4a54566b5a4555544247525645796445786856305a79556c557855465255576c5252565852755a444e6f52564a49556b566861305a72556c526f5447497762455a5756305a435533705a4d565a74536a4a545258424455565a5a4e464a56526b4a5462454a5956305647556c5659516b686a4d304a7456456852636c497a6245746b4d44464a55577857565646544f545256564646335655526b57466448536c645a5657524559544a57546d4657536d396a4d455a34546b5253646d4e495a45316a616d5277596d35574d564e72526e685262555a4b546d3552636c6c75546b525a6245707059555a7762574d77536c6452563252585a444935526c4e724d555a544d44557a546a4e4f546c56735454526c613070435657706f566c4e56566b7053613278595a444657626c5a57566b684e616b70445554424f546d5179546c5a555657784355327447634751795a47355862577432566a46535556465861464e6b4d465a445756563052314e72556b4a56566c704f596b5a53513156724f554e56566b5a5a55305673576c49775a4852684d555a5356565a5353475274566b356b523352795955524f616d527354544a68526c5a49593274475346525861485a4e56555a4457573161546d4e484f554a535657684b563156344e6d56564e555a6b6256497755316473524752724d564e505347784b56455a53626d4d794e58526a625752535632316f5256467464455a6c56465579556a42764e464a55516c5a6b4d325257565656534e6c4a74556e5252626d3935556b5a6f516c645664456c6c5747524b596a4647576c52575a46685256584245576a465a64303146546b7454527a6c4757577447516c6c5665455657525456565557704265464979556b5a615254463155544e4b6346645864473552566c4931556b5a6f516c4657536b354e526b7056576a42304e6d4a7263444e6956575271566d316151325671566b68695655557a537a4673526c4977526a52575232527359305a7363325256597a4e6152555a4d596a4a4f646c5257576b4e5262576331556c5261516c4655566c7061625842615557784765467058536d704f53465a51557a4e43566d49774d586c6b526c4a5954577378624751794d585269626d387a57544a3457574a495a454a5a62555a36546d78536556647465456454617a6b7a596d706a4d3152715a48566b626e4179597a466e646b34794e544e4e565467305533704f4d464d79617a525665546c7a5657354b64324a71556c5a5351334e325630564763574655556b4e6852553571546a4935536d49776244564c656d77315a464d354d6d4579555456556154673053336b35516c4a4961457057613030775531687665467073526b744d4d6e67785957744751314671556d35524d466c79576a4647536c45774f44425456584231564730316145347a61444a4e566b4a46546e7053646c4657526a4e52566d786f566b6335616c5a56576c685362476877575870734e56567461454a4e6257784f5757746b556b394661334a5356325132564442474d465274526e4e6b4d6d6855537a4178576c5674526d3554566c5a4f54577043545645775a453555566b5a765554466a636d497852544e5652455a47553155314d474d794f5570565632643359555657544664486348686856565a765646525362314577546b4a5256555a76537a4647556c4a7264454a5256555a4355544e6b546c465652544252565768435556644f516c4e57526b4a5256555a43546c564762324647526b4e524d445661556c5a5353324a56526c526c534768465a57356f63564e725554566c61334257576b5261546c5a725a457853526c5a595631566b5231597962455a5362453531556c643465464d7762465a4e62565a4b556d704b56314d77576e426a5658524956444e6154553175526a5255656b357455305677535652466445784e4d6a467a5658704f6245354762457454656b357055327843526c5a576247316a4d3034775645686f4e46704561454a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256566c3656544247626d4675526c4e5856553547556a4e4765474578556e646862546c545a444e61526c7057546a4a53656d7853546b526f52465655536e466c52555a3255577457536c46585a46525457475261555663314d565248644568685230354c5955684f536d46466348525556465a545645644f53567036536d39544d467044546d746b5531557a61464e536130597a566d31774d6c5636576a4e534d577832596c5a73565664566446465556466b315a4552464d307777566b6858526b5a44545446464e564a7561477058613252765954466b523246564f55745652565a4f59577447626d4977526b5a4f5654465656573173566c457863455254565456465557303556564a56546b705661315a685632746f613256564e5868684d6d524356444e4765474e575a477468566b3531596b5a4b556c4a724e57356b4d6e42325957313457574e49536c5a5256565a54565668614d475655617a566b56325243566c686156453477576c46555233527759544a4f5656497763476c4f4d48424c55565a5763475648556b52686133637a5a477472654756746345354e563278535631524a4d566c72637a4257523342785456686f566b3545576b7855566b35435a46564b626c5a57556c70534d445234537a4e77543252576248466a655852545557744665474a71576b3161656b354f5444425a6556557964455a684d6d524556544647524752484f565a5256555a455530525751314657566e5a5256555a435556563451314656526b566b4d455a5a5556564b566c465861464a5256555a43556b643052464977565442535657787a55565657536b3157566c4a55565670755657737864466456536b3153656b4a515644466f526c5647516b6855563352525457706f6356567261453569526b6c36596a4e6f566c6457566b3956567a6c325647784b5956525761465a5862575261566d3147526c5673576e685a4d553559596a493562315a4763465a694d57524d596a4935576b357161444a5a57457047546a4a524e466b796447706a4d6a6c35576c644b56314579576d6c615345357954305a4b553246456147745852334271593068616455394552586469656d787756306852636d56596133646b6132684854544e6b516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355565647516c4656526b4a5256555a4355566446636c565662454e6b4d446c475656525352564657516b686b4d6e5244597a4135626c5256536a5252565777305a46564f4d316b7a6348526c523268365557316a4d6d4e75556a5a6a4d30354b55577447526c46584d556c61656c5a7855316843556c6f78576e4658526c7059566c646b516c565661473953656c5a715457356155553571566e70535255355a5632354b5345317262454e525747524355544a4f63464a576245645756464a4e576b5a61636c5a746347355256327878566c52574d574656526b4a68526b5a7655544a5764574e475a466c5661305a4854565a6f556c4658566c4a68523268505957747755324674556c4e556130354a5556564756324e58644652574d30705755327857516c5246526b4a545257743554565a464d6d56464e55526c52577843556c563453457778556c4e4f4d455a535a444673513256486446465462566f7a5a4564534e4535744d44425a4d6d524f556b566161575177526e6868523352755657744a6546463655584a53613035485a4870615531565961476c6a4d467076596a42464d307436546e705453475243556d74564e5664725454526852306c33556a4a6f6455357162454a574d6a42325646643056464672526b4a4f65574d7255454d3563474a5859797451517a6c74596a4e4b624746585a4856554d6b7078576c644f4d46427164335a6a4d3170755547633950534a390000000000000000000000000000000000000000000000000000000000000002

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061027e5760003560e01c8063631f98521161015c578063c98163cf116100ce578063e985e9c511610087578063e985e9c51461068d578063f242432a146106bb578063f2fde38b146106ce578063f71be837146106e1578063f7436db1146106f4578063f9d4b0711461070757600080fd5b8063c98163cf14610626578063cc16210214610639578063d1a626481461064c578063d84a522314610654578063daf6faa614610667578063e04388c41461067a57600080fd5b8063a22cb46511610120578063a22cb465146105b2578063a3e1613b146105c5578063b46b7c27146105e5578063b66f655f146105ed578063b74866fb14610600578063b8df2a1b1461061357600080fd5b8063631f98521461057a57806365990b9a146105875780638456cb591461058f5780638da5cb5b1461059757806395a8c58d1461059f57600080fd5b80633c4bec2a116101f557806344deb6f3116101b957806344deb6f31461050157806348707609146105145780634e1273f414610527578063550bb2f1146105475780635c4719951461055a5780635c975abb1461056d57600080fd5b80633c4bec2a1461046d5780633ccfd60b146104805780633f4ba83a146104885780633fb27b85146104905780633ffefe4e1461049857600080fd5b806310a7fd7b1161024757806310a7fd7b146103145780631180b5531461033f57806317d70f7c146103e75780632b18c38a1461040e5780632eb2c2d61461044757806334fae5571461045a57600080fd5b8062fdd58e1461028357806301ffc9a7146102a95780630ce06b68146102cc5780630e89341c146102e15780630eaa024c14610301575b600080fd5b610296610291366004612cbd565b61071a565b6040519081526020015b60405180910390f35b6102bc6102b7366004612ce9565b610760565b60405190151581526020016102a0565b6102df6102da366004612cbd565b6107cc565b005b6102f46102ef366004612d13565b61081a565b6040516102a09190612d7c565b6102df61030f366004612e84565b6108cf565b610327610322366004612d13565b61099b565b6040516001600160a01b0390911681526020016102a0565b61039f61034d366004612f45565b6001600160a01b031660009081526004602052604090205461ffff81169162010000820463ffffffff1691600160301b810464ffffffffff1691600160581b820460ff1691600160601b900460601b90565b6040805161ffff909616865263ffffffff909416602086015264ffffffffff9092169284019290925290151560608301526001600160601b031916608082015260a0016102a0565b6102967f000000000000000000000000000000000000000000000000000000000000000281565b6102bc61041c366004612f45565b6001600160a01b0316600090815260046020526040902054600160301b900464ffffffffff16151590565b6102df610455366004613035565b6109c5565b6102df610468366004612f45565b610c44565b6102bc61047b3660046130f1565b610d6d565b6102df610da2565b6102df610de3565b6102df610e90565b6104ab6104a6366004612d13565b610ec8565b604080516001600160a01b03909716875261ffff909516602087015263ffffffff9093169385019390935264ffffffffff16606084015290151560808301526001600160601b03191660a082015260c0016102a0565b6102df61050f36600461310c565b610f52565b6102df610522366004613141565b610fba565b61053a61053536600461317d565b610ff3565b6040516102a0919061321b565b6102df610555366004613290565b6110e4565b6102df610568366004612f45565b611182565b6003546102bc9060ff1681565b6006546102bc9060ff1681565b6102f46111c5565b6102df6113ff565b610327611487565b6102bc6105ad36600461310c565b611519565b6102df6105c03660046132d2565b6115ea565b6105d86105d336600461330b565b611657565b6040516102a0919061333f565b6102f46117b6565b6102df6105fb3660046132d2565b6117d9565b6102df61060e36600461310c565b6119fa565b6102df61062136600461330b565b611a62565b6102df6106343660046133ca565b611b2b565b6102df6106473660046130f1565b611b93565b600554610296565b6102df6106623660046133f6565b611bfa565b6105d861067536600461344f565b611cb2565b6102df6106883660046133f6565b611e14565b6102bc61069b366004613471565b600760209081526000928352604080842090915290825290205460ff1681565b6102df6106c936600461349f565b611ecc565b6102df6106dc366004612f45565b612092565b6102df6106ef366004612f45565b612142565b6102df610702366004612f45565b612263565b600054610327906001600160a01b031681565b60008115801561074957506001600160a01b038316600090815260046020526040902054600160581b900460ff165b156107565750600161075a565b5060005b92915050565b60006301ffc9a760e01b6001600160e01b0319831614806107915750636cdb3d1360e11b6001600160e01b03198316145b806107ac57506303a24d0760e21b6001600160e01b03198316145b8061075a57506001600160e01b031982166332cc85cd60e11b1492915050565b336107d5611487565b6001600160a01b0316146108045760405162461bcd60e51b81526004016107fb90613507565b60405180910390fd5b61081661080f611487565b8383612307565b5050565b6060816000036108b657600880546108319061353c565b80601f016020809104026020016040519081016040528092919081815260200182805461085d9061353c565b80156108aa5780601f1061087f576101008083540402835291602001916108aa565b820191906000526020600020905b81548152906001019060200180831161088d57829003601f168201915b50505050509050919050565b505060408051602081019091526000815290565b919050565b600c6108db3382611519565b6108f75760405162461bcd60e51b81526004016107fb90613570565b60005b83518110156109955760006004600086848151811061091b5761091b613599565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020905083828151811061095757610957613599565b6020908102919091010151815460609190911c600160601b026bffffffffffffffffffffffff9091161790558061098d816135c5565b9150506108fa565b50505050565b600581815481106109ab57600080fd5b6000918252602090912001546001600160a01b0316905081565b60035460ff16156109e85760405162461bcd60e51b81526004016107fb906135de565b8151835114610a2b5760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b60448201526064016107fb565b6001600160a01b03841615610a6e5760405162461bcd60e51b815260206004820152600960248201526814dbdd5b189bdd5b9960ba1b60448201526064016107fb565b336001600160a01b0386161480610aa857506001600160a01b038516600090815260076020908152604080832033845290915290205460ff165b80610b24575060405163090c9a2d60e41b81526d76a84fef008cdabe6409d2fe638b906390c9a2d090610ae3903390899030906004016135fe565b602060405180830381865afa158015610b00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b249190613621565b610b405760405162461bcd60e51b81526004016107fb9061363e565b60005b8351811015610be557828181518110610b5e57610b5e613599565b6020026020010151610b8987868481518110610b7c57610b7c613599565b602002602001015161071a565b14610bb05760405162461bcd60e51b815260206004820152600060248201526044016107fb565b6001600160a01b0386166000908152600460205260409020805460ff60581b1916905580610bdd816135c5565b915050610b43565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051610c35929190613675565b60405180910390a45050505050565b6000546001600160a01b03163314610c8a5760405162461bcd60e51b81526020600482015260096024820152680dcdee840c6dec8caf60bb1b60448201526064016107fb565b60008054906101000a90046001600160a01b03166001600160a01b031663a79b81736040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cff91906136a3565b604051630f41a04d60e11b81526001600160a01b0383811660048301529190911690631e83409a906024016020604051808303816000875af1158015610d49573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061081691906136c0565b600060026000836017811115610d8557610d856136d9565b60ff90811682526020820192909252604001600020541692915050565b33610dab611487565b6001600160a01b031614610dd15760405162461bcd60e51b81526004016107fb90613507565b610de1610ddc611487565b612374565b565b6015610def3382611519565b610e0b5760405162461bcd60e51b81526004016107fb90613570565b60035460ff161515600114610e4f5760405162461bcd60e51b815260206004820152600a602482015269139bdd0814185d5cd95960b21b60448201526064016107fb565b6003805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a150565b6017610e9c3382611519565b610eb85760405162461bcd60e51b81526004016107fb90613570565b506006805460ff19166001179055565b600080600080600080600060058881548110610ee657610ee6613599565b6000918252602080832091909101546001600160a01b03168083526004909152604090912054909961ffff8216995062010000820463ffffffff169850600160301b820464ffffffffff169750600160581b820460ff169650600160601b90910460601b945092505050565b610f5a611487565b6001600160a01b0316336001600160a01b03161480610f7f5750610f7f336000611519565b80610f9457506000546001600160a01b031633145b610fb05760405162461bcd60e51b81526004016107fb906136ef565b61081682826123a9565b6016610fc63382611519565b610fe25760405162461bcd60e51b81526004016107fb90613570565b6008610fee8382613763565b505050565b606081518351146110385760405162461bcd60e51b815260206004820152600f60248201526e0988a9c8ea890be9a92a69a82a8869608b1b60448201526064016107fb565b82516001600160401b0381111561105157611051612d8f565b60405190808252806020026020018201604052801561107a578160200160208202803683370190505b50905060005b83518110156110dd576110b884828151811061109e5761109e613599565b6020026020010151848381518110610b7c57610b7c613599565b8282815181106110ca576110ca613599565b6020908102919091010152600101611080565b5092915050565b6110ec611487565b6001600160a01b0316336001600160a01b031614806111115750611111336000611519565b8061112657506000546001600160a01b031633145b6111425760405162461bcd60e51b81526004016107fb906136ef565b60005b81518110156108165761117082828151811061116357611163613599565b602002602001015161250a565b8061117a816135c5565b915050611145565b3361118b611487565b6001600160a01b0316146111b15760405162461bcd60e51b81526004016107fb90613507565b6111c26111bc611487565b826125b9565b50565b6000546060906001600160a01b031663db2ae3066111e260055490565b6040518263ffffffff1660e01b815260040161122291906040808252600790820152667369676e65727360c81b6060820152602081019190915260800190565b600060405180830381865afa15801561123f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112679190810190613822565b6000546006546001600160a01b039091169063c669e9c99060ff166112a9576040518060400160405280600581526020016466616c736560d81b8152506112c7565b604051806040016040528060048152602001637472756560e01b8152505b6040518263ffffffff1660e01b81526004016112e3919061388f565b600060405180830381865afa158015611300573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113289190810190613822565b6000546040805163c669e9c960e01b81526004810191909152600e60448201526d746f6b656e20666561747572657360901b60648201526080602482015260096084820152681cdbdd5b189bdd5b9960ba1b60a48201526001600160a01b039091169063c669e9c99060c401600060405180830381865afa1580156113b1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113d99190810190613822565b6040516020016113eb939291906138c7565b604051602081830303815290604052905090565b601561140b3382611519565b6114275760405162461bcd60e51b81526004016107fb90613570565b60035460ff161561144a5760405162461bcd60e51b81526004016107fb906135de565b6003805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610e85565b600080546040516331a9108f60e11b81527f000000000000000000000000000000000000000000000000000000000000000260048201526001600160a01b0390911690636352211e90602401602060405180830381865afa1580156114f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151491906136a3565b905090565b600081601781111561152d5761152d6136d9565b60ff1660016000856001600160a01b03166001600160a01b0316815260200190815260200160002054901c60001c600116600114806115a45750601282601781111561157b5761157b6136d9565b1480156115a45750733ee7fc9065f3efe3b6ab1894845e41146cb773856001600160a01b038416145b806115e3575060008260178111156115be576115be6136d9565b1480156115e357506115ce611487565b6001600160a01b0316836001600160a01b0316145b9392505050565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a35050565b606081516001600160401b0381111561167257611672612d8f565b6040519080825280602002602001820160405280156116cb57816020015b6040805160a0810182526000808252602080830182905292820181905260608201819052608082015282526000199092019101816116905790505b50905060005b82518110156117b057600460008483815181106116f0576116f0613599565b6020908102919091018101516001600160a01b03168252818101929092526040908101600020815160a081018352905461ffff8116825262010000810463ffffffff1693820193909352600160301b830464ffffffffff1691810191909152600160581b820460ff161515606080830191909152600160601b90920490911b6001600160601b0319166080820152825183908390811061179257611792613599565b602002602001018190525080806117a8906135c5565b9150506116d1565b50919050565b6060604051806102e001604052806102b5815260200161395b6102b59139905090565b336001600160a01b038316148061181357506001600160a01b038216600090815260076020908152604080832033845290915290205460ff165b8061188f575060405163090c9a2d60e41b81526d76a84fef008cdabe6409d2fe638b906390c9a2d09061184e903390869030906004016135fe565b602060405180830381865afa15801561186b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188f9190613621565b6118ab5760405162461bcd60e51b81526004016107fb9061363e565b6001600160a01b038216600090815260046020526040902054600160581b900460ff161561193a57801515600003610816576001600160a01b038216600081815260046020526040808220805460ff60581b19169055519091903390600080516020613c108339815191529061192e908590600190918252602082015260400190565b60405180910390a45050565b6001600160a01b038216600090815260046020526040902054600160301b900464ffffffffff16156119c457801515600103610816576001600160a01b038216600081815260046020526040808220805460ff60581b1916600160581b179055513390600080516020613c108339815191529061192e908490600190918252602082015260400190565b60405162461bcd60e51b815260206004820152600b60248201526a6e6f74206c61776c65737360a81b60448201526064016107fb565b611a02611487565b6001600160a01b0316336001600160a01b03161480611a275750611a27336000611519565b80611a3c57506000546001600160a01b031633145b611a585760405162461bcd60e51b81526004016107fb906136ef565b610816828261269c565b6010611a6e3382611519565b611a8a5760405162461bcd60e51b81526004016107fb90613570565b600654610100900460ff1615611acd5760405162461bcd60e51b81526020600482015260086024820152671c995b19585cd95960c21b60448201526064016107fb565b60005b8251811015611b0d57611afb838281518110611aee57611aee613599565b6020026020010151612791565b80611b05816135c5565b915050611ad0565b50506006805461ffff1916610100179055506003805460ff19169055565b600c611b373382611519565b611b535760405162461bcd60e51b81526004016107fb90613570565b506001600160a01b039091166000908152600460205260409020805460609290921c600160601b026bffffffffffffffffffffffff909216919091179055565b611b9b611487565b6001600160a01b0316336001600160a01b03161480611bc05750611bc0336000611519565b80611bd557506000546001600160a01b031633145b611bf15760405162461bcd60e51b81526004016107fb906136ef565b6111c28161250a565b611c02611487565b6001600160a01b0316336001600160a01b03161480611c275750611c27336000611519565b80611c3c57506000546001600160a01b031633145b611c585760405162461bcd60e51b81526004016107fb906136ef565b60005b8151811015610fee57611ca0838281518110611c7957611c79613599565b6020026020010151838381518110611c9357611c93613599565b602002602001015161269c565b80611caa816135c5565b915050611c5b565b6060611cbe8383613921565b6001600160401b03811115611cd557611cd5612d8f565b604051908082528060200260200182016040528015611d2e57816020015b6040805160a081018252600080825260208083018290529282018190526060820181905260808201528252600019909201910181611cf35790505b509050825b828110156110dd576004600060058381548110611d5257611d52613599565b6000918252602080832091909101546001600160a01b031683528281019390935260409182019020815160a081018352905461ffff8116825262010000810463ffffffff1693820193909352600160301b830464ffffffffff1691810191909152600160581b820460ff161515606080830191909152600160601b90920490911b6001600160601b03191660808201528251839083908110611df657611df6613599565b60200260200101819052508080611e0c906135c5565b915050611d33565b611e1c611487565b6001600160a01b0316336001600160a01b03161480611e415750611e41336000611519565b80611e5657506000546001600160a01b031633145b611e725760405162461bcd60e51b81526004016107fb906136ef565b60005b8151811015610fee57611eba838281518110611e9357611e93613599565b6020026020010151838381518110611ead57611ead613599565b60200260200101516123a9565b80611ec4816135c5565b915050611e75565b60035460ff1615611eef5760405162461bcd60e51b81526004016107fb906135de565b6001600160a01b03841615611f325760405162461bcd60e51b815260206004820152600960248201526814dbdd5b189bdd5b9960ba1b60448201526064016107fb565b81611f3d868561071a565b14611f645760405162461bcd60e51b815260206004820152600060248201526044016107fb565b336001600160a01b0386161480611f9e57506001600160a01b038516600090815260076020908152604080832033845290915290205460ff165b8061201a575060405163090c9a2d60e41b81526d76a84fef008cdabe6409d2fe638b906390c9a2d090611fd9903390899030906004016135fe565b602060405180830381865afa158015611ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201a9190613621565b6120365760405162461bcd60e51b81526004016107fb9061363e565b811561208b576001600160a01b03858116600081815260046020908152604091829020805460ff60581b191690558151878152908101869052928716923391600080516020613c108339815191529101610c35565b5050505050565b3361209b611487565b6001600160a01b0316146120c15760405162461bcd60e51b81526004016107fb90613507565b6000546040516350a1a66560e01b81527f000000000000000000000000000000000000000000000000000000000000000260048201526001600160a01b038381166024830152909116906350a1a66590604401600060405180830381600087803b15801561212e57600080fd5b505af115801561208b573d6000803e3d6000fd5b60035460ff16156121655760405162461bcd60e51b81526004016107fb906135de565b60065460ff16156121885760405162461bcd60e51b81526004016107fb90613934565b6001600160a01b0381163314806121c257506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b8061223e575060405163090c9a2d60e41b81526d76a84fef008cdabe6409d2fe638b906390c9a2d0906121fd903390859030906004016135fe565b602060405180830381865afa15801561221a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223e9190613621565b61225a5760405162461bcd60e51b81526004016107fb9061363e565b6111c281612791565b601761226f3382611519565b61228b5760405162461bcd60e51b81526004016107fb90613570565b6006546201000090046001600160a01b0316156122dc5760405162461bcd60e51b815260206004820152600f60248201526e636c6f616b6e65742061637469766560881b60448201526064016107fb565b50600680546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b604051632142170760e11b81523060048201526001600160a01b038481166024830152604482018390528316906342842e0e90606401600060405180830381600087803b15801561235757600080fd5b505af115801561236b573d6000803e3d6000fd5b50505050505050565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610816573d6000803e3d6000fd5b60128160178111156123bd576123bd6136d9565b036124165760405162461bcd60e51b815260206004820152602360248201527f796f752063616e6e6f742073696d706c79206265636f6d6520706f6e6465727760448201526261726560e81b60648201526084016107fb565b6002600082601781111561242c5761242c6136d9565b60ff908116825260208201929092526040016000205416156124795760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b60448201526064016107fb565b80601781111561248b5761248b6136d9565b6001600160a01b0383166000908152600160208190526040909120805460ff939093169190911b90911790558060178111156124c9576124c96136d9565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab600160405161164b911515815260200190565b60026000826017811115612520576125206136d9565b60ff9081168252602082019290925260400160002054166111c257600160026000836017811115612553576125536136d9565b60ff1681526020810191909152604001600020805460ff1916911515919091179055806017811115612587576125876136d9565b60ff167f2a4c011a3eb263cc32455711057131757df48518d49547f77ab832d8681a53ff60405160405180910390a250565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90859083906370a0823190602401602060405180830381865afa158015612609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262d91906136c0565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612678573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109959190613621565b600260008260178111156126b2576126b26136d9565b60ff908116825260208201929092526040016000205416156126ff5760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b60448201526064016107fb565b806017811115612711576127116136d9565b6001600160a01b0383166000908152600160208190526040909120805460ff939093169190911b199091169055806017811115612750576127506136d9565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab600060405161164b911515815260200190565b6001600160a01b0380821660009081526004602081905260408083209051627eeac760e11b815290937f000000000000000000000000d3a0b315023243632a15fd623d6f33314193df4e169162fdd58e9161280391879181016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015612820573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284491906136c0565b604051627eeac760e11b81526001600160a01b038581166004830152600360248301527f000000000000000000000000d3a0b315023243632a15fd623d6f33314193df4e169062fdd58e90604401602060405180830381865afa1580156128af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d391906136c0565b604051627eeac760e11b81526001600160a01b038681166004830152600260248301527f000000000000000000000000d3a0b315023243632a15fd623d6f33314193df4e169062fdd58e90604401602060405180830381865afa15801561293e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296291906136c0565b604051627eeac760e11b81526001600160a01b038781166004830152600160248301527f000000000000000000000000d3a0b315023243632a15fd623d6f33314193df4e169062fdd58e90604401602060405180830381865afa1580156129cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f191906136c0565b604051627eeac760e11b81526001600160a01b038881166004830152600060248301527f000000000000000000000000d3a0b315023243632a15fd623d6f33314193df4e169062fdd58e90604401602060405180830381865afa158015612a5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8091906136c0565b01010101905060006001600160a01b0316600660029054906101000a90046001600160a01b03166001600160a01b031614612b2f576006546040516370a0823160e01b81526001600160a01b03858116600483015262010000909204909116906370a0823190602401602060405180830381865afa158015612b06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2a91906136c0565b600302015b8154600160301b900464ffffffffff16600003612c3357815461ffff821661ffff198216811784556005805460ff60581b1964ffffffffff4316600160301b02166bffffffffffff0000000000001963ffffffff909216620100000265ffffffffffff19909516909317939093179290921617600160581b17835580546001818101835560009283527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910180546001600160a01b0387166001600160a01b031990911681179091556040519092913391600080516020613c1083398151915291612c2691859190918252602082015260400190565b60405180910390a4505050565b815461ffff9081169082161115610fee57815461ffff191661ffff821617808355600160581b900460ff16610fee57815460ff60581b1916600160581b178255604080516000808252600160208301526001600160a01b0386169290913391600080516020613c108339815191529101612c26565b6001600160a01b03811681146111c257600080fd5b60008060408385031215612cd057600080fd5b8235612cdb81612ca8565b946020939093013593505050565b600060208284031215612cfb57600080fd5b81356001600160e01b0319811681146115e357600080fd5b600060208284031215612d2557600080fd5b5035919050565b60005b83811015612d47578181015183820152602001612d2f565b50506000910152565b60008151808452612d68816020860160208601612d2c565b601f01601f19169290920160200192915050565b6020815260006115e36020830184612d50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612dcd57612dcd612d8f565b604052919050565b60006001600160401b03821115612dee57612dee612d8f565b5060051b60200190565b600082601f830112612e0957600080fd5b81356020612e1e612e1983612dd5565b612da5565b82815260059290921b84018101918181019086841115612e3d57600080fd5b8286015b84811015612e61578035612e5481612ca8565b8352918301918301612e41565b509695505050505050565b80356001600160601b0319811681146108ca57600080fd5b60008060408385031215612e9757600080fd5b82356001600160401b0380821115612eae57600080fd5b612eba86838701612df8565b9350602091508185013581811115612ed157600080fd5b85019050601f81018613612ee457600080fd5b8035612ef2612e1982612dd5565b81815260059190911b82018301908381019088831115612f1157600080fd5b928401925b82841015612f3657612f2784612e6c565b82529284019290840190612f16565b80955050505050509250929050565b600060208284031215612f5757600080fd5b81356115e381612ca8565b600082601f830112612f7357600080fd5b81356020612f83612e1983612dd5565b82815260059290921b84018101918181019086841115612fa257600080fd5b8286015b84811015612e615780358352918301918301612fa6565b60006001600160401b03821115612fd657612fd6612d8f565b50601f01601f191660200190565b600082601f830112612ff557600080fd5b8135613003612e1982612fbd565b81815284602083860101111561301857600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561304d57600080fd5b853561305881612ca8565b9450602086013561306881612ca8565b935060408601356001600160401b038082111561308457600080fd5b61309089838a01612f62565b945060608801359150808211156130a657600080fd5b6130b289838a01612f62565b935060808801359150808211156130c857600080fd5b506130d588828901612fe4565b9150509295509295909350565b8035601881106108ca57600080fd5b60006020828403121561310357600080fd5b6115e3826130e2565b6000806040838503121561311f57600080fd5b823561312a81612ca8565b9150613138602084016130e2565b90509250929050565b60006020828403121561315357600080fd5b81356001600160401b0381111561316957600080fd5b61317584828501612fe4565b949350505050565b6000806040838503121561319057600080fd5b82356001600160401b03808211156131a757600080fd5b6131b386838701612df8565b935060208501359150808211156131c957600080fd5b506131d685828601612f62565b9150509250929050565b600081518084526020808501945080840160005b83811015613210578151875295820195908201906001016131f4565b509495945050505050565b6020815260006115e360208301846131e0565b600082601f83011261323f57600080fd5b8135602061324f612e1983612dd5565b82815260059290921b8401810191818101908684111561326e57600080fd5b8286015b84811015612e6157613283816130e2565b8352918301918301613272565b6000602082840312156132a257600080fd5b81356001600160401b038111156132b857600080fd5b6131758482850161322e565b80151581146111c257600080fd5b600080604083850312156132e557600080fd5b82356132f081612ca8565b91506020830135613300816132c4565b809150509250929050565b60006020828403121561331d57600080fd5b81356001600160401b0381111561333357600080fd5b61317584828501612df8565b602080825282518282018190526000919060409081850190868401855b828110156133bd578151805161ffff1685528681015163ffffffff16878601528581015164ffffffffff16868601526060808201511515908601526080908101516001600160601b0319169085015260a0909301929085019060010161335c565b5091979650505050505050565b600080604083850312156133dd57600080fd5b82356133e881612ca8565b915061313860208401612e6c565b6000806040838503121561340957600080fd5b82356001600160401b038082111561342057600080fd5b61342c86838701612df8565b9350602085013591508082111561344257600080fd5b506131d68582860161322e565b6000806040838503121561346257600080fd5b50508035926020909101359150565b6000806040838503121561348457600080fd5b823561348f81612ca8565b9150602083013561330081612ca8565b600080600080600060a086880312156134b757600080fd5b85356134c281612ca8565b945060208601356134d281612ca8565b9350604086013592506060860135915060808601356001600160401b038111156134fb57600080fd5b6130d588828901612fe4565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061355057607f821691505b6020821081036117b057634e487b7160e01b600052602260045260246000fd5b6020808252600f908201526e75736572206c61636b7320726f6c6560881b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016135d7576135d76135af565b5060010190565b60208082526006908201526514185d5cd95960d21b604082015260600190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b60006020828403121561363357600080fd5b81516115e3816132c4565b6020808252601b908201527f756e617574686f72697a656420726570726573656e7461746976650000000000604082015260600190565b60408152600061368860408301856131e0565b828103602084015261369a81856131e0565b95945050505050565b6000602082840312156136b557600080fd5b81516115e381612ca8565b6000602082840312156136d257600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b601f821115610fee57600081815260208120601f850160051c8101602086101561373c5750805b601f850160051c820191505b8181101561375b57828155600101613748565b505050505050565b81516001600160401b0381111561377c5761377c612d8f565b6137908161378a845461353c565b84613715565b602080601f8311600181146137c557600084156137ad5750858301515b600019600386901b1c1916600185901b17855561375b565b600085815260208120601f198616915b828110156137f4578886015182559484019460019091019084016137d5565b50858210156138125787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121561383457600080fd5b81516001600160401b0381111561384a57600080fd5b8201601f8101841361385b57600080fd5b8051613869612e1982612fbd565b81815285602083850101111561387e57600080fd5b61369a826020830160208601612d2c565b6040815260006138b56040830160068152651cd9585b195960d21b602082015260400190565b82810360208401526131758185612d50565b600084516138d9818460208901612d2c565b8083019050600b60fa1b80825285516138f9816001850160208a01612d2c565b60019201918201528351613914816002840160208801612d2c565b0160020195945050505050565b8181038181111561075a5761075a6135af565b60208152600061075a6020830160068152651cd9585b195960d21b60208201526040019056fe57652061726520746865206c61776c6573732e205765207265636f676e697a6520746865206372756d626c696e6720696e737469747574696f6e73207468617420636f6e74726f6c206f7572206c6976657320616e642063686f6f736520746f206f7074206f757420696e7374656164206f66206669676874696e67206261636b2c20746f2067726f7720746865206e657720746f2073756273756d6520746865206f6c642e2049742069736e2774206368616f732e2049742069736e2774206465737472756374696f6e2e20436f64652069732061207265667567652066726f6d206c61772e20436f64652072756e7320776974686f75742072656761726420666f72206a7572697364696374696f6e2e20436f64652072657475726e7320706f77657220746f2074686520696e646976696475616c20696e207761797320756e707265636564656e74656420696e206f7572206572612e20546865206c61776c6573732063686f6f736520746865697220636f646520616e6420696e20646f696e6720736f2063686f6f73652074686569722072756c65732c20726f6c65732c20616e6420726573706f6e736962696c69746965732e20427574206e6f7420616e73776572696e6720746f206c6177206d65616e73206e6f74207265736f7274696e6720746f2069742e2049742069736e277420736166652e2049742069736e277420666f722065766572796f6e652e0a0a4d617962652069742069736e277420666f7220616e796f6e652e0a0a42757420636f64652e6c61776c657373206973206865726520666f722074686f73652077686f2063686f6f73652069742e0a0a54686f73652066657720707265706172656420666f722074686520736f6c656d6e20616374206f662063686f6963652e0a0a436f64652069736e2774206c61772e20436f6465206973206c61776c6573732ec3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62a26469706673582212207c5e83b3f15d79e475ffed919b6e4fdd34a1defd9cc02a9bfcfd9c73192d765864736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000002

-----Decoded View---------------
Arg [0] : tokenId (uint256): 2

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000002


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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