false
true
0

Contract Address Details

0x13c674c7F56232592c19e5fBBa345b8D3A9DC99f

Contract Name
GovernorPACT
Creator
0x780dce–74a2f0 at 0xb0e353–fbff64
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
26349481
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
GovernorPACT




Optimization enabled
true
Compiler version
v0.6.12+commit.27d51765




Optimization runs
200
EVM Version
istanbul




Verified at
2026-04-22T10:13:08.844389Z

Constructor Arguments

00000000000000000000000066e7ce35578a37209d01f99f3d2ff271f981f581000000000000000000000000000000000000000000000000000000000000000f

Arg [0] (address) : 0x66e7ce35578a37209d01f99f3d2ff271f981f581
Arg [1] (uint256) : 15

              

/app/contracts/GovernorPACT.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

import "./vendors/contracts/AbstractGovernor.sol";
import "./vendors/contracts/access/GovernanceOwnable.sol";
import "./vendors/libraries/SafeMath.sol";

contract GovernorPACT is AbstractGovernor, GovernanceOwnable {
    enum VotingSettingsKeys {
        DefaultPropose,
        FastPropose,
        MultiExecutable
    }

    // etherium - block_generation_frequency_ ~ 15s
    // binance smart chain - block_generation_frequency_ ~ 4s
    constructor(
        address pact_,
        uint256 block_generation_frequency_
    ) AbstractGovernor("Governor PACT", pact_) GovernanceOwnable(address(this)) public {
        _addAllowedTarget(address(this));
        _addAllowedTarget(pact_);

        _setVotingSettings(
            uint(VotingSettingsKeys.DefaultPropose), // votingSettingsId
            SafeMath.div(3 days, block_generation_frequency_),// votingPeriod
            SafeMath.div(15 days, block_generation_frequency_),// expirationPeriod
            10,// proposalMaxOperations
            25,// quorumVotesDelimiter 4% of total PACTs
            100// proposalThresholdDelimiter 1% of total PACTs
        );
        _setVotingSettings(
            uint(VotingSettingsKeys.FastPropose), // votingSettingsId
            SafeMath.div(1 hours, block_generation_frequency_),// votingPeriod
            SafeMath.div(2 hours, block_generation_frequency_),// expirationPeriod
            40,// proposalMaxOperations
            5,// quorumVotesDelimiter 20% of total PACTs
            20// proposalThresholdDelimiter 5% of total PACTs
        );
        _setVotingSettings(
            uint(VotingSettingsKeys.MultiExecutable), // votingSettingsId
            SafeMath.div(1 hours, block_generation_frequency_),// votingPeriod
            SafeMath.div(365 days, block_generation_frequency_),// expirationPeriod
            2,// proposalMaxOperations
            5,// quorumVotesDelimiter 20% of total PACTs
            20// proposalThresholdDelimiter 5% of total PACTs
        );
    }

    function createDefaultPropose(
        address[] memory targets,
        uint[] memory values,
        string[] memory signatures,
        bytes[] memory calldatas,
        string memory description
    ) public returns (uint) {
        for (uint i = 0; i < targets.length; i++) {
            require(allowedTargets[targets[i]], "GovernorPACT::createFastPropose: targets - supports only allowedTargets");
        }
        return _propose(
            uint(VotingSettingsKeys.DefaultPropose),
            targets,
            values,
            signatures,
            calldatas,
            description,
            false
        );
    }

    function createFastPropose(
        address[] memory targets,
        uint[] memory values,
        string[] memory signatures,
        bytes[] memory calldatas,
        string memory description
    ) public returns (uint) {
        for (uint i = 0; i < targets.length; i++) {
            require(allowedTargets[targets[i]], "GovernorPACT::createFastPropose: targets - supports only allowedTargets");
        }
        return _propose(
            uint(VotingSettingsKeys.FastPropose),
            targets,
            values,
            signatures,
            calldatas,
            description,
            false
        );
    }

    function createMultiExecutablePropose(
        address[] memory targets,
        uint[] memory values,
        string[] memory signatures,
        bytes[] memory calldatas,
        string memory description
    ) public returns (uint) {
        for (uint i = 0; i < targets.length; i++) {
            require(allowedTargets[targets[i]], "GovernorPACT::createMultiExecutablePropose: targets - supports only allowedTargets");
        }
        return _propose(
            uint(VotingSettingsKeys.MultiExecutable),
            targets,
            values,
            signatures,
            calldatas,
            description,
            true
        );
    }

    address[] internal allowedTargetsList;
    mapping (address => bool) public allowedTargets;

    function addAllowedTarget(address target) public onlyGovernance {
        _addAllowedTarget(target);
    }
    function _addAllowedTarget(address target) internal {
        if (allowedTargets[target] == false) {
            allowedTargets[target] = true;
            allowedTargetsList.push(target);
        }
    }

    function getAllowedTargets() public view returns(address[] memory) {
        return allowedTargetsList;
    }

}
        

/IERC20WithMaxTotalSupply.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "./IERC20.sol";

interface IERC20WithMaxTotalSupply is IERC20 {
    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
    event Mint(address indexed account, uint tokens);
    event Burn(address indexed account, uint tokens);
    function maxTotalSupply() external view returns (uint);
}
          

/IGovernanceOwnable.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;


interface IGovernanceOwnable {
    event GovernanceSetTransferred(address indexed previousGovernance, address indexed newGovernance);

    function governance() external view returns (address);
    function setGovernance(address newGovernance) external;
}
          

/IERC20.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

interface IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);

    function balanceOf(address tokenOwner) external view returns (uint balance);
    function allowance(address tokenOwner, address spender) external view returns (uint remaining);
    function approve(address spender, uint tokens) external returns (bool success);
    function transfer(address to, uint tokens) external returns (bool success);
    function transferFrom(address from, address to, uint tokens) external returns (bool success);

    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}
          

/utils/Context.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

// Copied from OpenZeppelin code:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
          

/SafeMath.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return add(a, b, "SafeMath: Add Overflow");
    }
    function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, errorMessage);// "SafeMath: Add Overflow"

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: Underflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;// "SafeMath: Underflow"

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return mul(a, b, "SafeMath: Mul Overflow");
    }
    function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, errorMessage);// "SafeMath: Mul Overflow"

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: division by zero");
        uint256 c = a / b;

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}
          

/IDelegableERC20.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "./IDelegable.sol";
import "./IERC20WithMaxTotalSupply.sol";

interface IDelegableERC20 is IDelegable, IERC20WithMaxTotalSupply {}
          

/IDelegable.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

interface IDelegable {
    function delegate(address delegatee) external;
    function delegateBySig(address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s) external;
    function getCurrentVotes(address account) external view returns (uint256);
    function getPriorVotes(address account, uint blockNumber) external view returns (uint256);

    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);
}
          

/access/GovernanceOwnable.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;

import "../../interfaces/IGovernanceOwnable.sol";

abstract contract GovernanceOwnable is IGovernanceOwnable {
    address private _governanceAddress;

    event GovernanceSetTransferred(address indexed previousGovernance, address indexed newGovernance);

    constructor (address governance_) public {
        require(governance_ != address(0), "Governance address should be not null");
        _governanceAddress = governance_;
        emit GovernanceSetTransferred(address(0), governance_);
    }

    /**
     * @dev Returns the address of the current governanceAddress.
     */
    function governance() public view override returns (address) {
        return _governanceAddress;
    }

    /**
     * @dev Throws if called by any account other than the governanceAddress.
     */
    modifier onlyGovernance() {
        require(_governanceAddress == msg.sender, "Governance: caller is not the governance");
        _;
    }

    /**
     * @dev SetGovernance of the contract to a new account (`newGovernance`).
     * Can only be called by the current onlyGovernance.
     */
    function setGovernance(address newGovernance) public virtual override onlyGovernance {
        require(newGovernance != address(0), "GovernanceOwnable: new governance is the zero address");
        emit GovernanceSetTransferred(_governanceAddress, newGovernance);
        _governanceAddress = newGovernance;
    }

}
          

/AbstractGovernor.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

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

import "../libraries/SafeMath.sol";

