Address Details
contract
proxy

0x097F74E6dc5248fb5C436E1787A4bfFe61F16853

Contract Name
MoolaGovernorBravoDelegate
Creator
0x007e71–f37016 at 0xd7cc54–51095f
Implementation
0x0000000000000000000000000000000000000000
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
14977268
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
MoolaGovernorBravoDelegate




Optimization enabled
true
Compiler version
v0.8.16+commit.07a7930e




Optimization runs
200
EVM Version
london




Verified at
2022-08-22T17:27:17.935990Z

contracts/governance/MoolaGovernorBravoDelegate.sol

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity ^0.8.10;

import "./interfaces/GovernorBravoInterfaces.sol";

contract MoolaGovernorBravoDelegate is GovernorBravoDelegateStorageV2, GovernorBravoEvents {

    /// @notice The name of this contract
    string public constant name = "Moola Governor Bravo";

    /// @notice The minimum setable proposal threshold
    uint public constant MIN_PROPOSAL_THRESHOLD = 1000e18; // 1,000 MOO

    /// @notice The maximum setable proposal threshold
    uint public constant MAX_PROPOSAL_THRESHOLD = 100000e18; //100,000 MOO

    /// @notice The minimum setable voting period
    uint public constant MIN_VOTING_PERIOD = 5760; // About 24 hours

    /// @notice The max setable voting period
    uint public constant MAX_VOTING_PERIOD = 80640; // About 2 weeks

    /// @notice The min setable voting delay
    uint public constant MIN_VOTING_DELAY = 1;

    /// @notice The max setable voting delay
    uint public constant MAX_VOTING_DELAY = 40320; // About 1 week

    /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed
    uint public constant quorumVotes = 400000e18; // 400,000 = 4% of MOO

    /// @notice The maximum number of actions that can be included in a proposal
    uint public constant proposalMaxOperations = 10; // 10 actions

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the ballot struct used by the contract
    bytes32 public constant BALLOT_TYPEHASH = keccak256("Ballot(uint256 proposalId,uint8 support)");

    /**
      * @notice Used to initialize the contract during delegator constructor
      * @param timelock_ The address of the Timelock
      * @param moo_ The address of the MOO token
      * @param votingPeriod_ The initial voting period
      * @param votingDelay_ The initial voting delay
      * @param proposalThreshold_ The initial proposal threshold
      */
    function initialize(address timelock_, address moo_, uint votingPeriod_, uint votingDelay_, uint proposalThreshold_) virtual public {
        require(address(timelock) == address(0), "GovernorBravo::initialize: can only initialize once");
        require(msg.sender == admin, "GovernorBravo::initialize: admin only");
        require(timelock_ != address(0), "GovernorBravo::initialize: invalid timelock address");
        require(moo_ != address(0), "GovernorBravo::initialize: invalid moo address");
        require(votingPeriod_ >= MIN_VOTING_PERIOD && votingPeriod_ <= MAX_VOTING_PERIOD, "GovernorBravo::initialize: invalid voting period");
        require(votingDelay_ >= MIN_VOTING_DELAY && votingDelay_ <= MAX_VOTING_DELAY, "GovernorBravo::initialize: invalid voting delay");
        require(proposalThreshold_ >= MIN_PROPOSAL_THRESHOLD && proposalThreshold_ <= MAX_PROPOSAL_THRESHOLD, "GovernorBravo::initialize: invalid proposal threshold");

        timelock = TimelockInterface(timelock_);
        moo = CompInterface(moo_);
        votingPeriod = votingPeriod_;
        votingDelay = votingDelay_;
        proposalThreshold = proposalThreshold_;
    }

    /**
      * @notice Function used to propose a new proposal. Sender must have delegates above the proposal threshold
      * @param targets Target addresses for proposal calls
      * @param values Eth values for proposal calls
      * @param signatures Function signatures for proposal calls
      * @param calldatas Calldatas for proposal calls
      * @param description String description of the proposal
      * @return Proposal id of new proposal
      */
    function propose(address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description) public returns (uint) {
        //
        
        // Allow addresses above proposal threshold and whitelisted addresses to propose
        require(moo.getPriorVotes(msg.sender, sub256(block.number, 1)) > proposalThreshold || isWhitelisted(msg.sender), "GovernorBravo::propose: proposer votes below proposal threshold");
        require(targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length, "GovernorBravo::propose: proposal function information arity mismatch");
        require(targets.length != 0, "GovernorBravo::propose: must provide actions");
        require(targets.length <= proposalMaxOperations, "GovernorBravo::propose: too many actions");

        uint latestProposalId = latestProposalIds[msg.sender];
        if (latestProposalId != 0) {
          ProposalState proposersLatestProposalState = state(latestProposalId);
          require(proposersLatestProposalState != ProposalState.Active, "GovernorBravo::propose: one live proposal per proposer, found an already active proposal");
          require(proposersLatestProposalState != ProposalState.Pending, "GovernorBravo::propose: one live proposal per proposer, found an already pending proposal");
        }

        uint startBlock = add256(block.number, votingDelay);
        uint endBlock = add256(startBlock, votingPeriod);

        proposalCount++;
        uint newProposalID = proposalCount;
        Proposal storage newProposal = proposals[newProposalID];
        // This should never happen but add a check in case.
        require(newProposal.id == 0, "GovernorBravo::propose: ProposalID collsion");
        newProposal.id = newProposalID;
        newProposal.proposer = msg.sender;
        newProposal.eta = 0;
        newProposal.targets = targets;
        newProposal.values = values;
        newProposal.signatures = signatures;
        newProposal.calldatas = calldatas;
        newProposal.startBlock = startBlock;
        newProposal.endBlock = endBlock;
        newProposal.forVotes = 0;
        newProposal.againstVotes = 0;
        newProposal.abstainVotes = 0;
        newProposal.canceled = false;
        newProposal.executed = false;

        latestProposalIds[newProposal.proposer] = newProposal.id;

        emit ProposalCreated(newProposal.id, msg.sender, targets, values, signatures, calldatas, startBlock, endBlock, description);
        return newProposal.id;
    }

    /**
      * @notice Queues a proposal of state succeeded
      * @param proposalId The id of the proposal to queue
      */
    function queue(uint proposalId) external {
        require(state(proposalId) == ProposalState.Succeeded, "GovernorBravo::queue: proposal can only be queued if it is succeeded");
        Proposal storage proposal = proposals[proposalId];
        uint eta = add256(block.timestamp, timelock.delay());
        for (uint i = 0; i < proposal.targets.length; i++) {
            queueOrRevertInternal(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta);
        }
        proposal.eta = eta;
        emit ProposalQueued(proposalId, eta);
    }

    function queueOrRevertInternal(address target, uint value, string memory signature, bytes memory data, uint eta) internal {
        require(!timelock.queuedTransactions(keccak256(abi.encode(target, value, signature, data, eta))), "GovernorBravo::queueOrRevertInternal: identical proposal action already queued at eta");
        timelock.queueTransaction(target, value, signature, data, eta);
    }

    /**
      * @notice Executes a queued proposal if eta has passed
      * @param proposalId The id of the proposal to execute
      */
    function execute(uint proposalId) external payable {
        require(state(proposalId) == ProposalState.Queued, "GovernorBravo::execute: proposal can only be executed if it is queued");
        Proposal storage proposal = proposals[proposalId];
        proposal.executed = true;
        for (uint i = 0; i < proposal.targets.length; i++) {
            timelock.executeTransaction{value: proposal.values[i]}(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta);
        }
        emit ProposalExecuted(proposalId);
    }

    /**
      * @notice Cancels a proposal only if sender is the proposer, or proposer delegates dropped below proposal threshold
      * @param proposalId The id of the proposal to cancel
      */
    function cancel(uint proposalId) external {
        require(state(proposalId) != ProposalState.Executed, "GovernorBravo::cancel: cannot cancel executed proposal");

        Proposal storage proposal = proposals[proposalId];

        // Proposer can cancel
        if(msg.sender != proposal.proposer) {
            // Whitelisted proposers can't be canceled for falling below proposal threshold
            if(isWhitelisted(proposal.proposer)) {
                require((moo.getPriorVotes(proposal.proposer, sub256(block.number, 1)) < proposalThreshold) && msg.sender == whitelistGuardian, "GovernorBravo::cancel: whitelisted proposer");
            }
            else {
                require((moo.getPriorVotes(proposal.proposer, sub256(block.number, 1)) < proposalThreshold), "GovernorBravo::cancel: proposer above threshold");
            }
        }

        proposal.canceled = true;
        for (uint i = 0; i < proposal.targets.length; i++) {
            timelock.cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta);
        }

        emit ProposalCanceled(proposalId);
    }

    /**
      * @notice Gets actions of a proposal
      * @param proposalId the id of the proposal
      * @return targets of the proposal actions
      * @return values of the proposal actions
      * @return signatures of the proposal actions
      * @return calldatas of the proposal actions
      */
    function getActions(uint proposalId) external view returns (address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas) {
        Proposal storage p = proposals[proposalId];
        return (p.targets, p.values, p.signatures, p.calldatas);
    }

    /**
      * @notice Gets the receipt for a voter on a given proposal
      * @param proposalId the id of proposal
      * @param voter The address of the voter
      * @return The voting receipt
      */
    function getReceipt(uint proposalId, address voter) external view returns (Receipt memory) {
        return proposals[proposalId].receipts[voter];
    }

    /**
      * @notice Gets the state of a proposal
      * @param proposalId The id of the proposal
      * @return Proposal state
      */
    function state(uint proposalId) public view returns (ProposalState) {
        require(proposalCount >= proposalId && proposalId > initialProposalId, "GovernorBravo::state: invalid proposal id");
        Proposal storage proposal = proposals[proposalId];
        if (proposal.canceled) {
            return ProposalState.Canceled;
        } else if (block.number <= proposal.startBlock) {
            return ProposalState.Pending;
        } else if (block.number <= proposal.endBlock) {
            return ProposalState.Active;
        } else if (proposal.forVotes <= proposal.againstVotes || proposal.forVotes < quorumVotes) {
            return ProposalState.Defeated;
        } else if (proposal.eta == 0) {
            return ProposalState.Succeeded;
        } else if (proposal.executed) {
            return ProposalState.Executed;
        } else if (block.timestamp >= add256(proposal.eta, timelock.GRACE_PERIOD())) {
            return ProposalState.Expired;
        } else {
            return ProposalState.Queued;
        }
    }

    /**
      * @notice Cast a vote for a proposal
      * @param proposalId The id of the proposal to vote on
      * @param support The support value for the vote. 0=against, 1=for, 2=abstain
      */
    function castVote(uint proposalId, uint8 support) external {
        emit VoteCast(msg.sender, proposalId, support, castVoteInternal(msg.sender, proposalId, support), "");
    }

    /**
      * @notice Cast a vote for a proposal with a reason
      * @param proposalId The id of the proposal to vote on
      * @param support The support value for the vote. 0=against, 1=for, 2=abstain
      * @param reason The reason given for the vote by the voter
      */
    function castVoteWithReason(uint proposalId, uint8 support, string calldata reason) external {
        emit VoteCast(msg.sender, proposalId, support, castVoteInternal(msg.sender, proposalId, support), reason);
    }

    /**
      * @notice Cast a vote for a proposal by signature
      * @dev External function that accepts EIP-712 signatures for voting on proposals.
      */
    function castVoteBySig(uint proposalId, uint8 support, uint8 v, bytes32 r, bytes32 s) external {
        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), getChainIdInternal(), address(this)));
        bytes32 structHash = keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support));
        bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "GovernorBravo::castVoteBySig: invalid signature");
        emit VoteCast(signatory, proposalId, support, castVoteInternal(signatory, proposalId, support), "");
    }

    /**
      * @notice Internal function that caries out voting logic
      * @param voter The voter that is casting their vote
      * @param proposalId The id of the proposal to vote on
      * @param support The support value for the vote. 0=against, 1=for, 2=abstain
      * @return The number of votes cast
      */
    function castVoteInternal(address voter, uint proposalId, uint8 support) internal returns (uint96) {
        require(state(proposalId) == ProposalState.Active, "GovernorBravo::castVoteInternal: voting is closed");
        require(support <= 2, "GovernorBravo::castVoteInternal: invalid vote type");
        Proposal storage proposal = proposals[proposalId];
        Receipt storage receipt = proposal.receipts[voter];
        require(receipt.hasVoted == false, "GovernorBravo::castVoteInternal: voter already voted");
        uint96 votes = moo.getPriorVotes(voter, proposal.startBlock);

        if (support == 0) {
            proposal.againstVotes = add256(proposal.againstVotes, votes);
        } else if (support == 1) {
            proposal.forVotes = add256(proposal.forVotes, votes);
        } else if (support == 2) {
            proposal.abstainVotes = add256(proposal.abstainVotes, votes);
        }

        receipt.hasVoted = true;
        receipt.support = support;
        receipt.votes = votes;

        return votes;
    }

    /**
     * @notice View function which returns if an account is whitelisted
     * @param account Account to check white list status of
     * @return If the account is whitelisted
     */
    function isWhitelisted(address account) public view returns (bool) {
        return (whitelistAccountExpirations[account] > block.timestamp);
    }

    /**
      * @notice Admin function for setting the voting delay
      * @param newVotingDelay new voting delay, in blocks
      */
    function _setVotingDelay(uint newVotingDelay) external {
        require(msg.sender == admin, "GovernorBravo::_setVotingDelay: admin only");
        require(newVotingDelay >= MIN_VOTING_DELAY && newVotingDelay <= MAX_VOTING_DELAY, "GovernorBravo::_setVotingDelay: invalid voting delay");
        uint oldVotingDelay = votingDelay;
        votingDelay = newVotingDelay;

        emit VotingDelaySet(oldVotingDelay,votingDelay);
    }

    /**
      * @notice Admin function for setting the voting period
      * @param newVotingPeriod new voting period, in blocks
      */
    function _setVotingPeriod(uint newVotingPeriod) external {
        require(msg.sender == admin, "GovernorBravo::_setVotingPeriod: admin only");
        require(newVotingPeriod >= MIN_VOTING_PERIOD && newVotingPeriod <= MAX_VOTING_PERIOD, "GovernorBravo::_setVotingPeriod: invalid voting period");
        uint oldVotingPeriod = votingPeriod;
        votingPeriod = newVotingPeriod;

        emit VotingPeriodSet(oldVotingPeriod, votingPeriod);
    }

    /**
      * @notice Admin function for setting the proposal threshold
      * @dev newProposalThreshold must be greater than the hardcoded min
      * @param newProposalThreshold new proposal threshold
      */
    function _setProposalThreshold(uint newProposalThreshold) external {
        require(msg.sender == admin, "GovernorBravo::_setProposalThreshold: admin only");
        require(newProposalThreshold >= MIN_PROPOSAL_THRESHOLD && newProposalThreshold <= MAX_PROPOSAL_THRESHOLD, "GovernorBravo::_setProposalThreshold: invalid proposal threshold");
        uint oldProposalThreshold = proposalThreshold;
        proposalThreshold = newProposalThreshold;

        emit ProposalThresholdSet(oldProposalThreshold, proposalThreshold);
    }

    /**
     * @notice Admin function for setting the whitelist expiration as a timestamp for an account. Whitelist status allows accounts to propose without meeting threshold
     * @param account Account address to set whitelist expiration for
     * @param expiration Expiration for account whitelist status as timestamp (if now < expiration, whitelisted)
     */
    function _setWhitelistAccountExpiration(address account, uint expiration) external {
        require(msg.sender == admin || msg.sender == whitelistGuardian, "GovernorBravo::_setWhitelistAccountExpiration: admin only");
        whitelistAccountExpirations[account] = expiration;

        emit WhitelistAccountExpirationSet(account, expiration);
    }

    /**
     * @notice Admin function for setting the whitelistGuardian. WhitelistGuardian can cancel proposals from whitelisted addresses
     * @param account Account to set whitelistGuardian to (0x0 to remove whitelistGuardian)
     */
     function _setWhitelistGuardian(address account) external {
        require(msg.sender == admin, "GovernorBravo::_setWhitelistGuardian: admin only");
        address oldGuardian = whitelistGuardian;
        whitelistGuardian = account;

        emit WhitelistGuardianSet(oldGuardian, whitelistGuardian);
     }

    /**
      * @notice Initiate the GovernorBravo contract
      * @dev Admin only. 
      * Sets admin role for timelock
      */
    function _initiate() external {
        require(msg.sender == admin, "GovernorBravo::_initiate: admin only");
        require(initialProposalId == 0, "GovernorBravo::_initiate: can only initiate once");
        
        // Accept admin role
        timelock.acceptAdmin();
    }

    /**
      * @notice Begins transfer of admin rights. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer.
      * @dev Admin function to begin change of admin. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer.
      * @param newPendingAdmin New pending admin.
      */
    function _setPendingAdmin(address newPendingAdmin) external {
        // Check caller = admin
        require(msg.sender == admin, "GovernorBravo:_setPendingAdmin: admin only");

        // Save current value, if any, for inclusion in log
        address oldPendingAdmin = pendingAdmin;

        // Store pendingAdmin with value newPendingAdmin
        pendingAdmin = newPendingAdmin;

        // Emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin)
        emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin);
    }

    /**
      * @notice Accepts transfer of admin rights. msg.sender must be pendingAdmin
      * @dev Admin function for pending admin to accept role and update admin
      */
    function _acceptAdmin() external {
        // Check caller is pendingAdmin and pendingAdmin ≠ address(0)
        require(msg.sender == pendingAdmin && msg.sender != address(0), "GovernorBravo:_acceptAdmin: pending admin only");

        // Save current values for inclusion in log
        address oldAdmin = admin;
        address oldPendingAdmin = pendingAdmin;

        // Store admin with value pendingAdmin
        admin = pendingAdmin;

        // Clear the pending value
        pendingAdmin = address(0);

        emit NewAdmin(oldAdmin, admin);
        emit NewPendingAdmin(oldPendingAdmin, pendingAdmin);
    }

    function add256(uint256 a, uint256 b) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, "addition overflow");
        return c;
    }

    function sub256(uint256 a, uint256 b) internal pure returns (uint) {
        require(b <= a, "subtraction underflow");
        return a - b;
    }

    function getChainIdInternal() internal view returns (uint) {
        uint chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}
        

