Address Details
contract
proxy

0xB8d83E9571A7FB4668C6EAA6AA148069E16AFB30

Contract Name
MoolaGovernorBravoDelegate
Creator
0x007e71–f37016 at 0x095be8–acbae7
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
15236841
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
MoolaGovernorBravoDelegate




Optimization enabled
true
Compiler version
v0.8.17+commit.8df45f5f




Optimization runs
200
EVM Version
london




Verified at
2022-09-22T13:08:19.306664Z

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
  uint256 public constant MIN_PROPOSAL_THRESHOLD = 1000e18; // 1,000 MOO

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

  /// @notice The minimum setable voting period
  uint256 public constant MIN_VOTING_PERIOD = 200; // About 1000 seconds

  /// @notice The max setable voting period
  uint256 public constant MAX_VOTING_PERIOD = 120960; // About 1 weeks

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

  /// @notice The max setable voting delay
  uint256 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
  uint256 public constant quorumVotes = 4000000e18; // 400,000 = 4% of MOO

  /// @notice The maximum number of actions that can be included in a proposal
  uint256 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_,
    uint256 votingPeriod_,
    uint256 votingDelay_,
    uint256 proposalThreshold_
  ) public virtual {
    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,
    uint256[] memory values,
    string[] memory signatures,
    bytes[] memory calldatas,
    string memory description
  ) public returns (uint256) {
    //

    // 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"
    );

    uint256 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"
      );
    }

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

    proposalCount++;
    uint256 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(uint256 proposalId) external {
    require(
      state(proposalId) == ProposalState.Succeeded,
      "GovernorBravo::queue: proposal can only be queued if it is succeeded"
    );
    Proposal storage proposal = proposals[proposalId];
    uint256 eta = add256(block.timestamp, timelock.delay());
    for (uint256 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,
    uint256 value,
    string memory signature,
    bytes memory data,
    uint256 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(uint256 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 (uint256 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(uint256 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 (uint256 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(uint256 proposalId)
    external
    view
    returns (
      address[] memory targets,
      uint256[] 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(uint256 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(uint256 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(uint256 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(
    uint256 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(
    uint256 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,
    uint256 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(uint256 newVotingDelay) external {
    require(msg.sender == admin, "GovernorBravo::_setVotingDelay: admin only");
    require(
      newVotingDelay >= MIN_VOTING_DELAY && newVotingDelay <= MAX_VOTING_DELAY,
      "GovernorBravo::_setVotingDelay: invalid voting delay"
    );
    uint256 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(uint256 newVotingPeriod) external {
    require(msg.sender == admin, "GovernorBravo::_setVotingPeriod: admin only");
    require(
      newVotingPeriod >= MIN_VOTING_PERIOD &&
        newVotingPeriod <= MAX_VOTING_PERIOD,
      "GovernorBravo::_setVotingPeriod: invalid voting period"
    );
    uint256 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(uint256 newProposalThreshold) external {
    require(
      msg.sender == admin,
      "GovernorBravo::_setProposalThreshold: admin only"
    );
    require(
      newProposalThreshold >= MIN_PROPOSAL_THRESHOLD &&
        newProposalThreshold <= MAX_PROPOSAL_THRESHOLD,
      "GovernorBravo::_setProposalThreshold: invalid proposal threshold"
    );
    uint256 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, uint256 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 (uint256) {
    uint256 c = a + b;
    require(c >= a, "addition overflow");
    return c;
  }

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

  function getChainIdInternal() internal view returns (uint256) {
    uint256 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(
    uint256 id,
    address proposer,
    address[] targets,
    uint256[] values,
    string[] signatures,
    bytes[] calldatas,
    uint256 startBlock,
    uint256 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,
    uint256 proposalId,
    uint8 support,
    uint256 votes,
    string reason
  );

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

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

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

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

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

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

  /// @notice Emitted when proposal threshold is set
  event ProposalThresholdSet(
    uint256 oldProposalThreshold,
    uint256 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, uint256 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
  uint256 public votingDelay;

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

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

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

  /// @notice The total number of proposals
  uint256 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(uint256 => Proposal) public proposals;

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

  struct Proposal {
    /// @notice Unique id for looking up a proposal
    uint256 id;
    /// @notice Creator of the proposal
    address proposer;
    /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
    uint256 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
    uint256[] 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
    uint256 startBlock;
    /// @notice The block at which voting ends: votes must be cast prior to this block
    uint256 endBlock;
    /// @notice Current number of votes in favor of this proposal
    uint256 forVotes;
    /// @notice Current number of votes in opposition to this proposal
    uint256 againstVotes;
    /// @notice Current number of votes for abstaining for this proposal
    uint256 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 => uint256) public whitelistAccountExpirations;

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

interface TimelockInterface {
  function delay() external view returns (uint256);

  function GRACE_PERIOD() external view returns (uint256);

  function acceptAdmin() external;

  function queuedTransactions(bytes32 hash) external view returns (bool);

  function queueTransaction(
    address target,
    uint256 value,
    string calldata signature,
    bytes calldata data,
    uint256 eta
  ) external returns (bytes32);

  function cancelTransaction(
    address target,
    uint256 value,
    string calldata signature,
    bytes calldata data,
    uint256 eta
  ) external;

  function executeTransaction(
    address target,
    uint256 value,
    string calldata signature,
    bytes calldata data,
    uint256 eta
  ) external payable returns (bytes memory);
}

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

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

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

0x608060405234801561001057600080fd5b50613feb806100206000396000f3fe6080604052600436106102725760003560e01c806363cd99cb1161014f578063d13f90b4116100c1578063e23a9a521161007a578063e23a9a521461088a578063e48083fe146108da578063e9c714f2146108ef578063f851a44014610904578063fc4eee4214610924578063fe0d94c11461093a57600080fd5b8063d13f90b4146107c0578063d33219b4146107e0578063da35c66414610800578063da95691a14610816578063ddf0b00914610836578063deaaa7cc1461085657600080fd5b80639953336511610113578063995333651461071d578063a64e024a1461073d578063b112626314610754578063b58131b01461076a578063b71d1a0c14610780578063c5a8425d146107a057600080fd5b806363cd99cb14610696578063791f5d23146106b65780637b3c71d3146106d35780637bdbe4d0146106f3578063878f14821461070857600080fd5b806326782247116101e85780633bccf4fd116101ac5780633bccf4fd146105c95780633e4f49e6146105e957806340e58ee5146106165780634d6733d21461063657806356781388146106565780635c60da1b1461067657600080fd5b806326782247146104d6578063328dd9821461050e57806338bd0dda1461053e5780633932abb11461056b5780633af32abf1461058157600080fd5b806317ba1b8b1161023a57806317ba1b8b146104105780631dfb1b5a1461043057806320606b7014610450578063215809ca1461048457806324bc1a641461049957806325fd935a146104b857600080fd5b8063013cf08b1461027757806302a251a31461035057806306fdde03146103745780630ea2d98c146103c157806317977c61146103e3575b600080fd5b34801561028357600080fd5b506102f56102923660046133c8565b600a60208190526000918252604090912080546001820154600283015460078401546008850154600986015496860154600b870154600c9097015495976001600160a01b0390951696939592949193919290919060ff808216916101009004168a565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b34801561035c57600080fd5b5061036660045481565b604051908152602001610347565b34801561038057600080fd5b506103b4604051806040016040528060148152602001734d6f6f6c6120476f7665726e6f7220427261766f60601b81525081565b6040516103479190613431565b3480156103cd57600080fd5b506103e16103dc3660046133c8565b61094d565b005b3480156103ef57600080fd5b506103666103fe366004613460565b600b6020526000908152604090205481565b34801561041c57600080fd5b506103e161042b3660046133c8565b610a85565b34801561043c57600080fd5b506103e161044b3660046133c8565b610bcd565b34801561045c57600080fd5b506103667f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561049057600080fd5b5061036660c881565b3480156104a557600080fd5b506103666a034f086f3b33b68400000081565b3480156104c457600080fd5b5061036669152d02c7e14af680000081565b3480156104e257600080fd5b506001546104f6906001600160a01b031681565b6040516001600160a01b039091168152602001610347565b34801561051a57600080fd5b5061052e6105293660046133c8565b610cf4565b6040516103479493929190613544565b34801561054a57600080fd5b50610366610559366004613460565b600c6020526000908152604090205481565b34801561057757600080fd5b5061036660035481565b34801561058d57600080fd5b506105b961059c366004613460565b6001600160a01b03166000908152600c6020526040902054421090565b6040519015158152602001610347565b3480156105d557600080fd5b506103e16105e43660046135ad565b610f85565b3480156105f557600080fd5b506106096106043660046133c8565b6111ff565b6040516103479190613611565b34801561062257600080fd5b506103e16106313660046133c8565b6113b9565b34801561064257600080fd5b506103e1610651366004613639565b611808565b34801561066257600080fd5b506103e1610671366004613663565b6118ee565b34801561068257600080fd5b506002546104f6906001600160a01b031681565b3480156106a257600080fd5b506009546104f6906001600160a01b031681565b3480156106c257600080fd5b50610366683635c9adc5dea0000081565b3480156106df57600080fd5b506103e16106ee36600461368f565b611959565b3480156106ff57600080fd5b50610366600a81565b34801561071457600080fd5b506103e16119a9565b34801561072957600080fd5b506103e1610738366004613460565b611ae2565b34801561074957600080fd5b506103666201d88081565b34801561076057600080fd5b50610366619d8081565b34801561077657600080fd5b5061036660055481565b34801561078c57600080fd5b506103e161079b366004613460565b611baf565b3480156107ac57600080fd5b50600d546104f6906001600160a01b031681565b3480156107cc57600080fd5b506103e16107db366004613716565b611c76565b3480156107ec57600080fd5b506008546104f6906001600160a01b031681565b34801561080c57600080fd5b5061036660075481565b34801561082257600080fd5b50610366610831366004613a31565b611f93565b34801561084257600080fd5b506103e16108513660046133c8565b6125c8565b34801561086257600080fd5b506103667f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b34801561089657600080fd5b506108aa6108a5366004613b03565b6128d4565b6040805182511515815260208084015160ff1690820152918101516001600160601b031690820152606001610347565b3480156108e657600080fd5b50610366600181565b3480156108fb57600080fd5b506103e161294c565b34801561091057600080fd5b506000546104f6906001600160a01b031681565b34801561093057600080fd5b5061036660065481565b6103e16109483660046133c8565b612a76565b6000546001600160a01b031633146109c05760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a60448201526a2061646d696e206f6e6c7960a81b60648201526084015b60405180910390fd5b60c881101580156109d457506201d8808111155b610a3f5760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a604482015275081a5b9d985b1a59081d9bdd1a5b99c81c195c9a5bd960521b60648201526084016109b7565b600480549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000546001600160a01b03163314610af85760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201526f686f6c643a2061646d696e206f6e6c7960801b60648201526084016109b7565b683635c9adc5dea000008110158015610b1b575069152d02c7e14af68000008111155b610b8f576040805162461bcd60e51b81526020600482015260248101919091527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201527f686f6c643a20696e76616c69642070726f706f73616c207468726573686f6c6460648201526084016109b7565b600580549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101610a79565b6000546001600160a01b03163314610c3a5760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b7565b60018110158015610c4d5750619d808111155b610cb65760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a20604482015273696e76616c696420766f74696e672064656c617960601b60648201526084016109b7565b600380549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101610a79565b6060806060806000600a600087815260200190815260200160002090508060030181600401826005018360060183805480602002602001604051908101604052809291908181526020018280548015610d7657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d58575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610dc857602002820191906000526020600020905b815481526020019060010190808311610db4575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610e9c578382906000526020600020018054610e0f90613b26565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b90613b26565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b505050505081526020019060010190610df0565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610f6f578382906000526020600020018054610ee290613b26565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0e90613b26565b8015610f5b5780601f10610f3057610100808354040283529160200191610f5b565b820191906000526020600020905b815481529060010190602001808311610f3e57829003601f168201915b505050505081526020019060010190610ec3565b5050505090509450945094509450509193509193565b60408051808201825260148152734d6f6f6c6120476f7665726e6f7220427261766f60601b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f3120cbbfab38c57ca23a5a6a87898b8764fccd7065340837e0d25ef137dc55d381840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611109573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111845760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63617374566f746542795369673a20696e60448201526e76616c6964207369676e617475726560881b60648201526084016109b7565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a6111bc858e8e612cb3565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b60008160075410158015611214575060065482115b6112725760405162461bcd60e51b815260206004820152602960248201527f476f7665726e6f72427261766f3a3a73746174653a20696e76616c69642070726044820152681bdc1bdcd85b081a5960ba1b60648201526084016109b7565b6000828152600a60205260409020600c81015460ff16156112965750600292915050565b806007015443116112aa5750600092915050565b806008015443116112be5750600192915050565b80600a015481600901541115806112e357506a034f086f3b33b6840000008160090154105b156112f15750600392915050565b80600201546000036113065750600492915050565b600c810154610100900460ff16156113215750600792915050565b6002810154600854604080516360d143f160e11b8152905161139b93926001600160a01b03169163c1a287e29160048083019260209291908290030181865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113969190613b5a565b612f93565b42106113aa5750600692915050565b50600592915050565b50919050565b60076113c4826111ff565b60078111156113d5576113d56135fb565b036114415760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2063616e6e6f742063616044820152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b60648201526084016109b7565b6000818152600a6020526040902060018101546001600160a01b031633146116ac5760018101546001600160a01b03166000908152600c60205260409020544210156115a5576005546009546001838101546001600160a01b039283169263782d6fe1929116906114b3904390612fed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156114fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115209190613b73565b6001600160601b03161080156115405750600d546001600160a01b031633145b6115a05760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2077686974656c69737460448201526a32b210383937b837b9b2b960a91b60648201526084016109b7565b6116ac565b6005546009546001838101546001600160a01b039283169263782d6fe1929116906115d1904390612fed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163e9190613b73565b6001600160601b0316106116ac5760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2070726f706f7365722060448201526e18589bdd99481d1a1c995cda1bdb19608a1b60648201526084016109b7565b600c8101805460ff1916600117905560005b60038201548110156117d7576008546003830180546001600160a01b039092169163591fcdfe9190849081106116f6576116f6613b9c565b6000918252602090912001546004850180546001600160a01b03909216918590811061172457611724613b9c565b906000526020600020015485600501858154811061174457611744613b9c565b9060005260206000200186600601868154811061176357611763613b9c565b9060005260206000200187600201546040518663ffffffff1660e01b8152600401611792959493929190613c2f565b600060405180830381600087803b1580156117ac57600080fd5b505af11580156117c0573d6000803e3d6000fd5b5050505080806117cf90613c91565b9150506116be565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610a79565b6000546001600160a01b031633148061182b5750600d546001600160a01b031633145b61189d5760405162461bcd60e51b815260206004820152603960248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744163636f60448201527f756e7445787069726174696f6e3a2061646d696e206f6e6c790000000000000060648201526084016109b7565b6001600160a01b0382166000818152600c6020908152604091829020849055815192835282018390527f4e7b7545bc5744d0e30425959f4687475774b6c7edad77d24cb51c7d967d45159101610a79565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4838361191d848383612cb3565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a25050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585611988848383612cb3565b868660405161199b959493929190613caa565b60405180910390a250505050565b6000546001600160a01b03163314611a0f5760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2061646d696e206044820152636f6e6c7960e01b60648201526084016109b7565b60065415611a785760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2063616e206f6e60448201526f6c7920696e697469617465206f6e636560801b60648201526084016109b7565b600860009054906101000a90046001600160a01b03166001600160a01b0316630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac857600080fd5b505af1158015611adc573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611b555760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744775617260448201526f6469616e3a2061646d696e206f6e6c7960801b60648201526084016109b7565b600d80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f80a07e73e552148844a9c216d9724212d609cfa54e9c1a2e97203bdd2c4ad3419101610a79565b6000546001600160a01b03163314611c1c5760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a5f73657450656e64696e6741646d696e3a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b7565b600180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a79565b6008546001600160a01b031615611ceb5760405162461bcd60e51b815260206004820152603360248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2063616e206f6044820152726e6c7920696e697469616c697a65206f6e636560681b60648201526084016109b7565b6000546001600160a01b03163314611d535760405162461bcd60e51b815260206004820152602560248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2061646d696e604482015264206f6e6c7960d81b60648201526084016109b7565b6001600160a01b038516611db35760405162461bcd60e51b81526020600482015260336024820152600080516020613f9683398151915260448201527269642074696d656c6f636b206164647265737360681b60648201526084016109b7565b6001600160a01b038416611e0e5760405162461bcd60e51b815260206004820152602e6024820152600080516020613f9683398151915260448201526d6964206d6f6f206164647265737360901b60648201526084016109b7565b60c88310158015611e2257506201d8808311155b611e755760405162461bcd60e51b81526020600482015260306024820152600080516020613f9683398151915260448201526f1a59081d9bdd1a5b99c81c195c9a5bd960821b60648201526084016109b7565b60018210158015611e885750619d808211155b611eda5760405162461bcd60e51b815260206004820152602f6024820152600080516020613f9683398151915260448201526e696420766f74696e672064656c617960881b60648201526084016109b7565b683635c9adc5dea000008110158015611efd575069152d02c7e14af68000008111155b611f555760405162461bcd60e51b81526020600482015260356024820152600080516020613f968339815191526044820152741a59081c1c9bdc1bdcd85b081d1a1c995cda1bdb19605a1b60648201526084016109b7565b600880546001600160a01b039687166001600160a01b0319918216179091556009805495909616941693909317909355600455600391909155600555565b600554600954600091906001600160a01b031663782d6fe133611fb7436001612fed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120249190613b73565b6001600160601b031611806120475750336000908152600c602052604090205442105b6120b95760405162461bcd60e51b815260206004820152603f60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73657260448201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c640060648201526084016109b7565b845186511480156120cb575083518651145b80156120d8575082518651145b6121585760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73616c908201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6064820152630c2e8c6d60e31b608482015260a4016109b7565b85516000036121be5760405162461bcd60e51b815260206004820152602c60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206d7573742070726f60448201526b7669646520616374696f6e7360a01b60648201526084016109b7565b600a865111156122215760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e7960448201526720616374696f6e7360c01b60648201526084016109b7565b336000908152600b602052604090205480156123a0576000612242826111ff565b90506001816007811115612258576122586135fb565b036122f15760405162461bcd60e51b815260206004820152605860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c7265616479206163746976652070726f706f73616c0000000000000000608482015260a4016109b7565b6000816007811115612305576123056135fb565b0361239e5760405162461bcd60e51b815260206004820152605960248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000608482015260a4016109b7565b505b60006123ae43600354612f93565b905060006123be82600454612f93565b6007805491925060006123d083613c91565b90915550506007546000818152600a602052604090208054156124495760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2050726f706f73616c60448201526a24a21031b7b63639b4b7b760a91b60648201526084016109b7565b8181556001810180546001600160a01b03191633179055600060028201558a5161247c90600383019060208e01906131f8565b50895161249290600483019060208d019061325d565b5088516124a890600583019060208c0190613298565b5087516124be90600683019060208b01906132ea565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0181905550600081600c0160006101000a81548160ff021916908315150217905550600081600c0160016101000a81548160ff0219169083151502179055508060000154600b60008360010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f6040516125b199989796959493929190613cfa565b60405180910390a1549a9950505050505050505050565b60046125d3826111ff565b60078111156125e4576125e46135fb565b146126655760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a71756575653a2070726f706f73616c2063908201527f616e206f6e6c79206265207175657565642069662069742069732073756363656064820152631959195960e21b608482015260a4016109b7565b6000818152600a602090815260408083206008548251630d48571f60e31b815292519194936126c49342936001600160a01b0390931692636a42b8f8926004808401939192918290030181865afa158015611372573d6000803e3d6000fd5b905060005b600383015481101561288e5761287c8360030182815481106126ed576126ed613b9c565b6000918252602090912001546004850180546001600160a01b03909216918490811061271b5761271b613b9c565b906000526020600020015485600501848154811061273b5761273b613b9c565b90600052602060002001805461275090613b26565b80601f016020809104026020016040519081016040528092919081815260200182805461277c90613b26565b80156127c95780601f1061279e576101008083540402835291602001916127c9565b820191906000526020600020905b8154815290600101906020018083116127ac57829003601f168201915b50505050508660060185815481106127e3576127e3613b9c565b9060005260206000200180546127f890613b26565b80601f016020809104026020016040519081016040528092919081815260200182805461282490613b26565b80156128715780601f1061284657610100808354040283529160200191612871565b820191906000526020600020905b81548152906001019060200180831161285457829003601f168201915b505050505086613041565b8061288681613c91565b9150506126c9565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1505050565b604080516060808201835260008083526020808401829052928401819052858152600a83528381206001600160a01b0386168252600d018352839020835191820184525460ff8082161515835261010082041692820192909252620100009091046001600160601b0316918101919091525b92915050565b6001546001600160a01b03163314801561296557503315155b6129c85760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e6f72427261766f3a5f61636365707441646d696e3a2070656e6460448201526d696e672061646d696e206f6e6c7960901b60648201526084016109b7565b60008054600180546001600160a01b038082166001600160a01b031980861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a79565b6005612a81826111ff565b6007811115612a9257612a926135fb565b14612b135760405162461bcd60e51b815260206004820152604560248201527f476f7665726e6f72427261766f3a3a657865637574653a2070726f706f73616c60448201527f2063616e206f6e6c7920626520657865637574656420696620697420697320716064820152641d595d595960da1b608482015260a4016109b7565b6000818152600a60205260408120600c8101805461ff001916610100179055905b6003820154811015612c82576008546004830180546001600160a01b0390921691630825f38f919084908110612b6c57612b6c613b9c565b9060005260206000200154846003018481548110612b8c57612b8c613b9c565b6000918252602090912001546004860180546001600160a01b039092169186908110612bba57612bba613b9c565b9060005260206000200154866005018681548110612bda57612bda613b9c565b90600052602060002001876006018781548110612bf957612bf9613b9c565b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612c28959493929190613c2f565b60006040518083038185885af1158015612c46573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612c6f9190810190613d92565b5080612c7a81613c91565b915050612b34565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610a79565b60006001612cc0846111ff565b6007811115612cd157612cd16135fb565b14612d385760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015270081d9bdd1a5b99c81a5cc818db1bdcd959607a1b60648201526084016109b7565b60028260ff161115612da75760405162461bcd60e51b815260206004820152603260248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a60448201527120696e76616c696420766f7465207479706560701b60648201526084016109b7565b6000838152600a602090815260408083206001600160a01b0388168452600d8101909252909120805460ff1615612e3d5760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015273081d9bdd195c88185b1c9958591e481d9bdd195960621b60648201526084016109b7565b600954600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe191612e87918b916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015612ea4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec89190613b73565b90508460ff16600003612ef657612eec83600a0154826001600160601b0316612f93565b600a840155612f4a565b8460ff16600103612f2257612f188360090154826001600160601b0316612f93565b6009840155612f4a565b8460ff16600203612f4a57612f4483600b0154826001600160601b0316612f93565b600b8401555b81546001600160601b03821662010000026dffffffffffffffffffffffff00001960ff88166101000261ffff199093169290921760011791909116179091559150509392505050565b600080612fa08385613e09565b905083811015612fe65760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b60448201526064016109b7565b9392505050565b6000828211156130375760405162461bcd60e51b81526020600482015260156024820152747375627472616374696f6e20756e646572666c6f7760581b60448201526064016109b7565b612fe68284613e1c565b6008546040516001600160a01b039091169063f2b065379061306f9088908890889088908890602001613e2f565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016130a391815260200190565b602060405180830381865afa1580156130c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e49190613e68565b156131755760405162461bcd60e51b815260206004820152605560248201527f476f7665726e6f72427261766f3a3a71756575654f72526576657274496e746560448201527f726e616c3a206964656e746963616c2070726f706f73616c20616374696f6e20606482015274616c7265616479207175657565642061742065746160581b608482015260a4016109b7565b600854604051633a66f90160e01b81526001600160a01b0390911690633a66f901906131ad9088908890889088908890600401613e2f565b6020604051808303816000875af11580156131cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f09190613b5a565b505050505050565b82805482825590600052602060002090810192821561324d579160200282015b8281111561324d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613218565b5061325992915061333c565b5090565b82805482825590600052602060002090810192821561324d579160200282015b8281111561324d57825182559160200191906001019061327d565b8280548282559060005260206000209081019282156132de579160200282015b828111156132de57825182906132ce9082613ed5565b50916020019190600101906132b8565b50613259929150613351565b828054828255906000526020600020908101928215613330579160200282015b8281111561333057825182906133209082613ed5565b509160200191906001019061330a565b5061325992915061336e565b5b80821115613259576000815560010161333d565b80821115613259576000613365828261338b565b50600101613351565b80821115613259576000613382828261338b565b5060010161336e565b50805461339790613b26565b6000825580601f106133a7575050565b601f0160209004906000526020600020908101906133c5919061333c565b50565b6000602082840312156133da57600080fd5b5035919050565b60005b838110156133fc5781810151838201526020016133e4565b50506000910152565b6000815180845261341d8160208601602086016133e1565b601f01601f19169290920160200192915050565b602081526000612fe66020830184613405565b80356001600160a01b038116811461345b57600080fd5b919050565b60006020828403121561347257600080fd5b612fe682613444565b600081518084526020808501945080840160005b838110156134b45781516001600160a01b03168752958201959082019060010161348f565b509495945050505050565b600081518084526020808501945080840160005b838110156134b4578151875295820195908201906001016134d3565b600081518084526020808501808196508360051b8101915082860160005b85811015613537578284038952613525848351613405565b9885019893509084019060010161350d565b5091979650505050505050565b608081526000613557608083018761347b565b828103602084015261356981876134bf565b9050828103604084015261357d81866134ef565b9050828103606084015261359181856134ef565b979650505050505050565b803560ff8116811461345b57600080fd5b600080600080600060a086880312156135c557600080fd5b853594506135d56020870161359c565b93506135e36040870161359c565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b602081016008831061363357634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561364c57600080fd5b61365583613444565b946020939093013593505050565b6000806040838503121561367657600080fd5b823591506136866020840161359c565b90509250929050565b600080600080606085870312156136a557600080fd5b843593506136b56020860161359c565b9250604085013567ffffffffffffffff808211156136d257600080fd5b818701915087601f8301126136e657600080fd5b8135818111156136f557600080fd5b88602082850101111561370757600080fd5b95989497505060200194505050565b600080600080600060a0868803121561372e57600080fd5b61373786613444565b945061374560208701613444565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137a2576137a2613763565b604052919050565b600067ffffffffffffffff8211156137c4576137c4613763565b5060051b60200190565b600082601f8301126137df57600080fd5b813560206137f46137ef836137aa565b613779565b82815260059290921b8401810191818101908684111561381357600080fd5b8286015b848110156138355761382881613444565b8352918301918301613817565b509695505050505050565b600082601f83011261385157600080fd5b813560206138616137ef836137aa565b82815260059290921b8401810191818101908684111561388057600080fd5b8286015b848110156138355780358352918301918301613884565b600067ffffffffffffffff8211156138b5576138b5613763565b50601f01601f191660200190565b60006138d16137ef8461389b565b90508281528383830111156138e557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261390d57600080fd5b612fe6838335602085016138c3565b600082601f83011261392d57600080fd5b8135602061393d6137ef836137aa565b82815260059290921b8401810191818101908684111561395c57600080fd5b8286015b8481101561383557803567ffffffffffffffff8111156139805760008081fd5b61398e8986838b01016138fc565b845250918301918301613960565b600082601f8301126139ad57600080fd5b813560206139bd6137ef836137aa565b82815260059290921b840181019181810190868411156139dc57600080fd5b8286015b8481101561383557803567ffffffffffffffff811115613a005760008081fd5b8701603f81018913613a125760008081fd5b613a238986830135604084016138c3565b8452509183019183016139e0565b600080600080600060a08688031215613a4957600080fd5b853567ffffffffffffffff80821115613a6157600080fd5b613a6d89838a016137ce565b96506020880135915080821115613a8357600080fd5b613a8f89838a01613840565b95506040880135915080821115613aa557600080fd5b613ab189838a0161391c565b94506060880135915080821115613ac757600080fd5b613ad389838a0161399c565b93506080880135915080821115613ae957600080fd5b50613af6888289016138fc565b9150509295509295909350565b60008060408385031215613b1657600080fd5b8235915061368660208401613444565b600181811c90821680613b3a57607f821691505b6020821081036113b357634e487b7160e01b600052602260045260246000fd5b600060208284031215613b6c57600080fd5b5051919050565b600060208284031215613b8557600080fd5b81516001600160601b0381168114612fe657600080fd5b634e487b7160e01b600052603260045260246000fd5b60008154613bbf81613b26565b808552602060018381168015613bdc5760018114613bf657613c24565b60ff1985168884015283151560051b880183019550613c24565b866000528260002060005b85811015613c1c5781548a8201860152908301908401613c01565b890184019650505b505050505092915050565b60018060a01b038616815284602082015260a060408201526000613c5660a0830186613bb2565b8281036060840152613c688186613bb2565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201613ca357613ca3613c7b565b5060010190565b85815260ff851660208201526001600160601b038416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8981526001600160a01b038916602082015261012060408201819052600090613d258382018b61347b565b90508281036060840152613d39818a6134bf565b90508281036080840152613d4d81896134ef565b905082810360a0840152613d6181886134ef565b90508560c08401528460e0840152828103610100840152613d828185613405565b9c9b505050505050505050505050565b600060208284031215613da457600080fd5b815167ffffffffffffffff811115613dbb57600080fd5b8201601f81018413613dcc57600080fd5b8051613dda6137ef8261389b565b818152856020838501011115613def57600080fd5b613e008260208301602086016133e1565b95945050505050565b8082018082111561294657612946613c7b565b8181038181111561294657612946613c7b565b60018060a01b038616815284602082015260a060408201526000613e5660a0830186613405565b8281036060840152613c688186613405565b600060208284031215613e7a57600080fd5b81518015158114612fe657600080fd5b601f821115613ed057600081815260208120601f850160051c81016020861015613eb15750805b601f850160051c820191505b818110156131f057828155600101613ebd565b505050565b815167ffffffffffffffff811115613eef57613eef613763565b613f0381613efd8454613b26565b84613e8a565b602080601f831160018114613f385760008415613f205750858301515b600019600386901b1c1916600185901b1785556131f0565b600085815260208120601f198616915b82811015613f6757888601518255948401946001909101908401613f48565b5085821015613f855787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe476f7665726e6f72427261766f3a3a696e697469616c697a653a20696e76616ca26469706673582212204765a8166ab2629c127e7dd2c3ac8adb5caed8af874846ed1a4e469586f7cbc564736f6c63430008110033

Deployed ByteCode

0x6080604052600436106102725760003560e01c806363cd99cb1161014f578063d13f90b4116100c1578063e23a9a521161007a578063e23a9a521461088a578063e48083fe146108da578063e9c714f2146108ef578063f851a44014610904578063fc4eee4214610924578063fe0d94c11461093a57600080fd5b8063d13f90b4146107c0578063d33219b4146107e0578063da35c66414610800578063da95691a14610816578063ddf0b00914610836578063deaaa7cc1461085657600080fd5b80639953336511610113578063995333651461071d578063a64e024a1461073d578063b112626314610754578063b58131b01461076a578063b71d1a0c14610780578063c5a8425d146107a057600080fd5b806363cd99cb14610696578063791f5d23146106b65780637b3c71d3146106d35780637bdbe4d0146106f3578063878f14821461070857600080fd5b806326782247116101e85780633bccf4fd116101ac5780633bccf4fd146105c95780633e4f49e6146105e957806340e58ee5146106165780634d6733d21461063657806356781388146106565780635c60da1b1461067657600080fd5b806326782247146104d6578063328dd9821461050e57806338bd0dda1461053e5780633932abb11461056b5780633af32abf1461058157600080fd5b806317ba1b8b1161023a57806317ba1b8b146104105780631dfb1b5a1461043057806320606b7014610450578063215809ca1461048457806324bc1a641461049957806325fd935a146104b857600080fd5b8063013cf08b1461027757806302a251a31461035057806306fdde03146103745780630ea2d98c146103c157806317977c61146103e3575b600080fd5b34801561028357600080fd5b506102f56102923660046133c8565b600a60208190526000918252604090912080546001820154600283015460078401546008850154600986015496860154600b870154600c9097015495976001600160a01b0390951696939592949193919290919060ff808216916101009004168a565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b34801561035c57600080fd5b5061036660045481565b604051908152602001610347565b34801561038057600080fd5b506103b4604051806040016040528060148152602001734d6f6f6c6120476f7665726e6f7220427261766f60601b81525081565b6040516103479190613431565b3480156103cd57600080fd5b506103e16103dc3660046133c8565b61094d565b005b3480156103ef57600080fd5b506103666103fe366004613460565b600b6020526000908152604090205481565b34801561041c57600080fd5b506103e161042b3660046133c8565b610a85565b34801561043c57600080fd5b506103e161044b3660046133c8565b610bcd565b34801561045c57600080fd5b506103667f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561049057600080fd5b5061036660c881565b3480156104a557600080fd5b506103666a034f086f3b33b68400000081565b3480156104c457600080fd5b5061036669152d02c7e14af680000081565b3480156104e257600080fd5b506001546104f6906001600160a01b031681565b6040516001600160a01b039091168152602001610347565b34801561051a57600080fd5b5061052e6105293660046133c8565b610cf4565b6040516103479493929190613544565b34801561054a57600080fd5b50610366610559366004613460565b600c6020526000908152604090205481565b34801561057757600080fd5b5061036660035481565b34801561058d57600080fd5b506105b961059c366004613460565b6001600160a01b03166000908152600c6020526040902054421090565b6040519015158152602001610347565b3480156105d557600080fd5b506103e16105e43660046135ad565b610f85565b3480156105f557600080fd5b506106096106043660046133c8565b6111ff565b6040516103479190613611565b34801561062257600080fd5b506103e16106313660046133c8565b6113b9565b34801561064257600080fd5b506103e1610651366004613639565b611808565b34801561066257600080fd5b506103e1610671366004613663565b6118ee565b34801561068257600080fd5b506002546104f6906001600160a01b031681565b3480156106a257600080fd5b506009546104f6906001600160a01b031681565b3480156106c257600080fd5b50610366683635c9adc5dea0000081565b3480156106df57600080fd5b506103e16106ee36600461368f565b611959565b3480156106ff57600080fd5b50610366600a81565b34801561071457600080fd5b506103e16119a9565b34801561072957600080fd5b506103e1610738366004613460565b611ae2565b34801561074957600080fd5b506103666201d88081565b34801561076057600080fd5b50610366619d8081565b34801561077657600080fd5b5061036660055481565b34801561078c57600080fd5b506103e161079b366004613460565b611baf565b3480156107ac57600080fd5b50600d546104f6906001600160a01b031681565b3480156107cc57600080fd5b506103e16107db366004613716565b611c76565b3480156107ec57600080fd5b506008546104f6906001600160a01b031681565b34801561080c57600080fd5b5061036660075481565b34801561082257600080fd5b50610366610831366004613a31565b611f93565b34801561084257600080fd5b506103e16108513660046133c8565b6125c8565b34801561086257600080fd5b506103667f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b34801561089657600080fd5b506108aa6108a5366004613b03565b6128d4565b6040805182511515815260208084015160ff1690820152918101516001600160601b031690820152606001610347565b3480156108e657600080fd5b50610366600181565b3480156108fb57600080fd5b506103e161294c565b34801561091057600080fd5b506000546104f6906001600160a01b031681565b34801561093057600080fd5b5061036660065481565b6103e16109483660046133c8565b612a76565b6000546001600160a01b031633146109c05760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a60448201526a2061646d696e206f6e6c7960a81b60648201526084015b60405180910390fd5b60c881101580156109d457506201d8808111155b610a3f5760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a604482015275081a5b9d985b1a59081d9bdd1a5b99c81c195c9a5bd960521b60648201526084016109b7565b600480549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000546001600160a01b03163314610af85760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201526f686f6c643a2061646d696e206f6e6c7960801b60648201526084016109b7565b683635c9adc5dea000008110158015610b1b575069152d02c7e14af68000008111155b610b8f576040805162461bcd60e51b81526020600482015260248101919091527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201527f686f6c643a20696e76616c69642070726f706f73616c207468726573686f6c6460648201526084016109b7565b600580549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101610a79565b6000546001600160a01b03163314610c3a5760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b7565b60018110158015610c4d5750619d808111155b610cb65760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a20604482015273696e76616c696420766f74696e672064656c617960601b60648201526084016109b7565b600380549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101610a79565b6060806060806000600a600087815260200190815260200160002090508060030181600401826005018360060183805480602002602001604051908101604052809291908181526020018280548015610d7657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d58575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610dc857602002820191906000526020600020905b815481526020019060010190808311610db4575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610e9c578382906000526020600020018054610e0f90613b26565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3b90613b26565b8015610e885780601f10610e5d57610100808354040283529160200191610e88565b820191906000526020600020905b815481529060010190602001808311610e6b57829003601f168201915b505050505081526020019060010190610df0565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610f6f578382906000526020600020018054610ee290613b26565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0e90613b26565b8015610f5b5780601f10610f3057610100808354040283529160200191610f5b565b820191906000526020600020905b815481529060010190602001808311610f3e57829003601f168201915b505050505081526020019060010190610ec3565b5050505090509450945094509450509193509193565b60408051808201825260148152734d6f6f6c6120476f7665726e6f7220427261766f60601b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f3120cbbfab38c57ca23a5a6a87898b8764fccd7065340837e0d25ef137dc55d381840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611109573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111845760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63617374566f746542795369673a20696e60448201526e76616c6964207369676e617475726560881b60648201526084016109b7565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a6111bc858e8e612cb3565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b60008160075410158015611214575060065482115b6112725760405162461bcd60e51b815260206004820152602960248201527f476f7665726e6f72427261766f3a3a73746174653a20696e76616c69642070726044820152681bdc1bdcd85b081a5960ba1b60648201526084016109b7565b6000828152600a60205260409020600c81015460ff16156112965750600292915050565b806007015443116112aa5750600092915050565b806008015443116112be5750600192915050565b80600a015481600901541115806112e357506a034f086f3b33b6840000008160090154105b156112f15750600392915050565b80600201546000036113065750600492915050565b600c810154610100900460ff16156113215750600792915050565b6002810154600854604080516360d143f160e11b8152905161139b93926001600160a01b03169163c1a287e29160048083019260209291908290030181865afa158015611372573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113969190613b5a565b612f93565b42106113aa5750600692915050565b50600592915050565b50919050565b60076113c4826111ff565b60078111156113d5576113d56135fb565b036114415760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2063616e6e6f742063616044820152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b60648201526084016109b7565b6000818152600a6020526040902060018101546001600160a01b031633146116ac5760018101546001600160a01b03166000908152600c60205260409020544210156115a5576005546009546001838101546001600160a01b039283169263782d6fe1929116906114b3904390612fed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156114fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115209190613b73565b6001600160601b03161080156115405750600d546001600160a01b031633145b6115a05760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2077686974656c69737460448201526a32b210383937b837b9b2b960a91b60648201526084016109b7565b6116ac565b6005546009546001838101546001600160a01b039283169263782d6fe1929116906115d1904390612fed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa15801561161a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163e9190613b73565b6001600160601b0316106116ac5760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2070726f706f7365722060448201526e18589bdd99481d1a1c995cda1bdb19608a1b60648201526084016109b7565b600c8101805460ff1916600117905560005b60038201548110156117d7576008546003830180546001600160a01b039092169163591fcdfe9190849081106116f6576116f6613b9c565b6000918252602090912001546004850180546001600160a01b03909216918590811061172457611724613b9c565b906000526020600020015485600501858154811061174457611744613b9c565b9060005260206000200186600601868154811061176357611763613b9c565b9060005260206000200187600201546040518663ffffffff1660e01b8152600401611792959493929190613c2f565b600060405180830381600087803b1580156117ac57600080fd5b505af11580156117c0573d6000803e3d6000fd5b5050505080806117cf90613c91565b9150506116be565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610a79565b6000546001600160a01b031633148061182b5750600d546001600160a01b031633145b61189d5760405162461bcd60e51b815260206004820152603960248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744163636f60448201527f756e7445787069726174696f6e3a2061646d696e206f6e6c790000000000000060648201526084016109b7565b6001600160a01b0382166000818152600c6020908152604091829020849055815192835282018390527f4e7b7545bc5744d0e30425959f4687475774b6c7edad77d24cb51c7d967d45159101610a79565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4838361191d848383612cb3565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a25050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585611988848383612cb3565b868660405161199b959493929190613caa565b60405180910390a250505050565b6000546001600160a01b03163314611a0f5760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2061646d696e206044820152636f6e6c7960e01b60648201526084016109b7565b60065415611a785760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2063616e206f6e60448201526f6c7920696e697469617465206f6e636560801b60648201526084016109b7565b600860009054906101000a90046001600160a01b03166001600160a01b0316630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac857600080fd5b505af1158015611adc573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611b555760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744775617260448201526f6469616e3a2061646d696e206f6e6c7960801b60648201526084016109b7565b600d80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f80a07e73e552148844a9c216d9724212d609cfa54e9c1a2e97203bdd2c4ad3419101610a79565b6000546001600160a01b03163314611c1c5760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a5f73657450656e64696e6741646d696e3a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b7565b600180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a79565b6008546001600160a01b031615611ceb5760405162461bcd60e51b815260206004820152603360248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2063616e206f6044820152726e6c7920696e697469616c697a65206f6e636560681b60648201526084016109b7565b6000546001600160a01b03163314611d535760405162461bcd60e51b815260206004820152602560248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2061646d696e604482015264206f6e6c7960d81b60648201526084016109b7565b6001600160a01b038516611db35760405162461bcd60e51b81526020600482015260336024820152600080516020613f9683398151915260448201527269642074696d656c6f636b206164647265737360681b60648201526084016109b7565b6001600160a01b038416611e0e5760405162461bcd60e51b815260206004820152602e6024820152600080516020613f9683398151915260448201526d6964206d6f6f206164647265737360901b60648201526084016109b7565b60c88310158015611e2257506201d8808311155b611e755760405162461bcd60e51b81526020600482015260306024820152600080516020613f9683398151915260448201526f1a59081d9bdd1a5b99c81c195c9a5bd960821b60648201526084016109b7565b60018210158015611e885750619d808211155b611eda5760405162461bcd60e51b815260206004820152602f6024820152600080516020613f9683398151915260448201526e696420766f74696e672064656c617960881b60648201526084016109b7565b683635c9adc5dea000008110158015611efd575069152d02c7e14af68000008111155b611f555760405162461bcd60e51b81526020600482015260356024820152600080516020613f968339815191526044820152741a59081c1c9bdc1bdcd85b081d1a1c995cda1bdb19605a1b60648201526084016109b7565b600880546001600160a01b039687166001600160a01b0319918216179091556009805495909616941693909317909355600455600391909155600555565b600554600954600091906001600160a01b031663782d6fe133611fb7436001612fed565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120249190613b73565b6001600160601b031611806120475750336000908152600c602052604090205442105b6120b95760405162461bcd60e51b815260206004820152603f60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73657260448201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c640060648201526084016109b7565b845186511480156120cb575083518651145b80156120d8575082518651145b6121585760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73616c908201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6064820152630c2e8c6d60e31b608482015260a4016109b7565b85516000036121be5760405162461bcd60e51b815260206004820152602c60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206d7573742070726f60448201526b7669646520616374696f6e7360a01b60648201526084016109b7565b600a865111156122215760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e7960448201526720616374696f6e7360c01b60648201526084016109b7565b336000908152600b602052604090205480156123a0576000612242826111ff565b90506001816007811115612258576122586135fb565b036122f15760405162461bcd60e51b815260206004820152605860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c7265616479206163746976652070726f706f73616c0000000000000000608482015260a4016109b7565b6000816007811115612305576123056135fb565b0361239e5760405162461bcd60e51b815260206004820152605960248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000608482015260a4016109b7565b505b60006123ae43600354612f93565b905060006123be82600454612f93565b6007805491925060006123d083613c91565b90915550506007546000818152600a602052604090208054156124495760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2050726f706f73616c60448201526a24a21031b7b63639b4b7b760a91b60648201526084016109b7565b8181556001810180546001600160a01b03191633179055600060028201558a5161247c90600383019060208e01906131f8565b50895161249290600483019060208d019061325d565b5088516124a890600583019060208c0190613298565b5087516124be90600683019060208b01906132ea565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0181905550600081600c0160006101000a81548160ff021916908315150217905550600081600c0160016101000a81548160ff0219169083151502179055508060000154600b60008360010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f6040516125b199989796959493929190613cfa565b60405180910390a1549a9950505050505050505050565b60046125d3826111ff565b60078111156125e4576125e46135fb565b146126655760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a71756575653a2070726f706f73616c2063908201527f616e206f6e6c79206265207175657565642069662069742069732073756363656064820152631959195960e21b608482015260a4016109b7565b6000818152600a602090815260408083206008548251630d48571f60e31b815292519194936126c49342936001600160a01b0390931692636a42b8f8926004808401939192918290030181865afa158015611372573d6000803e3d6000fd5b905060005b600383015481101561288e5761287c8360030182815481106126ed576126ed613b9c565b6000918252602090912001546004850180546001600160a01b03909216918490811061271b5761271b613b9c565b906000526020600020015485600501848154811061273b5761273b613b9c565b90600052602060002001805461275090613b26565b80601f016020809104026020016040519081016040528092919081815260200182805461277c90613b26565b80156127c95780601f1061279e576101008083540402835291602001916127c9565b820191906000526020600020905b8154815290600101906020018083116127ac57829003601f168201915b50505050508660060185815481106127e3576127e3613b9c565b9060005260206000200180546127f890613b26565b80601f016020809104026020016040519081016040528092919081815260200182805461282490613b26565b80156128715780601f1061284657610100808354040283529160200191612871565b820191906000526020600020905b81548152906001019060200180831161285457829003601f168201915b505050505086613041565b8061288681613c91565b9150506126c9565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1505050565b604080516060808201835260008083526020808401829052928401819052858152600a83528381206001600160a01b0386168252600d018352839020835191820184525460ff8082161515835261010082041692820192909252620100009091046001600160601b0316918101919091525b92915050565b6001546001600160a01b03163314801561296557503315155b6129c85760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e6f72427261766f3a5f61636365707441646d696e3a2070656e6460448201526d696e672061646d696e206f6e6c7960901b60648201526084016109b7565b60008054600180546001600160a01b038082166001600160a01b031980861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a79565b6005612a81826111ff565b6007811115612a9257612a926135fb565b14612b135760405162461bcd60e51b815260206004820152604560248201527f476f7665726e6f72427261766f3a3a657865637574653a2070726f706f73616c60448201527f2063616e206f6e6c7920626520657865637574656420696620697420697320716064820152641d595d595960da1b608482015260a4016109b7565b6000818152600a60205260408120600c8101805461ff001916610100179055905b6003820154811015612c82576008546004830180546001600160a01b0390921691630825f38f919084908110612b6c57612b6c613b9c565b9060005260206000200154846003018481548110612b8c57612b8c613b9c565b6000918252602090912001546004860180546001600160a01b039092169186908110612bba57612bba613b9c565b9060005260206000200154866005018681548110612bda57612bda613b9c565b90600052602060002001876006018781548110612bf957612bf9613b9c565b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612c28959493929190613c2f565b60006040518083038185885af1158015612c46573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612c6f9190810190613d92565b5080612c7a81613c91565b915050612b34565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610a79565b60006001612cc0846111ff565b6007811115612cd157612cd16135fb565b14612d385760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015270081d9bdd1a5b99c81a5cc818db1bdcd959607a1b60648201526084016109b7565b60028260ff161115612da75760405162461bcd60e51b815260206004820152603260248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a60448201527120696e76616c696420766f7465207479706560701b60648201526084016109b7565b6000838152600a602090815260408083206001600160a01b0388168452600d8101909252909120805460ff1615612e3d5760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015273081d9bdd195c88185b1c9958591e481d9bdd195960621b60648201526084016109b7565b600954600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe191612e87918b916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015612ea4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec89190613b73565b90508460ff16600003612ef657612eec83600a0154826001600160601b0316612f93565b600a840155612f4a565b8460ff16600103612f2257612f188360090154826001600160601b0316612f93565b6009840155612f4a565b8460ff16600203612f4a57612f4483600b0154826001600160601b0316612f93565b600b8401555b81546001600160601b03821662010000026dffffffffffffffffffffffff00001960ff88166101000261ffff199093169290921760011791909116179091559150509392505050565b600080612fa08385613e09565b905083811015612fe65760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b60448201526064016109b7565b9392505050565b6000828211156130375760405162461bcd60e51b81526020600482015260156024820152747375627472616374696f6e20756e646572666c6f7760581b60448201526064016109b7565b612fe68284613e1c565b6008546040516001600160a01b039091169063f2b065379061306f9088908890889088908890602001613e2f565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016130a391815260200190565b602060405180830381865afa1580156130c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e49190613e68565b156131755760405162461bcd60e51b815260206004820152605560248201527f476f7665726e6f72427261766f3a3a71756575654f72526576657274496e746560448201527f726e616c3a206964656e746963616c2070726f706f73616c20616374696f6e20606482015274616c7265616479207175657565642061742065746160581b608482015260a4016109b7565b600854604051633a66f90160e01b81526001600160a01b0390911690633a66f901906131ad9088908890889088908890600401613e2f565b6020604051808303816000875af11580156131cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131f09190613b5a565b505050505050565b82805482825590600052602060002090810192821561324d579160200282015b8281111561324d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613218565b5061325992915061333c565b5090565b82805482825590600052602060002090810192821561324d579160200282015b8281111561324d57825182559160200191906001019061327d565b8280548282559060005260206000209081019282156132de579160200282015b828111156132de57825182906132ce9082613ed5565b50916020019190600101906132b8565b50613259929150613351565b828054828255906000526020600020908101928215613330579160200282015b8281111561333057825182906133209082613ed5565b509160200191906001019061330a565b5061325992915061336e565b5b80821115613259576000815560010161333d565b80821115613259576000613365828261338b565b50600101613351565b80821115613259576000613382828261338b565b5060010161336e565b50805461339790613b26565b6000825580601f106133a7575050565b601f0160209004906000526020600020908101906133c5919061333c565b50565b6000602082840312156133da57600080fd5b5035919050565b60005b838110156133fc5781810151838201526020016133e4565b50506000910152565b6000815180845261341d8160208601602086016133e1565b601f01601f19169290920160200192915050565b602081526000612fe66020830184613405565b80356001600160a01b038116811461345b57600080fd5b919050565b60006020828403121561347257600080fd5b612fe682613444565b600081518084526020808501945080840160005b838110156134b45781516001600160a01b03168752958201959082019060010161348f565b509495945050505050565b600081518084526020808501945080840160005b838110156134b4578151875295820195908201906001016134d3565b600081518084526020808501808196508360051b8101915082860160005b85811015613537578284038952613525848351613405565b9885019893509084019060010161350d565b5091979650505050505050565b608081526000613557608083018761347b565b828103602084015261356981876134bf565b9050828103604084015261357d81866134ef565b9050828103606084015261359181856134ef565b979650505050505050565b803560ff8116811461345b57600080fd5b600080600080600060a086880312156135c557600080fd5b853594506135d56020870161359c565b93506135e36040870161359c565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b602081016008831061363357634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561364c57600080fd5b61365583613444565b946020939093013593505050565b6000806040838503121561367657600080fd5b823591506136866020840161359c565b90509250929050565b600080600080606085870312156136a557600080fd5b843593506136b56020860161359c565b9250604085013567ffffffffffffffff808211156136d257600080fd5b818701915087601f8301126136e657600080fd5b8135818111156136f557600080fd5b88602082850101111561370757600080fd5b95989497505060200194505050565b600080600080600060a0868803121561372e57600080fd5b61373786613444565b945061374560208701613444565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137a2576137a2613763565b604052919050565b600067ffffffffffffffff8211156137c4576137c4613763565b5060051b60200190565b600082601f8301126137df57600080fd5b813560206137f46137ef836137aa565b613779565b82815260059290921b8401810191818101908684111561381357600080fd5b8286015b848110156138355761382881613444565b8352918301918301613817565b509695505050505050565b600082601f83011261385157600080fd5b813560206138616137ef836137aa565b82815260059290921b8401810191818101908684111561388057600080fd5b8286015b848110156138355780358352918301918301613884565b600067ffffffffffffffff8211156138b5576138b5613763565b50601f01601f191660200190565b60006138d16137ef8461389b565b90508281528383830111156138e557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261390d57600080fd5b612fe6838335602085016138c3565b600082601f83011261392d57600080fd5b8135602061393d6137ef836137aa565b82815260059290921b8401810191818101908684111561395c57600080fd5b8286015b8481101561383557803567ffffffffffffffff8111156139805760008081fd5b61398e8986838b01016138fc565b845250918301918301613960565b600082601f8301126139ad57600080fd5b813560206139bd6137ef836137aa565b82815260059290921b840181019181810190868411156139dc57600080fd5b8286015b8481101561383557803567ffffffffffffffff811115613a005760008081fd5b8701603f81018913613a125760008081fd5b613a238986830135604084016138c3565b8452509183019183016139e0565b600080600080600060a08688031215613a4957600080fd5b853567ffffffffffffffff80821115613a6157600080fd5b613a6d89838a016137ce565b96506020880135915080821115613a8357600080fd5b613a8f89838a01613840565b95506040880135915080821115613aa557600080fd5b613ab189838a0161391c565b94506060880135915080821115613ac757600080fd5b613ad389838a0161399c565b93506080880135915080821115613ae957600080fd5b50613af6888289016138fc565b9150509295509295909350565b60008060408385031215613b1657600080fd5b8235915061368660208401613444565b600181811c90821680613b3a57607f821691505b6020821081036113b357634e487b7160e01b600052602260045260246000fd5b600060208284031215613b6c57600080fd5b5051919050565b600060208284031215613b8557600080fd5b81516001600160601b0381168114612fe657600080fd5b634e487b7160e01b600052603260045260246000fd5b60008154613bbf81613b26565b808552602060018381168015613bdc5760018114613bf657613c24565b60ff1985168884015283151560051b880183019550613c24565b866000528260002060005b85811015613c1c5781548a8201860152908301908401613c01565b890184019650505b505050505092915050565b60018060a01b038616815284602082015260a060408201526000613c5660a0830186613bb2565b8281036060840152613c688186613bb2565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201613ca357613ca3613c7b565b5060010190565b85815260ff851660208201526001600160601b038416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8981526001600160a01b038916602082015261012060408201819052600090613d258382018b61347b565b90508281036060840152613d39818a6134bf565b90508281036080840152613d4d81896134ef565b905082810360a0840152613d6181886134ef565b90508560c08401528460e0840152828103610100840152613d828185613405565b9c9b505050505050505050505050565b600060208284031215613da457600080fd5b815167ffffffffffffffff811115613dbb57600080fd5b8201601f81018413613dcc57600080fd5b8051613dda6137ef8261389b565b818152856020838501011115613def57600080fd5b613e008260208301602086016133e1565b95945050505050565b8082018082111561294657612946613c7b565b8181038181111561294657612946613c7b565b60018060a01b038616815284602082015260a060408201526000613e5660a0830186613405565b8281036060840152613c688186613405565b600060208284031215613e7a57600080fd5b81518015158114612fe657600080fd5b601f821115613ed057600081815260208120601f850160051c81016020861015613eb15750805b601f850160051c820191505b818110156131f057828155600101613ebd565b505050565b815167ffffffffffffffff811115613eef57613eef613763565b613f0381613efd8454613b26565b84613e8a565b602080601f831160018114613f385760008415613f205750858301515b600019600386901b1c1916600185901b1785556131f0565b600085815260208120601f198616915b82811015613f6757888601518255948401946001909101908401613f48565b5085821015613f855787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe476f7665726e6f72427261766f3a3a696e697469616c697a653a20696e76616ca26469706673582212204765a8166ab2629c127e7dd2c3ac8adb5caed8af874846ed1a4e469586f7cbc564736f6c63430008110033