// Copied and modified from Compound code:
// https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/GovernorAlpha.sol
abstract contract AbstractGovernor is Context {
    using SafeMath for uint256;

    string _name;
    IDelegableERC20 public _token;

    constructor(
        string memory name_,
        address token_
    ) public {
        _name = name_;
        _token = IDelegableERC20(token_);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    /// @notice all VotingSettings
    mapping (uint => VotingSettings) public _votingSettings;

    /// @notice votingPeriod - The duration of voting on a proposal, in blocks
    /// @notice expirationPeriod - The duration of execution on a proposal after voting, in blocks
    /// @notice proposalMaxOperations - The maximum number of actions that can be included in a proposal
    /// @notice quorumVotesDelimiter - Number for calculate count of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed
    /// @notice proposalThresholdDelimiter - Number for calculate count of votes required in order for a voter to become a proposer
    struct VotingSettings {
        bool isValue;
        uint256 votingPeriod;
        uint256 expirationPeriod;
        uint256 proposalMaxOperations;
        uint256 quorumVotesDelimiter;
        uint256 proposalThresholdDelimiter;
    }

    /// @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
    function quorumVotes(uint256 votingSettingsId) public view returns (uint) {
        VotingSettings storage votingSettings = _votingSettings[votingSettingsId];
        require(votingSettings.isValue, "Governor::quorumVotes: incorrect votingSettingsId");
        return _token.totalSupply() / votingSettings.quorumVotesDelimiter;
    }

    /// @notice The number of votes required in order for a voter to become a proposer
    function proposalThreshold(uint256 votingSettingsId) public view returns (uint) {
        VotingSettings storage votingSettings = _votingSettings[votingSettingsId];
        require(votingSettings.isValue, "Governor::proposalThreshold: incorrect votingSettingsId");
        return _token.totalSupply() / votingSettings.proposalThresholdDelimiter;
    }

    /// @notice The delay before voting on a proposal may take place, once proposed
    function _setVotingSettings(
        uint256 votingSettingsId,
        uint256 votingPeriod,
        uint256 expirationPeriod,
        uint256 proposalMaxOperations,
        uint256 quorumVotesDelimiter,
        uint256 proposalThresholdDelimiter
    ) internal {
        VotingSettings storage votingSettings = _votingSettings[votingSettingsId];
        require(votingSettings.isValue == false, "Governor::setVotingSettings: incorrect votingSettingsId");

        require(votingPeriod > 0, "Governor::setVotingSettings: shoud be more then 0");
        require(expirationPeriod > 0, "Governor::setVotingSettings: shoud be more then 0");
        require(proposalMaxOperations > 0, "Governor::setVotingSettings: shoud be more then 0");
        require(quorumVotesDelimiter > 0, "Governor::setVotingSettings: shoud be more then 0");
        require(proposalThresholdDelimiter > 0, "Governor::setVotingSettings: shoud be more then 0");

        VotingSettings memory newVotingSettings = VotingSettings({
            isValue: true,
            votingPeriod: votingPeriod,
            expirationPeriod: expirationPeriod,
            proposalMaxOperations: proposalMaxOperations,
            quorumVotesDelimiter: quorumVotesDelimiter,
            proposalThresholdDelimiter: proposalThresholdDelimiter
        });

        _votingSettings[votingSettingsId] = newVotingSettings;
    }

    function getVotingSettings(uint256 votingSettingsId) public view returns (VotingSettings memory) {
        return _votingSettings[votingSettingsId];
    }

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

    /// @notice id -  Unique id for looking up a proposal
    /// @notice proposer -  Creator of the proposal
    /// @notice targets -  the ordered list of target addresses for calls to be made
    /// @notice values -  The ordered list of values (i.e. msg.value) to be passed to the calls to be made
    /// @notice signatures -  The ordered list of function signatures to be called
    /// @notice calldatas -  The ordered list of calldata to be passed to each call
    /// @notice startBlock -  The block at which voting begins: holders must delegate their votes prior to this block
    /// @notice endBlock -  The block at which voting ends: votes must be cast prior to this block
    /// @notice expiredBlock -  The block at which successful, but not executed transactions is expired
    /// @notice forVotes -  Current number of votes in favor of this proposal
    /// @notice againstVotes -  Current number of votes in opposition to this proposal
    /// @notice canceled -  Flag marking whether the proposal has been canceled
    /// @notice executed -  Flag marking whether the proposal has been executed
    /// @notice receipts -  Receipts of ballots for the entire set of voters
    struct Proposal {
        uint256 votingSettingsId;
        uint id;
        address proposer;
        address[] targets;
        uint[] values;
        string[] signatures;
        bytes[] calldatas;
        uint startBlock;
        uint endBlock;
        uint expiredBlock;
        uint forVotes;
        uint againstVotes;
        bool canceled;
        bool executed;
        mapping (address => Receipt) receipts;
        bool isMultiExecutable;
    }

    /// @notice Ballot receipt record for a voter
    /// @notice hasVoted - Whether or not a vote has been cast
    /// @notice support - Whether or not the voter supports the proposal
    /// @notice votes - The number of votes the voter had, which were cast
    struct Receipt {
        bool hasVoted;
        bool support;
        uint256 votes;
    }

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

    /// @notice The official record of all proposals ever proposed
    mapping (uint => Proposal) public _proposals;
    /// @notice The official records of all proposals executions
    mapping (uint => uint[]) public _proposalsExecutionBlocks;
    /// @notice The latest proposal for each proposer
    mapping (address => uint) public _latestProposalIds;

    /// @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,bool support)");

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

    /// @notice An event emitted when a vote has been cast on a proposal
    event VoteCast(address voter, uint proposalId, bool support, uint votes);

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

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

    /// @notice An event emitted when a some proposals transaction has been executed
    event ExecuteTransaction(address indexed target, uint value, string signature, bytes data);

    /// @notice The delay before voting on a proposal may take place, once proposed
    function _propose(
        uint256 votingSettingsId,
        address[] memory targets,
        uint[] memory values,
        string[] memory signatures,
        bytes[] memory calldatas,
        string memory description,
        bool isMultiExecutable
    ) internal returns (uint) {
        VotingSettings storage votingSettings = _votingSettings[votingSettingsId];
        require(votingSettings.isValue, "Governor::propose: incorrect votingSettingsId");

        require(
            _token.getPriorVotes(
                _msgSender(),
                block.number.sub(1, "Governor::propose: block.number - Underflow")
            ) > proposalThreshold(votingSettingsId),
            "Governor::propose: proposer votes below proposal threshold"
        );
        require(
            targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length,
            "Governor::propose: proposal function information arity mismatch"
        );
        require(
            targets.length != 0,
            "Governor::propose: must provide actions"
        );
        require(
            targets.length <= votingSettings.proposalMaxOperations,
            "Governor::propose: too many actions"
        );

        uint startBlock = block.number;
        uint endBlock = startBlock.add(votingSettings.votingPeriod, "Governor::propose: endBlock - Add Overflow");

        _proposalCount++;
        Proposal memory newProposal = Proposal({
            votingSettingsId: votingSettingsId,
            id: _proposalCount,
            proposer: _msgSender(),
            targets: targets,
            values: values,
            signatures: signatures,
            calldatas: calldatas,
            startBlock: startBlock,
            endBlock: endBlock,
            expiredBlock: endBlock.add(votingSettings.expirationPeriod, "Governor::propose: expiredBlock - Add Overflow"),
            //forVotes: _token.getPriorVotes(_msgSender(), 0),
            forVotes: 0,
            againstVotes: 0,
            canceled: false,
            executed: false,
            isMultiExecutable: isMultiExecutable
        });

        _proposals[newProposal.id] = newProposal;
        _latestProposalIds[newProposal.proposer] = newProposal.id;
        _castVote(newProposal.proposer, newProposal.id, true);

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

    function execute(uint proposalId) public payable {
        require(
            state(proposalId) == ProposalState.Succeeded,
            "Governor::execute: proposal can only be executed if it is Succeeded"
        );
        Proposal storage proposal = _proposals[proposalId];
        _proposalsExecutionBlocks[proposalId].push(block.number);
        if (!proposal.isMultiExecutable) {
            proposal.executed = true;
        }

        for (uint i = 0; i < proposal.targets.length; i++) {
            _executeTransaction(
                proposal.targets[i],
                proposal.values[i],
                proposal.signatures[i],
                proposal.calldatas[i]
            );
        }
        emit ProposalExecuted(proposalId);
    }

    function _executeTransaction(
        address target,
        uint value,
        string memory signature,
        bytes memory data
    ) internal returns (
        bytes memory
    ) {
        bytes memory callData;
        if (bytes(signature).length == 0) {
            callData = data;
        } else {
            callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
        }

        // solium-disable-next-line security/no-call-value
        (bool success, bytes memory returnData) = target.call{value: value}(callData);
        require(success, "Governor::_executeTransaction: Transaction execution reverted.");

        emit ExecuteTransaction(target, value, signature, data);

        return returnData;
    }

    function cancel(uint proposalId) public {
        ProposalState state = state(proposalId);
        require(state != ProposalState.Executed, "Governor::cancel: cannot cancel executed proposal");

        Proposal storage proposal = _proposals[proposalId];

        require(
            _token.getPriorVotes(
                proposal.proposer,
                block.number.sub(1, "Governor::cancel: block.number - Underflow")
            ) < proposalThreshold(proposal.votingSettingsId),
            "Governor::cancel: proposer above threshold"
        );

        proposal.canceled = true;

        emit ProposalCanceled(proposalId);
    }

    function getActions(
        uint proposalId
    ) public view returns (
        address[] memory targets,
        uint[] memory values,
        string[] memory signatures,
        bytes[] memory calldatas
    ) {
        Proposal storage p = _proposals[proposalId];
        return (p.targets, p.values, p.signatures, p.calldatas);
    }

    function getReceipt(uint proposalId, address voter) public view returns (Receipt memory) {
        return _proposals[proposalId].receipts[voter];
    }

    function state(uint proposalId) public view returns (ProposalState) {
        require(
            _proposalCount >= proposalId && proposalId > 0,
            "Governor::state: invalid proposal id"
        );
        Proposal storage proposal = _proposals[proposalId];

        if (proposal.canceled) {
            return ProposalState.Canceled;
        } else if (proposal.executed) {
            return ProposalState.Executed;
        } else if (block.number <= proposal.endBlock) {
            return ProposalState.Active;
        } else if (proposal.forVotes <= proposal.againstVotes || proposal.forVotes < quorumVotes(proposal.votingSettingsId)) {
            return ProposalState.Defeated;
        } else if (block.number < proposal.expiredBlock) {
            return ProposalState.Succeeded;
        } else {
            return ProposalState.Expired;
        }
    }

    function castVote(uint proposalId, bool support) public {
        return _castVote(_msgSender(), proposalId, support);
    }

    function castVoteBySig(uint proposalId, bool support, uint8 v, bytes32 r, bytes32 s) public {
        bytes32 domainSeparator = keccak256(abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(_name)), getChainId(), 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), "Governor::castVoteBySig: invalid signature");
        return _castVote(signatory, proposalId, support);
    }

    function _castVote(address voter, uint proposalId, bool support) internal {
        require(state(proposalId) == ProposalState.Active, "Governor::_castVote: voting is closed");
        Proposal storage proposal = _proposals[proposalId];
        Receipt storage receipt = proposal.receipts[voter];
        require(receipt.hasVoted == false, "Governor::_castVote: voter already voted");
        uint256 votes = _token.getPriorVotes(voter, proposal.startBlock);

        if (support) {
            proposal.forVotes = proposal.forVotes.add(votes, "Governor::_castVote: votes - Add Overflow");
        } else {
            proposal.againstVotes = proposal.againstVotes.add(votes, "Governor::_castVote: votes - Add Overflow");
        }

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

        emit VoteCast(voter, proposalId, support, votes);
    }

    function getChainId() internal pure returns (uint) {
        uint chainId;
        assembly { chainId := chainid() }
        return chainId;
    }
}
          