/contracts/governance/interfaces/GovernorBravoInterfaces.sol

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity ^0.8.10;


contract GovernorBravoEvents {
    /// @notice An event emitted when a new proposal is created
    event ProposalCreated(uint id, address proposer, address[] targets, uint[] values, string[] signatures, bytes[] calldatas, uint startBlock, uint endBlock, string description);

    /// @notice An event emitted when a vote has been cast on a proposal
    /// @param voter The address which casted a vote
    /// @param proposalId The proposal id which was voted on
    /// @param support Support value for the vote. 0=against, 1=for, 2=abstain
    /// @param votes Number of votes which were cast by the voter
    /// @param reason The reason given for the vote by the voter
    event VoteCast(address indexed voter, uint proposalId, uint8 support, uint votes, string reason);

    /// @notice An event emitted when a proposal has been canceled
    event ProposalCanceled(uint id);

    /// @notice An event emitted when a proposal has been queued in the Timelock
    event ProposalQueued(uint id, uint eta);

    /// @notice An event emitted when a proposal has been executed in the Timelock
    event ProposalExecuted(uint id);

    /// @notice An event emitted when the voting delay is set
    event VotingDelaySet(uint oldVotingDelay, uint newVotingDelay);

    /// @notice An event emitted when the voting period is set
    event VotingPeriodSet(uint oldVotingPeriod, uint newVotingPeriod);

    /// @notice Emitted when implementation is changed
    event NewImplementation(address oldImplementation, address newImplementation);

    /// @notice Emitted when proposal threshold is set
    event ProposalThresholdSet(uint oldProposalThreshold, uint newProposalThreshold);

    /// @notice Emitted when pendingAdmin is changed
    event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin);

    /// @notice Emitted when pendingAdmin is accepted, which means admin is updated
    event NewAdmin(address oldAdmin, address newAdmin);

    /// @notice Emitted when whitelist account expiration is set
    event WhitelistAccountExpirationSet(address account, uint expiration);

    /// @notice Emitted when the whitelistGuardian is set
    event WhitelistGuardianSet(address oldGuardian, address newGuardian);
}

