Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- GovernorAlpha
- Optimization enabled
- false
- Compiler version
- v0.8.18+commit.87f61d96
- EVM Version
- default
- Verified at
- 2023-08-09T17:59:23.782709Z
Constructor Arguments
000000000000000000000000e18c200a70908c89ffa18c628fe1b83ac0065ea40000000000000000000000003618b6cab13cfc2d2de2224e5a6c5183e99fff85
Arg [0] (address) : 0xe18c200a70908c89ffa18c628fe1b83ac0065ea4
Arg [1] (address) : 0x3618b6cab13cfc2d2de2224e5a6c5183e99fff85
Contract source code
// SPDX-License-Identifier: BSD-3-Clause pragma solidity ^0.8.10; contract GovernorAlpha { /// @notice The name of this contract string public constant name = "Pegasys Governor Alpha"; /// @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() public pure returns (uint) { return 400e18; } // 4,000,000 = 4% of PSYS /// @notice The number of votes required in order for a voter to become a proposer function proposalThreshold() public pure returns (uint) { return 10e18; } // 1,000,000 = 1% of PSYS /// @notice The maximum number of actions that can be included in a proposal function proposalMaxOperations() public pure returns (uint) { return 10; } // 10 actions /// @notice The delay before voting on a proposal may take place, once proposed function votingDelay() public pure returns (uint) { return 1; } // 1 block /// @notice The duration of voting on a proposal, in blocks function votingPeriod() public pure virtual returns (uint) { return 96; // back to 1728; } // ~3 days in blocks (assuming 150s blocks) /// @notice The address of the Pegasys Protocol Timelock TimelockInterface public timelock; /// @notice The address of the Pegasys governance token PsysInterface public psys; /// @notice The address of the Governor Guardian address public guardian; /// @notice The total number of proposals uint public proposalCount; struct Proposal { /// @notice Unique id for looking up a proposal uint id; /// @notice Creator of the proposal address proposer; /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds uint eta; /// @notice the ordered list of target addresses for calls to be made address[] targets; /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint[] values; /// @notice The ordered list of function signatures to be called string[] signatures; /// @notice The ordered list of calldata to be passed to each call bytes[] calldatas; /// @notice The block at which voting begins: holders must delegate their votes prior to this block uint startBlock; /// @notice The block at which voting ends: votes must be cast prior to this block uint endBlock; /// @notice Current number of votes in favor of this proposal uint forVotes; /// @notice Current number of votes in opposition to this proposal uint againstVotes; /// @notice Flag marking whether the proposal has been canceled bool canceled; /// @notice Flag marking whether the proposal has been executed bool executed; /// @notice Receipts of ballots for the entire set of voters mapping(address => Receipt) receipts; } /// @notice Ballot receipt record for a voter struct Receipt { /// @notice Whether or not a vote has been cast bool hasVoted; /// @notice Whether or not the voter supports the proposal bool support; /// @notice The number of votes the voter had, which were cast uint96 votes; } /// @notice Possible states that a proposal may be in enum ProposalState { Pending, Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed } /// @notice The official record of all proposals ever proposed mapping(uint => Proposal) public proposals; /// @notice The latest proposal for each proposer mapping(address => uint) public latestProposalIds; /// @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 queued in the Timelock event ProposalQueued(uint id, uint eta); /// @notice An event emitted when a proposal has been executed in the Timelock event ProposalExecuted(uint id); constructor( address psys_, address guardian_ ) { timelock = TimelockInterface(0x432EeB57e19b146fE6bff7E672a0BA47712F3e66); psys = PsysInterface(psys_); guardian = guardian_; } function propose( address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description ) public returns (uint) { require( psys.getPriorVotes(msg.sender, sub256(block.number, 1)) > proposalThreshold(), "GovernorAlpha::propose: proposer votes below proposal threshold" ); require( targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length, "GovernorAlpha::propose: proposal function information arity mismatch" ); require( targets.length != 0, "GovernorAlpha::propose: must provide actions" ); require( targets.length <= proposalMaxOperations(), "GovernorAlpha::propose: too many actions" ); uint latestProposalId = latestProposalIds[msg.sender]; if (latestProposalId != 0) { ProposalState proposersLatestProposalState = state( latestProposalId ); } uint startBlock = add256(block.number, votingDelay()); uint endBlock = add256(startBlock, votingPeriod()); proposalCount++; uint proposalId = proposalCount; Proposal storage newProposal = proposals[proposalId]; // This should never happen but add a check in case. require( newProposal.id == 0, "GovernorAlpha::propose: ProposalID collsion" ); newProposal.id = proposalId; newProposal.proposer = msg.sender; newProposal.eta = 0; newProposal.targets = targets; newProposal.values = values; newProposal.signatures = signatures; newProposal.calldatas = calldatas; newProposal.startBlock = startBlock; newProposal.endBlock = endBlock; newProposal.forVotes = 0; newProposal.againstVotes = 0; newProposal.canceled = false; newProposal.executed = false; latestProposalIds[newProposal.proposer] = newProposal.id; emit ProposalCreated( newProposal.id, msg.sender, targets, values, signatures, calldatas, startBlock, endBlock, description ); return newProposal.id; } function queue(uint proposalId) public { require( state(proposalId) == ProposalState.Succeeded, "GovernorAlpha::queue: proposal can only be queued if it is succeeded" ); Proposal storage proposal = proposals[proposalId]; uint eta = add256(block.timestamp, timelock.delay()); for (uint i = 0; i < proposal.targets.length; i++) { _queueOrRevert( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta ); } proposal.eta = eta; emit ProposalQueued(proposalId, eta); } function _queueOrRevert( address target, uint value, string memory signature, bytes memory data, uint eta ) internal { require( !timelock.queuedTransactions( keccak256(abi.encode(target, value, signature, data, eta)) ), "GovernorAlpha::_queueOrRevert: proposal action already queued at eta" ); timelock.queueTransaction(target, value, signature, data, eta); } function execute(uint proposalId) public payable { require( state(proposalId) == ProposalState.Queued, "GovernorAlpha::execute: proposal can only be executed if it is queued" ); Proposal storage proposal = proposals[proposalId]; proposal.executed = true; for (uint i = 0; i < proposal.targets.length; i++) { timelock.executeTransaction{value: proposal.values[i]}( proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta ); } emit ProposalExecuted(proposalId); } function cancel(uint proposalId) public { ProposalState state = state(proposalId); Proposal storage proposal = proposals[proposalId]; 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, "GovernorAlpha::state: invalid proposal id" ); Proposal storage proposal = proposals[proposalId]; if (proposal.canceled) { return ProposalState.Canceled; } else if (block.number <= proposal.startBlock) { return ProposalState.Pending; } else if (block.number <= proposal.endBlock) { return ProposalState.Active; } else if ( proposal.forVotes <= proposal.againstVotes || proposal.forVotes < quorumVotes() ) { return ProposalState.Defeated; } else if (proposal.eta == 0) { return ProposalState.Succeeded; } else if (proposal.executed) { return ProposalState.Executed; } else if ( block.timestamp >= add256(proposal.eta, timelock.GRACE_PERIOD()) ) { return ProposalState.Expired; } else { return ProposalState.Queued; } } function castVote(uint proposalId, bool support) public { return _castVote(msg.sender, 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), "GovernorAlpha::castVoteBySig: invalid signature" ); return _castVote(signatory, proposalId, support); } function _castVote( address voter, uint proposalId, bool support ) internal { require( state(proposalId) == ProposalState.Active, "GovernorAlpha::_castVote: voting is closed" ); Proposal storage proposal = proposals[proposalId]; Receipt storage receipt = proposal.receipts[voter]; require( receipt.hasVoted == false, "GovernorAlpha::_castVote: voter already voted" ); uint96 votes = psys.getPriorVotes(voter, proposal.startBlock); if (support) { proposal.forVotes = add256(proposal.forVotes, votes); } else { proposal.againstVotes = add256(proposal.againstVotes, votes); } receipt.hasVoted = true; receipt.support = support; receipt.votes = votes; emit VoteCast(voter, proposalId, support, votes); } function __acceptAdmin() public { require( msg.sender == guardian, "GovernorAlpha::__acceptAdmin: sender must be gov guardian" ); timelock.acceptAdmin(); } function __abdicate() public { require( msg.sender == guardian, "GovernorAlpha::__abdicate: sender must be gov guardian" ); guardian = address(0); } function __queueSetTimelockPendingAdmin(address newPendingAdmin, uint eta) public { require( msg.sender == guardian, "GovernorAlpha::__queueSetTimelockPendingAdmin: sender must be gov guardian" ); timelock.queueTransaction( address(timelock), 0, "setPendingAdmin(address)", abi.encode(newPendingAdmin), eta ); } function __executeSetTimelockPendingAdmin(address newPendingAdmin, uint eta) public { require( msg.sender == guardian, "GovernorAlpha::__executeSetTimelockPendingAdmin: sender must be gov guardian" ); timelock.executeTransaction( address(timelock), 0, "setPendingAdmin(address)", abi.encode(newPendingAdmin), eta ); } function add256(uint256 a, uint256 b) internal pure returns (uint) { uint c = a + b; require(c >= a, "addition overflow"); return c; } function sub256(uint256 a, uint256 b) internal pure returns (uint) { require(b <= a, "subtraction underflow"); return a - b; } function getChainId() internal view returns (uint) { uint chainId; assembly { chainId := chainid() } return chainId; } } interface TimelockInterface { function delay() external view returns (uint); function GRACE_PERIOD() external view returns (uint); function acceptAdmin() external; function queuedTransactions(bytes32 hash) external view returns (bool); function queueTransaction( address target, uint value, string calldata signature, bytes calldata data, uint eta ) external returns (bytes32); function cancelTransaction( address target, uint value, string calldata signature, bytes calldata data, uint eta ) external; function executeTransaction( address target, uint value, string calldata signature, bytes calldata data, uint eta ) external payable returns (bytes memory); } interface PsysInterface { function getPriorVotes(address account, uint blockNumber) external view returns (uint96); }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"psys_","internalType":"address"},{"type":"address","name":"guardian_","internalType":"address"}]},{"type":"event","name":"ProposalCanceled","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalCreated","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"address","name":"proposer","internalType":"address","indexed":false},{"type":"address[]","name":"targets","internalType":"address[]","indexed":false},{"type":"uint256[]","name":"values","internalType":"uint256[]","indexed":false},{"type":"string[]","name":"signatures","internalType":"string[]","indexed":false},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]","indexed":false},{"type":"uint256","name":"startBlock","internalType":"uint256","indexed":false},{"type":"uint256","name":"endBlock","internalType":"uint256","indexed":false},{"type":"string","name":"description","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalExecuted","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalQueued","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"uint256","name":"eta","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"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":"nonpayable","outputs":[],"name":"__abdicate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__acceptAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__executeSetTimelockPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__queueSetTimelockPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"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":"payable","outputs":[],"name":"execute","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"}],"name":"getActions","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct GovernorAlpha.Receipt","components":[{"type":"bool","name":"hasVoted","internalType":"bool"},{"type":"bool","name":"support","internalType":"bool"},{"type":"uint96","name":"votes","internalType":"uint96"}]}],"name":"getReceipt","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"address","name":"voter","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"guardian","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":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalCount","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalMaxOperations","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"address","name":"proposer","internalType":"address"},{"type":"uint256","name":"eta","internalType":"uint256"},{"type":"uint256","name":"startBlock","internalType":"uint256"},{"type":"uint256","name":"endBlock","internalType":"uint256"},{"type":"uint256","name":"forVotes","internalType":"uint256"},{"type":"uint256","name":"againstVotes","internalType":"uint256"},{"type":"bool","name":"canceled","internalType":"bool"},{"type":"bool","name":"executed","internalType":"bool"}],"name":"proposals","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"propose","inputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"},{"type":"string","name":"description","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract PsysInterface"}],"name":"psys","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"queue","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"quorumVotes","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum GovernorAlpha.ProposalState"}],"name":"state","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract TimelockInterface"}],"name":"timelock","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"votingDelay","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"votingPeriod","inputs":[]}]
Contract Creation Code
0x60806040523480156200001157600080fd5b50604051620051de380380620051de83398181016040528101906200003791906200017f565b73432eeb57e19b146fe6bff7e672a0ba47712f3e666000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620001c6565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000147826200011a565b9050919050565b62000159816200013a565b81146200016557600080fd5b50565b60008151905062000179816200014e565b92915050565b6000806040838503121562000199576200019862000115565b5b6000620001a98582860162000168565b9250506020620001bc8582860162000168565b9150509250929050565b61500880620001d66000396000f3fe60806040526004361061019c5760003560e01c8063452a9320116100ec578063d33219b41161008a578063ddf0b00911610064578063ddf0b009146105b1578063deaaa7cc146105da578063e23a9a5214610605578063fe0d94c1146106425761019c565b8063d33219b41461051e578063da35c66414610549578063da95691a146105745761019c565b80637bdbe4d0116100c65780637bdbe4d01461048857806391500671146104b3578063b58131b0146104dc578063b9a61961146105075761019c565b8063452a93201461041d5780634634c61f14610448578063760fbc13146104715761019c565b806321f43e42116101595780633932abb1116101335780633932abb114610361578063393aac271461038c5780633e4f49e6146103b757806340e58ee5146103f45761019c565b806321f43e42146102cd57806324bc1a64146102f6578063328dd982146103215761019c565b8063013cf08b146101a157806302a251a3146101e657806306fdde031461021157806315373e3d1461023c57806317977c611461026557806320606b70146102a2575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906127b3565b61065e565b6040516101dd9998979695949392919061284b565b60405180910390f35b3480156101f257600080fd5b506101fb6106e6565b60405161020891906128d8565b60405180910390f35b34801561021d57600080fd5b506102266106ef565b6040516102339190612983565b60405180910390f35b34801561024857600080fd5b50610263600480360381019061025e91906129d1565b610728565b005b34801561027157600080fd5b5061028c60048036038101906102879190612a3d565b610737565b60405161029991906128d8565b60405180910390f35b3480156102ae57600080fd5b506102b761074f565b6040516102c49190612a83565b60405180910390f35b3480156102d957600080fd5b506102f460048036038101906102ef9190612a9e565b610773565b005b34801561030257600080fd5b5061030b6108ef565b60405161031891906128d8565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906127b3565b610900565b6040516103589493929190612e7d565b60405180910390f35b34801561036d57600080fd5b50610376610bbd565b60405161038391906128d8565b60405180910390f35b34801561039857600080fd5b506103a1610bc6565b6040516103ae9190612f3d565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d991906127b3565b610bec565b6040516103eb9190612fcf565b60405180910390f35b34801561040057600080fd5b5061041b600480360381019061041691906127b3565b610dbf565b005b34801561042957600080fd5b50610432610e3c565b60405161043f9190612fea565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a919061306a565b610e62565b005b34801561047d57600080fd5b5061048661104a565b005b34801561049457600080fd5b5061049d61111e565b6040516104aa91906128d8565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190612a9e565b611127565b005b3480156104e857600080fd5b506104f161129e565b6040516104fe91906128d8565b60405180910390f35b34801561051357600080fd5b5061051c6112ae565b005b34801561052a57600080fd5b506105336113c0565b6040516105409190613106565b60405180910390f35b34801561055557600080fd5b5061055e6113e4565b60405161056b91906128d8565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613644565b6113ea565b6040516105a891906128d8565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d391906127b3565b6118bf565b005b3480156105e657600080fd5b506105ef611c0b565b6040516105fc9190612a83565b60405180910390f35b34801561061157600080fd5b5061062c6004803603810190610627919061374b565b611c2f565b6040516106399190613803565b60405180910390f35b61065c600480360381019061065791906127b3565b611d11565b005b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600201549080600701549080600801549080600901549080600a01549080600b0160009054906101000a900460ff169080600b0160019054906101000a900460ff16905089565b60006060905090565b6040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c7068610000000000000000000081525081565b610733338383611f82565b5050565b60056020528060005260406000206000915090505481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa906138b6565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000856040516020016108739190612fea565b604051602081830303815290604052856040518563ffffffff1660e01b81526004016108a294939291906139a7565b6000604051808303816000875af11580156108c1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108ea9190613a76565b505050565b60006815af1d78b58c400000905090565b606080606080600060046000878152602001908152602001600020905080600301816004018260050183600601838054806020026020016040519081016040528092919081815260200182805480156109ae57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610964575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610a0057602002820191906000526020600020905b8154815260200190600101908083116109ec575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610ad4578382906000526020600020018054610a4790613aee565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7390613aee565b8015610ac05780601f10610a9557610100808354040283529160200191610ac0565b820191906000526020600020905b815481529060010190602001808311610aa357829003601f168201915b505050505081526020019060010190610a28565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610ba7578382906000526020600020018054610b1a90613aee565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4690613aee565b8015610b935780601f10610b6857610100808354040283529160200191610b93565b820191906000526020600020905b815481529060010190602001808311610b7657829003601f168201915b505050505081526020019060010190610afb565b5050505090509450945094509450509193509193565b60006001905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008160035410158015610c005750600082115b610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690613b91565b60405180910390fd5b600060046000848152602001908152602001600020905080600b0160009054906101000a900460ff1615610c77576002915050610dba565b80600701544311610c8c576000915050610dba565b80600801544311610ca1576001915050610dba565b80600a01548160090154111580610cc25750610cbb6108ef565b8160090154105b15610cd1576003915050610dba565b6000816002015403610ce7576004915050610dba565b80600b0160019054906101000a900460ff1615610d08576007915050610dba565b610da4816002015460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f9190613bc6565b612250565b4210610db4576006915050610dba565b60059150505b919050565b6000610dca82610bec565b90506000600460008481526020019081526020016000209050600181600b0160006101000a81548160ff0219169083151502179055507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c83604051610e2f91906128d8565b60405180910390a1505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c7068610000000000000000000081525080519060200120610eca6122ae565b30604051602001610ede9493929190613bf3565b60405160208183030381529060405280519060200120905060007f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee8787604051602001610f2d93929190613c38565b60405160208183030381529060405280519060200120905060008282604051602001610f5a929190613ce7565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610f979493929190613d2d565b6020604051602081039080840390855afa158015610fb9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b90613de4565b60405180910390fd5b61103f818a8a611f82565b505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190613e76565b60405180910390fd5b6000600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae90613f2e565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90160008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000856040516020016112279190612fea565b604051602081830303815290604052856040518563ffffffff1660e01b815260040161125694939291906139a7565b6020604051808303816000875af1158015611275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112999190613f63565b505050565b6000678ac7230489e80000905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590614002565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156113a657600080fd5b505af11580156113ba573d6000803e3d6000fd5b50505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60006113f461129e565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe13361143e4360016122bb565b6040518363ffffffff1660e01b815260040161145b929190614022565b602060405180830381865afa158015611478573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149c9190614077565b6bffffffffffffffffffffffff16116114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614116565b60405180910390fd5b845186511480156114fc575083518651145b8015611509575082518651145b611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f906141ce565b60405180910390fd5b600086510361158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390614260565b60405180910390fd5b61159461111e565b865111156115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce906142f2565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811461163257600061162e82610bec565b9050505b600061164543611640610bbd565b612250565b9050600061165a826116556106e6565b612250565b90506003600081548092919061166f90614341565b919050555060006003549050600060046000838152602001908152602001600020905060008160000154146116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d0906143fb565b60405180910390fd5b818160000181905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600081600201819055508a8160030190805190602001906117479291906124c8565b5089816004019080519060200190611760929190612552565b508881600501908051906020019061177992919061259f565b50878160060190805190602001906117929291906125f8565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0160006101000a81548160ff021916908315150217905550600081600b0160016101000a81548160ff0219169083151502179055508060000154600560008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f6040516118a29998979695949392919061441b565b60405180910390a180600001549550505050505095945050505050565b600460078111156118d3576118d2612f58565b5b6118dc82610bec565b60078111156118ee576118ed612f58565b5b1461192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590614563565b60405180910390fd5b600060046000838152602001908152602001600020905060006119df4260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119da9190613bc6565b612250565b905060005b8260030180549050811015611bc357611bb0836003018281548110611a0c57611a0b614583565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018381548110611a4d57611a4c614583565b5b9060005260206000200154856005018481548110611a6e57611a6d614583565b5b906000526020600020018054611a8390613aee565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaf90613aee565b8015611afc5780601f10611ad157610100808354040283529160200191611afc565b820191906000526020600020905b815481529060010190602001808311611adf57829003601f168201915b5050505050866006018581548110611b1757611b16614583565b5b906000526020600020018054611b2c90613aee565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5890613aee565b8015611ba55780601f10611b7a57610100808354040283529160200191611ba5565b820191906000526020600020905b815481529060010190602001808311611b8857829003601f168201915b505050505086612314565b8080611bbb90614341565b9150506119e4565b508082600201819055507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928382604051611bfe9291906145b2565b60405180910390a1505050565b7f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee81565b611c37612651565b60046000848152602001908152602001600020600c0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff161515151581526020016000820160029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905092915050565b60056007811115611d2557611d24612f58565b5b611d2e82610bec565b6007811115611d4057611d3f612f58565b5b14611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7790614673565b60405180910390fd5b6000600460008381526020019081526020016000209050600181600b0160016101000a81548160ff02191690831515021790555060005b8160030180549050811015611f465760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f836004018381548110611e1857611e17614583565b5b9060005260206000200154846003018481548110611e3957611e38614583565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856004018581548110611e7a57611e79614583565b5b9060005260206000200154866005018681548110611e9b57611e9a614583565b5b90600052602060002001876006018781548110611ebb57611eba614583565b5b9060005260206000200188600201546040518763ffffffff1660e01b8152600401611eea9594939291906147c5565b60006040518083038185885af1158015611f08573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f82011682018060405250810190611f329190613a76565b508080611f3e90614341565b915050611db7565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611f7691906128d8565b60405180910390a15050565b60016007811115611f9657611f95612f58565b5b611f9f83610bec565b6007811115611fb157611fb0612f58565b5b14611ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe890614898565b60405180910390fd5b6000600460008481526020019081526020016000209050600081600c0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600015158160000160009054906101000a900460ff161515146120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c9061492a565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe18785600701546040518363ffffffff1660e01b8152600401612108929190614022565b602060405180830381865afa158015612125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121499190614077565b9050831561217a5761216d8360090154826bffffffffffffffffffffffff16612250565b836009018190555061219f565b61219683600a0154826bffffffffffffffffffffffff16612250565b83600a01819055505b60018260000160006101000a81548160ff021916908315150217905550838260000160016101000a81548160ff021916908315150217905550808260000160026101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055507f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c4686868684604051612240949392919061497b565b60405180910390a1505050505050565b600080828461225f91906149c0565b9050838110156122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b90614a40565b60405180910390fd5b8091505092915050565b6000804690508091505090565b600082821115612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790614aac565b60405180910390fd5b818361230c9190614acc565b905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2b065378686868686604051602001612369959493929190614b00565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161239b9190612a83565b602060405180830381865afa1580156123b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123dc9190614b76565b1561241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241390614c3b565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90186868686866040518663ffffffff1660e01b815260040161247d959493929190614b00565b6020604051808303816000875af115801561249c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c09190613f63565b505050505050565b828054828255906000526020600020908101928215612541579160200282015b828111156125405782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906124e8565b5b50905061254e9190612684565b5090565b82805482825590600052602060002090810192821561258e579160200282015b8281111561258d578251825591602001919060010190612572565b5b50905061259b9190612684565b5090565b8280548282559060005260206000209081019282156125e7579160200282015b828111156125e65782518290816125d69190614de8565b50916020019190600101906125bf565b5b5090506125f491906126a1565b5090565b828054828255906000526020600020908101928215612640579160200282015b8281111561263f57825182908161262f9190614f00565b5091602001919060010190612618565b5b50905061264d91906126c5565b5090565b604051806060016040528060001515815260200160001515815260200160006bffffffffffffffffffffffff1681525090565b5b8082111561269d576000816000905550600101612685565b5090565b5b808211156126c157600081816126b891906126e9565b506001016126a2565b5090565b5b808211156126e557600081816126dc9190612729565b506001016126c6565b5090565b5080546126f590613aee565b6000825580601f106127075750612726565b601f0160209004906000526020600020908101906127259190612684565b5b50565b50805461273590613aee565b6000825580601f106127475750612766565b601f0160209004906000526020600020908101906127659190612684565b5b50565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6127908161277d565b811461279b57600080fd5b50565b6000813590506127ad81612787565b92915050565b6000602082840312156127c9576127c8612773565b5b60006127d78482850161279e565b91505092915050565b6127e98161277d565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061281a826127ef565b9050919050565b61282a8161280f565b82525050565b60008115159050919050565b61284581612830565b82525050565b600061012082019050612861600083018c6127e0565b61286e602083018b612821565b61287b604083018a6127e0565b61288860608301896127e0565b61289560808301886127e0565b6128a260a08301876127e0565b6128af60c08301866127e0565b6128bc60e083018561283c565b6128ca61010083018461283c565b9a9950505050505050505050565b60006020820190506128ed60008301846127e0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561292d578082015181840152602081019050612912565b60008484015250505050565b6000601f19601f8301169050919050565b6000612955826128f3565b61295f81856128fe565b935061296f81856020860161290f565b61297881612939565b840191505092915050565b6000602082019050818103600083015261299d818461294a565b905092915050565b6129ae81612830565b81146129b957600080fd5b50565b6000813590506129cb816129a5565b92915050565b600080604083850312156129e8576129e7612773565b5b60006129f68582860161279e565b9250506020612a07858286016129bc565b9150509250929050565b612a1a8161280f565b8114612a2557600080fd5b50565b600081359050612a3781612a11565b92915050565b600060208284031215612a5357612a52612773565b5b6000612a6184828501612a28565b91505092915050565b6000819050919050565b612a7d81612a6a565b82525050565b6000602082019050612a986000830184612a74565b92915050565b60008060408385031215612ab557612ab4612773565b5b6000612ac385828601612a28565b9250506020612ad48582860161279e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b138161280f565b82525050565b6000612b258383612b0a565b60208301905092915050565b6000602082019050919050565b6000612b4982612ade565b612b538185612ae9565b9350612b5e83612afa565b8060005b83811015612b8f578151612b768882612b19565b9750612b8183612b31565b925050600181019050612b62565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612bd18161277d565b82525050565b6000612be38383612bc8565b60208301905092915050565b6000602082019050919050565b6000612c0782612b9c565b612c118185612ba7565b9350612c1c83612bb8565b8060005b83811015612c4d578151612c348882612bd7565b9750612c3f83612bef565b925050600181019050612c20565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000612ca2826128f3565b612cac8185612c86565b9350612cbc81856020860161290f565b612cc581612939565b840191505092915050565b6000612cdc8383612c97565b905092915050565b6000602082019050919050565b6000612cfc82612c5a565b612d068185612c65565b935083602082028501612d1885612c76565b8060005b85811015612d545784840389528151612d358582612cd0565b9450612d4083612ce4565b925060208a01995050600181019050612d1c565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000612db982612d92565b612dc38185612d9d565b9350612dd381856020860161290f565b612ddc81612939565b840191505092915050565b6000612df38383612dae565b905092915050565b6000602082019050919050565b6000612e1382612d66565b612e1d8185612d71565b935083602082028501612e2f85612d82565b8060005b85811015612e6b5784840389528151612e4c8582612de7565b9450612e5783612dfb565b925060208a01995050600181019050612e33565b50829750879550505050505092915050565b60006080820190508181036000830152612e978187612b3e565b90508181036020830152612eab8186612bfc565b90508181036040830152612ebf8185612cf1565b90508181036060830152612ed38184612e08565b905095945050505050565b6000819050919050565b6000612f03612efe612ef9846127ef565b612ede565b6127ef565b9050919050565b6000612f1582612ee8565b9050919050565b6000612f2782612f0a565b9050919050565b612f3781612f1c565b82525050565b6000602082019050612f526000830184612f2e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60088110612f9857612f97612f58565b5b50565b6000819050612fa982612f87565b919050565b6000612fb982612f9b565b9050919050565b612fc981612fae565b82525050565b6000602082019050612fe46000830184612fc0565b92915050565b6000602082019050612fff6000830184612821565b92915050565b600060ff82169050919050565b61301b81613005565b811461302657600080fd5b50565b60008135905061303881613012565b92915050565b61304781612a6a565b811461305257600080fd5b50565b6000813590506130648161303e565b92915050565b600080600080600060a0868803121561308657613085612773565b5b60006130948882890161279e565b95505060206130a5888289016129bc565b94505060406130b688828901613029565b93505060606130c788828901613055565b92505060806130d888828901613055565b9150509295509295909350565b60006130f082612f0a565b9050919050565b613100816130e5565b82525050565b600060208201905061311b60008301846130f7565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61315e82612939565b810181811067ffffffffffffffff8211171561317d5761317c613126565b5b80604052505050565b6000613190612769565b905061319c8282613155565b919050565b600067ffffffffffffffff8211156131bc576131bb613126565b5b602082029050602081019050919050565b600080fd5b60006131e56131e0846131a1565b613186565b90508083825260208201905060208402830185811115613208576132076131cd565b5b835b81811015613231578061321d8882612a28565b84526020840193505060208101905061320a565b5050509392505050565b600082601f8301126132505761324f613121565b5b81356132608482602086016131d2565b91505092915050565b600067ffffffffffffffff82111561328457613283613126565b5b602082029050602081019050919050565b60006132a86132a384613269565b613186565b905080838252602082019050602084028301858111156132cb576132ca6131cd565b5b835b818110156132f457806132e0888261279e565b8452602084019350506020810190506132cd565b5050509392505050565b600082601f83011261331357613312613121565b5b8135613323848260208601613295565b91505092915050565b600067ffffffffffffffff82111561334757613346613126565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff82111561337857613377613126565b5b61338182612939565b9050602081019050919050565b82818337600083830152505050565b60006133b06133ab8461335d565b613186565b9050828152602081018484840111156133cc576133cb613358565b5b6133d784828561338e565b509392505050565b600082601f8301126133f4576133f3613121565b5b813561340484826020860161339d565b91505092915050565b600061342061341b8461332c565b613186565b90508083825260208201905060208402830185811115613443576134426131cd565b5b835b8181101561348a57803567ffffffffffffffff81111561346857613467613121565b5b80860161347589826133df565b85526020850194505050602081019050613445565b5050509392505050565b600082601f8301126134a9576134a8613121565b5b81356134b984826020860161340d565b91505092915050565b600067ffffffffffffffff8211156134dd576134dc613126565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561350957613508613126565b5b61351282612939565b9050602081019050919050565b600061353261352d846134ee565b613186565b90508281526020810184848401111561354e5761354d613358565b5b61355984828561338e565b509392505050565b600082601f83011261357657613575613121565b5b813561358684826020860161351f565b91505092915050565b60006135a261359d846134c2565b613186565b905080838252602082019050602084028301858111156135c5576135c46131cd565b5b835b8181101561360c57803567ffffffffffffffff8111156135ea576135e9613121565b5b8086016135f78982613561565b855260208501945050506020810190506135c7565b5050509392505050565b600082601f83011261362b5761362a613121565b5b813561363b84826020860161358f565b91505092915050565b600080600080600060a086880312156136605761365f612773565b5b600086013567ffffffffffffffff81111561367e5761367d612778565b5b61368a8882890161323b565b955050602086013567ffffffffffffffff8111156136ab576136aa612778565b5b6136b7888289016132fe565b945050604086013567ffffffffffffffff8111156136d8576136d7612778565b5b6136e488828901613494565b935050606086013567ffffffffffffffff81111561370557613704612778565b5b61371188828901613616565b925050608086013567ffffffffffffffff81111561373257613731612778565b5b61373e888289016133df565b9150509295509295909350565b6000806040838503121561376257613761612773565b5b60006137708582860161279e565b925050602061378185828601612a28565b9150509250929050565b61379481612830565b82525050565b60006bffffffffffffffffffffffff82169050919050565b6137bb8161379a565b82525050565b6060820160008201516137d7600085018261378b565b5060208201516137ea602085018261378b565b5060408201516137fd60408501826137b2565b50505050565b600060608201905061381860008301846137c1565b92915050565b7f476f7665726e6f72416c7068613a3a5f5f6578656375746553657454696d656c60008201527f6f636b50656e64696e6741646d696e3a2073656e646572206d7573742062652060208201527f676f7620677561726469616e0000000000000000000000000000000000000000604082015250565b60006138a0604c836128fe565b91506138ab8261381e565b606082019050919050565b600060208201905081810360008301526138cf81613893565b9050919050565b6000819050919050565b60006138fb6138f66138f1846138d6565b612ede565b61277d565b9050919050565b61390b816138e0565b82525050565b7f73657450656e64696e6741646d696e2861646472657373290000000000000000600082015250565b60006139476018836128fe565b915061395282613911565b602082019050919050565b600082825260208201905092915050565b600061397982612d92565b613983818561395d565b935061399381856020860161290f565b61399c81612939565b840191505092915050565b600060a0820190506139bc6000830187612821565b6139c96020830186613902565b81810360408301526139da8161393a565b905081810360608301526139ee818561396e565b90506139fd60808301846127e0565b95945050505050565b6000613a19613a14846134ee565b613186565b905082815260208101848484011115613a3557613a34613358565b5b613a4084828561290f565b509392505050565b600082601f830112613a5d57613a5c613121565b5b8151613a6d848260208601613a06565b91505092915050565b600060208284031215613a8c57613a8b612773565b5b600082015167ffffffffffffffff811115613aaa57613aa9612778565b5b613ab684828501613a48565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b0657607f821691505b602082108103613b1957613b18613abf565b5b50919050565b7f476f7665726e6f72416c7068613a3a73746174653a20696e76616c696420707260008201527f6f706f73616c2069640000000000000000000000000000000000000000000000602082015250565b6000613b7b6029836128fe565b9150613b8682613b1f565b604082019050919050565b60006020820190508181036000830152613baa81613b6e565b9050919050565b600081519050613bc081612787565b92915050565b600060208284031215613bdc57613bdb612773565b5b6000613bea84828501613bb1565b91505092915050565b6000608082019050613c086000830187612a74565b613c156020830186612a74565b613c2260408301856127e0565b613c2f6060830184612821565b95945050505050565b6000606082019050613c4d6000830186612a74565b613c5a60208301856127e0565b613c67604083018461283c565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613cb0600283613c6f565b9150613cbb82613c7a565b600282019050919050565b6000819050919050565b613ce1613cdc82612a6a565b613cc6565b82525050565b6000613cf282613ca3565b9150613cfe8285613cd0565b602082019150613d0e8284613cd0565b6020820191508190509392505050565b613d2781613005565b82525050565b6000608082019050613d426000830187612a74565b613d4f6020830186613d1e565b613d5c6040830185612a74565b613d696060830184612a74565b95945050505050565b7f476f7665726e6f72416c7068613a3a63617374566f746542795369673a20696e60008201527f76616c6964207369676e61747572650000000000000000000000000000000000602082015250565b6000613dce602f836128fe565b9150613dd982613d72565b604082019050919050565b60006020820190508181036000830152613dfd81613dc1565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f61626469636174653a2073656e646560008201527f72206d75737420626520676f7620677561726469616e00000000000000000000602082015250565b6000613e606036836128fe565b9150613e6b82613e04565b604082019050919050565b60006020820190508181036000830152613e8f81613e53565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f717565756553657454696d656c6f6360008201527f6b50656e64696e6741646d696e3a2073656e646572206d75737420626520676f60208201527f7620677561726469616e00000000000000000000000000000000000000000000604082015250565b6000613f18604a836128fe565b9150613f2382613e96565b606082019050919050565b60006020820190508181036000830152613f4781613f0b565b9050919050565b600081519050613f5d8161303e565b92915050565b600060208284031215613f7957613f78612773565b5b6000613f8784828501613f4e565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f5f61636365707441646d696e3a20736560008201527f6e646572206d75737420626520676f7620677561726469616e00000000000000602082015250565b6000613fec6039836128fe565b9150613ff782613f90565b604082019050919050565b6000602082019050818103600083015261401b81613fdf565b9050919050565b60006040820190506140376000830185612821565b61404460208301846127e0565b9392505050565b6140548161379a565b811461405f57600080fd5b50565b6000815190506140718161404b565b92915050565b60006020828403121561408d5761408c612773565b5b600061409b84828501614062565b91505092915050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73657260008201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c6400602082015250565b6000614100603f836128fe565b915061410b826140a4565b604082019050919050565b6000602082019050818103600083015261412f816140f3565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73616c60008201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d60208201527f6174636800000000000000000000000000000000000000000000000000000000604082015250565b60006141b86044836128fe565b91506141c382614136565b606082019050919050565b600060208201905081810360008301526141e7816141ab565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206d7573742070726f60008201527f7669646520616374696f6e730000000000000000000000000000000000000000602082015250565b600061424a602c836128fe565b9150614255826141ee565b604082019050919050565b600060208201905081810360008301526142798161423d565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a20746f6f206d616e7960008201527f20616374696f6e73000000000000000000000000000000000000000000000000602082015250565b60006142dc6028836128fe565b91506142e782614280565b604082019050919050565b6000602082019050818103600083015261430b816142cf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061434c8261277d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361437e5761437d614312565b5b600182019050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2050726f706f73616c60008201527f494420636f6c6c73696f6e000000000000000000000000000000000000000000602082015250565b60006143e5602b836128fe565b91506143f082614389565b604082019050919050565b60006020820190508181036000830152614414816143d8565b9050919050565b600061012082019050614431600083018c6127e0565b61443e602083018b612821565b8181036040830152614450818a612b3e565b905081810360608301526144648189612bfc565b905081810360808301526144788188612cf1565b905081810360a083015261448c8187612e08565b905061449b60c08301866127e0565b6144a860e08301856127e0565b8181036101008301526144bb818461294a565b90509a9950505050505050505050565b7f476f7665726e6f72416c7068613a3a71756575653a2070726f706f73616c206360008201527f616e206f6e6c792062652071756575656420696620697420697320737563636560208201527f6564656400000000000000000000000000000000000000000000000000000000604082015250565b600061454d6044836128fe565b9150614558826144cb565b606082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006040820190506145c760008301856127e0565b6145d460208301846127e0565b9392505050565b7f476f7665726e6f72416c7068613a3a657865637574653a2070726f706f73616c60008201527f2063616e206f6e6c79206265206578656375746564206966206974206973207160208201527f7565756564000000000000000000000000000000000000000000000000000000604082015250565b600061465d6045836128fe565b9150614668826145db565b606082019050919050565b6000602082019050818103600083015261468c81614650565b9050919050565b60008190508160005260206000209050919050565b600081546146b581613aee565b6146bf81866128fe565b945060018216600081146146da57600181146146f057614723565b60ff198316865281151560200286019350614723565b6146f985614693565b60005b8381101561471b578154818901526001820191506020810190506146fc565b808801955050505b50505092915050565b60008190508160005260206000209050919050565b6000815461474e81613aee565b614758818661395d565b945060018216600081146147735760018114614789576147bc565b60ff1983168652811515602002860193506147bc565b6147928561472c565b60005b838110156147b457815481890152600182019150602081019050614795565b808801955050505b50505092915050565b600060a0820190506147da6000830188612821565b6147e760208301876127e0565b81810360408301526147f981866146a8565b9050818103606083015261480d8185614741565b905061481c60808301846127e0565b9695505050505050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f74696e6760008201527f20697320636c6f73656400000000000000000000000000000000000000000000602082015250565b6000614882602a836128fe565b915061488d82614826565b604082019050919050565b600060208201905081810360008301526148b181614875565b9050919050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f7465722060008201527f616c726561647920766f74656400000000000000000000000000000000000000602082015250565b6000614914602d836128fe565b915061491f826148b8565b604082019050919050565b6000602082019050818103600083015261494381614907565b9050919050565b600061496561496061495b8461379a565b612ede565b61277d565b9050919050565b6149758161494a565b82525050565b60006080820190506149906000830187612821565b61499d60208301866127e0565b6149aa604083018561283c565b6149b7606083018461496c565b95945050505050565b60006149cb8261277d565b91506149d68361277d565b92508282019050808211156149ee576149ed614312565b5b92915050565b7f6164646974696f6e206f766572666c6f77000000000000000000000000000000600082015250565b6000614a2a6011836128fe565b9150614a35826149f4565b602082019050919050565b60006020820190508181036000830152614a5981614a1d565b9050919050565b7f7375627472616374696f6e20756e646572666c6f770000000000000000000000600082015250565b6000614a966015836128fe565b9150614aa182614a60565b602082019050919050565b60006020820190508181036000830152614ac581614a89565b9050919050565b6000614ad78261277d565b9150614ae28361277d565b9250828203905081811115614afa57614af9614312565b5b92915050565b600060a082019050614b156000830188612821565b614b2260208301876127e0565b8181036040830152614b34818661294a565b90508181036060830152614b48818561396e565b9050614b5760808301846127e0565b9695505050505050565b600081519050614b70816129a5565b92915050565b600060208284031215614b8c57614b8b612773565b5b6000614b9a84828501614b61565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f71756575654f725265766572743a207060008201527f726f706f73616c20616374696f6e20616c72656164792071756575656420617460208201527f2065746100000000000000000000000000000000000000000000000000000000604082015250565b6000614c256044836128fe565b9150614c3082614ba3565b606082019050919050565b60006020820190508181036000830152614c5481614c18565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614ca87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614c6b565b614cb28683614c6b565b95508019841693508086168417925050509392505050565b6000614ce5614ce0614cdb8461277d565b612ede565b61277d565b9050919050565b6000819050919050565b614cff83614cca565b614d13614d0b82614cec565b848454614c78565b825550505050565b600090565b614d28614d1b565b614d33818484614cf6565b505050565b5b81811015614d5757614d4c600082614d20565b600181019050614d39565b5050565b601f821115614d9c57614d6d81614693565b614d7684614c5b565b81016020851015614d85578190505b614d99614d9185614c5b565b830182614d38565b50505b505050565b600082821c905092915050565b6000614dbf60001984600802614da1565b1980831691505092915050565b6000614dd88383614dae565b9150826002028217905092915050565b614df1826128f3565b67ffffffffffffffff811115614e0a57614e09613126565b5b614e148254613aee565b614e1f828285614d5b565b600060209050601f831160018114614e525760008415614e40578287015190505b614e4a8582614dcc565b865550614eb2565b601f198416614e6086614693565b60005b82811015614e8857848901518255600182019150602085019450602081019050614e63565b86831015614ea55784890151614ea1601f891682614dae565b8355505b6001600288020188555050505b505050505050565b601f821115614efb57614ecc8161472c565b614ed584614c5b565b81016020851015614ee4578190505b614ef8614ef085614c5b565b830182614d38565b50505b505050565b614f0982612d92565b67ffffffffffffffff811115614f2257614f21613126565b5b614f2c8254613aee565b614f37828285614eba565b600060209050601f831160018114614f6a5760008415614f58578287015190505b614f628582614dcc565b865550614fca565b601f198416614f788661472c565b60005b82811015614fa057848901518255600182019150602085019450602081019050614f7b565b86831015614fbd5784890151614fb9601f891682614dae565b8355505b6001600288020188555050505b50505050505056fea264697066735822122060e6d318798bfaf63acbc56e9788b1e0bfef404eb7adaf705254ee25fd4fedb364736f6c63430008120033000000000000000000000000e18c200a70908c89ffa18c628fe1b83ac0065ea40000000000000000000000003618b6cab13cfc2d2de2224e5a6c5183e99fff85
Deployed ByteCode
0x60806040526004361061019c5760003560e01c8063452a9320116100ec578063d33219b41161008a578063ddf0b00911610064578063ddf0b009146105b1578063deaaa7cc146105da578063e23a9a5214610605578063fe0d94c1146106425761019c565b8063d33219b41461051e578063da35c66414610549578063da95691a146105745761019c565b80637bdbe4d0116100c65780637bdbe4d01461048857806391500671146104b3578063b58131b0146104dc578063b9a61961146105075761019c565b8063452a93201461041d5780634634c61f14610448578063760fbc13146104715761019c565b806321f43e42116101595780633932abb1116101335780633932abb114610361578063393aac271461038c5780633e4f49e6146103b757806340e58ee5146103f45761019c565b806321f43e42146102cd57806324bc1a64146102f6578063328dd982146103215761019c565b8063013cf08b146101a157806302a251a3146101e657806306fdde031461021157806315373e3d1461023c57806317977c611461026557806320606b70146102a2575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c391906127b3565b61065e565b6040516101dd9998979695949392919061284b565b60405180910390f35b3480156101f257600080fd5b506101fb6106e6565b60405161020891906128d8565b60405180910390f35b34801561021d57600080fd5b506102266106ef565b6040516102339190612983565b60405180910390f35b34801561024857600080fd5b50610263600480360381019061025e91906129d1565b610728565b005b34801561027157600080fd5b5061028c60048036038101906102879190612a3d565b610737565b60405161029991906128d8565b60405180910390f35b3480156102ae57600080fd5b506102b761074f565b6040516102c49190612a83565b60405180910390f35b3480156102d957600080fd5b506102f460048036038101906102ef9190612a9e565b610773565b005b34801561030257600080fd5b5061030b6108ef565b60405161031891906128d8565b60405180910390f35b34801561032d57600080fd5b50610348600480360381019061034391906127b3565b610900565b6040516103589493929190612e7d565b60405180910390f35b34801561036d57600080fd5b50610376610bbd565b60405161038391906128d8565b60405180910390f35b34801561039857600080fd5b506103a1610bc6565b6040516103ae9190612f3d565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d991906127b3565b610bec565b6040516103eb9190612fcf565b60405180910390f35b34801561040057600080fd5b5061041b600480360381019061041691906127b3565b610dbf565b005b34801561042957600080fd5b50610432610e3c565b60405161043f9190612fea565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a919061306a565b610e62565b005b34801561047d57600080fd5b5061048661104a565b005b34801561049457600080fd5b5061049d61111e565b6040516104aa91906128d8565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190612a9e565b611127565b005b3480156104e857600080fd5b506104f161129e565b6040516104fe91906128d8565b60405180910390f35b34801561051357600080fd5b5061051c6112ae565b005b34801561052a57600080fd5b506105336113c0565b6040516105409190613106565b60405180910390f35b34801561055557600080fd5b5061055e6113e4565b60405161056b91906128d8565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613644565b6113ea565b6040516105a891906128d8565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d391906127b3565b6118bf565b005b3480156105e657600080fd5b506105ef611c0b565b6040516105fc9190612a83565b60405180910390f35b34801561061157600080fd5b5061062c6004803603810190610627919061374b565b611c2f565b6040516106399190613803565b60405180910390f35b61065c600480360381019061065791906127b3565b611d11565b005b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600201549080600701549080600801549080600901549080600a01549080600b0160009054906101000a900460ff169080600b0160019054906101000a900460ff16905089565b60006060905090565b6040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c7068610000000000000000000081525081565b610733338383611f82565b5050565b60056020528060005260406000206000915090505481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa906138b6565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000856040516020016108739190612fea565b604051602081830303815290604052856040518563ffffffff1660e01b81526004016108a294939291906139a7565b6000604051808303816000875af11580156108c1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108ea9190613a76565b505050565b60006815af1d78b58c400000905090565b606080606080600060046000878152602001908152602001600020905080600301816004018260050183600601838054806020026020016040519081016040528092919081815260200182805480156109ae57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610964575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610a0057602002820191906000526020600020905b8154815260200190600101908083116109ec575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610ad4578382906000526020600020018054610a4790613aee565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7390613aee565b8015610ac05780601f10610a9557610100808354040283529160200191610ac0565b820191906000526020600020905b815481529060010190602001808311610aa357829003601f168201915b505050505081526020019060010190610a28565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610ba7578382906000526020600020018054610b1a90613aee565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4690613aee565b8015610b935780601f10610b6857610100808354040283529160200191610b93565b820191906000526020600020905b815481529060010190602001808311610b7657829003601f168201915b505050505081526020019060010190610afb565b5050505090509450945094509450509193509193565b60006001905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008160035410158015610c005750600082115b610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3690613b91565b60405180910390fd5b600060046000848152602001908152602001600020905080600b0160009054906101000a900460ff1615610c77576002915050610dba565b80600701544311610c8c576000915050610dba565b80600801544311610ca1576001915050610dba565b80600a01548160090154111580610cc25750610cbb6108ef565b8160090154105b15610cd1576003915050610dba565b6000816002015403610ce7576004915050610dba565b80600b0160019054906101000a900460ff1615610d08576007915050610dba565b610da4816002015460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9f9190613bc6565b612250565b4210610db4576006915050610dba565b60059150505b919050565b6000610dca82610bec565b90506000600460008481526020019081526020016000209050600181600b0160006101000a81548160ff0219169083151502179055507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c83604051610e2f91906128d8565b60405180910390a1505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c7068610000000000000000000081525080519060200120610eca6122ae565b30604051602001610ede9493929190613bf3565b60405160208183030381529060405280519060200120905060007f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee8787604051602001610f2d93929190613c38565b60405160208183030381529060405280519060200120905060008282604051602001610f5a929190613ce7565b604051602081830303815290604052805190602001209050600060018288888860405160008152602001604052604051610f979493929190613d2d565b6020604051602081039080840390855afa158015610fb9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b90613de4565b60405180910390fd5b61103f818a8a611f82565b505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d190613e76565b60405180910390fd5b6000600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae90613f2e565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90160008054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000856040516020016112279190612fea565b604051602081830303815290604052856040518563ffffffff1660e01b815260040161125694939291906139a7565b6020604051808303816000875af1158015611275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112999190613f63565b505050565b6000678ac7230489e80000905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590614002565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156113a657600080fd5b505af11580156113ba573d6000803e3d6000fd5b50505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60006113f461129e565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe13361143e4360016122bb565b6040518363ffffffff1660e01b815260040161145b929190614022565b602060405180830381865afa158015611478573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149c9190614077565b6bffffffffffffffffffffffff16116114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190614116565b60405180910390fd5b845186511480156114fc575083518651145b8015611509575082518651145b611548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153f906141ce565b60405180910390fd5b600086510361158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158390614260565b60405180910390fd5b61159461111e565b865111156115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce906142f2565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811461163257600061162e82610bec565b9050505b600061164543611640610bbd565b612250565b9050600061165a826116556106e6565b612250565b90506003600081548092919061166f90614341565b919050555060006003549050600060046000838152602001908152602001600020905060008160000154146116d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d0906143fb565b60405180910390fd5b818160000181905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600081600201819055508a8160030190805190602001906117479291906124c8565b5089816004019080519060200190611760929190612552565b508881600501908051906020019061177992919061259f565b50878160060190805190602001906117929291906125f8565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0160006101000a81548160ff021916908315150217905550600081600b0160016101000a81548160ff0219169083151502179055508060000154600560008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f6040516118a29998979695949392919061441b565b60405180910390a180600001549550505050505095945050505050565b600460078111156118d3576118d2612f58565b5b6118dc82610bec565b60078111156118ee576118ed612f58565b5b1461192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590614563565b60405180910390fd5b600060046000838152602001908152602001600020905060006119df4260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119da9190613bc6565b612250565b905060005b8260030180549050811015611bc357611bb0836003018281548110611a0c57611a0b614583565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018381548110611a4d57611a4c614583565b5b9060005260206000200154856005018481548110611a6e57611a6d614583565b5b906000526020600020018054611a8390613aee565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaf90613aee565b8015611afc5780601f10611ad157610100808354040283529160200191611afc565b820191906000526020600020905b815481529060010190602001808311611adf57829003601f168201915b5050505050866006018581548110611b1757611b16614583565b5b906000526020600020018054611b2c90613aee565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5890613aee565b8015611ba55780601f10611b7a57610100808354040283529160200191611ba5565b820191906000526020600020905b815481529060010190602001808311611b8857829003601f168201915b505050505086612314565b8080611bbb90614341565b9150506119e4565b508082600201819055507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda28928382604051611bfe9291906145b2565b60405180910390a1505050565b7f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee81565b611c37612651565b60046000848152602001908152602001600020600c0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff161515151581526020016000820160029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905092915050565b60056007811115611d2557611d24612f58565b5b611d2e82610bec565b6007811115611d4057611d3f612f58565b5b14611d80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7790614673565b60405180910390fd5b6000600460008381526020019081526020016000209050600181600b0160016101000a81548160ff02191690831515021790555060005b8160030180549050811015611f465760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f836004018381548110611e1857611e17614583565b5b9060005260206000200154846003018481548110611e3957611e38614583565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16856004018581548110611e7a57611e79614583565b5b9060005260206000200154866005018681548110611e9b57611e9a614583565b5b90600052602060002001876006018781548110611ebb57611eba614583565b5b9060005260206000200188600201546040518763ffffffff1660e01b8152600401611eea9594939291906147c5565b60006040518083038185885af1158015611f08573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f82011682018060405250810190611f329190613a76565b508080611f3e90614341565b915050611db7565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f82604051611f7691906128d8565b60405180910390a15050565b60016007811115611f9657611f95612f58565b5b611f9f83610bec565b6007811115611fb157611fb0612f58565b5b14611ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe890614898565b60405180910390fd5b6000600460008481526020019081526020016000209050600081600c0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600015158160000160009054906101000a900460ff161515146120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c9061492a565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe18785600701546040518363ffffffff1660e01b8152600401612108929190614022565b602060405180830381865afa158015612125573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121499190614077565b9050831561217a5761216d8360090154826bffffffffffffffffffffffff16612250565b836009018190555061219f565b61219683600a0154826bffffffffffffffffffffffff16612250565b83600a01819055505b60018260000160006101000a81548160ff021916908315150217905550838260000160016101000a81548160ff021916908315150217905550808260000160026101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055507f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c4686868684604051612240949392919061497b565b60405180910390a1505050505050565b600080828461225f91906149c0565b9050838110156122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b90614a40565b60405180910390fd5b8091505092915050565b6000804690508091505090565b600082821115612300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f790614aac565b60405180910390fd5b818361230c9190614acc565b905092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2b065378686868686604051602001612369959493929190614b00565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161239b9190612a83565b602060405180830381865afa1580156123b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123dc9190614b76565b1561241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241390614c3b565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90186868686866040518663ffffffff1660e01b815260040161247d959493929190614b00565b6020604051808303816000875af115801561249c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c09190613f63565b505050505050565b828054828255906000526020600020908101928215612541579160200282015b828111156125405782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906124e8565b5b50905061254e9190612684565b5090565b82805482825590600052602060002090810192821561258e579160200282015b8281111561258d578251825591602001919060010190612572565b5b50905061259b9190612684565b5090565b8280548282559060005260206000209081019282156125e7579160200282015b828111156125e65782518290816125d69190614de8565b50916020019190600101906125bf565b5b5090506125f491906126a1565b5090565b828054828255906000526020600020908101928215612640579160200282015b8281111561263f57825182908161262f9190614f00565b5091602001919060010190612618565b5b50905061264d91906126c5565b5090565b604051806060016040528060001515815260200160001515815260200160006bffffffffffffffffffffffff1681525090565b5b8082111561269d576000816000905550600101612685565b5090565b5b808211156126c157600081816126b891906126e9565b506001016126a2565b5090565b5b808211156126e557600081816126dc9190612729565b506001016126c6565b5090565b5080546126f590613aee565b6000825580601f106127075750612726565b601f0160209004906000526020600020908101906127259190612684565b5b50565b50805461273590613aee565b6000825580601f106127475750612766565b601f0160209004906000526020600020908101906127659190612684565b5b50565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6127908161277d565b811461279b57600080fd5b50565b6000813590506127ad81612787565b92915050565b6000602082840312156127c9576127c8612773565b5b60006127d78482850161279e565b91505092915050565b6127e98161277d565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061281a826127ef565b9050919050565b61282a8161280f565b82525050565b60008115159050919050565b61284581612830565b82525050565b600061012082019050612861600083018c6127e0565b61286e602083018b612821565b61287b604083018a6127e0565b61288860608301896127e0565b61289560808301886127e0565b6128a260a08301876127e0565b6128af60c08301866127e0565b6128bc60e083018561283c565b6128ca61010083018461283c565b9a9950505050505050505050565b60006020820190506128ed60008301846127e0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561292d578082015181840152602081019050612912565b60008484015250505050565b6000601f19601f8301169050919050565b6000612955826128f3565b61295f81856128fe565b935061296f81856020860161290f565b61297881612939565b840191505092915050565b6000602082019050818103600083015261299d818461294a565b905092915050565b6129ae81612830565b81146129b957600080fd5b50565b6000813590506129cb816129a5565b92915050565b600080604083850312156129e8576129e7612773565b5b60006129f68582860161279e565b9250506020612a07858286016129bc565b9150509250929050565b612a1a8161280f565b8114612a2557600080fd5b50565b600081359050612a3781612a11565b92915050565b600060208284031215612a5357612a52612773565b5b6000612a6184828501612a28565b91505092915050565b6000819050919050565b612a7d81612a6a565b82525050565b6000602082019050612a986000830184612a74565b92915050565b60008060408385031215612ab557612ab4612773565b5b6000612ac385828601612a28565b9250506020612ad48582860161279e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b138161280f565b82525050565b6000612b258383612b0a565b60208301905092915050565b6000602082019050919050565b6000612b4982612ade565b612b538185612ae9565b9350612b5e83612afa565b8060005b83811015612b8f578151612b768882612b19565b9750612b8183612b31565b925050600181019050612b62565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612bd18161277d565b82525050565b6000612be38383612bc8565b60208301905092915050565b6000602082019050919050565b6000612c0782612b9c565b612c118185612ba7565b9350612c1c83612bb8565b8060005b83811015612c4d578151612c348882612bd7565b9750612c3f83612bef565b925050600181019050612c20565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b6000612ca2826128f3565b612cac8185612c86565b9350612cbc81856020860161290f565b612cc581612939565b840191505092915050565b6000612cdc8383612c97565b905092915050565b6000602082019050919050565b6000612cfc82612c5a565b612d068185612c65565b935083602082028501612d1885612c76565b8060005b85811015612d545784840389528151612d358582612cd0565b9450612d4083612ce4565b925060208a01995050600181019050612d1c565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000612db982612d92565b612dc38185612d9d565b9350612dd381856020860161290f565b612ddc81612939565b840191505092915050565b6000612df38383612dae565b905092915050565b6000602082019050919050565b6000612e1382612d66565b612e1d8185612d71565b935083602082028501612e2f85612d82565b8060005b85811015612e6b5784840389528151612e4c8582612de7565b9450612e5783612dfb565b925060208a01995050600181019050612e33565b50829750879550505050505092915050565b60006080820190508181036000830152612e978187612b3e565b90508181036020830152612eab8186612bfc565b90508181036040830152612ebf8185612cf1565b90508181036060830152612ed38184612e08565b905095945050505050565b6000819050919050565b6000612f03612efe612ef9846127ef565b612ede565b6127ef565b9050919050565b6000612f1582612ee8565b9050919050565b6000612f2782612f0a565b9050919050565b612f3781612f1c565b82525050565b6000602082019050612f526000830184612f2e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60088110612f9857612f97612f58565b5b50565b6000819050612fa982612f87565b919050565b6000612fb982612f9b565b9050919050565b612fc981612fae565b82525050565b6000602082019050612fe46000830184612fc0565b92915050565b6000602082019050612fff6000830184612821565b92915050565b600060ff82169050919050565b61301b81613005565b811461302657600080fd5b50565b60008135905061303881613012565b92915050565b61304781612a6a565b811461305257600080fd5b50565b6000813590506130648161303e565b92915050565b600080600080600060a0868803121561308657613085612773565b5b60006130948882890161279e565b95505060206130a5888289016129bc565b94505060406130b688828901613029565b93505060606130c788828901613055565b92505060806130d888828901613055565b9150509295509295909350565b60006130f082612f0a565b9050919050565b613100816130e5565b82525050565b600060208201905061311b60008301846130f7565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61315e82612939565b810181811067ffffffffffffffff8211171561317d5761317c613126565b5b80604052505050565b6000613190612769565b905061319c8282613155565b919050565b600067ffffffffffffffff8211156131bc576131bb613126565b5b602082029050602081019050919050565b600080fd5b60006131e56131e0846131a1565b613186565b90508083825260208201905060208402830185811115613208576132076131cd565b5b835b81811015613231578061321d8882612a28565b84526020840193505060208101905061320a565b5050509392505050565b600082601f8301126132505761324f613121565b5b81356132608482602086016131d2565b91505092915050565b600067ffffffffffffffff82111561328457613283613126565b5b602082029050602081019050919050565b60006132a86132a384613269565b613186565b905080838252602082019050602084028301858111156132cb576132ca6131cd565b5b835b818110156132f457806132e0888261279e565b8452602084019350506020810190506132cd565b5050509392505050565b600082601f83011261331357613312613121565b5b8135613323848260208601613295565b91505092915050565b600067ffffffffffffffff82111561334757613346613126565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff82111561337857613377613126565b5b61338182612939565b9050602081019050919050565b82818337600083830152505050565b60006133b06133ab8461335d565b613186565b9050828152602081018484840111156133cc576133cb613358565b5b6133d784828561338e565b509392505050565b600082601f8301126133f4576133f3613121565b5b813561340484826020860161339d565b91505092915050565b600061342061341b8461332c565b613186565b90508083825260208201905060208402830185811115613443576134426131cd565b5b835b8181101561348a57803567ffffffffffffffff81111561346857613467613121565b5b80860161347589826133df565b85526020850194505050602081019050613445565b5050509392505050565b600082601f8301126134a9576134a8613121565b5b81356134b984826020860161340d565b91505092915050565b600067ffffffffffffffff8211156134dd576134dc613126565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561350957613508613126565b5b61351282612939565b9050602081019050919050565b600061353261352d846134ee565b613186565b90508281526020810184848401111561354e5761354d613358565b5b61355984828561338e565b509392505050565b600082601f83011261357657613575613121565b5b813561358684826020860161351f565b91505092915050565b60006135a261359d846134c2565b613186565b905080838252602082019050602084028301858111156135c5576135c46131cd565b5b835b8181101561360c57803567ffffffffffffffff8111156135ea576135e9613121565b5b8086016135f78982613561565b855260208501945050506020810190506135c7565b5050509392505050565b600082601f83011261362b5761362a613121565b5b813561363b84826020860161358f565b91505092915050565b600080600080600060a086880312156136605761365f612773565b5b600086013567ffffffffffffffff81111561367e5761367d612778565b5b61368a8882890161323b565b955050602086013567ffffffffffffffff8111156136ab576136aa612778565b5b6136b7888289016132fe565b945050604086013567ffffffffffffffff8111156136d8576136d7612778565b5b6136e488828901613494565b935050606086013567ffffffffffffffff81111561370557613704612778565b5b61371188828901613616565b925050608086013567ffffffffffffffff81111561373257613731612778565b5b61373e888289016133df565b9150509295509295909350565b6000806040838503121561376257613761612773565b5b60006137708582860161279e565b925050602061378185828601612a28565b9150509250929050565b61379481612830565b82525050565b60006bffffffffffffffffffffffff82169050919050565b6137bb8161379a565b82525050565b6060820160008201516137d7600085018261378b565b5060208201516137ea602085018261378b565b5060408201516137fd60408501826137b2565b50505050565b600060608201905061381860008301846137c1565b92915050565b7f476f7665726e6f72416c7068613a3a5f5f6578656375746553657454696d656c60008201527f6f636b50656e64696e6741646d696e3a2073656e646572206d7573742062652060208201527f676f7620677561726469616e0000000000000000000000000000000000000000604082015250565b60006138a0604c836128fe565b91506138ab8261381e565b606082019050919050565b600060208201905081810360008301526138cf81613893565b9050919050565b6000819050919050565b60006138fb6138f66138f1846138d6565b612ede565b61277d565b9050919050565b61390b816138e0565b82525050565b7f73657450656e64696e6741646d696e2861646472657373290000000000000000600082015250565b60006139476018836128fe565b915061395282613911565b602082019050919050565b600082825260208201905092915050565b600061397982612d92565b613983818561395d565b935061399381856020860161290f565b61399c81612939565b840191505092915050565b600060a0820190506139bc6000830187612821565b6139c96020830186613902565b81810360408301526139da8161393a565b905081810360608301526139ee818561396e565b90506139fd60808301846127e0565b95945050505050565b6000613a19613a14846134ee565b613186565b905082815260208101848484011115613a3557613a34613358565b5b613a4084828561290f565b509392505050565b600082601f830112613a5d57613a5c613121565b5b8151613a6d848260208601613a06565b91505092915050565b600060208284031215613a8c57613a8b612773565b5b600082015167ffffffffffffffff811115613aaa57613aa9612778565b5b613ab684828501613a48565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613b0657607f821691505b602082108103613b1957613b18613abf565b5b50919050565b7f476f7665726e6f72416c7068613a3a73746174653a20696e76616c696420707260008201527f6f706f73616c2069640000000000000000000000000000000000000000000000602082015250565b6000613b7b6029836128fe565b9150613b8682613b1f565b604082019050919050565b60006020820190508181036000830152613baa81613b6e565b9050919050565b600081519050613bc081612787565b92915050565b600060208284031215613bdc57613bdb612773565b5b6000613bea84828501613bb1565b91505092915050565b6000608082019050613c086000830187612a74565b613c156020830186612a74565b613c2260408301856127e0565b613c2f6060830184612821565b95945050505050565b6000606082019050613c4d6000830186612a74565b613c5a60208301856127e0565b613c67604083018461283c565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000613cb0600283613c6f565b9150613cbb82613c7a565b600282019050919050565b6000819050919050565b613ce1613cdc82612a6a565b613cc6565b82525050565b6000613cf282613ca3565b9150613cfe8285613cd0565b602082019150613d0e8284613cd0565b6020820191508190509392505050565b613d2781613005565b82525050565b6000608082019050613d426000830187612a74565b613d4f6020830186613d1e565b613d5c6040830185612a74565b613d696060830184612a74565b95945050505050565b7f476f7665726e6f72416c7068613a3a63617374566f746542795369673a20696e60008201527f76616c6964207369676e61747572650000000000000000000000000000000000602082015250565b6000613dce602f836128fe565b9150613dd982613d72565b604082019050919050565b60006020820190508181036000830152613dfd81613dc1565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f61626469636174653a2073656e646560008201527f72206d75737420626520676f7620677561726469616e00000000000000000000602082015250565b6000613e606036836128fe565b9150613e6b82613e04565b604082019050919050565b60006020820190508181036000830152613e8f81613e53565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f717565756553657454696d656c6f6360008201527f6b50656e64696e6741646d696e3a2073656e646572206d75737420626520676f60208201527f7620677561726469616e00000000000000000000000000000000000000000000604082015250565b6000613f18604a836128fe565b9150613f2382613e96565b606082019050919050565b60006020820190508181036000830152613f4781613f0b565b9050919050565b600081519050613f5d8161303e565b92915050565b600060208284031215613f7957613f78612773565b5b6000613f8784828501613f4e565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f5f61636365707441646d696e3a20736560008201527f6e646572206d75737420626520676f7620677561726469616e00000000000000602082015250565b6000613fec6039836128fe565b9150613ff782613f90565b604082019050919050565b6000602082019050818103600083015261401b81613fdf565b9050919050565b60006040820190506140376000830185612821565b61404460208301846127e0565b9392505050565b6140548161379a565b811461405f57600080fd5b50565b6000815190506140718161404b565b92915050565b60006020828403121561408d5761408c612773565b5b600061409b84828501614062565b91505092915050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73657260008201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c6400602082015250565b6000614100603f836128fe565b915061410b826140a4565b604082019050919050565b6000602082019050818103600083015261412f816140f3565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73616c60008201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d60208201527f6174636800000000000000000000000000000000000000000000000000000000604082015250565b60006141b86044836128fe565b91506141c382614136565b606082019050919050565b600060208201905081810360008301526141e7816141ab565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206d7573742070726f60008201527f7669646520616374696f6e730000000000000000000000000000000000000000602082015250565b600061424a602c836128fe565b9150614255826141ee565b604082019050919050565b600060208201905081810360008301526142798161423d565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a20746f6f206d616e7960008201527f20616374696f6e73000000000000000000000000000000000000000000000000602082015250565b60006142dc6028836128fe565b91506142e782614280565b604082019050919050565b6000602082019050818103600083015261430b816142cf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061434c8261277d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361437e5761437d614312565b5b600182019050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2050726f706f73616c60008201527f494420636f6c6c73696f6e000000000000000000000000000000000000000000602082015250565b60006143e5602b836128fe565b91506143f082614389565b604082019050919050565b60006020820190508181036000830152614414816143d8565b9050919050565b600061012082019050614431600083018c6127e0565b61443e602083018b612821565b8181036040830152614450818a612b3e565b905081810360608301526144648189612bfc565b905081810360808301526144788188612cf1565b905081810360a083015261448c8187612e08565b905061449b60c08301866127e0565b6144a860e08301856127e0565b8181036101008301526144bb818461294a565b90509a9950505050505050505050565b7f476f7665726e6f72416c7068613a3a71756575653a2070726f706f73616c206360008201527f616e206f6e6c792062652071756575656420696620697420697320737563636560208201527f6564656400000000000000000000000000000000000000000000000000000000604082015250565b600061454d6044836128fe565b9150614558826144cb565b606082019050919050565b6000602082019050818103600083015261457c81614540565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006040820190506145c760008301856127e0565b6145d460208301846127e0565b9392505050565b7f476f7665726e6f72416c7068613a3a657865637574653a2070726f706f73616c60008201527f2063616e206f6e6c79206265206578656375746564206966206974206973207160208201527f7565756564000000000000000000000000000000000000000000000000000000604082015250565b600061465d6045836128fe565b9150614668826145db565b606082019050919050565b6000602082019050818103600083015261468c81614650565b9050919050565b60008190508160005260206000209050919050565b600081546146b581613aee565b6146bf81866128fe565b945060018216600081146146da57600181146146f057614723565b60ff198316865281151560200286019350614723565b6146f985614693565b60005b8381101561471b578154818901526001820191506020810190506146fc565b808801955050505b50505092915050565b60008190508160005260206000209050919050565b6000815461474e81613aee565b614758818661395d565b945060018216600081146147735760018114614789576147bc565b60ff1983168652811515602002860193506147bc565b6147928561472c565b60005b838110156147b457815481890152600182019150602081019050614795565b808801955050505b50505092915050565b600060a0820190506147da6000830188612821565b6147e760208301876127e0565b81810360408301526147f981866146a8565b9050818103606083015261480d8185614741565b905061481c60808301846127e0565b9695505050505050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f74696e6760008201527f20697320636c6f73656400000000000000000000000000000000000000000000602082015250565b6000614882602a836128fe565b915061488d82614826565b604082019050919050565b600060208201905081810360008301526148b181614875565b9050919050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f7465722060008201527f616c726561647920766f74656400000000000000000000000000000000000000602082015250565b6000614914602d836128fe565b915061491f826148b8565b604082019050919050565b6000602082019050818103600083015261494381614907565b9050919050565b600061496561496061495b8461379a565b612ede565b61277d565b9050919050565b6149758161494a565b82525050565b60006080820190506149906000830187612821565b61499d60208301866127e0565b6149aa604083018561283c565b6149b7606083018461496c565b95945050505050565b60006149cb8261277d565b91506149d68361277d565b92508282019050808211156149ee576149ed614312565b5b92915050565b7f6164646974696f6e206f766572666c6f77000000000000000000000000000000600082015250565b6000614a2a6011836128fe565b9150614a35826149f4565b602082019050919050565b60006020820190508181036000830152614a5981614a1d565b9050919050565b7f7375627472616374696f6e20756e646572666c6f770000000000000000000000600082015250565b6000614a966015836128fe565b9150614aa182614a60565b602082019050919050565b60006020820190508181036000830152614ac581614a89565b9050919050565b6000614ad78261277d565b9150614ae28361277d565b9250828203905081811115614afa57614af9614312565b5b92915050565b600060a082019050614b156000830188612821565b614b2260208301876127e0565b8181036040830152614b34818661294a565b90508181036060830152614b48818561396e565b9050614b5760808301846127e0565b9695505050505050565b600081519050614b70816129a5565b92915050565b600060208284031215614b8c57614b8b612773565b5b6000614b9a84828501614b61565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f71756575654f725265766572743a207060008201527f726f706f73616c20616374696f6e20616c72656164792071756575656420617460208201527f2065746100000000000000000000000000000000000000000000000000000000604082015250565b6000614c256044836128fe565b9150614c3082614ba3565b606082019050919050565b60006020820190508181036000830152614c5481614c18565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302614ca87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614c6b565b614cb28683614c6b565b95508019841693508086168417925050509392505050565b6000614ce5614ce0614cdb8461277d565b612ede565b61277d565b9050919050565b6000819050919050565b614cff83614cca565b614d13614d0b82614cec565b848454614c78565b825550505050565b600090565b614d28614d1b565b614d33818484614cf6565b505050565b5b81811015614d5757614d4c600082614d20565b600181019050614d39565b5050565b601f821115614d9c57614d6d81614693565b614d7684614c5b565b81016020851015614d85578190505b614d99614d9185614c5b565b830182614d38565b50505b505050565b600082821c905092915050565b6000614dbf60001984600802614da1565b1980831691505092915050565b6000614dd88383614dae565b9150826002028217905092915050565b614df1826128f3565b67ffffffffffffffff811115614e0a57614e09613126565b5b614e148254613aee565b614e1f828285614d5b565b600060209050601f831160018114614e525760008415614e40578287015190505b614e4a8582614dcc565b865550614eb2565b601f198416614e6086614693565b60005b82811015614e8857848901518255600182019150602085019450602081019050614e63565b86831015614ea55784890151614ea1601f891682614dae565b8355505b6001600288020188555050505b505050505050565b601f821115614efb57614ecc8161472c565b614ed584614c5b565b81016020851015614ee4578190505b614ef8614ef085614c5b565b830182614d38565b50505b505050565b614f0982612d92565b67ffffffffffffffff811115614f2257614f21613126565b5b614f2c8254613aee565b614f37828285614eba565b600060209050601f831160018114614f6a5760008415614f58578287015190505b614f628582614dcc565b865550614fca565b601f198416614f788661472c565b60005b82811015614fa057848901518255600182019150602085019450602081019050614f7b565b86831015614fbd5784890151614fb9601f891682614dae565b8355505b6001600288020188555050505b50505050505056fea264697066735822122060e6d318798bfaf63acbc56e9788b1e0bfef404eb7adaf705254ee25fd4fedb364736f6c63430008120033