Compiler Settings

{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"/app/contracts/GovernorPACT.sol":"GovernorPACT"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"pact_","internalType":"address"},{"type":"uint256","name":"block_generation_frequency_","internalType":"uint256"}]},{"type":"event","name":"ExecuteTransaction","inputs":[{"type":"address","name":"target","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"signature","internalType":"string","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false}],"anonymous":false},{"type":"event","name":"GovernanceSetTransferred","inputs":[{"type":"address","name":"previousGovernance","internalType":"address","indexed":true},{"type":"address","name":"newGovernance","internalType":"address","indexed":true}],"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":"VoteCast","inputs":[{"type":"address","name":"voter","internalType":"address","indexed":false},{"type":"uint256","name":"proposalId","internalType":"uint256","indexed":false},{"type":"bool","name":"support","internalType":"bool","indexed":false},{"type":"uint256","name":"votes","internalType":"uint256","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":"_latestProposalIds","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_proposalCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"votingSettingsId","internalType":"uint256"},{"type":"uint256","name":"id","internalType":"uint256"},{"type":"address","name":"proposer","internalType":"address"},{"type":"uint256","name":"startBlock","internalType":"uint256"},{"type":"uint256","name":"endBlock","internalType":"uint256"},{"type":"uint256","name":"expiredBlock","internalType":"uint256"},{"type":"uint256","name":"forVotes","internalType":"uint256"},{"type":"uint256","name":"againstVotes","internalType":"uint256"},{"type":"bool","name":"canceled","internalType":"bool"},{"type":"bool","name":"executed","internalType":"bool"},{"type":"bool","name":"isMultiExecutable","internalType":"bool"}],"name":"_proposals","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_proposalsExecutionBlocks","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDelegableERC20"}],"name":"_token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"isValue","internalType":"bool"},{"type":"uint256","name":"votingPeriod","internalType":"uint256"},{"type":"uint256","name":"expirationPeriod","internalType":"uint256"},{"type":"uint256","name":"proposalMaxOperations","internalType":"uint256"},{"type":"uint256","name":"quorumVotesDelimiter","internalType":"uint256"},{"type":"uint256","name":"proposalThresholdDelimiter","internalType":"uint256"}],"name":"_votingSettings","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addAllowedTarget","inputs":[{"type":"address","name":"target","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowedTargets","inputs":[{"type":"address","name":"","internalType":"address"}]},{"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":"bool","name":"support","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVoteBySig","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"bool","name":"support","internalType":"bool"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"createDefaultPropose","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":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"createFastPropose","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":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"createMultiExecutablePropose","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":"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":"address[]","name":"","internalType":"address[]"}],"name":"getAllowedTargets","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct AbstractGovernor.Receipt","components":[{"type":"bool","name":"hasVoted","internalType":"bool"},{"type":"bool","name":"support","internalType":"bool"},{"type":"uint256","name":"votes","internalType":"uint256"}]}],"name":"getReceipt","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"address","name":"voter","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct AbstractGovernor.VotingSettings","components":[{"type":"bool","name":"isValue","internalType":"bool"},{"type":"uint256","name":"votingPeriod","internalType":"uint256"},{"type":"uint256","name":"expirationPeriod","internalType":"uint256"},{"type":"uint256","name":"proposalMaxOperations","internalType":"uint256"},{"type":"uint256","name":"quorumVotesDelimiter","internalType":"uint256"},{"type":"uint256","name":"proposalThresholdDelimiter","internalType":"uint256"}]}],"name":"getVotingSettings","inputs":[{"type":"uint256","name":"votingSettingsId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalThreshold","inputs":[{"type":"uint256","name":"votingSettingsId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"quorumVotes","inputs":[{"type":"uint256","name":"votingSettingsId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGovernance","inputs":[{"type":"address","name":"newGovernance","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum AbstractGovernor.ProposalState"}],"name":"state","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b50604051620037a2380380620037a28339810160408190526200003491620004ed565b60408051808201909152600d8082526c11dbdd995c9b9bdc88141050d5609a1b6020830190815230929185916200006f916000919062000419565b50600180546001600160a01b0319166001600160a01b03928316179055821615159050620000ba5760405162461bcd60e51b8152600401620000b1906200060c565b60405180910390fd5b600780546001600160a01b0319166001600160a01b0383169081179091556040516000907ff5b58f4b82655edcd8644d0e54fd6d2d37321f54f4755e4e67fd6af851c43fec908290a3506200010f30620001f2565b6200011a82620001f2565b6200016060006200013a6203f480846200027c60201b620014e41760201c565b620001546213c680856200027c60201b620014e41760201c565b600a60196064620002b3565b620001a460016200017f610e10846200027c60201b620014e41760201c565b62000198611c20856200027c60201b620014e41760201c565b602860056014620002b3565b620001ea6002620001c3610e10846200027c60201b620014e41760201c565b620001de6301e13380856200027c60201b620014e41760201c565b600260056014620002b3565b505062000651565b6001600160a01b03811660009081526009602052604090205460ff1662000279576001600160a01b0381166000818152600960205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b03191690911790555b50565b6000816200029e5760405162461bcd60e51b8152600401620000b19062000584565b6000828481620002aa57fe5b04949350505050565b6000868152600260205260409020805460ff1615620002e65760405162461bcd60e51b8152600401620000b19062000527565b60008611620003095760405162461bcd60e51b8152600401620000b190620005bb565b600085116200032c5760405162461bcd60e51b8152600401620000b190620005bb565b600084116200034f5760405162461bcd60e51b8152600401620000b190620005bb565b60008311620003725760405162461bcd60e51b8152600401620000b190620005bb565b60008211620003955760405162461bcd60e51b8152600401620000b190620005bb565b6200039f6200049e565b50506040805160c08101825260018082526020808301988952828401978852606083019687526080830195865260a083019485526000998a52600290819052929098209051815460ff1916901515178155955196860196909655925194840194909455516003830155915160048201559051600590910155565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200045c57805160ff19168380011785556200048c565b828001600101855582156200048c579182015b828111156200048c5782518255916020019190600101906200046f565b506200049a929150620004d6565b5090565b6040518060c0016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081525090565b5b808211156200049a5760008155600101620004d7565b6000806040838503121562000500578182fd5b82516001600160a01b038116811462000517578283fd5b6020939093015192949293505050565b60208082526037908201527f476f7665726e6f723a3a736574566f74696e6753657474696e67733a20696e6360408201527f6f727265637420766f74696e6753657474696e67734964000000000000000000606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526031908201527f476f7665726e6f723a3a736574566f74696e6753657474696e67733a2073686f60408201527007564206265206d6f7265207468656e203607c1b606082015260800190565b60208082526025908201527f476f7665726e616e636520616464726573732073686f756c64206265206e6f74604082015264081b9d5b1b60da1b606082015260800190565b61314180620006616000396000f3fe60806040526004361061019c5760003560e01c80635d7fe398116100ec578063ccf0e6d81161008a578063e2c4abe811610064578063e2c4abe8146104e9578063ecd0c0c31461050b578063edd7456914610520578063fe0d94c1146105405761019c565b8063ccf0e6d814610487578063deaaa7cc146104a7578063e23a9a52146104bc5761019c565b806381e94e8d116100c657806381e94e8d146103e8578063ab033ea914610408578063b638571814610428578063b8fe8d5f1461045a5761019c565b80635d7fe398146103935780636f2904cc146103b35780637629a4ac146103c85761019c565b8063328dd98211610159578063409ae08911610133578063409ae0891461030457806340e58ee5146103315780634634c61f146103515780635aa6e675146103715761019c565b8063328dd9821461028757806333834ca4146102b75780633e4f49e6146102d75761019c565b806306fdde03146101a15780630a494840146101cc5780630f7b1f081461020357806315373e3d14610230578063182562b31461025257806320606b7014610272575b600080fd5b3480156101ad57600080fd5b506101b6610553565b6040516101c3919061279e565b60405180910390f35b3480156101d857600080fd5b506101ec6101e7366004612367565b6105e9565b6040516101c39b9a99989796959493929190612f53565b34801561020f57600080fd5b5061022361021e366004612367565b610653565b6040516101c39190612727565b34801561023c57600080fd5b5061025061024b3660046123c3565b610727565b005b34801561025e57600080fd5b5061025061026d366004612279565b61073d565b34801561027e57600080fd5b50610223610773565b34801561029357600080fd5b506102a76102a2366004612367565b610797565b6040516101c3949392919061269a565b3480156102c357600080fd5b506102236102d236600461229b565b610a26565b3480156102e357600080fd5b506102f76102f2366004612367565b610aab565b6040516101c3919061278a565b34801561031057600080fd5b5061032461031f366004612367565b610b84565b6040516101c39190612e4a565b34801561033d57600080fd5b5061025061034c366004612367565b610be7565b34801561035d57600080fd5b5061025061036c3660046123f2565b610d54565b34801561037d57600080fd5b50610386610ece565b6040516101c39190612632565b34801561039f57600080fd5b506102236103ae36600461229b565b610edd565b3480156103bf57600080fd5b50610223610f50565b3480156103d457600080fd5b506102236103e3366004612367565b610f56565b3480156103f457600080fd5b50610223610403366004612448565b610fd8565b34801561041457600080fd5b50610250610423366004612279565b611006565b34801561043457600080fd5b50610448610443366004612367565b6110b2565b6040516101c3969594939291906126fd565b34801561046657600080fd5b5061047a610475366004612279565b6110ed565b6040516101c391906126f2565b34801561049357600080fd5b506102236104a236600461229b565b611102565b3480156104b357600080fd5b5061022361117c565b3480156104c857600080fd5b506104dc6104d7366004612397565b6111a0565b6040516101c39190612e25565b3480156104f557600080fd5b506104fe611204565b6040516101c39190612687565b34801561051757600080fd5b50610386611265565b34801561052c57600080fd5b5061022361053b366004612279565b611274565b61025061054e366004612367565b611286565b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105df5780601f106105b4576101008083540402835291602001916105df565b820191906000526020600020905b8154815290600101906020018083116105c257829003601f168201915b5050505050905090565b6004602052600090815260409020805460018201546002830154600784015460088501546009860154600a870154600b880154600c890154600e90990154979896976001600160a01b03909616969495939492939192909160ff808316926101009004811691168b565b6000818152600260205260408120805460ff1661068b5760405162461bcd60e51b815260040161068290612ce8565b60405180910390fd5b8060040154600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106de57600080fd5b505afa1580156106f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610716919061237f565b8161071d57fe5b049150505b919050565b610739610732611517565b838361151b565b5050565b6007546001600160a01b031633146107675760405162461bcd60e51b8152600401610682906129af565b610770816116ed565b50565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6060806060806000600460008781526020019081526020016000209050806003018160040182600501836006018380548060200260200160405190810160405280929190818152602001828054801561081957602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107fb575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561086b57602002820191906000526020600020905b815481526020019060010190808311610857575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561093e5760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b505050505081526020019060010190610893565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610a105760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156109fc5780601f106109d1576101008083540402835291602001916109fc565b820191906000526020600020905b8154815290600101906020018083116109df57829003601f168201915b505050505081526020019060010190610965565b5050505090509450945094509450509193509193565b6000805b8651811015610a8e5760096000888381518110610a4357fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16610a865760405162461bcd60e51b815260040161068290612b8c565b600101610a2a565b50610aa160015b87878787876000611773565b9695505050505050565b60008160035410158015610abf5750600082115b610adb5760405162461bcd60e51b815260040161068290612b48565b6000828152600460205260409020600c81015460ff1615610b00576001915050610722565b600c810154610100900460ff1615610b1c576005915050610722565b80600801544311610b31576000915050610722565b80600b015481600a0154111580610b5557508054610b4e90610653565b81600a0154105b15610b64576002915050610722565b8060090154431015610b7a576003915050610722565b6004915050610722565b610b8c611d1b565b50600090815260026020818152604092839020835160c081018552815460ff1615158152600182015492810192909252918201549281019290925260038101546060830152600481015460808301526005015460a082015290565b6000610bf282610aab565b90506005816005811115610c0257fe5b1415610c205760405162461bcd60e51b8152600401610682906128ae565b60008281526004602052604090208054610c3990610f56565b6001805460028401546040805160608101909152602a8082526001600160a01b039384169463782d6fe19490931692610c7e9290916130366020830139439190611baa565b6040518363ffffffff1660e01b8152600401610c9b929190612646565b60206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb919061237f565b10610d085760405162461bcd60e51b815260040161068290612c9e565b600c8101805460ff191660011790556040517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90610d47908590612727565b60405180910390a1505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666000604051610d8691906125a7565b6040518091039020610d96611bd6565b30604051602001610daa9493929190612730565b60405160208183030381529060405280519060200120905060007f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee8787604051602001610df993929190612754565b60405160208183030381529060405280519060200120905060008282604051602001610e26929190612617565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610e63949392919061276c565b6020604051602081039080840390855afa158015610e85573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610eb85760405162461bcd60e51b815260040161068290612ddb565b610ec3818a8a61151b565b505050505050505050565b6007546001600160a01b031690565b6000805b8651811015610f455760096000888381518110610efa57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16610f3d5760405162461bcd60e51b815260040161068290612b8c565b600101610ee1565b50610aa16000610a95565b60035481565b6000818152600260205260408120805460ff16610f855760405162461bcd60e51b815260040161068290612c41565b8060050154600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106de57600080fd5b60056020528160005260406000208181548110610ff157fe5b90600052602060002001600091509150505481565b6007546001600160a01b031633146110305760405162461bcd60e51b8152600401610682906129af565b6001600160a01b0381166110565760405162461bcd60e51b8152600401610682906129f7565b6007546040516001600160a01b038084169216907ff5b58f4b82655edcd8644d0e54fd6d2d37321f54f4755e4e67fd6af851c43fec90600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b600260208190526000918252604090912080546001820154928201546003830154600484015460059094015460ff9093169493919290919086565b60096020526000908152604090205460ff1681565b6000805b865181101561116a576009600088838151811061111f57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff166111625760405162461bcd60e51b815260040161068290612a4c565b600101611106565b50610aa1600287878787876001611773565b7f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee81565b6111a8611d53565b5060008281526004602090815260408083206001600160a01b0385168452600d018252918290208251606081018452815460ff808216151583526101009091041615159281019290925260010154918101919091525b92915050565b606060088054806020026020016040519081016040528092919081815260200182805480156105df57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161123e575050505050905090565b6001546001600160a01b031681565b60066020526000908152604090205481565b600361129182610aab565b600581111561129c57fe5b146112b95760405162461bcd60e51b8152600401610682906128ff565b60008181526004602090815260408083206005835290832080546001810182559084529190922043910155600e81015460ff1661130257600c8101805461ff0019166101001790555b60005b60038201548110156114a85761149f82600301828154811061132357fe5b6000918252602090912001546004840180546001600160a01b03909216918490811061134b57fe5b906000526020600020015484600501848154811061136557fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113f35780601f106113c8576101008083540402835291602001916113f3565b820191906000526020600020905b8154815290600101906020018083116113d657829003601f168201915b505050505085600601858154811061140757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156114955780601f1061146a57610100808354040283529160200191611495565b820191906000526020600020905b81548152906001019060200180831161147857829003601f168201915b5050505050611bda565b50600101611305565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516114d89190612727565b60405180910390a15050565b6000816115035760405162461bcd60e51b815260040161068290612b11565b600082848161150e57fe5b04949350505050565b3390565b600061152683610aab565b600581111561153157fe5b1461154e5760405162461bcd60e51b815260040161068290612d96565b60008281526004602090815260408083206001600160a01b0387168452600d8101909252909120805460ff16156115975760405162461bcd60e51b815260040161068290612bf9565b600154600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe1916115cd918a91600401612646565b60206040518083038186803b1580156115e557600080fd5b505afa1580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d919061237f565b905083156116585761164e816040518060600160405280602981526020016130e360299139600a8601549190611ceb565b600a840155611687565b611681816040518060600160405280602981526020016130e360299139600b8601549190611ceb565b600b8401555b8154600160ff19909116811761ff0019166101008615150217835582018190556040517f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c46906116dd90889088908890869061265f565b60405180910390a1505050505050565b6001600160a01b03811660009081526009602052604090205460ff16610770576001600160a01b03166000818152600960205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000878152600260205260408120805460ff166117a25760405162461bcd60e51b815260040161068290612ac4565b6117ab89610f56565b6001546001600160a01b031663782d6fe16117c4611517565b6117ea60016040518060600160405280602b81526020016130b8602b9139439190611baa565b6040518363ffffffff1660e01b8152600401611807929190612646565b60206040518083038186803b15801561181f57600080fd5b505afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611857919061237f565b116118745760405162461bcd60e51b8152600401610682906127b1565b86518851148015611886575085518851145b8015611893575084518851145b6118af5760405162461bcd60e51b81526004016106829061280e565b87516118cd5760405162461bcd60e51b815260040161068290612968565b8060030154885111156118f25760405162461bcd60e51b81526004016106829061286b565b6000439050600061192283600101546040518060600160405280602a8152602001613060602a9139849190611ceb565b6003805460010190559050611935611d73565b604051806101e001604052808d81526020016003548152602001611957611517565b6001600160a01b031681526020018c81526020018b81526020018a81526020018981526020018481526020018381526020016119b286600201546040518060600160405280602e815260200161308a602e9139869190611ceb565b81526000602080830182905260408084018390526060808501849052608085018490528b151560a09095019490945284820180518452600483529281902085518155925160018401558401516002830180546001600160a01b0319166001600160a01b0390921691909117905591830151805193945084939192611a3e92600385019290910190611df8565b5060808201518051611a5a916004840191602090910190611e5d565b5060a08201518051611a76916005840191602090910190611ea4565b5060c08201518051611a92916006840191602090910190611efd565b5060e082015160078201556101008083015160088301556101208301516009830155610140830151600a830155610160830151600b830155610180830151600c830180546101a0860151151590930261ff001992151560ff1994851617929092169190911790556101c090920151600e90910180549115159190921617905560208082018051604080850180516001600160a01b03166000908152600690955293205590519051611b459190600161151b565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160200151611b73611517565b8d8d8d8d89898f604051611b8f99989796959493929190612e90565b60405180910390a1602001519b9a5050505050505050505050565b60008184841115611bce5760405162461bcd60e51b8152600401610682919061279e565b505050900390565b4690565b606080835160001415611bee575081611c1a565b838051906020012083604051602001611c0892919061255a565b60405160208183030381529060405290505b60006060876001600160a01b03168784604051611c37919061258b565b60006040518083038185875af1925050503d8060008114611c74576040519150601f19603f3d011682016040523d82523d6000602084013e611c79565b606091505b509150915081611c9b5760405162461bcd60e51b815260040161068290612d39565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d0888888604051611cd893929190612f28565b60405180910390a2979650505050505050565b60008383018285821015611d125760405162461bcd60e51b8152600401610682919061279e565b50949350505050565b6040518060c0016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b604051806101e00160405280600081526020016000815260200160006001600160a01b031681526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581526020016000151581525090565b828054828255906000526020600020908101928215611e4d579160200282015b82811115611e4d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611e18565b50611e59929150611f56565b5090565b828054828255906000526020600020908101928215611e98579160200282015b82811115611e98578251825591602001919060010190611e7d565b50611e59929150611f75565b828054828255906000526020600020908101928215611ef1579160200282015b82811115611ef15782518051611ee1918491602090910190611f8a565b5091602001919060010190611ec4565b50611e59929150611ff7565b828054828255906000526020600020908101928215611f4a579160200282015b82811115611f4a5782518051611f3a918491602090910190611f8a565b5091602001919060010190611f1d565b50611e59929150612014565b5b80821115611e595780546001600160a01b0319168155600101611f57565b5b80821115611e595760008155600101611f76565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611fcb57805160ff1916838001178555611e98565b82800160010185558215611e985791820182811115611e98578251825591602001919060010190611e7d565b80821115611e5957600061200b8282612031565b50600101611ff7565b80821115611e595760006120288282612031565b50600101612014565b50805460018160011615610100020316600290046000825580601f106120575750610770565b601f0160209004906000526020600020908101906107709190611f75565b80356001600160a01b03811681146111fe57600080fd5b600082601f83011261209c578081fd5b81356120af6120aa82612fd7565b612fb0565b8181529150602080830190848101818402860182018710156120d057600080fd5b60005b848110156120f7576120e58883612075565b845292820192908201906001016120d3565b505050505092915050565b600082601f830112612112578081fd5b81356121206120aa82612fd7565b818152915060208083019084810160005b848110156120f757612148888484358a0101612210565b84529282019290820190600101612131565b600082601f83011261216a578081fd5b81356121786120aa82612fd7565b818152915060208083019084810160005b848110156120f7576121a0888484358a0101612210565b84529282019290820190600101612189565b600082601f8301126121c2578081fd5b81356121d06120aa82612fd7565b8181529150602080830190848101818402860182018710156121f157600080fd5b60005b848110156120f7578135845292820192908201906001016121f4565b600082601f830112612220578081fd5b813567ffffffffffffffff811115612236578182fd5b612249601f8201601f1916602001612fb0565b915080825283602082850101111561226057600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121561228a578081fd5b6122948383612075565b9392505050565b600080600080600060a086880312156122b2578081fd5b853567ffffffffffffffff808211156122c9578283fd5b6122d589838a0161208c565b965060208801359150808211156122ea578283fd5b6122f689838a016121b2565b9550604088013591508082111561230b578283fd5b61231789838a0161215a565b9450606088013591508082111561232c578283fd5b61233889838a01612102565b9350608088013591508082111561234d578283fd5b5061235a88828901612210565b9150509295509295909350565b600060208284031215612378578081fd5b5035919050565b600060208284031215612390578081fd5b5051919050565b600080604083850312156123a9578182fd5b823591506123ba8460208501612075565b90509250929050565b600080604083850312156123d5578182fd5b8235915060208301356123e781613027565b809150509250929050565b600080600080600060a08688031215612409578081fd5b85359450602086013561241b81613027565b9350604086013560ff81168114612430578182fd5b94979396509394606081013594506080013592915050565b6000806040838503121561245a578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156124a15781516001600160a01b03168752958201959082019060010161247c565b509495945050505050565b6000815180845260208085018081965082840281019150828601855b858110156124f25782840389526124e084835161252e565b988501989350908401906001016124c8565b5091979650505050505050565b6000815180845260208085019450808401835b838110156124a157815187529582019590820190600101612512565b60008151808452612546816020860160208601612ff7565b601f01601f19169290920160200192915050565b6001600160e01b031983168152815160009061257d816004850160208701612ff7565b919091016004019392505050565b6000825161259d818460208701612ff7565b9190910192915050565b60008083546001808216600081146125c657600181146125dd5761260c565b60ff198316865260028304607f168601935061260c565b600283048786526020808720875b838110156126045781548a8201529085019082016125eb565b505050860193505b509195945050505050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03949094168452602084019290925215156040830152606082015260800190565b6000602082526122946020830184612469565b6000608082526126ad6080830187612469565b82810360208401526126bf81876124ff565b905082810360408401526126d381866124ac565b905082810360608401526126e781856124ac565b979650505050505050565b901515815260200190565b9515158652602086019490945260408501929092526060840152608083015260a082015260c00190565b90815260200190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b92835260208301919091521515604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b602081016006831061279857fe5b91905290565b600060208252612294602083018461252e565b6020808252603a908201527f476f7665726e6f723a3a70726f706f73653a2070726f706f73657220766f746560408201527f732062656c6f772070726f706f73616c207468726573686f6c64000000000000606082015260800190565b6020808252603f908201527f476f7665726e6f723a3a70726f706f73653a2070726f706f73616c2066756e6360408201527f74696f6e20696e666f726d6174696f6e206172697479206d69736d6174636800606082015260800190565b60208082526023908201527f476f7665726e6f723a3a70726f706f73653a20746f6f206d616e7920616374696040820152626f6e7360e81b606082015260800190565b60208082526031908201527f476f7665726e6f723a3a63616e63656c3a2063616e6e6f742063616e63656c20604082015270195e1958dd5d1959081c1c9bdc1bdcd85b607a1b606082015260800190565b60208082526043908201527f476f7665726e6f723a3a657865637574653a2070726f706f73616c2063616e2060408201527f6f6e6c792062652065786563757465642069662069742069732053756363656560608201526219195960ea1b608082015260a00190565b60208082526027908201527f476f7665726e6f723a3a70726f706f73653a206d7573742070726f7669646520604082015266616374696f6e7360c81b606082015260800190565b60208082526028908201527f476f7665726e616e63653a2063616c6c6572206973206e6f742074686520676f6040820152677665726e616e636560c01b606082015260800190565b60208082526035908201527f476f7665726e616e63654f776e61626c653a206e657720676f7665726e616e636040820152746520697320746865207a65726f206164647265737360581b606082015260800190565b60208082526052908201527f476f7665726e6f72504143543a3a6372656174654d756c74694578656375746160408201527f626c6550726f706f73653a2074617267657473202d20737570706f727473206f6060820152716e6c7920616c6c6f7765645461726765747360701b608082015260a00190565b6020808252602d908201527f476f7665726e6f723a3a70726f706f73653a20696e636f727265637420766f7460408201526c1a5b99d4d95d1d1a5b99dcd259609a1b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526024908201527f476f7665726e6f723a3a73746174653a20696e76616c69642070726f706f73616040820152631b081a5960e21b606082015260800190565b60208082526047908201527f476f7665726e6f72504143543a3a6372656174654661737450726f706f73653a60408201527f2074617267657473202d20737570706f727473206f6e6c7920616c6c6f7765646060820152665461726765747360c81b608082015260a00190565b60208082526028908201527f476f7665726e6f723a3a5f63617374566f74653a20766f74657220616c726561604082015267191e481d9bdd195960c21b606082015260800190565b60208082526037908201527f476f7665726e6f723a3a70726f706f73616c5468726573686f6c643a20696e6360408201527f6f727265637420766f74696e6753657474696e67734964000000000000000000606082015260800190565b6020808252602a908201527f476f7665726e6f723a3a63616e63656c3a2070726f706f7365722061626f7665604082015269081d1a1c995cda1bdb1960b21b606082015260800190565b60208082526031908201527f476f7665726e6f723a3a71756f72756d566f7465733a20696e636f7272656374604082015270081d9bdd1a5b99d4d95d1d1a5b99dcd259607a1b606082015260800190565b6020808252603e908201527f476f7665726e6f723a3a5f657865637574655472616e73616374696f6e3a205460408201527f72616e73616374696f6e20657865637574696f6e2072657665727465642e0000606082015260800190565b60208082526025908201527f476f7665726e6f723a3a5f63617374566f74653a20766f74696e6720697320636040820152641b1bdcd95960da1b606082015260800190565b6020808252602a908201527f476f7665726e6f723a3a63617374566f746542795369673a20696e76616c6964604082015269207369676e617475726560b01b606082015260800190565b8151151581526020808301511515908201526040918201519181019190915260600190565b600060c0820190508251151582526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b8981526001600160a01b038916602082015261012060408201819052600090612ebb8382018b612469565b90508281036060840152612ecf818a6124ff565b90508281036080840152612ee381896124ac565b905082810360a0840152612ef781886124ac565b90508560c08401528460e0840152828103610100840152612f18818561252e565b9c9b505050505050505050505050565b600084825260606020830152612f41606083018561252e565b8281036040840152610aa1818561252e565b9a8b5260208b01999099526001600160a01b039790971660408a01526060890195909552608088019390935260a087019190915260c086015260e08501521515610100840152151561012083015215156101408201526101600190565b60405181810167ffffffffffffffff81118282101715612fcf57600080fd5b604052919050565b600067ffffffffffffffff821115612fed578081fd5b5060209081020190565b60005b83811015613012578181015183820152602001612ffa565b83811115613021576000848401525b50505050565b801515811461077057600080fdfe476f7665726e6f723a3a63616e63656c3a20626c6f636b2e6e756d626572202d20556e646572666c6f77476f7665726e6f723a3a70726f706f73653a20656e64426c6f636b202d20416464204f766572666c6f77476f7665726e6f723a3a70726f706f73653a2065787069726564426c6f636b202d20416464204f766572666c6f77476f7665726e6f723a3a70726f706f73653a20626c6f636b2e6e756d626572202d20556e646572666c6f77476f7665726e6f723a3a5f63617374566f74653a20766f746573202d20416464204f766572666c6f77a2646970667358221220acc23c35515c77cf1f8445679556dc50ae71bda89c95ffcf6f42c008b4dfc61264736f6c634300060c003300000000000000000000000066e7ce35578a37209d01f99f3d2ff271f981f581000000000000000000000000000000000000000000000000000000000000000f

Deployed ByteCode

0x60806040526004361061019c5760003560e01c80635d7fe398116100ec578063ccf0e6d81161008a578063e2c4abe811610064578063e2c4abe8146104e9578063ecd0c0c31461050b578063edd7456914610520578063fe0d94c1146105405761019c565b8063ccf0e6d814610487578063deaaa7cc146104a7578063e23a9a52146104bc5761019c565b806381e94e8d116100c657806381e94e8d146103e8578063ab033ea914610408578063b638571814610428578063b8fe8d5f1461045a5761019c565b80635d7fe398146103935780636f2904cc146103b35780637629a4ac146103c85761019c565b8063328dd98211610159578063409ae08911610133578063409ae0891461030457806340e58ee5146103315780634634c61f146103515780635aa6e675146103715761019c565b8063328dd9821461028757806333834ca4146102b75780633e4f49e6146102d75761019c565b806306fdde03146101a15780630a494840146101cc5780630f7b1f081461020357806315373e3d14610230578063182562b31461025257806320606b7014610272575b600080fd5b3480156101ad57600080fd5b506101b6610553565b6040516101c3919061279e565b60405180910390f35b3480156101d857600080fd5b506101ec6101e7366004612367565b6105e9565b6040516101c39b9a99989796959493929190612f53565b34801561020f57600080fd5b5061022361021e366004612367565b610653565b6040516101c39190612727565b34801561023c57600080fd5b5061025061024b3660046123c3565b610727565b005b34801561025e57600080fd5b5061025061026d366004612279565b61073d565b34801561027e57600080fd5b50610223610773565b34801561029357600080fd5b506102a76102a2366004612367565b610797565b6040516101c3949392919061269a565b3480156102c357600080fd5b506102236102d236600461229b565b610a26565b3480156102e357600080fd5b506102f76102f2366004612367565b610aab565b6040516101c3919061278a565b34801561031057600080fd5b5061032461031f366004612367565b610b84565b6040516101c39190612e4a565b34801561033d57600080fd5b5061025061034c366004612367565b610be7565b34801561035d57600080fd5b5061025061036c3660046123f2565b610d54565b34801561037d57600080fd5b50610386610ece565b6040516101c39190612632565b34801561039f57600080fd5b506102236103ae36600461229b565b610edd565b3480156103bf57600080fd5b50610223610f50565b3480156103d457600080fd5b506102236103e3366004612367565b610f56565b3480156103f457600080fd5b50610223610403366004612448565b610fd8565b34801561041457600080fd5b50610250610423366004612279565b611006565b34801561043457600080fd5b50610448610443366004612367565b6110b2565b6040516101c3969594939291906126fd565b34801561046657600080fd5b5061047a610475366004612279565b6110ed565b6040516101c391906126f2565b34801561049357600080fd5b506102236104a236600461229b565b611102565b3480156104b357600080fd5b5061022361117c565b3480156104c857600080fd5b506104dc6104d7366004612397565b6111a0565b6040516101c39190612e25565b3480156104f557600080fd5b506104fe611204565b6040516101c39190612687565b34801561051757600080fd5b50610386611265565b34801561052c57600080fd5b5061022361053b366004612279565b611274565b61025061054e366004612367565b611286565b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105df5780601f106105b4576101008083540402835291602001916105df565b820191906000526020600020905b8154815290600101906020018083116105c257829003601f168201915b5050505050905090565b6004602052600090815260409020805460018201546002830154600784015460088501546009860154600a870154600b880154600c890154600e90990154979896976001600160a01b03909616969495939492939192909160ff808316926101009004811691168b565b6000818152600260205260408120805460ff1661068b5760405162461bcd60e51b815260040161068290612ce8565b60405180910390fd5b8060040154600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106de57600080fd5b505afa1580156106f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610716919061237f565b8161071d57fe5b049150505b919050565b610739610732611517565b838361151b565b5050565b6007546001600160a01b031633146107675760405162461bcd60e51b8152600401610682906129af565b610770816116ed565b50565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6060806060806000600460008781526020019081526020016000209050806003018160040182600501836006018380548060200260200160405190810160405280929190818152602001828054801561081957602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107fb575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561086b57602002820191906000526020600020905b815481526020019060010190808311610857575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561093e5760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561092a5780601f106108ff5761010080835404028352916020019161092a565b820191906000526020600020905b81548152906001019060200180831161090d57829003601f168201915b505050505081526020019060010190610893565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610a105760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156109fc5780601f106109d1576101008083540402835291602001916109fc565b820191906000526020600020905b8154815290600101906020018083116109df57829003601f168201915b505050505081526020019060010190610965565b5050505090509450945094509450509193509193565b6000805b8651811015610a8e5760096000888381518110610a4357fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16610a865760405162461bcd60e51b815260040161068290612b8c565b600101610a2a565b50610aa160015b87878787876000611773565b9695505050505050565b60008160035410158015610abf5750600082115b610adb5760405162461bcd60e51b815260040161068290612b48565b6000828152600460205260409020600c81015460ff1615610b00576001915050610722565b600c810154610100900460ff1615610b1c576005915050610722565b80600801544311610b31576000915050610722565b80600b015481600a0154111580610b5557508054610b4e90610653565b81600a0154105b15610b64576002915050610722565b8060090154431015610b7a576003915050610722565b6004915050610722565b610b8c611d1b565b50600090815260026020818152604092839020835160c081018552815460ff1615158152600182015492810192909252918201549281019290925260038101546060830152600481015460808301526005015460a082015290565b6000610bf282610aab565b90506005816005811115610c0257fe5b1415610c205760405162461bcd60e51b8152600401610682906128ae565b60008281526004602052604090208054610c3990610f56565b6001805460028401546040805160608101909152602a8082526001600160a01b039384169463782d6fe19490931692610c7e9290916130366020830139439190611baa565b6040518363ffffffff1660e01b8152600401610c9b929190612646565b60206040518083038186803b158015610cb357600080fd5b505afa158015610cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ceb919061237f565b10610d085760405162461bcd60e51b815260040161068290612c9e565b600c8101805460ff191660011790556040517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90610d47908590612727565b60405180910390a1505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666000604051610d8691906125a7565b6040518091039020610d96611bd6565b30604051602001610daa9493929190612730565b60405160208183030381529060405280519060200120905060007f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee8787604051602001610df993929190612754565b60405160208183030381529060405280519060200120905060008282604051602001610e26929190612617565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610e63949392919061276c565b6020604051602081039080840390855afa158015610e85573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610eb85760405162461bcd60e51b815260040161068290612ddb565b610ec3818a8a61151b565b505050505050505050565b6007546001600160a01b031690565b6000805b8651811015610f455760096000888381518110610efa57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff16610f3d5760405162461bcd60e51b815260040161068290612b8c565b600101610ee1565b50610aa16000610a95565b60035481565b6000818152600260205260408120805460ff16610f855760405162461bcd60e51b815260040161068290612c41565b8060050154600160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156106de57600080fd5b60056020528160005260406000208181548110610ff157fe5b90600052602060002001600091509150505481565b6007546001600160a01b031633146110305760405162461bcd60e51b8152600401610682906129af565b6001600160a01b0381166110565760405162461bcd60e51b8152600401610682906129f7565b6007546040516001600160a01b038084169216907ff5b58f4b82655edcd8644d0e54fd6d2d37321f54f4755e4e67fd6af851c43fec90600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b600260208190526000918252604090912080546001820154928201546003830154600484015460059094015460ff9093169493919290919086565b60096020526000908152604090205460ff1681565b6000805b865181101561116a576009600088838151811061111f57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff166111625760405162461bcd60e51b815260040161068290612a4c565b600101611106565b50610aa1600287878787876001611773565b7f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee81565b6111a8611d53565b5060008281526004602090815260408083206001600160a01b0385168452600d018252918290208251606081018452815460ff808216151583526101009091041615159281019290925260010154918101919091525b92915050565b606060088054806020026020016040519081016040528092919081815260200182805480156105df57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161123e575050505050905090565b6001546001600160a01b031681565b60066020526000908152604090205481565b600361129182610aab565b600581111561129c57fe5b146112b95760405162461bcd60e51b8152600401610682906128ff565b60008181526004602090815260408083206005835290832080546001810182559084529190922043910155600e81015460ff1661130257600c8101805461ff0019166101001790555b60005b60038201548110156114a85761149f82600301828154811061132357fe5b6000918252602090912001546004840180546001600160a01b03909216918490811061134b57fe5b906000526020600020015484600501848154811061136557fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113f35780601f106113c8576101008083540402835291602001916113f3565b820191906000526020600020905b8154815290600101906020018083116113d657829003601f168201915b505050505085600601858154811061140757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156114955780601f1061146a57610100808354040283529160200191611495565b820191906000526020600020905b81548152906001019060200180831161147857829003601f168201915b5050505050611bda565b50600101611305565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516114d89190612727565b60405180910390a15050565b6000816115035760405162461bcd60e51b815260040161068290612b11565b600082848161150e57fe5b04949350505050565b3390565b600061152683610aab565b600581111561153157fe5b1461154e5760405162461bcd60e51b815260040161068290612d96565b60008281526004602090815260408083206001600160a01b0387168452600d8101909252909120805460ff16156115975760405162461bcd60e51b815260040161068290612bf9565b600154600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe1916115cd918a91600401612646565b60206040518083038186803b1580156115e557600080fd5b505afa1580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d919061237f565b905083156116585761164e816040518060600160405280602981526020016130e360299139600a8601549190611ceb565b600a840155611687565b611681816040518060600160405280602981526020016130e360299139600b8601549190611ceb565b600b8401555b8154600160ff19909116811761ff0019166101008615150217835582018190556040517f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c46906116dd90889088908890869061265f565b60405180910390a1505050505050565b6001600160a01b03811660009081526009602052604090205460ff16610770576001600160a01b03166000818152600960205260408120805460ff191660019081179091556008805491820181559091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319169091179055565b6000878152600260205260408120805460ff166117a25760405162461bcd60e51b815260040161068290612ac4565b6117ab89610f56565b6001546001600160a01b031663782d6fe16117c4611517565b6117ea60016040518060600160405280602b81526020016130b8602b9139439190611baa565b6040518363ffffffff1660e01b8152600401611807929190612646565b60206040518083038186803b15801561181f57600080fd5b505afa158015611833573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611857919061237f565b116118745760405162461bcd60e51b8152600401610682906127b1565b86518851148015611886575085518851145b8015611893575084518851145b6118af5760405162461bcd60e51b81526004016106829061280e565b87516118cd5760405162461bcd60e51b815260040161068290612968565b8060030154885111156118f25760405162461bcd60e51b81526004016106829061286b565b6000439050600061192283600101546040518060600160405280602a8152602001613060602a9139849190611ceb565b6003805460010190559050611935611d73565b604051806101e001604052808d81526020016003548152602001611957611517565b6001600160a01b031681526020018c81526020018b81526020018a81526020018981526020018481526020018381526020016119b286600201546040518060600160405280602e815260200161308a602e9139869190611ceb565b81526000602080830182905260408084018390526060808501849052608085018490528b151560a09095019490945284820180518452600483529281902085518155925160018401558401516002830180546001600160a01b0319166001600160a01b0390921691909117905591830151805193945084939192611a3e92600385019290910190611df8565b5060808201518051611a5a916004840191602090910190611e5d565b5060a08201518051611a76916005840191602090910190611ea4565b5060c08201518051611a92916006840191602090910190611efd565b5060e082015160078201556101008083015160088301556101208301516009830155610140830151600a830155610160830151600b830155610180830151600c830180546101a0860151151590930261ff001992151560ff1994851617929092169190911790556101c090920151600e90910180549115159190921617905560208082018051604080850180516001600160a01b03166000908152600690955293205590519051611b459190600161151b565b7f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160200151611b73611517565b8d8d8d8d89898f604051611b8f99989796959493929190612e90565b60405180910390a1602001519b9a5050505050505050505050565b60008184841115611bce5760405162461bcd60e51b8152600401610682919061279e565b505050900390565b4690565b606080835160001415611bee575081611c1a565b838051906020012083604051602001611c0892919061255a565b60405160208183030381529060405290505b60006060876001600160a01b03168784604051611c37919061258b565b60006040518083038185875af1925050503d8060008114611c74576040519150601f19603f3d011682016040523d82523d6000602084013e611c79565b606091505b509150915081611c9b5760405162461bcd60e51b815260040161068290612d39565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d0888888604051611cd893929190612f28565b60405180910390a2979650505050505050565b60008383018285821015611d125760405162461bcd60e51b8152600401610682919061279e565b50949350505050565b6040518060c0016040528060001515815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516060810182526000808252602082018190529181019190915290565b604051806101e00160405280600081526020016000815260200160006001600160a01b031681526020016060815260200160608152602001606081526020016060815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581526020016000151581525090565b828054828255906000526020600020908101928215611e4d579160200282015b82811115611e4d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611e18565b50611e59929150611f56565b5090565b828054828255906000526020600020908101928215611e98579160200282015b82811115611e98578251825591602001919060010190611e7d565b50611e59929150611f75565b828054828255906000526020600020908101928215611ef1579160200282015b82811115611ef15782518051611ee1918491602090910190611f8a565b5091602001919060010190611ec4565b50611e59929150611ff7565b828054828255906000526020600020908101928215611f4a579160200282015b82811115611f4a5782518051611f3a918491602090910190611f8a565b5091602001919060010190611f1d565b50611e59929150612014565b5b80821115611e595780546001600160a01b0319168155600101611f57565b5b80821115611e595760008155600101611f76565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611fcb57805160ff1916838001178555611e98565b82800160010185558215611e985791820182811115611e98578251825591602001919060010190611e7d565b80821115611e5957600061200b8282612031565b50600101611ff7565b80821115611e595760006120288282612031565b50600101612014565b50805460018160011615610100020316600290046000825580601f106120575750610770565b601f0160209004906000526020600020908101906107709190611f75565b80356001600160a01b03811681146111fe57600080fd5b600082601f83011261209c578081fd5b81356120af6120aa82612fd7565b612fb0565b8181529150602080830190848101818402860182018710156120d057600080fd5b60005b848110156120f7576120e58883612075565b845292820192908201906001016120d3565b505050505092915050565b600082601f830112612112578081fd5b81356121206120aa82612fd7565b818152915060208083019084810160005b848110156120f757612148888484358a0101612210565b84529282019290820190600101612131565b600082601f83011261216a578081fd5b81356121786120aa82612fd7565b818152915060208083019084810160005b848110156120f7576121a0888484358a0101612210565b84529282019290820190600101612189565b600082601f8301126121c2578081fd5b81356121d06120aa82612fd7565b8181529150602080830190848101818402860182018710156121f157600080fd5b60005b848110156120f7578135845292820192908201906001016121f4565b600082601f830112612220578081fd5b813567ffffffffffffffff811115612236578182fd5b612249601f8201601f1916602001612fb0565b915080825283602082850101111561226057600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121561228a578081fd5b6122948383612075565b9392505050565b600080600080600060a086880312156122b2578081fd5b853567ffffffffffffffff808211156122c9578283fd5b6122d589838a0161208c565b965060208801359150808211156122ea578283fd5b6122f689838a016121b2565b9550604088013591508082111561230b578283fd5b61231789838a0161215a565b9450606088013591508082111561232c578283fd5b61233889838a01612102565b9350608088013591508082111561234d578283fd5b5061235a88828901612210565b9150509295509295909350565b600060208284031215612378578081fd5b5035919050565b600060208284031215612390578081fd5b5051919050565b600080604083850312156123a9578182fd5b823591506123ba8460208501612075565b90509250929050565b600080604083850312156123d5578182fd5b8235915060208301356123e781613027565b809150509250929050565b600080600080600060a08688031215612409578081fd5b85359450602086013561241b81613027565b9350604086013560ff81168114612430578182fd5b94979396509394606081013594506080013592915050565b6000806040838503121561245a578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b838110156124a15781516001600160a01b03168752958201959082019060010161247c565b509495945050505050565b6000815180845260208085018081965082840281019150828601855b858110156124f25782840389526124e084835161252e565b988501989350908401906001016124c8565b5091979650505050505050565b6000815180845260208085019450808401835b838110156124a157815187529582019590820190600101612512565b60008151808452612546816020860160208601612ff7565b601f01601f19169290920160200192915050565b6001600160e01b031983168152815160009061257d816004850160208701612ff7565b919091016004019392505050565b6000825161259d818460208701612ff7565b9190910192915050565b60008083546001808216600081146125c657600181146125dd5761260c565b60ff198316865260028304607f168601935061260c565b600283048786526020808720875b838110156126045781548a8201529085019082016125eb565b505050860193505b509195945050505050565b61190160f01b81526002810192909252602282015260420190565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b03949094168452602084019290925215156040830152606082015260800190565b6000602082526122946020830184612469565b6000608082526126ad6080830187612469565b82810360208401526126bf81876124ff565b905082810360408401526126d381866124ac565b905082810360608401526126e781856124ac565b979650505050505050565b901515815260200190565b9515158652602086019490945260408501929092526060840152608083015260a082015260c00190565b90815260200190565b938452602084019290925260408301526001600160a01b0316606082015260800190565b92835260208301919091521515604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b602081016006831061279857fe5b91905290565b600060208252612294602083018461252e565b6020808252603a908201527f476f7665726e6f723a3a70726f706f73653a2070726f706f73657220766f746560408201527f732062656c6f772070726f706f73616c207468726573686f6c64000000000000606082015260800190565b6020808252603f908201527f476f7665726e6f723a3a70726f706f73653a2070726f706f73616c2066756e6360408201527f74696f6e20696e666f726d6174696f6e206172697479206d69736d6174636800606082015260800190565b60208082526023908201527f476f7665726e6f723a3a70726f706f73653a20746f6f206d616e7920616374696040820152626f6e7360e81b606082015260800190565b60208082526031908201527f476f7665726e6f723a3a63616e63656c3a2063616e6e6f742063616e63656c20604082015270195e1958dd5d1959081c1c9bdc1bdcd85b607a1b606082015260800190565b60208082526043908201527f476f7665726e6f723a3a657865637574653a2070726f706f73616c2063616e2060408201527f6f6e6c792062652065786563757465642069662069742069732053756363656560608201526219195960ea1b608082015260a00190565b60208082526027908201527f476f7665726e6f723a3a70726f706f73653a206d7573742070726f7669646520604082015266616374696f6e7360c81b606082015260800190565b60208082526028908201527f476f7665726e616e63653a2063616c6c6572206973206e6f742074686520676f6040820152677665726e616e636560c01b606082015260800190565b60208082526035908201527f476f7665726e616e63654f776e61626c653a206e657720676f7665726e616e636040820152746520697320746865207a65726f206164647265737360581b606082015260800190565b60208082526052908201527f476f7665726e6f72504143543a3a6372656174654d756c74694578656375746160408201527f626c6550726f706f73653a2074617267657473202d20737570706f727473206f6060820152716e6c7920616c6c6f7765645461726765747360701b608082015260a00190565b6020808252602d908201527f476f7665726e6f723a3a70726f706f73653a20696e636f727265637420766f7460408201526c1a5b99d4d95d1d1a5b99dcd259609a1b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526024908201527f476f7665726e6f723a3a73746174653a20696e76616c69642070726f706f73616040820152631b081a5960e21b606082015260800190565b60208082526047908201527f476f7665726e6f72504143543a3a6372656174654661737450726f706f73653a60408201527f2074617267657473202d20737570706f727473206f6e6c7920616c6c6f7765646060820152665461726765747360c81b608082015260a00190565b60208082526028908201527f476f7665726e6f723a3a5f63617374566f74653a20766f74657220616c726561604082015267191e481d9bdd195960c21b606082015260800190565b60208082526037908201527f476f7665726e6f723a3a70726f706f73616c5468726573686f6c643a20696e6360408201527f6f727265637420766f74696e6753657474696e67734964000000000000000000606082015260800190565b6020808252602a908201527f476f7665726e6f723a3a63616e63656c3a2070726f706f7365722061626f7665604082015269081d1a1c995cda1bdb1960b21b606082015260800190565b60208082526031908201527f476f7665726e6f723a3a71756f72756d566f7465733a20696e636f7272656374604082015270081d9bdd1a5b99d4d95d1d1a5b99dcd259607a1b606082015260800190565b6020808252603e908201527f476f7665726e6f723a3a5f657865637574655472616e73616374696f6e3a205460408201527f72616e73616374696f6e20657865637574696f6e2072657665727465642e0000606082015260800190565b60208082526025908201527f476f7665726e6f723a3a5f63617374566f74653a20766f74696e6720697320636040820152641b1bdcd95960da1b606082015260800190565b6020808252602a908201527f476f7665726e6f723a3a63617374566f746542795369673a20696e76616c6964604082015269207369676e617475726560b01b606082015260800190565b8151151581526020808301511515908201526040918201519181019190915260600190565b600060c0820190508251151582526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b8981526001600160a01b038916602082015261012060408201819052600090612ebb8382018b612469565b90508281036060840152612ecf818a6124ff565b90508281036080840152612ee381896124ac565b905082810360a0840152612ef781886124ac565b90508560c08401528460e0840152828103610100840152612f18818561252e565b9c9b505050505050505050505050565b600084825260606020830152612f41606083018561252e565b8281036040840152610aa1818561252e565b9a8b5260208b01999099526001600160a01b039790971660408a01526060890195909552608088019390935260a087019190915260c086015260e08501521515610100840152151561012083015215156101408201526101600190565b60405181810167ffffffffffffffff81118282101715612fcf57600080fd5b604052919050565b600067ffffffffffffffff821115612fed578081fd5b5060209081020190565b60005b83811015613012578181015183820152602001612ffa565b83811115613021576000848401525b50505050565b801515811461077057600080fdfe476f7665726e6f723a3a63616e63656c3a20626c6f636b2e6e756d626572202d20556e646572666c6f77476f7665726e6f723a3a70726f706f73653a20656e64426c6f636b202d20416464204f766572666c6f77476f7665726e6f723a3a70726f706f73653a2065787069726564426c6f636b202d20416464204f766572666c6f77476f7665726e6f723a3a70726f706f73653a20626c6f636b2e6e756d626572202d20556e646572666c6f77476f7665726e6f723a3a5f63617374566f74653a20766f746573202d20416464204f766572666c6f77a2646970667358221220acc23c35515c77cf1f8445679556dc50ae71bda89c95ffcf6f42c008b4dfc61264736f6c634300060c0033