contract GovernorBravoDelegatorStorage {
    /// @notice Administrator for this contract
    address public admin;

    /// @notice Pending administrator for this contract
    address public pendingAdmin;

    /// @notice Active brains of Governor
    address public implementation;
}


/**
 * @title Storage for Governor Bravo Delegate
 * @notice For future upgrades, do not change GovernorBravoDelegateStorageV1. Create a new
 * contract which implements GovernorBravoDelegateStorageV1 and following the naming convention
 * GovernorBravoDelegateStorageVX.
 */
contract GovernorBravoDelegateStorageV1 is GovernorBravoDelegatorStorage {

    /// @notice The delay before voting on a proposal may take place, once proposed, in blocks
    uint public votingDelay;

    /// @notice The duration of voting on a proposal, in blocks
    uint public votingPeriod;

    /// @notice The number of votes required in order for a voter to become a proposer
    uint public proposalThreshold;

    /// @notice Initial proposal id set at become
    uint public initialProposalId;

    /// @notice The total number of proposals
    uint public proposalCount;

    /// @notice The address of the Moola Protocol Timelock
    TimelockInterface public timelock;

    /// @notice The address of the Moola governance token
    CompInterface public moo;

    /// @notice The official record of all proposals ever proposed
    mapping (uint => Proposal) public proposals;

    /// @notice The latest proposal for each proposer
    mapping (address => uint) public latestProposalIds;


    struct Proposal {
        /// @notice Unique id for looking up a proposal
        uint id;

        /// @notice Creator of the proposal
        address proposer;

        /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
        uint eta;

        /// @notice the ordered list of target addresses for calls to be made
        address[] targets;

        /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made
        uint[] values;

        /// @notice The ordered list of function signatures to be called
        string[] signatures;

        /// @notice The ordered list of calldata to be passed to each call
        bytes[] calldatas;

        /// @notice The block at which voting begins: holders must delegate their votes prior to this block
        uint startBlock;

        /// @notice The block at which voting ends: votes must be cast prior to this block
        uint endBlock;

        /// @notice Current number of votes in favor of this proposal
        uint forVotes;

        /// @notice Current number of votes in opposition to this proposal
        uint againstVotes;

        /// @notice Current number of votes for abstaining for this proposal
        uint abstainVotes;

        /// @notice Flag marking whether the proposal has been canceled
        bool canceled;

        /// @notice Flag marking whether the proposal has been executed
        bool executed;

        /// @notice Receipts of ballots for the entire set of voters
        mapping (address => Receipt) receipts;
    }

    /// @notice Ballot receipt record for a voter
    struct Receipt {
        /// @notice Whether or not a vote has been cast
        bool hasVoted;

        /// @notice Whether or not the voter supports the proposal or abstains
        uint8 support;

        /// @notice The number of votes the voter had, which were cast
        uint96 votes;
    }

    /// @notice Possible states that a proposal may be in
    enum ProposalState {
        Pending,
        Active,
        Canceled,
        Defeated,
        Succeeded,
        Queued,
        Expired,
        Executed
    }
}

contract GovernorBravoDelegateStorageV2 is GovernorBravoDelegateStorageV1 {
    /// @notice Stores the expiration of account whitelist status as a timestamp
    mapping (address => uint) public whitelistAccountExpirations;

    /// @notice Address which manages whitelisted proposals and whitelist accounts
    address public whitelistGuardian;
}

interface TimelockInterface {
    function delay() external view returns (uint);
    function GRACE_PERIOD() external view returns (uint);
    function acceptAdmin() external;
    function queuedTransactions(bytes32 hash) external view returns (bool);
    function queueTransaction(address target, uint value, string calldata signature, bytes calldata data, uint eta) external returns (bytes32);
    function cancelTransaction(address target, uint value, string calldata signature, bytes calldata data, uint eta) external;
    function executeTransaction(address target, uint value, string calldata signature, bytes calldata data, uint eta) external payable returns (bytes memory);
}

interface CompInterface {
    function getPriorVotes(address account, uint blockNumber) external view returns (uint96);
}

interface GovernorAlpha {
    /// @notice The total number of proposals
    function proposalCount() external returns (uint);
}
          

Contract ABI

[{"type":"event","name":"NewAdmin","inputs":[{"type":"address","name":"oldAdmin","internalType":"address","indexed":false},{"type":"address","name":"newAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewImplementation","inputs":[{"type":"address","name":"oldImplementation","internalType":"address","indexed":false},{"type":"address","name":"newImplementation","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewPendingAdmin","inputs":[{"type":"address","name":"oldPendingAdmin","internalType":"address","indexed":false},{"type":"address","name":"newPendingAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalCanceled","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalCreated","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"address","name":"proposer","internalType":"address","indexed":false},{"type":"address[]","name":"targets","internalType":"address[]","indexed":false},{"type":"uint256[]","name":"values","internalType":"uint256[]","indexed":false},{"type":"string[]","name":"signatures","internalType":"string[]","indexed":false},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]","indexed":false},{"type":"uint256","name":"startBlock","internalType":"uint256","indexed":false},{"type":"uint256","name":"endBlock","internalType":"uint256","indexed":false},{"type":"string","name":"description","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalExecuted","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalQueued","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"uint256","name":"eta","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalThresholdSet","inputs":[{"type":"uint256","name":"oldProposalThreshold","internalType":"uint256","indexed":false},{"type":"uint256","name":"newProposalThreshold","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"VoteCast","inputs":[{"type":"address","name":"voter","internalType":"address","indexed":true},{"type":"uint256","name":"proposalId","internalType":"uint256","indexed":false},{"type":"uint8","name":"support","internalType":"uint8","indexed":false},{"type":"uint256","name":"votes","internalType":"uint256","indexed":false},{"type":"string","name":"reason","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"VotingDelaySet","inputs":[{"type":"uint256","name":"oldVotingDelay","internalType":"uint256","indexed":false},{"type":"uint256","name":"newVotingDelay","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"VotingPeriodSet","inputs":[{"type":"uint256","name":"oldVotingPeriod","internalType":"uint256","indexed":false},{"type":"uint256","name":"newVotingPeriod","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"WhitelistAccountExpirationSet","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false},{"type":"uint256","name":"expiration","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"WhitelistGuardianSet","inputs":[{"type":"address","name":"oldGuardian","internalType":"address","indexed":false},{"type":"address","name":"newGuardian","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"BALLOT_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_PROPOSAL_THRESHOLD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_VOTING_DELAY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_VOTING_PERIOD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_PROPOSAL_THRESHOLD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_VOTING_DELAY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_VOTING_PERIOD","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_acceptAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_initiate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setProposalThreshold","inputs":[{"type":"uint256","name":"newProposalThreshold","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setVotingDelay","inputs":[{"type":"uint256","name":"newVotingDelay","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setVotingPeriod","inputs":[{"type":"uint256","name":"newVotingPeriod","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setWhitelistAccountExpiration","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"expiration","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setWhitelistGuardian","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancel","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVote","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"uint8","name":"support","internalType":"uint8"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVoteBySig","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"uint8","name":"support","internalType":"uint8"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVoteWithReason","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"uint8","name":"support","internalType":"uint8"},{"type":"string","name":"reason","internalType":"string"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"execute","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"}],"name":"getActions","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct GovernorBravoDelegateStorageV1.Receipt","components":[{"type":"bool","name":"hasVoted","internalType":"bool"},{"type":"uint8","name":"support","internalType":"uint8"},{"type":"uint96","name":"votes","internalType":"uint96"}]}],"name":"getReceipt","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"address","name":"voter","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"implementation","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"initialProposalId","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"timelock_","internalType":"address"},{"type":"address","name":"moo_","internalType":"address"},{"type":"uint256","name":"votingPeriod_","internalType":"uint256"},{"type":"uint256","name":"votingDelay_","internalType":"uint256"},{"type":"uint256","name":"proposalThreshold_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isWhitelisted","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"latestProposalIds","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract CompInterface"}],"name":"moo","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalMaxOperations","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"address","name":"proposer","internalType":"address"},{"type":"uint256","name":"eta","internalType":"uint256"},{"type":"uint256","name":"startBlock","internalType":"uint256"},{"type":"uint256","name":"endBlock","internalType":"uint256"},{"type":"uint256","name":"forVotes","internalType":"uint256"},{"type":"uint256","name":"againstVotes","internalType":"uint256"},{"type":"uint256","name":"abstainVotes","internalType":"uint256"},{"type":"bool","name":"canceled","internalType":"bool"},{"type":"bool","name":"executed","internalType":"bool"}],"name":"proposals","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"propose","inputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"},{"type":"string","name":"description","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"queue","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"quorumVotes","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum GovernorBravoDelegateStorageV1.ProposalState"}],"name":"state","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract TimelockInterface"}],"name":"timelock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"votingDelay","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"votingPeriod","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"whitelistAccountExpirations","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"whitelistGuardian","inputs":[]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50613fec806100206000396000f3fe6080604052600436106102725760003560e01c806363cd99cb1161014f578063d13f90b4116100c1578063e23a9a521161007a578063e23a9a521461088a578063e48083fe146108da578063e9c714f2146108ef578063f851a44014610904578063fc4eee4214610924578063fe0d94c11461093a57600080fd5b8063d13f90b4146107c0578063d33219b4146107e0578063da35c66414610800578063da95691a14610816578063ddf0b00914610836578063deaaa7cc1461085657600080fd5b80639953336511610113578063995333651461071d578063a64e024a1461073d578063b112626314610754578063b58131b01461076a578063b71d1a0c14610780578063c5a8425d146107a057600080fd5b806363cd99cb14610696578063791f5d23146106b65780637b3c71d3146106d35780637bdbe4d0146106f3578063878f14821461070857600080fd5b806326782247116101e85780633bccf4fd116101ac5780633bccf4fd146105c95780633e4f49e6146105e957806340e58ee5146106165780634d6733d21461063657806356781388146106565780635c60da1b1461067657600080fd5b806326782247146104d6578063328dd9821461050e57806338bd0dda1461053e5780633932abb11461056b5780633af32abf1461058157600080fd5b806317ba1b8b1161023a57806317ba1b8b146104105780631dfb1b5a1461043057806320606b7014610450578063215809ca1461048457806324bc1a641461049a57806325fd935a146104b857600080fd5b8063013cf08b1461027757806302a251a31461035057806306fdde03146103745780630ea2d98c146103c157806317977c61146103e3575b600080fd5b34801561028357600080fd5b506102f56102923660046133c9565b600a60208190526000918252604090912080546001820154600283015460078401546008850154600986015496860154600b870154600c9097015495976001600160a01b0390951696939592949193919290919060ff808216916101009004168a565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b34801561035c57600080fd5b5061036660045481565b604051908152602001610347565b34801561038057600080fd5b506103b4604051806040016040528060148152602001734d6f6f6c6120476f7665726e6f7220427261766f60601b81525081565b6040516103479190613432565b3480156103cd57600080fd5b506103e16103dc3660046133c9565b61094d565b005b3480156103ef57600080fd5b506103666103fe366004613461565b600b6020526000908152604090205481565b34801561041c57600080fd5b506103e161042b3660046133c9565b610a86565b34801561043c57600080fd5b506103e161044b3660046133c9565b610bce565b34801561045c57600080fd5b506103667f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561049057600080fd5b5061036661168081565b3480156104a657600080fd5b506103666954b40b1f852bda00000081565b3480156104c457600080fd5b5061036669152d02c7e14af680000081565b3480156104e257600080fd5b506001546104f6906001600160a01b031681565b6040516001600160a01b039091168152602001610347565b34801561051a57600080fd5b5061052e6105293660046133c9565b610cf5565b6040516103479493929190613545565b34801561054a57600080fd5b50610366610559366004613461565b600c6020526000908152604090205481565b34801561057757600080fd5b5061036660035481565b34801561058d57600080fd5b506105b961059c366004613461565b6001600160a01b03166000908152600c6020526040902054421090565b6040519015158152602001610347565b3480156105d557600080fd5b506103e16105e43660046135ae565b610f86565b3480156105f557600080fd5b506106096106043660046133c9565b611200565b6040516103479190613612565b34801561062257600080fd5b506103e16106313660046133c9565b6113b9565b34801561064257600080fd5b506103e161065136600461363a565b611808565b34801561066257600080fd5b506103e1610671366004613664565b6118ee565b34801561068257600080fd5b506002546104f6906001600160a01b031681565b3480156106a257600080fd5b506009546104f6906001600160a01b031681565b3480156106c257600080fd5b50610366683635c9adc5dea0000081565b3480156106df57600080fd5b506103e16106ee366004613690565b611959565b3480156106ff57600080fd5b50610366600a81565b34801561071457600080fd5b506103e16119a9565b34801561072957600080fd5b506103e1610738366004613461565b611ae2565b34801561074957600080fd5b5061036662013b0081565b34801561076057600080fd5b50610366619d8081565b34801561077657600080fd5b5061036660055481565b34801561078c57600080fd5b506103e161079b366004613461565b611baf565b3480156107ac57600080fd5b50600d546104f6906001600160a01b031681565b3480156107cc57600080fd5b506103e16107db366004613717565b611c76565b3480156107ec57600080fd5b506008546104f6906001600160a01b031681565b34801561080c57600080fd5b5061036660075481565b34801561082257600080fd5b50610366610831366004613a32565b611f94565b34801561084257600080fd5b506103e16108513660046133c9565b6125c9565b34801561086257600080fd5b506103667f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b34801561089657600080fd5b506108aa6108a5366004613b04565b6128d5565b6040805182511515815260208084015160ff1690820152918101516001600160601b031690820152606001610347565b3480156108e657600080fd5b50610366600181565b3480156108fb57600080fd5b506103e161294d565b34801561091057600080fd5b506000546104f6906001600160a01b031681565b34801561093057600080fd5b5061036660065481565b6103e16109483660046133c9565b612a77565b6000546001600160a01b031633146109c05760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a60448201526a2061646d696e206f6e6c7960a81b60648201526084015b60405180910390fd5b61168081101580156109d5575062013b008111155b610a405760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a604482015275081a5b9d985b1a59081d9bdd1a5b99c81c195c9a5bd960521b60648201526084016109b7565b600480549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000546001600160a01b03163314610af95760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201526f686f6c643a2061646d696e206f6e6c7960801b60648201526084016109b7565b683635c9adc5dea000008110158015610b1c575069152d02c7e14af68000008111155b610b90576040805162461bcd60e51b81526020600482015260248101919091527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201527f686f6c643a20696e76616c69642070726f706f73616c207468726573686f6c6460648201526084016109b7565b600580549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101610a7a565b6000546001600160a01b03163314610c3b5760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b7565b60018110158015610c4e5750619d808111155b610cb75760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a20604482015273696e76616c696420766f74696e672064656c617960601b60648201526084016109b7565b600380549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101610a7a565b6060806060806000600a600087815260200190815260200160002090508060030181600401826005018360060183805480602002602001604051908101604052809291908181526020018280548015610d7757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d59575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610dc957602002820191906000526020600020905b815481526020019060010190808311610db5575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610e9d578382906000526020600020018054610e1090613b27565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90613b27565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b505050505081526020019060010190610df1565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610f70578382906000526020600020018054610ee390613b27565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0f90613b27565b8015610f5c5780601f10610f3157610100808354040283529160200191610f5c565b820191906000526020600020905b815481529060010190602001808311610f3f57829003601f168201915b505050505081526020019060010190610ec4565b5050505090509450945094509450509193509193565b60408051808201825260148152734d6f6f6c6120476f7665726e6f7220427261766f60601b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f3120cbbfab38c57ca23a5a6a87898b8764fccd7065340837e0d25ef137dc55d381840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561110a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111855760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63617374566f746542795369673a20696e60448201526e76616c6964207369676e617475726560881b60648201526084016109b7565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a6111bd858e8e612cb4565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b60008160075410158015611215575060065482115b6112735760405162461bcd60e51b815260206004820152602960248201527f476f7665726e6f72427261766f3a3a73746174653a20696e76616c69642070726044820152681bdc1bdcd85b081a5960ba1b60648201526084016109b7565b6000828152600a60205260409020600c81015460ff16156112975750600292915050565b806007015443116112ab5750600092915050565b806008015443116112bf5750600192915050565b80600a015481600901541115806112e357506954b40b1f852bda0000008160090154105b156112f15750600392915050565b80600201546000036113065750600492915050565b600c810154610100900460ff16156113215750600792915050565b6002810154600854604080516360d143f160e11b8152905161139b93926001600160a01b03169163c1a287e29160048083019260209291908290030181865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113969190613b5b565b612f94565b42106113aa5750600692915050565b50600592915050565b50919050565b60076113c482611200565b60078111156113d5576113d56135fc565b036114415760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2063616e6e6f742063616044820152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b60648201526084016109b7565b6000818152600a6020526040902060018101546001600160a01b031633146116ac5760018101546001600160a01b03166000908152600c60205260409020544210156115a5576005546009546001838101546001600160a01b039283169263782d6fe1929116906114b3904390612fee565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156114fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115209190613b74565b6001600160601b03161080156115405750600d546001600160a01b031633145b6115a05760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2077686974656c69737460448201526a32b210383937b837b9b2b960a91b60648201526084016109b7565b6116ac565b6005546009546001838101546001600160a01b039283169263782d6fe1929116906115d1904390612fee565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163e9190613b74565b6001600160601b0316106116ac5760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2070726f706f7365722060448201526e18589bdd99481d1a1c995cda1bdb19608a1b60648201526084016109b7565b600c8101805460ff1916600117905560005b60038201548110156117d7576008546003830180546001600160a01b039092169163591fcdfe9190849081106116f6576116f6613b9d565b6000918252602090912001546004850180546001600160a01b03909216918590811061172457611724613b9d565b906000526020600020015485600501858154811061174457611744613b9d565b9060005260206000200186600601868154811061176357611763613b9d565b9060005260206000200187600201546040518663ffffffff1660e01b8152600401611792959493929190613c30565b600060405180830381600087803b1580156117ac57600080fd5b505af11580156117c0573d6000803e3d6000fd5b5050505080806117cf90613c92565b9150506116be565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610a7a565b6000546001600160a01b031633148061182b5750600d546001600160a01b031633145b61189d5760405162461bcd60e51b815260206004820152603960248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744163636f60448201527f756e7445787069726174696f6e3a2061646d696e206f6e6c790000000000000060648201526084016109b7565b6001600160a01b0382166000818152600c6020908152604091829020849055815192835282018390527f4e7b7545bc5744d0e30425959f4687475774b6c7edad77d24cb51c7d967d45159101610a7a565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4838361191d848383612cb4565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a25050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585611988848383612cb4565b868660405161199b959493929190613cab565b60405180910390a250505050565b6000546001600160a01b03163314611a0f5760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2061646d696e206044820152636f6e6c7960e01b60648201526084016109b7565b60065415611a785760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2063616e206f6e60448201526f6c7920696e697469617465206f6e636560801b60648201526084016109b7565b600860009054906101000a90046001600160a01b03166001600160a01b0316630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac857600080fd5b505af1158015611adc573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611b555760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744775617260448201526f6469616e3a2061646d696e206f6e6c7960801b60648201526084016109b7565b600d80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f80a07e73e552148844a9c216d9724212d609cfa54e9c1a2e97203bdd2c4ad3419101610a7a565b6000546001600160a01b03163314611c1c5760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a5f73657450656e64696e6741646d696e3a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b7565b600180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a7a565b6008546001600160a01b031615611ceb5760405162461bcd60e51b815260206004820152603360248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2063616e206f6044820152726e6c7920696e697469616c697a65206f6e636560681b60648201526084016109b7565b6000546001600160a01b03163314611d535760405162461bcd60e51b815260206004820152602560248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2061646d696e604482015264206f6e6c7960d81b60648201526084016109b7565b6001600160a01b038516611db35760405162461bcd60e51b81526020600482015260336024820152600080516020613f9783398151915260448201527269642074696d656c6f636b206164647265737360681b60648201526084016109b7565b6001600160a01b038416611e0e5760405162461bcd60e51b815260206004820152602e6024820152600080516020613f9783398151915260448201526d6964206d6f6f206164647265737360901b60648201526084016109b7565b6116808310158015611e23575062013b008311155b611e765760405162461bcd60e51b81526020600482015260306024820152600080516020613f9783398151915260448201526f1a59081d9bdd1a5b99c81c195c9a5bd960821b60648201526084016109b7565b60018210158015611e895750619d808211155b611edb5760405162461bcd60e51b815260206004820152602f6024820152600080516020613f9783398151915260448201526e696420766f74696e672064656c617960881b60648201526084016109b7565b683635c9adc5dea000008110158015611efe575069152d02c7e14af68000008111155b611f565760405162461bcd60e51b81526020600482015260356024820152600080516020613f978339815191526044820152741a59081c1c9bdc1bdcd85b081d1a1c995cda1bdb19605a1b60648201526084016109b7565b600880546001600160a01b039687166001600160a01b0319918216179091556009805495909616941693909317909355600455600391909155600555565b600554600954600091906001600160a01b031663782d6fe133611fb8436001612fee565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120259190613b74565b6001600160601b031611806120485750336000908152600c602052604090205442105b6120ba5760405162461bcd60e51b815260206004820152603f60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73657260448201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c640060648201526084016109b7565b845186511480156120cc575083518651145b80156120d9575082518651145b6121595760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73616c908201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6064820152630c2e8c6d60e31b608482015260a4016109b7565b85516000036121bf5760405162461bcd60e51b815260206004820152602c60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206d7573742070726f60448201526b7669646520616374696f6e7360a01b60648201526084016109b7565b600a865111156122225760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e7960448201526720616374696f6e7360c01b60648201526084016109b7565b336000908152600b602052604090205480156123a157600061224382611200565b90506001816007811115612259576122596135fc565b036122f25760405162461bcd60e51b815260206004820152605860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c7265616479206163746976652070726f706f73616c0000000000000000608482015260a4016109b7565b6000816007811115612306576123066135fc565b0361239f5760405162461bcd60e51b815260206004820152605960248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000608482015260a4016109b7565b505b60006123af43600354612f94565b905060006123bf82600454612f94565b6007805491925060006123d183613c92565b90915550506007546000818152600a6020526040902080541561244a5760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2050726f706f73616c60448201526a24a21031b7b63639b4b7b760a91b60648201526084016109b7565b8181556001810180546001600160a01b03191633179055600060028201558a5161247d90600383019060208e01906131f9565b50895161249390600483019060208d019061325e565b5088516124a990600583019060208c0190613299565b5087516124bf90600683019060208b01906132eb565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0181905550600081600c0160006101000a81548160ff021916908315150217905550600081600c0160016101000a81548160ff0219169083151502179055508060000154600b60008360010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f6040516125b299989796959493929190613cfb565b60405180910390a1549a9950505050505050505050565b60046125d482611200565b60078111156125e5576125e56135fc565b146126665760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a71756575653a2070726f706f73616c2063908201527f616e206f6e6c79206265207175657565642069662069742069732073756363656064820152631959195960e21b608482015260a4016109b7565b6000818152600a602090815260408083206008548251630d48571f60e31b815292519194936126c59342936001600160a01b0390931692636a42b8f8926004808401939192918290030181865afa158015611372573d6000803e3d6000fd5b905060005b600383015481101561288f5761287d8360030182815481106126ee576126ee613b9d565b6000918252602090912001546004850180546001600160a01b03909216918490811061271c5761271c613b9d565b906000526020600020015485600501848154811061273c5761273c613b9d565b90600052602060002001805461275190613b27565b80601f016020809104026020016040519081016040528092919081815260200182805461277d90613b27565b80156127ca5780601f1061279f576101008083540402835291602001916127ca565b820191906000526020600020905b8154815290600101906020018083116127ad57829003601f168201915b50505050508660060185815481106127e4576127e4613b9d565b9060005260206000200180546127f990613b27565b80601f016020809104026020016040519081016040528092919081815260200182805461282590613b27565b80156128725780601f1061284757610100808354040283529160200191612872565b820191906000526020600020905b81548152906001019060200180831161285557829003601f168201915b505050505086613042565b8061288781613c92565b9150506126ca565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1505050565b604080516060808201835260008083526020808401829052928401819052858152600a83528381206001600160a01b0386168252600d018352839020835191820184525460ff8082161515835261010082041692820192909252620100009091046001600160601b0316918101919091525b92915050565b6001546001600160a01b03163314801561296657503315155b6129c95760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e6f72427261766f3a5f61636365707441646d696e3a2070656e6460448201526d696e672061646d696e206f6e6c7960901b60648201526084016109b7565b60008054600180546001600160a01b038082166001600160a01b031980861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a7a565b6005612a8282611200565b6007811115612a9357612a936135fc565b14612b145760405162461bcd60e51b815260206004820152604560248201527f476f7665726e6f72427261766f3a3a657865637574653a2070726f706f73616c60448201527f2063616e206f6e6c7920626520657865637574656420696620697420697320716064820152641d595d595960da1b608482015260a4016109b7565b6000818152600a60205260408120600c8101805461ff001916610100179055905b6003820154811015612c83576008546004830180546001600160a01b0390921691630825f38f919084908110612b6d57612b6d613b9d565b9060005260206000200154846003018481548110612b8d57612b8d613b9d565b6000918252602090912001546004860180546001600160a01b039092169186908110612bbb57612bbb613b9d565b9060005260206000200154866005018681548110612bdb57612bdb613b9d565b90600052602060002001876006018781548110612bfa57612bfa613b9d565b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612c29959493929190613c30565b60006040518083038185885af1158015612c47573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612c709190810190613d93565b5080612c7b81613c92565b915050612b35565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610a7a565b60006001612cc184611200565b6007811115612cd257612cd26135fc565b14612d395760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015270081d9bdd1a5b99c81a5cc818db1bdcd959607a1b60648201526084016109b7565b60028260ff161115612da85760405162461bcd60e51b815260206004820152603260248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a60448201527120696e76616c696420766f7465207479706560701b60648201526084016109b7565b6000838152600a602090815260408083206001600160a01b0388168452600d8101909252909120805460ff1615612e3e5760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015273081d9bdd195c88185b1c9958591e481d9bdd195960621b60648201526084016109b7565b600954600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe191612e88918b916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015612ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec99190613b74565b90508460ff16600003612ef757612eed83600a0154826001600160601b0316612f94565b600a840155612f4b565b8460ff16600103612f2357612f198360090154826001600160601b0316612f94565b6009840155612f4b565b8460ff16600203612f4b57612f4583600b0154826001600160601b0316612f94565b600b8401555b81546001600160601b03821662010000026dffffffffffffffffffffffff00001960ff88166101000261ffff199093169290921760011791909116179091559150509392505050565b600080612fa18385613e0a565b905083811015612fe75760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b60448201526064016109b7565b9392505050565b6000828211156130385760405162461bcd60e51b81526020600482015260156024820152747375627472616374696f6e20756e646572666c6f7760581b60448201526064016109b7565b612fe78284613e1d565b6008546040516001600160a01b039091169063f2b06537906130709088908890889088908890602001613e30565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016130a491815260200190565b602060405180830381865afa1580156130c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e59190613e69565b156131765760405162461bcd60e51b815260206004820152605560248201527f476f7665726e6f72427261766f3a3a71756575654f72526576657274496e746560448201527f726e616c3a206964656e746963616c2070726f706f73616c20616374696f6e20606482015274616c7265616479207175657565642061742065746160581b608482015260a4016109b7565b600854604051633a66f90160e01b81526001600160a01b0390911690633a66f901906131ae9088908890889088908890600401613e30565b6020604051808303816000875af11580156131cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f19190613b5b565b505050505050565b82805482825590600052602060002090810192821561324e579160200282015b8281111561324e57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613219565b5061325a92915061333d565b5090565b82805482825590600052602060002090810192821561324e579160200282015b8281111561324e57825182559160200191906001019061327e565b8280548282559060005260206000209081019282156132df579160200282015b828111156132df57825182906132cf9082613ed6565b50916020019190600101906132b9565b5061325a929150613352565b828054828255906000526020600020908101928215613331579160200282015b8281111561333157825182906133219082613ed6565b509160200191906001019061330b565b5061325a92915061336f565b5b8082111561325a576000815560010161333e565b8082111561325a576000613366828261338c565b50600101613352565b8082111561325a576000613383828261338c565b5060010161336f565b50805461339890613b27565b6000825580601f106133a8575050565b601f0160209004906000526020600020908101906133c6919061333d565b50565b6000602082840312156133db57600080fd5b5035919050565b60005b838110156133fd5781810151838201526020016133e5565b50506000910152565b6000815180845261341e8160208601602086016133e2565b601f01601f19169290920160200192915050565b602081526000612fe76020830184613406565b80356001600160a01b038116811461345c57600080fd5b919050565b60006020828403121561347357600080fd5b612fe782613445565b600081518084526020808501945080840160005b838110156134b55781516001600160a01b031687529582019590820190600101613490565b509495945050505050565b600081518084526020808501945080840160005b838110156134b5578151875295820195908201906001016134d4565b600081518084526020808501808196508360051b8101915082860160005b85811015613538578284038952613526848351613406565b9885019893509084019060010161350e565b5091979650505050505050565b608081526000613558608083018761347c565b828103602084015261356a81876134c0565b9050828103604084015261357e81866134f0565b9050828103606084015261359281856134f0565b979650505050505050565b803560ff8116811461345c57600080fd5b600080600080600060a086880312156135c657600080fd5b853594506135d66020870161359d565b93506135e46040870161359d565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b602081016008831061363457634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561364d57600080fd5b61365683613445565b946020939093013593505050565b6000806040838503121561367757600080fd5b823591506136876020840161359d565b90509250929050565b600080600080606085870312156136a657600080fd5b843593506136b66020860161359d565b9250604085013567ffffffffffffffff808211156136d357600080fd5b818701915087601f8301126136e757600080fd5b8135818111156136f657600080fd5b88602082850101111561370857600080fd5b95989497505060200194505050565b600080600080600060a0868803121561372f57600080fd5b61373886613445565b945061374660208701613445565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137a3576137a3613764565b604052919050565b600067ffffffffffffffff8211156137c5576137c5613764565b5060051b60200190565b600082601f8301126137e057600080fd5b813560206137f56137f0836137ab565b61377a565b82815260059290921b8401810191818101908684111561381457600080fd5b8286015b848110156138365761382981613445565b8352918301918301613818565b509695505050505050565b600082601f83011261385257600080fd5b813560206138626137f0836137ab565b82815260059290921b8401810191818101908684111561388157600080fd5b8286015b848110156138365780358352918301918301613885565b600067ffffffffffffffff8211156138b6576138b6613764565b50601f01601f191660200190565b60006138d26137f08461389c565b90508281528383830111156138e657600080fd5b828260208301376000602084830101529392505050565b600082601f83011261390e57600080fd5b612fe7838335602085016138c4565b600082601f83011261392e57600080fd5b8135602061393e6137f0836137ab565b82815260059290921b8401810191818101908684111561395d57600080fd5b8286015b8481101561383657803567ffffffffffffffff8111156139815760008081fd5b61398f8986838b01016138fd565b845250918301918301613961565b600082601f8301126139ae57600080fd5b813560206139be6137f0836137ab565b82815260059290921b840181019181810190868411156139dd57600080fd5b8286015b8481101561383657803567ffffffffffffffff811115613a015760008081fd5b8701603f81018913613a135760008081fd5b613a248986830135604084016138c4565b8452509183019183016139e1565b600080600080600060a08688031215613a4a57600080fd5b853567ffffffffffffffff80821115613a6257600080fd5b613a6e89838a016137cf565b96506020880135915080821115613a8457600080fd5b613a9089838a01613841565b95506040880135915080821115613aa657600080fd5b613ab289838a0161391d565b94506060880135915080821115613ac857600080fd5b613ad489838a0161399d565b93506080880135915080821115613aea57600080fd5b50613af7888289016138fd565b9150509295509295909350565b60008060408385031215613b1757600080fd5b8235915061368760208401613445565b600181811c90821680613b3b57607f821691505b6020821081036113b357634e487b7160e01b600052602260045260246000fd5b600060208284031215613b6d57600080fd5b5051919050565b600060208284031215613b8657600080fd5b81516001600160601b0381168114612fe757600080fd5b634e487b7160e01b600052603260045260246000fd5b60008154613bc081613b27565b808552602060018381168015613bdd5760018114613bf757613c25565b60ff1985168884015283151560051b880183019550613c25565b866000528260002060005b85811015613c1d5781548a8201860152908301908401613c02565b890184019650505b505050505092915050565b60018060a01b038616815284602082015260a060408201526000613c5760a0830186613bb3565b8281036060840152613c698186613bb3565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201613ca457613ca4613c7c565b5060010190565b85815260ff851660208201526001600160601b038416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8981526001600160a01b038916602082015261012060408201819052600090613d268382018b61347c565b90508281036060840152613d3a818a6134c0565b90508281036080840152613d4e81896134f0565b905082810360a0840152613d6281886134f0565b90508560c08401528460e0840152828103610100840152613d838185613406565b9c9b505050505050505050505050565b600060208284031215613da557600080fd5b815167ffffffffffffffff811115613dbc57600080fd5b8201601f81018413613dcd57600080fd5b8051613ddb6137f08261389c565b818152856020838501011115613df057600080fd5b613e018260208301602086016133e2565b95945050505050565b8082018082111561294757612947613c7c565b8181038181111561294757612947613c7c565b60018060a01b038616815284602082015260a060408201526000613e5760a0830186613406565b8281036060840152613c698186613406565b600060208284031215613e7b57600080fd5b81518015158114612fe757600080fd5b601f821115613ed157600081815260208120601f850160051c81016020861015613eb25750805b601f850160051c820191505b818110156131f157828155600101613ebe565b505050565b815167ffffffffffffffff811115613ef057613ef0613764565b613f0481613efe8454613b27565b84613e8b565b602080601f831160018114613f395760008415613f215750858301515b600019600386901b1c1916600185901b1785556131f1565b600085815260208120601f198616915b82811015613f6857888601518255948401946001909101908401613f49565b5085821015613f865787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe476f7665726e6f72427261766f3a3a696e697469616c697a653a20696e76616ca26469706673582212200d081e809efd3c5fef3b7d37bee0c87fbbb497104764c6ad484f53861efaa49664736f6c63430008100033

Deployed ByteCode

0x6080604052600436106102725760003560e01c806363cd99cb1161014f578063d13f90b4116100c1578063e23a9a521161007a578063e23a9a521461088a578063e48083fe146108da578063e9c714f2146108ef578063f851a44014610904578063fc4eee4214610924578063fe0d94c11461093a57600080fd5b8063d13f90b4146107c0578063d33219b4146107e0578063da35c66414610800578063da95691a14610816578063ddf0b00914610836578063deaaa7cc1461085657600080fd5b80639953336511610113578063995333651461071d578063a64e024a1461073d578063b112626314610754578063b58131b01461076a578063b71d1a0c14610780578063c5a8425d146107a057600080fd5b806363cd99cb14610696578063791f5d23146106b65780637b3c71d3146106d35780637bdbe4d0146106f3578063878f14821461070857600080fd5b806326782247116101e85780633bccf4fd116101ac5780633bccf4fd146105c95780633e4f49e6146105e957806340e58ee5146106165780634d6733d21461063657806356781388146106565780635c60da1b1461067657600080fd5b806326782247146104d6578063328dd9821461050e57806338bd0dda1461053e5780633932abb11461056b5780633af32abf1461058157600080fd5b806317ba1b8b1161023a57806317ba1b8b146104105780631dfb1b5a1461043057806320606b7014610450578063215809ca1461048457806324bc1a641461049a57806325fd935a146104b857600080fd5b8063013cf08b1461027757806302a251a31461035057806306fdde03146103745780630ea2d98c146103c157806317977c61146103e3575b600080fd5b34801561028357600080fd5b506102f56102923660046133c9565b600a60208190526000918252604090912080546001820154600283015460078401546008850154600986015496860154600b870154600c9097015495976001600160a01b0390951696939592949193919290919060ff808216916101009004168a565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b34801561035c57600080fd5b5061036660045481565b604051908152602001610347565b34801561038057600080fd5b506103b4604051806040016040528060148152602001734d6f6f6c6120476f7665726e6f7220427261766f60601b81525081565b6040516103479190613432565b3480156103cd57600080fd5b506103e16103dc3660046133c9565b61094d565b005b3480156103ef57600080fd5b506103666103fe366004613461565b600b6020526000908152604090205481565b34801561041c57600080fd5b506103e161042b3660046133c9565b610a86565b34801561043c57600080fd5b506103e161044b3660046133c9565b610bce565b34801561045c57600080fd5b506103667f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561049057600080fd5b5061036661168081565b3480156104a657600080fd5b506103666954b40b1f852bda00000081565b3480156104c457600080fd5b5061036669152d02c7e14af680000081565b3480156104e257600080fd5b506001546104f6906001600160a01b031681565b6040516001600160a01b039091168152602001610347565b34801561051a57600080fd5b5061052e6105293660046133c9565b610cf5565b6040516103479493929190613545565b34801561054a57600080fd5b50610366610559366004613461565b600c6020526000908152604090205481565b34801561057757600080fd5b5061036660035481565b34801561058d57600080fd5b506105b961059c366004613461565b6001600160a01b03166000908152600c6020526040902054421090565b6040519015158152602001610347565b3480156105d557600080fd5b506103e16105e43660046135ae565b610f86565b3480156105f557600080fd5b506106096106043660046133c9565b611200565b6040516103479190613612565b34801561062257600080fd5b506103e16106313660046133c9565b6113b9565b34801561064257600080fd5b506103e161065136600461363a565b611808565b34801561066257600080fd5b506103e1610671366004613664565b6118ee565b34801561068257600080fd5b506002546104f6906001600160a01b031681565b3480156106a257600080fd5b506009546104f6906001600160a01b031681565b3480156106c257600080fd5b50610366683635c9adc5dea0000081565b3480156106df57600080fd5b506103e16106ee366004613690565b611959565b3480156106ff57600080fd5b50610366600a81565b34801561071457600080fd5b506103e16119a9565b34801561072957600080fd5b506103e1610738366004613461565b611ae2565b34801561074957600080fd5b5061036662013b0081565b34801561076057600080fd5b50610366619d8081565b34801561077657600080fd5b5061036660055481565b34801561078c57600080fd5b506103e161079b366004613461565b611baf565b3480156107ac57600080fd5b50600d546104f6906001600160a01b031681565b3480156107cc57600080fd5b506103e16107db366004613717565b611c76565b3480156107ec57600080fd5b506008546104f6906001600160a01b031681565b34801561080c57600080fd5b5061036660075481565b34801561082257600080fd5b50610366610831366004613a32565b611f94565b34801561084257600080fd5b506103e16108513660046133c9565b6125c9565b34801561086257600080fd5b506103667f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b34801561089657600080fd5b506108aa6108a5366004613b04565b6128d5565b6040805182511515815260208084015160ff1690820152918101516001600160601b031690820152606001610347565b3480156108e657600080fd5b50610366600181565b3480156108fb57600080fd5b506103e161294d565b34801561091057600080fd5b506000546104f6906001600160a01b031681565b34801561093057600080fd5b5061036660065481565b6103e16109483660046133c9565b612a77565b6000546001600160a01b031633146109c05760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a60448201526a2061646d696e206f6e6c7960a81b60648201526084015b60405180910390fd5b61168081101580156109d5575062013b008111155b610a405760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a604482015275081a5b9d985b1a59081d9bdd1a5b99c81c195c9a5bd960521b60648201526084016109b7565b600480549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000546001600160a01b03163314610af95760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201526f686f6c643a2061646d696e206f6e6c7960801b60648201526084016109b7565b683635c9adc5dea000008110158015610b1c575069152d02c7e14af68000008111155b610b90576040805162461bcd60e51b81526020600482015260248101919091527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201527f686f6c643a20696e76616c69642070726f706f73616c207468726573686f6c6460648201526084016109b7565b600580549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101610a7a565b6000546001600160a01b03163314610c3b5760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b7565b60018110158015610c4e5750619d808111155b610cb75760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a20604482015273696e76616c696420766f74696e672064656c617960601b60648201526084016109b7565b600380549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101610a7a565b6060806060806000600a600087815260200190815260200160002090508060030181600401826005018360060183805480602002602001604051908101604052809291908181526020018280548015610d7757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d59575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610dc957602002820191906000526020600020905b815481526020019060010190808311610db5575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610e9d578382906000526020600020018054610e1090613b27565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90613b27565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b505050505081526020019060010190610df1565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610f70578382906000526020600020018054610ee390613b27565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0f90613b27565b8015610f5c5780601f10610f3157610100808354040283529160200191610f5c565b820191906000526020600020905b815481529060010190602001808311610f3f57829003601f168201915b505050505081526020019060010190610ec4565b5050505090509450945094509450509193509193565b60408051808201825260148152734d6f6f6c6120476f7665726e6f7220427261766f60601b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f3120cbbfab38c57ca23a5a6a87898b8764fccd7065340837e0d25ef137dc55d381840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa15801561110a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111855760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63617374566f746542795369673a20696e60448201526e76616c6964207369676e617475726560881b60648201526084016109b7565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a6111bd858e8e612cb4565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b60008160075410158015611215575060065482115b6112735760405162461bcd60e51b815260206004820152602960248201527f476f7665726e6f72427261766f3a3a73746174653a20696e76616c69642070726044820152681bdc1bdcd85b081a5960ba1b60648201526084016109b7565b6000828152600a60205260409020600c81015460ff16156112975750600292915050565b806007015443116112ab5750600092915050565b806008015443116112bf5750600192915050565b80600a015481600901541115806112e357506954b40b1f852bda0000008160090154105b156112f15750600392915050565b80600201546000036113065750600492915050565b600c810154610100900460ff16156113215750600792915050565b6002810154600854604080516360d143f160e11b8152905161139b93926001600160a01b03169163c1a287e29160048083019260209291908290030181865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113969190613b5b565b612f94565b42106113aa5750600692915050565b50600592915050565b50919050565b60076113c482611200565b60078111156113d5576113d56135fc565b036114415760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2063616e6e6f742063616044820152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b60648201526084016109b7565b6000818152600a6020526040902060018101546001600160a01b031633146116ac5760018101546001600160a01b03166000908152600c60205260409020544210156115a5576005546009546001838101546001600160a01b039283169263782d6fe1929116906114b3904390612fee565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156114fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115209190613b74565b6001600160601b03161080156115405750600d546001600160a01b031633145b6115a05760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2077686974656c69737460448201526a32b210383937b837b9b2b960a91b60648201526084016109b7565b6116ac565b6005546009546001838101546001600160a01b039283169263782d6fe1929116906115d1904390612fee565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163e9190613b74565b6001600160601b0316106116ac5760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2070726f706f7365722060448201526e18589bdd99481d1a1c995cda1bdb19608a1b60648201526084016109b7565b600c8101805460ff1916600117905560005b60038201548110156117d7576008546003830180546001600160a01b039092169163591fcdfe9190849081106116f6576116f6613b9d565b6000918252602090912001546004850180546001600160a01b03909216918590811061172457611724613b9d565b906000526020600020015485600501858154811061174457611744613b9d565b9060005260206000200186600601868154811061176357611763613b9d565b9060005260206000200187600201546040518663ffffffff1660e01b8152600401611792959493929190613c30565b600060405180830381600087803b1580156117ac57600080fd5b505af11580156117c0573d6000803e3d6000fd5b5050505080806117cf90613c92565b9150506116be565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610a7a565b6000546001600160a01b031633148061182b5750600d546001600160a01b031633145b61189d5760405162461bcd60e51b815260206004820152603960248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744163636f60448201527f756e7445787069726174696f6e3a2061646d696e206f6e6c790000000000000060648201526084016109b7565b6001600160a01b0382166000818152600c6020908152604091829020849055815192835282018390527f4e7b7545bc5744d0e30425959f4687475774b6c7edad77d24cb51c7d967d45159101610a7a565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4838361191d848383612cb4565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a25050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585611988848383612cb4565b868660405161199b959493929190613cab565b60405180910390a250505050565b6000546001600160a01b03163314611a0f5760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2061646d696e206044820152636f6e6c7960e01b60648201526084016109b7565b60065415611a785760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2063616e206f6e60448201526f6c7920696e697469617465206f6e636560801b60648201526084016109b7565b600860009054906101000a90046001600160a01b03166001600160a01b0316630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac857600080fd5b505af1158015611adc573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611b555760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744775617260448201526f6469616e3a2061646d696e206f6e6c7960801b60648201526084016109b7565b600d80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f80a07e73e552148844a9c216d9724212d609cfa54e9c1a2e97203bdd2c4ad3419101610a7a565b6000546001600160a01b03163314611c1c5760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a5f73657450656e64696e6741646d696e3a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b7565b600180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a7a565b6008546001600160a01b031615611ceb5760405162461bcd60e51b815260206004820152603360248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2063616e206f6044820152726e6c7920696e697469616c697a65206f6e636560681b60648201526084016109b7565b6000546001600160a01b03163314611d535760405162461bcd60e51b815260206004820152602560248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2061646d696e604482015264206f6e6c7960d81b60648201526084016109b7565b6001600160a01b038516611db35760405162461bcd60e51b81526020600482015260336024820152600080516020613f9783398151915260448201527269642074696d656c6f636b206164647265737360681b60648201526084016109b7565b6001600160a01b038416611e0e5760405162461bcd60e51b815260206004820152602e6024820152600080516020613f9783398151915260448201526d6964206d6f6f206164647265737360901b60648201526084016109b7565b6116808310158015611e23575062013b008311155b611e765760405162461bcd60e51b81526020600482015260306024820152600080516020613f9783398151915260448201526f1a59081d9bdd1a5b99c81c195c9a5bd960821b60648201526084016109b7565b60018210158015611e895750619d808211155b611edb5760405162461bcd60e51b815260206004820152602f6024820152600080516020613f9783398151915260448201526e696420766f74696e672064656c617960881b60648201526084016109b7565b683635c9adc5dea000008110158015611efe575069152d02c7e14af68000008111155b611f565760405162461bcd60e51b81526020600482015260356024820152600080516020613f978339815191526044820152741a59081c1c9bdc1bdcd85b081d1a1c995cda1bdb19605a1b60648201526084016109b7565b600880546001600160a01b039687166001600160a01b0319918216179091556009805495909616941693909317909355600455600391909155600555565b600554600954600091906001600160a01b031663782d6fe133611fb8436001612fee565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120259190613b74565b6001600160601b031611806120485750336000908152600c602052604090205442105b6120ba5760405162461bcd60e51b815260206004820152603f60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73657260448201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c640060648201526084016109b7565b845186511480156120cc575083518651145b80156120d9575082518651145b6121595760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73616c908201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6064820152630c2e8c6d60e31b608482015260a4016109b7565b85516000036121bf5760405162461bcd60e51b815260206004820152602c60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206d7573742070726f60448201526b7669646520616374696f6e7360a01b60648201526084016109b7565b600a865111156122225760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e7960448201526720616374696f6e7360c01b60648201526084016109b7565b336000908152600b602052604090205480156123a157600061224382611200565b90506001816007811115612259576122596135fc565b036122f25760405162461bcd60e51b815260206004820152605860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c7265616479206163746976652070726f706f73616c0000000000000000608482015260a4016109b7565b6000816007811115612306576123066135fc565b0361239f5760405162461bcd60e51b815260206004820152605960248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000608482015260a4016109b7565b505b60006123af43600354612f94565b905060006123bf82600454612f94565b6007805491925060006123d183613c92565b90915550506007546000818152600a6020526040902080541561244a5760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2050726f706f73616c60448201526a24a21031b7b63639b4b7b760a91b60648201526084016109b7565b8181556001810180546001600160a01b03191633179055600060028201558a5161247d90600383019060208e01906131f9565b50895161249390600483019060208d019061325e565b5088516124a990600583019060208c0190613299565b5087516124bf90600683019060208b01906132eb565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0181905550600081600c0160006101000a81548160ff021916908315150217905550600081600c0160016101000a81548160ff0219169083151502179055508060000154600b60008360010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f6040516125b299989796959493929190613cfb565b60405180910390a1549a9950505050505050505050565b60046125d482611200565b60078111156125e5576125e56135fc565b146126665760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a71756575653a2070726f706f73616c2063908201527f616e206f6e6c79206265207175657565642069662069742069732073756363656064820152631959195960e21b608482015260a4016109b7565b6000818152600a602090815260408083206008548251630d48571f60e31b815292519194936126c59342936001600160a01b0390931692636a42b8f8926004808401939192918290030181865afa158015611372573d6000803e3d6000fd5b905060005b600383015481101561288f5761287d8360030182815481106126ee576126ee613b9d565b6000918252602090912001546004850180546001600160a01b03909216918490811061271c5761271c613b9d565b906000526020600020015485600501848154811061273c5761273c613b9d565b90600052602060002001805461275190613b27565b80601f016020809104026020016040519081016040528092919081815260200182805461277d90613b27565b80156127ca5780601f1061279f576101008083540402835291602001916127ca565b820191906000526020600020905b8154815290600101906020018083116127ad57829003601f168201915b50505050508660060185815481106127e4576127e4613b9d565b9060005260206000200180546127f990613b27565b80601f016020809104026020016040519081016040528092919081815260200182805461282590613b27565b80156128725780601f1061284757610100808354040283529160200191612872565b820191906000526020600020905b81548152906001019060200180831161285557829003601f168201915b505050505086613042565b8061288781613c92565b9150506126ca565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1505050565b604080516060808201835260008083526020808401829052928401819052858152600a83528381206001600160a01b0386168252600d018352839020835191820184525460ff8082161515835261010082041692820192909252620100009091046001600160601b0316918101919091525b92915050565b6001546001600160a01b03163314801561296657503315155b6129c95760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e6f72427261766f3a5f61636365707441646d696e3a2070656e6460448201526d696e672061646d696e206f6e6c7960901b60648201526084016109b7565b60008054600180546001600160a01b038082166001600160a01b031980861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a7a565b6005612a8282611200565b6007811115612a9357612a936135fc565b14612b145760405162461bcd60e51b815260206004820152604560248201527f476f7665726e6f72427261766f3a3a657865637574653a2070726f706f73616c60448201527f2063616e206f6e6c7920626520657865637574656420696620697420697320716064820152641d595d595960da1b608482015260a4016109b7565b6000818152600a60205260408120600c8101805461ff001916610100179055905b6003820154811015612c83576008546004830180546001600160a01b0390921691630825f38f919084908110612b6d57612b6d613b9d565b9060005260206000200154846003018481548110612b8d57612b8d613b9d565b6000918252602090912001546004860180546001600160a01b039092169186908110612bbb57612bbb613b9d565b9060005260206000200154866005018681548110612bdb57612bdb613b9d565b90600052602060002001876006018781548110612bfa57612bfa613b9d565b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612c29959493929190613c30565b60006040518083038185885af1158015612c47573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612c709190810190613d93565b5080612c7b81613c92565b915050612b35565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610a7a565b60006001612cc184611200565b6007811115612cd257612cd26135fc565b14612d395760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015270081d9bdd1a5b99c81a5cc818db1bdcd959607a1b60648201526084016109b7565b60028260ff161115612da85760405162461bcd60e51b815260206004820152603260248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a60448201527120696e76616c696420766f7465207479706560701b60648201526084016109b7565b6000838152600a602090815260408083206001600160a01b0388168452600d8101909252909120805460ff1615612e3e5760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015273081d9bdd195c88185b1c9958591e481d9bdd195960621b60648201526084016109b7565b600954600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe191612e88918b916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015612ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec99190613b74565b90508460ff16600003612ef757612eed83600a0154826001600160601b0316612f94565b600a840155612f4b565b8460ff16600103612f2357612f198360090154826001600160601b0316612f94565b6009840155612f4b565b8460ff16600203612f4b57612f4583600b0154826001600160601b0316612f94565b600b8401555b81546001600160601b03821662010000026dffffffffffffffffffffffff00001960ff88166101000261ffff199093169290921760011791909116179091559150509392505050565b600080612fa18385613e0a565b905083811015612fe75760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b60448201526064016109b7565b9392505050565b6000828211156130385760405162461bcd60e51b81526020600482015260156024820152747375627472616374696f6e20756e646572666c6f7760581b60448201526064016109b7565b612fe78284613e1d565b6008546040516001600160a01b039091169063f2b06537906130709088908890889088908890602001613e30565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016130a491815260200190565b602060405180830381865afa1580156130c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e59190613e69565b156131765760405162461bcd60e51b815260206004820152605560248201527f476f7665726e6f72427261766f3a3a71756575654f72526576657274496e746560448201527f726e616c3a206964656e746963616c2070726f706f73616c20616374696f6e20606482015274616c7265616479207175657565642061742065746160581b608482015260a4016109b7565b600854604051633a66f90160e01b81526001600160a01b0390911690633a66f901906131ae9088908890889088908890600401613e30565b6020604051808303816000875af11580156131cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f19190613b5b565b505050505050565b82805482825590600052602060002090810192821561324e579160200282015b8281111561324e57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613219565b5061325a92915061333d565b5090565b82805482825590600052602060002090810192821561324e579160200282015b8281111561324e57825182559160200191906001019061327e565b8280548282559060005260206000209081019282156132df579160200282015b828111156132df57825182906132cf9082613ed6565b50916020019190600101906132b9565b5061325a929150613352565b828054828255906000526020600020908101928215613331579160200282015b8281111561333157825182906133219082613ed6565b509160200191906001019061330b565b5061325a92915061336f565b5b8082111561325a576000815560010161333e565b8082111561325a576000613366828261338c565b50600101613352565b8082111561325a576000613383828261338c565b5060010161336f565b50805461339890613b27565b6000825580601f106133a8575050565b601f0160209004906000526020600020908101906133c6919061333d565b50565b6000602082840312156133db57600080fd5b5035919050565b60005b838110156133fd5781810151838201526020016133e5565b50506000910152565b6000815180845261341e8160208601602086016133e2565b601f01601f19169290920160200192915050565b602081526000612fe76020830184613406565b80356001600160a01b038116811461345c57600080fd5b919050565b60006020828403121561347357600080fd5b612fe782613445565b600081518084526020808501945080840160005b838110156134b55781516001600160a01b031687529582019590820190600101613490565b509495945050505050565b600081518084526020808501945080840160005b838110156134b5578151875295820195908201906001016134d4565b600081518084526020808501808196508360051b8101915082860160005b85811015613538578284038952613526848351613406565b9885019893509084019060010161350e565b5091979650505050505050565b608081526000613558608083018761347c565b828103602084015261356a81876134c0565b9050828103604084015261357e81866134f0565b9050828103606084015261359281856134f0565b979650505050505050565b803560ff8116811461345c57600080fd5b600080600080600060a086880312156135c657600080fd5b853594506135d66020870161359d565b93506135e46040870161359d565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b602081016008831061363457634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561364d57600080fd5b61365683613445565b946020939093013593505050565b6000806040838503121561367757600080fd5b823591506136876020840161359d565b90509250929050565b600080600080606085870312156136a657600080fd5b843593506136b66020860161359d565b9250604085013567ffffffffffffffff808211156136d357600080fd5b818701915087601f8301126136e757600080fd5b8135818111156136f657600080fd5b88602082850101111561370857600080fd5b95989497505060200194505050565b600080600080600060a0868803121561372f57600080fd5b61373886613445565b945061374660208701613445565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137a3576137a3613764565b604052919050565b600067ffffffffffffffff8211156137c5576137c5613764565b5060051b60200190565b600082601f8301126137e057600080fd5b813560206137f56137f0836137ab565b61377a565b82815260059290921b8401810191818101908684111561381457600080fd5b8286015b848110156138365761382981613445565b8352918301918301613818565b509695505050505050565b600082601f83011261385257600080fd5b813560206138626137f0836137ab565b82815260059290921b8401810191818101908684111561388157600080fd5b8286015b848110156138365780358352918301918301613885565b600067ffffffffffffffff8211156138b6576138b6613764565b50601f01601f191660200190565b60006138d26137f08461389c565b90508281528383830111156138e657600080fd5b828260208301376000602084830101529392505050565b600082601f83011261390e57600080fd5b612fe7838335602085016138c4565b600082601f83011261392e57600080fd5b8135602061393e6137f0836137ab565b82815260059290921b8401810191818101908684111561395d57600080fd5b8286015b8481101561383657803567ffffffffffffffff8111156139815760008081fd5b61398f8986838b01016138fd565b845250918301918301613961565b600082601f8301126139ae57600080fd5b813560206139be6137f0836137ab565b82815260059290921b840181019181810190868411156139dd57600080fd5b8286015b8481101561383657803567ffffffffffffffff811115613a015760008081fd5b8701603f81018913613a135760008081fd5b613a248986830135604084016138c4565b8452509183019183016139e1565b600080600080600060a08688031215613a4a57600080fd5b853567ffffffffffffffff80821115613a6257600080fd5b613a6e89838a016137cf565b96506020880135915080821115613a8457600080fd5b613a9089838a01613841565b95506040880135915080821115613aa657600080fd5b613ab289838a0161391d565b94506060880135915080821115613ac857600080fd5b613ad489838a0161399d565b93506080880135915080821115613aea57600080fd5b50613af7888289016138fd565b9150509295509295909350565b60008060408385031215613b1757600080fd5b8235915061368760208401613445565b600181811c90821680613b3b57607f821691505b6020821081036113b357634e487b7160e01b600052602260045260246000fd5b600060208284031215613b6d57600080fd5b5051919050565b600060208284031215613b8657600080fd5b81516001600160601b0381168114612fe757600080fd5b634e487b7160e01b600052603260045260246000fd5b60008154613bc081613b27565b808552602060018381168015613bdd5760018114613bf757613c25565b60ff1985168884015283151560051b880183019550613c25565b866000528260002060005b85811015613c1d5781548a8201860152908301908401613c02565b890184019650505b505050505092915050565b60018060a01b038616815284602082015260a060408201526000613c5760a0830186613bb3565b8281036060840152613c698186613bb3565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201613ca457613ca4613c7c565b5060010190565b85815260ff851660208201526001600160601b038416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8981526001600160a01b038916602082015261012060408201819052600090613d268382018b61347c565b90508281036060840152613d3a818a6134c0565b90508281036080840152613d4e81896134f0565b905082810360a0840152613d6281886134f0565b90508560c08401528460e0840152828103610100840152613d838185613406565b9c9b505050505050505050505050565b600060208284031215613da557600080fd5b815167ffffffffffffffff811115613dbc57600080fd5b8201601f81018413613dcd57600080fd5b8051613ddb6137f08261389c565b818152856020838501011115613df057600080fd5b613e018260208301602086016133e2565b95945050505050565b8082018082111561294757612947613c7c565b8181038181111561294757612947613c7c565b60018060a01b038616815284602082015260a060408201526000613e5760a0830186613406565b8281036060840152613c698186613406565b600060208284031215613e7b57600080fd5b81518015158114612fe757600080fd5b601f821115613ed157600081815260208120601f850160051c81016020861015613eb25750805b601f850160051c820191505b818110156131f157828155600101613ebe565b505050565b815167ffffffffffffffff811115613ef057613ef0613764565b613f0481613efe8454613b27565b84613e8b565b602080601f831160018114613f395760008415613f215750858301515b600019600386901b1c1916600185901b1785556131f1565b600085815260208120601f198616915b82811015613f6857888601518255948401946001909101908401613f49565b5085821015613f865787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe476f7665726e6f72427261766f3a3a696e697469616c697a653a20696e76616ca26469706673582212200d081e809efd3c5fef3b7d37bee0c87fbbb497104764c6ad484f53861efaa49664736f6c63430008100033