Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Sponsored
Latest 25 from a total of 99 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Log Election | 13930972 | 636 days 12 hrs ago | IN | 0 ETH | 0.53093571 | ||||
Log Election | 13930972 | 636 days 12 hrs ago | IN | 0 ETH | 0.51860672 | ||||
Log Election | 13930971 | 636 days 12 hrs ago | IN | 0 ETH | 0.5298139 | ||||
Log Proposal | 13918238 | 638 days 11 hrs ago | IN | 0 ETH | 0.0117278 | ||||
Log Proposal | 13878496 | 644 days 15 hrs ago | IN | 0 ETH | 0.01522564 | ||||
Log Proposal | 13859695 | 647 days 13 hrs ago | IN | 0 ETH | 0.01196405 | ||||
Dilute | 13855649 | 648 days 4 hrs ago | IN | 0 ETH | 0.01506136 | ||||
Log Proposal | 13846971 | 649 days 12 hrs ago | IN | 0 ETH | 0.01122886 | ||||
Log Proposal | 13808007 | 655 days 13 hrs ago | IN | 0 ETH | 0.01407359 | ||||
Log Proposal | 13806151 | 655 days 20 hrs ago | IN | 0 ETH | 0.01784956 | ||||
Log Proposal | 13805707 | 655 days 21 hrs ago | IN | 0 ETH | 0.02200612 | ||||
Log Proposal | 13799716 | 656 days 20 hrs ago | IN | 0 ETH | 0.02538061 | ||||
Log Proposal | 13799690 | 656 days 20 hrs ago | IN | 0 ETH | 0.01715189 | ||||
Log Proposal | 13772826 | 660 days 23 hrs ago | IN | 0 ETH | 0.02059863 | ||||
Log Proposal | 13763603 | 662 days 11 hrs ago | IN | 0 ETH | 0.01475354 | ||||
Log Proposal | 13732312 | 667 days 11 hrs ago | IN | 0 ETH | 0.01616028 | ||||
Log Proposal | 13717707 | 669 days 19 hrs ago | IN | 0 ETH | 0.02338933 | ||||
Log Proposal | 13717707 | 669 days 19 hrs ago | IN | 0 ETH | 0.02338933 | ||||
Log Proposal | 13682644 | 675 days 9 hrs ago | IN | 0 ETH | 0.0254804 | ||||
Log Proposal | 13682634 | 675 days 9 hrs ago | IN | 0 ETH | 0.02425714 | ||||
Log Proposal | 13673394 | 676 days 21 hrs ago | IN | 0 ETH | 0.02758582 | ||||
Log Proposal | 13672772 | 676 days 23 hrs ago | IN | 0 ETH | 0.02481016 | ||||
Log Proposal | 13669421 | 677 days 12 hrs ago | IN | 0 ETH | 0.0243959 | ||||
Log Proposal | 13666035 | 678 days 55 mins ago | IN | 0 ETH | 0.02298512 | ||||
Log Proposal | 13634628 | 683 days 37 mins ago | IN | 0 ETH | 0.03799892 |
Loading...
Loading
Contract Name:
CouncilDilution
Compiler Version
v0.5.16+commit.9c3226ce
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// File contracts/Owned.sol pragma solidity ^0.5.16; // https://docs.synthetix.io/contracts/source/contracts/owned contract Owned { address public owner; address public nominatedOwner; constructor(address _owner) public { require(_owner != address(0), "Owner address cannot be 0"); owner = _owner; emit OwnerChanged(address(0), _owner); } function nominateNewOwner(address _owner) external onlyOwner { nominatedOwner = _owner; emit OwnerNominated(_owner); } function acceptOwnership() external { require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); emit OwnerChanged(owner, nominatedOwner); owner = nominatedOwner; nominatedOwner = address(0); } modifier onlyOwner { _onlyOwner(); _; } function _onlyOwner() private view { require(msg.sender == owner, "Only the contract owner may perform this action"); } event OwnerNominated(address newOwner); event OwnerChanged(address oldOwner, address newOwner); } // File @openzeppelin/contracts/math/[email protected] pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File contracts/SafeDecimalMath.sol pragma solidity ^0.5.16; // Libraries // https://docs.synthetix.io/contracts/source/libraries/safedecimalmath library SafeDecimalMath { using SafeMath for uint; /* Number of decimal places in the representations. */ uint8 public constant decimals = 18; uint8 public constant highPrecisionDecimals = 27; /* The number representing 1.0. */ uint public constant UNIT = 10**uint(decimals); /* The number representing 1.0 for higher fidelity numbers. */ uint public constant PRECISE_UNIT = 10**uint(highPrecisionDecimals); uint private constant UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR = 10**uint(highPrecisionDecimals - decimals); /** * @return Provides an interface to UNIT. */ function unit() external pure returns (uint) { return UNIT; } /** * @return Provides an interface to PRECISE_UNIT. */ function preciseUnit() external pure returns (uint) { return PRECISE_UNIT; } /** * @return The result of multiplying x and y, interpreting the operands as fixed-point * decimals. * * @dev A unit factor is divided out after the product of x and y is evaluated, * so that product must be less than 2**256. As this is an integer division, * the internal division always rounds down. This helps save on gas. Rounding * is more expensive on gas. */ function multiplyDecimal(uint x, uint y) internal pure returns (uint) { /* Divide by UNIT to remove the extra factor introduced by the product. */ return x.mul(y) / UNIT; } /** * @return The result of safely multiplying x and y, interpreting the operands * as fixed-point decimals of the specified precision unit. * * @dev The operands should be in the form of a the specified unit factor which will be * divided out after the product of x and y is evaluated, so that product must be * less than 2**256. * * Unlike multiplyDecimal, this function rounds the result to the nearest increment. * Rounding is useful when you need to retain fidelity for small decimal numbers * (eg. small fractions or percentages). */ function _multiplyDecimalRound( uint x, uint y, uint precisionUnit ) private pure returns (uint) { /* Divide by UNIT to remove the extra factor introduced by the product. */ uint quotientTimesTen = x.mul(y) / (precisionUnit / 10); if (quotientTimesTen % 10 >= 5) { quotientTimesTen += 10; } return quotientTimesTen / 10; } /** * @return The result of safely multiplying x and y, interpreting the operands * as fixed-point decimals of a precise unit. * * @dev The operands should be in the precise unit factor which will be * divided out after the product of x and y is evaluated, so that product must be * less than 2**256. * * Unlike multiplyDecimal, this function rounds the result to the nearest increment. * Rounding is useful when you need to retain fidelity for small decimal numbers * (eg. small fractions or percentages). */ function multiplyDecimalRoundPrecise(uint x, uint y) internal pure returns (uint) { return _multiplyDecimalRound(x, y, PRECISE_UNIT); } /** * @return The result of safely multiplying x and y, interpreting the operands * as fixed-point decimals of a standard unit. * * @dev The operands should be in the standard unit factor which will be * divided out after the product of x and y is evaluated, so that product must be * less than 2**256. * * Unlike multiplyDecimal, this function rounds the result to the nearest increment. * Rounding is useful when you need to retain fidelity for small decimal numbers * (eg. small fractions or percentages). */ function multiplyDecimalRound(uint x, uint y) internal pure returns (uint) { return _multiplyDecimalRound(x, y, UNIT); } /** * @return The result of safely dividing x and y. The return value is a high * precision decimal. * * @dev y is divided after the product of x and the standard precision unit * is evaluated, so the product of x and UNIT must be less than 2**256. As * this is an integer division, the result is always rounded down. * This helps save on gas. Rounding is more expensive on gas. */ function divideDecimal(uint x, uint y) internal pure returns (uint) { /* Reintroduce the UNIT factor that will be divided out by y. */ return x.mul(UNIT).div(y); } /** * @return The result of safely dividing x and y. The return value is as a rounded * decimal in the precision unit specified in the parameter. * * @dev y is divided after the product of x and the specified precision unit * is evaluated, so the product of x and the specified precision unit must * be less than 2**256. The result is rounded to the nearest increment. */ function _divideDecimalRound( uint x, uint y, uint precisionUnit ) private pure returns (uint) { uint resultTimesTen = x.mul(precisionUnit * 10).div(y); if (resultTimesTen % 10 >= 5) { resultTimesTen += 10; } return resultTimesTen / 10; } /** * @return The result of safely dividing x and y. The return value is as a rounded * standard precision decimal. * * @dev y is divided after the product of x and the standard precision unit * is evaluated, so the product of x and the standard precision unit must * be less than 2**256. The result is rounded to the nearest increment. */ function divideDecimalRound(uint x, uint y) internal pure returns (uint) { return _divideDecimalRound(x, y, UNIT); } /** * @return The result of safely dividing x and y. The return value is as a rounded * high precision decimal. * * @dev y is divided after the product of x and the high precision unit * is evaluated, so the product of x and the high precision unit must * be less than 2**256. The result is rounded to the nearest increment. */ function divideDecimalRoundPrecise(uint x, uint y) internal pure returns (uint) { return _divideDecimalRound(x, y, PRECISE_UNIT); } /** * @dev Convert a standard decimal representation to a high precision one. */ function decimalToPreciseDecimal(uint i) internal pure returns (uint) { return i.mul(UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR); } /** * @dev Convert a high precision decimal to a standard decimal representation. */ function preciseDecimalToDecimal(uint i) internal pure returns (uint) { uint quotientTimesTen = i / (UNIT_TO_HIGH_PRECISION_CONVERSION_FACTOR / 10); if (quotientTimesTen % 10 >= 5) { quotientTimesTen += 10; } return quotientTimesTen / 10; } } // File contracts/CouncilDilution.sol //SPDX-License-Identifier: Unlicense pragma solidity ^0.5.16; pragma experimental ABIEncoderV2; /** @title A contract that allows for the dilution of Spartan Council voting weights @author @andytcf */ contract CouncilDilution is Owned { using SafeDecimalMath for uint; /* SCCP configurable values */ // @notice How many seats on the Spartan Council uint public numOfSeats; // @notice The length of a proposal (SCCP/SIP) voting period uint public proposalPeriod; /* Global variables */ // @notice The ipfs hash of the latest Spartan Council election proposal string public latestElectionHash; struct ElectionLog { // @notice The ipfs hash of a particular Spartan Council election proposal string electionHash; // @notice A mapping of the votes allocated to each of the Spartan Council members mapping(address => uint) votesForMember; // @notice A mapping to check whether an address was an elected Council member in this election mapping(address => bool) councilMembers; // @notice The timestamp which the election log was stored uint created; } struct ProposalLog { // @notice The ipfs hash of a particular SCCP/SIP proposal string proposalHash; // @notice The election hash of the current epoch when the proposal was made string electionHash; // @notice The timestamp which the voting period begins uint start; // @notice The timestamp which the voting period of the proposal ends uint end; // @notice A boolean value to check whether a proposal log exists bool exist; } struct DilutionReceipt { // @notice The ipfs hash of the proposal which the dilution happened on string proposalHash; // @notice The address of the council member diluted address memberDiluted; // @notice The total amount in which the council member was diluted by uint totalDilutionValue; // @notice A list of dilutors address[] dilutors; // @notice A mapping to show the value of dilution per dilutor mapping(address => uint) voterDilutions; // @notice A flag value to check whether a dilution exist bool exist; } // @notice Given a election hash, return the ElectionLog struct associated mapping(string => ElectionLog) public electionHashToLog; // @notice Given a voter address and a council member address, return the delegated vote weight for the most recent Spartan Council election mapping(address => mapping(address => uint)) public latestDelegatedVoteWeight; // @notice Given a council member address, return the total delegated vote weight for the most recent Spartan Council election mapping(address => uint) public latestVotingWeight; // @notice Given a propoal hash and a voting address, find out the member the user has voted for mapping(string => mapping(address => address)) public electionMemberVotedFor; // @notice Given a proposal hash and a voting address, find if a member has diluted mapping(string => mapping(address => bool)) public hasAddressDilutedForProposal; // @notice Given a proposal hash (SCCP/SIP), return the ProposalLog struct associated mapping(string => ProposalLog) public proposalHashToLog; // @notice Given a proposal hash and a council member, return the DilutionReceipt if it exists mapping(string => mapping(address => DilutionReceipt)) public proposalHashToMemberDilution; /* Events */ // @notice An event emitted when a new ElectionLog is created event ElectionLogged( string electionHash, address[] nominatedCouncilMembers, address[] voters, address[] nomineesVotedFor, uint[] assignedVoteWeights ); // @notice An event emitted when a new ProposalLog is created event ProposalLogged(string proposalHash, string electionHash, uint start, uint end); // @notice An event emitted when a new DilutionReceipt is created event DilutionCreated( string proposalHash, address memberDiluted, uint totalDilutionValueBefore, uint totalDilutionValueAfter ); // @notice An event emitted when a DilutionReceipt is modified event DilutionModified( string proposalHash, address memberDiluted, uint totalDilutionValueBefore, uint totalDilutionValueAfter ); // @notice An event emitted when the number of council seats is modified event SeatsModified(uint previousNumberOfSeats, uint newNumberOfSeats); // @notice An event emitted when the proposal period is modified event ProposalPeriodModified(uint previousProposalPeriod, uint newProposalPeriod); /* */ // @notice Initialises the contract with a X number of council seats and a proposal period of 3 days constructor(uint _numOfSeats) public Owned(msg.sender) { numOfSeats = _numOfSeats; proposalPeriod = 3 days; } /* Mutative Functions */ /** @notice A function to create a new ElectionLog, this is called to record the result of a Spartan Council election @param electionHash The ipfs hash of the Spartan Council election proposal to log @param nominatedCouncilMembers The array of the successful Spartan Council nominees addresses, must be the same length as the numOfSeats @param voters An ordered array of all the voter's addresses corresponding to `nomineesVotedFor`, `assignedVoteWeights` @param nomineesVotedFor An ordered array of all the nominee address that received votes corresponding to `voters`, `assignedVoteWeights` @param assignedVoteWeights An ordered array of the voting weights corresponding to `voters`, `nomineesVotedFor` @return electionHash */ function logElection( string memory electionHash, address[] memory nominatedCouncilMembers, address[] memory voters, address[] memory nomineesVotedFor, uint[] memory assignedVoteWeights ) public onlyOwner() returns (string memory) { require(bytes(electionHash).length > 0, "empty election hash provided"); require(voters.length > 0, "empty voters array provided"); require(nomineesVotedFor.length > 0, "empty nomineesVotedFor array provided"); require(assignedVoteWeights.length > 0, "empty assignedVoteWeights array provided"); require(nominatedCouncilMembers.length == numOfSeats, "invalid number of council members"); ElectionLog memory newElectionLog = ElectionLog(electionHash, now); electionHashToLog[electionHash] = newElectionLog; // store the voting history for calculating the allocated voting weights for (uint i = 0; i < voters.length; i++) { latestDelegatedVoteWeight[voters[i]][nomineesVotedFor[i]] = assignedVoteWeights[i]; latestVotingWeight[nomineesVotedFor[i]] = latestVotingWeight[nomineesVotedFor[i]] + assignedVoteWeights[i]; electionMemberVotedFor[electionHash][voters[i]] = nomineesVotedFor[i]; } // store the total weight of each successful council member for (uint j = 0; j < nominatedCouncilMembers.length; j++) { electionHashToLog[electionHash].votesForMember[nominatedCouncilMembers[j]] = latestVotingWeight[ nominatedCouncilMembers[j] ]; electionHashToLog[electionHash].councilMembers[nominatedCouncilMembers[j]] = true; } latestElectionHash = electionHash; emit ElectionLogged(electionHash, nominatedCouncilMembers, voters, nomineesVotedFor, assignedVoteWeights); return electionHash; } /** @notice A function to created a new ProposalLog, this is called to record SCCP/SIPS created and allow for dilution to occur per proposal. @param proposalHash the ipfs hash of the proposal to be logged @return proposalHash */ function logProposal(string memory proposalHash) public returns (string memory) { require(!proposalHashToLog[proposalHash].exist, "proposal hash is not unique"); require(bytes(proposalHash).length > 0, "proposal hash must not be empty"); uint start = now; uint end = start + proposalPeriod; ProposalLog memory newProposalLog = ProposalLog(proposalHash, latestElectionHash, start, end, true); proposalHashToLog[proposalHash] = newProposalLog; emit ProposalLogged(proposalHash, latestElectionHash, start, end); return proposalHash; } /** @notice A function to dilute a council member's voting weight for a particular proposal @param proposalHash the ipfs hash of the proposal to be logged @param memberToDilute the address of the member to dilute */ function dilute(string memory proposalHash, address memberToDilute) public { require(memberToDilute != address(0), "member to dilute must be a valid address"); require( electionHashToLog[latestElectionHash].councilMembers[memberToDilute], "member to dilute must be a nominated council member" ); require(proposalHashToLog[proposalHash].exist, "proposal does not exist"); require( latestDelegatedVoteWeight[msg.sender][memberToDilute] > 0, "sender has not delegated voting weight for member" ); require(now < proposalHashToLog[proposalHash].end, "dilution can only occur within the proposal voting period"); require(hasAddressDilutedForProposal[proposalHash][msg.sender] == false, "sender has already diluted"); if (proposalHashToMemberDilution[proposalHash][memberToDilute].exist) { DilutionReceipt storage receipt = proposalHashToMemberDilution[proposalHash][memberToDilute]; uint originalTotalDilutionValue = receipt.totalDilutionValue; receipt.dilutors.push(msg.sender); receipt.voterDilutions[msg.sender] = latestDelegatedVoteWeight[msg.sender][memberToDilute]; receipt.totalDilutionValue = receipt.totalDilutionValue + latestDelegatedVoteWeight[msg.sender][memberToDilute]; hasAddressDilutedForProposal[proposalHash][msg.sender] = true; emit DilutionCreated( proposalHash, receipt.memberDiluted, originalTotalDilutionValue, receipt.totalDilutionValue ); } else { address[] memory dilutors; DilutionReceipt memory newDilutionReceipt = DilutionReceipt(proposalHash, memberToDilute, 0, dilutors, true); proposalHashToMemberDilution[proposalHash][memberToDilute] = newDilutionReceipt; uint originalTotalDilutionValue = proposalHashToMemberDilution[proposalHash][memberToDilute].totalDilutionValue; proposalHashToMemberDilution[proposalHash][memberToDilute].dilutors.push(msg.sender); proposalHashToMemberDilution[proposalHash][memberToDilute].voterDilutions[ msg.sender ] = latestDelegatedVoteWeight[msg.sender][memberToDilute]; proposalHashToMemberDilution[proposalHash][memberToDilute].totalDilutionValue = latestDelegatedVoteWeight[ msg.sender ][memberToDilute]; hasAddressDilutedForProposal[proposalHash][msg.sender] = true; emit DilutionCreated( proposalHash, memberToDilute, originalTotalDilutionValue, proposalHashToMemberDilution[proposalHash][memberToDilute].totalDilutionValue ); } } /** @notice A function that allows a voter to undo a dilution @param proposalHash the ipfs hash of the proposal to be logged @param memberToUndilute the address of the member to undilute */ function invalidateDilution(string memory proposalHash, address memberToUndilute) public { require(memberToUndilute != address(0), "member to undilute must be a valid address"); require(proposalHashToLog[proposalHash].exist, "proposal does not exist"); require( proposalHashToMemberDilution[proposalHash][memberToUndilute].exist, "dilution receipt does not exist for this member and proposal hash" ); require( proposalHashToMemberDilution[proposalHash][memberToUndilute].voterDilutions[msg.sender] > 0 && hasAddressDilutedForProposal[proposalHash][msg.sender] == true, "voter has no dilution weight" ); require(now < proposalHashToLog[proposalHash].end, "undo dilution can only occur within the proposal voting period"); address caller = msg.sender; DilutionReceipt storage receipt = proposalHashToMemberDilution[proposalHash][memberToUndilute]; uint originalTotalDilutionValue = receipt.totalDilutionValue; uint voterDilutionValue = receipt.voterDilutions[msg.sender]; hasAddressDilutedForProposal[proposalHash][msg.sender] = false; for (uint i = 0; i < receipt.dilutors.length; i++) { if (receipt.dilutors[i] == caller) { receipt.dilutors[i] = receipt.dilutors[receipt.dilutors.length - 1]; break; } } receipt.dilutors.pop(); receipt.voterDilutions[msg.sender] = 0; receipt.totalDilutionValue = receipt.totalDilutionValue - voterDilutionValue; emit DilutionModified(proposalHash, receipt.memberDiluted, originalTotalDilutionValue, receipt.totalDilutionValue); } /* Views */ /** @notice A view function that checks which proposalHashes exist on the contract and return them @param proposalHashes a array of hashes to check validity against @return a array with elements either empty or with the valid proposal hash */ function getValidProposals(string[] memory proposalHashes) public view returns (string[] memory) { string[] memory validHashes = new string[](proposalHashes.length); for (uint i = 0; i < proposalHashes.length; i++) { string memory proposalHash = proposalHashes[i]; if (proposalHashToLog[proposalHash].exist) { validHashes[i] = (proposalHashToLog[proposalHash].proposalHash); } } return validHashes; } /** @notice A view function that calculates the council member voting weight for a proposal after any dilution penalties @param proposalHash the ipfs hash of the proposal to check dilution against @param councilMember the council member to check diluted weight for @return the calculated diluted ratio (1e18) */ function getDilutedWeightForProposal(string memory proposalHash, address councilMember) public view returns (uint) { require(proposalHashToLog[proposalHash].exist, "proposal does not exist"); string memory electionHash = proposalHashToLog[proposalHash].electionHash; require(electionHashToLog[electionHash].councilMembers[councilMember], "address must be a nominated council member"); uint originalWeight = electionHashToLog[electionHash].votesForMember[councilMember]; uint penaltyValue = proposalHashToMemberDilution[proposalHash][councilMember].totalDilutionValue; return (originalWeight - penaltyValue).divideDecimal(originalWeight); } /** @notice A view helper function to get the dilutors for a particular DilutionReceipt @param proposalHash the ipfs hash of the proposal to get the dilution receipt for @param memberDiluted the council member to get the dilution array for @return a list of the voters addresses who have diluted this member for this proposal */ function getDilutorsForDilutionReceipt(string memory proposalHash, address memberDiluted) public view returns (address[] memory) { return proposalHashToMemberDilution[proposalHash][memberDiluted].dilutors; } /** @notice A view helper function to get the weighting of a voter's dilution for a DilutionReceipt @param proposalHash the ipfs hash of the proposal to get the dilution receipt for @param memberDiluted the council member to check dilution weighting against @param voter the voter address to get the dilution weighting for @return the dilution weight of the voter, for a specific proposal and council member */ function getVoterDilutionWeightingForDilutionReceipt( string memory proposalHash, address memberDiluted, address voter ) public view returns (uint) { return proposalHashToMemberDilution[proposalHash][memberDiluted].voterDilutions[voter]; } /* Restricted Functions */ /** @notice A function that can only be called by the OWNER that changes the number of seats on the Spartan Council @param _numOfSeats the number of seats to set the numOfSeats to */ function modifySeats(uint _numOfSeats) public onlyOwner() { require(_numOfSeats > 0, "number of seats must be greater than zero"); uint oldNumOfSeats = numOfSeats; numOfSeats = _numOfSeats; emit SeatsModified(oldNumOfSeats, numOfSeats); } /** @notice A function that can only be called by the owner that changes the proposal voting period length @param _proposalPeriod the proposal perod in seconds, to set the proposalPeriod variable to */ function modifyProposalPeriod(uint _proposalPeriod) public onlyOwner() { uint oldProposalPeriod = proposalPeriod; proposalPeriod = _proposalPeriod; emit ProposalPeriodModified(oldProposalPeriod, proposalPeriod); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_numOfSeats","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"proposalHash","type":"string"},{"indexed":false,"internalType":"address","name":"memberDiluted","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDilutionValueBefore","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDilutionValueAfter","type":"uint256"}],"name":"DilutionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"proposalHash","type":"string"},{"indexed":false,"internalType":"address","name":"memberDiluted","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalDilutionValueBefore","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDilutionValueAfter","type":"uint256"}],"name":"DilutionModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"electionHash","type":"string"},{"indexed":false,"internalType":"address[]","name":"nominatedCouncilMembers","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"voters","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"nomineesVotedFor","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"assignedVoteWeights","type":"uint256[]"}],"name":"ElectionLogged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"proposalHash","type":"string"},{"indexed":false,"internalType":"string","name":"electionHash","type":"string"},{"indexed":false,"internalType":"uint256","name":"start","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"end","type":"uint256"}],"name":"ProposalLogged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousProposalPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newProposalPeriod","type":"uint256"}],"name":"ProposalPeriodModified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousNumberOfSeats","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newNumberOfSeats","type":"uint256"}],"name":"SeatsModified","type":"event"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"memberToDilute","type":"address"}],"name":"dilute","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"electionHashToLog","outputs":[{"internalType":"string","name":"electionHash","type":"string"},{"internalType":"uint256","name":"created","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"electionMemberVotedFor","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"councilMember","type":"address"}],"name":"getDilutedWeightForProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"memberDiluted","type":"address"}],"name":"getDilutorsForDilutionReceipt","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string[]","name":"proposalHashes","type":"string[]"}],"name":"getValidProposals","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"memberDiluted","type":"address"},{"internalType":"address","name":"voter","type":"address"}],"name":"getVoterDilutionWeightingForDilutionReceipt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"hasAddressDilutedForProposal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"memberToUndilute","type":"address"}],"name":"invalidateDilution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"latestDelegatedVoteWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"latestElectionHash","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestVotingWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"electionHash","type":"string"},{"internalType":"address[]","name":"nominatedCouncilMembers","type":"address[]"},{"internalType":"address[]","name":"voters","type":"address[]"},{"internalType":"address[]","name":"nomineesVotedFor","type":"address[]"},{"internalType":"uint256[]","name":"assignedVoteWeights","type":"uint256[]"}],"name":"logElection","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"proposalHash","type":"string"}],"name":"logProposal","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_proposalPeriod","type":"uint256"}],"name":"modifyProposalPeriod","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_numOfSeats","type":"uint256"}],"name":"modifySeats","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nominateNewOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numOfSeats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"proposalHashToLog","outputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"string","name":"electionHash","type":"string"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"bool","name":"exist","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"}],"name":"proposalHashToMemberDilution","outputs":[{"internalType":"string","name":"proposalHash","type":"string"},{"internalType":"address","name":"memberDiluted","type":"address"},{"internalType":"uint256","name":"totalDilutionValue","type":"uint256"},{"internalType":"bool","name":"exist","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposalPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200502138038062005021833981810160405262000037919081019062000157565b33600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000a29062000214565b60405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6000826040516200011f929190620001e7565b60405180910390a150806002819055506203f48060038190555050620002db565b6000815190506200015181620002c1565b92915050565b6000602082840312156200016a57600080fd5b60006200017a8482850162000140565b91505092915050565b6200018e8162000285565b82525050565b6200019f8162000247565b82525050565b6000620001b460198362000236565b91507f4f776e657220616464726573732063616e6e6f742062652030000000000000006000830152602082019050919050565b6000604082019050620001fe600083018562000183565b6200020d602083018462000194565b9392505050565b600060208201905081810360008301526200022f81620001a5565b9050919050565b600082825260208201905092915050565b600062000254826200025b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000620002928262000299565b9050919050565b6000620002a682620002ad565b9050919050565b6000620002ba826200025b565b9050919050565b620002cc816200027b565b8114620002d857600080fd5b50565b614d3680620002eb6000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c806379ba5097116100c3578063b71860f71161007c578063b71860f714610406578063bd5ebdd614610436578063d030dd2414610454578063d564bc8614610484578063f5a9a63a146104a0578063fded1505146104d157610158565b806379ba5097146103325780637f3aa6c81461033c5780638849891d146103585780638da5cb5b146103885780639eb269f7146103a6578063a736cc11146103d657610158565b80632c103c79116101155780632c103c791461024357806343d2d8b714610261578063526577ff1461027d57806353a47bb7146102b0578063624f3abe146102ce578063761409a6146102fe57610158565b80631627540c1461015d5780631dc0ffbc146101795780632816ee6a146101a957806328389be2146101d9578063283f4172146102095780632a36aef214610225575b600080fd5b61017760048036036101729190810190613537565b610501565b005b610193600480360361018e919081019061365f565b610584565b6040516101a091906149e6565b60405180910390f35b6101c360048036036101be9190810190613537565b610843565b6040516101d091906149e6565b60405180910390f35b6101f360048036036101ee9190810190613560565b61085b565b60405161020091906149e6565b60405180910390f35b610223600480360361021e919081019061385d565b610880565b005b61022d6108d5565b60405161023a91906149e6565b60405180910390f35b61024b6108db565b60405161025891906149e6565b60405180910390f35b61027b6004803603610276919081019061365f565b6108e1565b005b61029760048036036102929190810190613809565b610f7f565b6040516102a79493929190614649565b60405180910390f35b6102b8611097565b6040516102c5919061444d565b60405180910390f35b6102e860048036036102e3919081019061361e565b6110bd565b6040516102f59190614512565b60405180910390f35b610318600480360361031391908101906135dd565b611327565b604051610329959493929190614695565b60405180910390f35b61033a6114b0565b005b6103566004803603610351919081019061385d565b611662565b005b610372600480360361036d919081019061371a565b6116fa565b60405161037f9190614512565b60405180910390f35b610390611ce8565b60405161039d919061444d565b60405180910390f35b6103c060048036036103bb9190810190613809565b611d0d565b6040516103cd919061444d565b60405180910390f35b6103f060048036036103eb9190810190613809565b611d65565b6040516103fd91906144d5565b60405180910390f35b610420600480360361041b919081019061365f565b611daa565b60405161042d9190614491565b60405180910390f35b61043e611e97565b60405161044b91906144f0565b60405180910390f35b61046e600480360361046991908101906136b3565b611f35565b60405161047b91906149e6565b60405180910390f35b61049e6004803603610499919081019061365f565b611fdc565b005b6104ba60048036036104b591908101906135dd565b612c33565b6040516104c89291906146f6565b60405180910390f35b6104eb60048036036104e6919081019061359c565b612d05565b6040516104f891906144b3565b60405180910390f35b610509612e85565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2281604051610579919061444d565b60405180910390a150565b6000600a83604051610596919061441f565b908152602001604051809103902060040160009054906101000a900460ff166105f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105eb90614826565b60405180910390fd5b6060600a84604051610606919061441f565b90815260200160405180910390206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106ab5780601f10610680576101008083540402835291602001916106ab565b820191906000526020600020905b81548152906001019060200180831161068e57829003601f168201915b505050505090506005816040516106c2919061441f565b908152602001604051809103902060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661075d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075490614926565b60405180910390fd5b600060058260405161076f919061441f565b908152602001604051809103902060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b866040516107d2919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905061083882828403612f1690919063ffffffff16565b935050505092915050565b60076020528060005260406000206000915090505481565b6006602052816000526040600020602052806000526040600020600091509150505481565b610888612e85565b60006003549050816003819055507f4b8caef4830afa7b696a5c84ec0b624a0cbb7615afbe0da7f78336ed10167647816003546040516108c9929190614a01565b60405180910390a15050565b60025481565b60035481565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610948906149a6565b60405180910390fd5b600a82604051610961919061441f565b908152602001604051809103902060040160009054906101000a900460ff166109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690614826565b60405180910390fd5b600b826040516109cf919061441f565b908152602001604051809103902060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160009054906101000a900460ff16610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a61906148c6565b60405180910390fd5b6000600b83604051610a7c919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118015610b81575060011515600983604051610b24919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb7906148a6565b60405180910390fd5b600a82604051610bd0919061441f565b9081526020016040518091039020600301544210610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90614946565b60405180910390fd5b60003390506000600b84604051610c3a919061441f565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160020154905060008260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600987604051610ce8919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060008090505b8360030180549050811015610e79578473ffffffffffffffffffffffffffffffffffffffff16846003018281548110610d8557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e6c5783600301600185600301805490500381548110610de557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846003018281548110610e1f57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e79565b8080600101915050610d50565b5082600301805480610e8757fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905560008360040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508083600201540383600201819055507f4aa0494fe4184fdf0e4444f08ecf6a62a958f61523ab9b03635674a5345772f8868460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848660020154604051610f6f9493929190614534565b60405180910390a1505050505050565b600b8280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009150915050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561104e5780601f106110235761010080835404028352916020019161104e565b820191906000526020600020905b81548152906001019060200180831161103157829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060050160009054906101000a900460ff16905084565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a826040516110cf919061441f565b908152602001604051809103902060040160009054906101000a900460ff161561112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906148e6565b60405180910390fd5b6000825111611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614726565b60405180910390fd5b6000429050600060035482019050611188613067565b6040518060a0016040528086815260200160048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561122f5780601f106112045761010080835404028352916020019161122f565b820191906000526020600020905b81548152906001019060200180831161121257829003601f168201915b5050505050815260200184815260200183815260200160011515815250905080600a8660405161125f919061441f565b90815260200160405180910390206000820151816000019080519060200190611289929190613098565b5060208201518160010190805190602001906112a6929190613098565b50604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050507fd47fe0a856b7afa634ae1195e8e24dea267362b36bf6bd3bcbb72ee3a64df964856004858560405161131494939291906145f6565b60405180910390a1849350505050919050565b600a81805160208101820180518482526020830160208501208183528095505050505050600091509050806000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113e95780601f106113be576101008083540402835291602001916113e9565b820191906000526020600020905b8154815290600101906020018083116113cc57829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114875780601f1061145c57610100808354040283529160200191611487565b820191906000526020600020905b81548152906001019060200180831161146a57829003601f168201915b5050505050908060020154908060030154908060040160009054906101000a900460ff16905085565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153790614746565b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516115b4929190614468565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61166a612e85565b600081116116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a4906147e6565b60405180910390fd5b60006002549050816002819055507ff19f525adce024b62e1f0a6dc5a1cd7f2942a3b12bd99d3142d7656277ed2bef816002546040516116ee929190614a01565b60405180910390a15050565b6060611704612e85565b6000865111611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90614766565b60405180910390fd5b600084511161178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390614986565b60405180910390fd5b60008351116117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c7906147a6565b60405180910390fd5b6000825111611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90614786565b60405180910390fd5b600254855114611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090614846565b60405180910390fd5b611861613118565b604051806040016040528088815260200142815250905080600588604051611889919061441f565b908152602001604051809103902060008201518160000190805190602001906118b3929190613098565b506020820151816003015590505060008090505b8551811015611b15578381815181106118dc57fe5b6020026020010151600660008884815181106118f457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087848151811061194457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083818151811061199657fe5b6020026020010151600760008784815181106119ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540160076000878481518110611a0257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550848181518110611a5457fe5b6020026020010151600889604051611a6c919061441f565b90815260200160405180910390206000888481518110611a8857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806001019150506118c7565b5060008090505b8651811015611c845760076000888381518110611b3557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600589604051611b88919061441f565b90815260200160405180910390206001016000898481518110611ba757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600589604051611bff919061441f565b90815260200160405180910390206002016000898481518110611c1e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611b1c565b508660049080519060200190611c9b929190613132565b507fa3703394e5f162a1d0ed6d6e1dcfa1f871d1900ff2b7b8195d1483989f1486a88787878787604051611cd3959493929190614580565b60405180910390a18691505095945050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6008828051602081018201805184825260208301602085012081835280955050505050506020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6009828051602081018201805184825260208301602085012081835280955050505050506020528060005260406000206000915091509054906101000a900460ff1681565b6060600b83604051611dbc919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301805480602002602001604051908101604052809291908181526020018280548015611e8a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611e40575b5050505050905092915050565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f2d5780601f10611f0257610100808354040283529160200191611f2d565b820191906000526020600020905b815481529060010190602001808311611f1057829003601f168201915b505050505081565b6000600b84604051611f47919061441f565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204390614806565b60405180910390fd5b6005600460405161205d9190614436565b908152602001604051809103902060020160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef906149c6565b60405180910390fd5b600a82604051612108919061441f565b908152602001604051809103902060040160009054906101000a900460ff16612166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215d90614826565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c906147c6565b60405180910390fd5b600a82604051612235919061441f565b9081526020016040518091039020600301544210612288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227f90614906565b60405180910390fd5b6000151560098360405161229c919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232e90614966565b60405180910390fd5b600b82604051612347919061441f565b908152602001604051809103902060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160009054906101000a900460ff16156126a5576000600b836040516123ba919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600201549050816003013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826002015401826002018190555060016009856040516125d7919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6f053211788fd6640229ec58c60c916876198ae9f9b5023a1f77dfcd607cfe7d848360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168385600201546040516126969493929190614534565b60405180910390a15050612c2f565b60606126af6131b2565b6040518060a001604052808581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200183815260200160011515815250905080600b85604051612703919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001908051906020019061276a929190613098565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030190805190602001906127d89291906131f9565b5060808201518160050160006101000a81548160ff0219169083151502179055509050506000600b8560405161280e919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050600b8560405161286f919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b866040516129ae919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b86604051612aca919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506001600986604051612b2e919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6f053211788fd6640229ec58c60c916876198ae9f9b5023a1f77dfcd607cfe7d858583600b89604051612bc4919061441f565b908152602001604051809103902060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154604051612c239493929190614534565b60405180910390a15050505b5050565b600581805160208101820180518482526020830160208501208183528095505050505050600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cf55780601f10612cca57610100808354040283529160200191612cf5565b820191906000526020600020905b815481529060010190602001808311612cd857829003601f168201915b5050505050908060030154905082565b6060808251604051908082528060200260200182016040528015612d3d57816020015b6060815260200190600190039081612d285790505b50905060008090505b8351811015612e7b576060848281518110612d5d57fe5b60200260200101519050600a81604051612d77919061441f565b908152602001604051809103902060040160009054906101000a900460ff1615612e6d57600a81604051612dab919061441f565b90815260200160405180910390206000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e505780601f10612e2557610100808354040283529160200191612e50565b820191906000526020600020905b815481529060010190602001808311612e3357829003601f168201915b5050505050838381518110612e6157fe5b60200260200101819052505b508080600101915050612d46565b5080915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0b90614866565b60405180910390fd5b565b6000612f4482612f36601260ff16600a0a86612f4c90919063ffffffff16565b612fbc90919063ffffffff16565b905092915050565b600080831415612f5f5760009050612fb6565b6000828402905082848281612f7057fe5b0414612fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa890614886565b60405180910390fd5b809150505b92915050565b6000612ffe83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613006565b905092915050565b6000808311829061304d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130449190614512565b60405180910390fd5b50600083858161305957fe5b049050809150509392505050565b6040518060a00160405280606081526020016060815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106130d957805160ff1916838001178555613107565b82800160010185558215613107579182015b828111156131065782518255916020019190600101906130eb565b5b5090506131149190613283565b5090565b604051806040016040528060608152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061317357805160ff19168380011785556131a1565b828001600101855582156131a1579182015b828111156131a0578251825591602001919060010190613185565b5b5090506131ae9190613283565b5090565b6040518060a0016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000151581525090565b828054828255906000526020600020908101928215613272579160200282015b828111156132715782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613219565b5b50905061327f91906132a8565b5090565b6132a591905b808211156132a1576000816000905550600101613289565b5090565b90565b6132e891905b808211156132e457600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016132ae565b5090565b90565b6000813590506132fa81614cc5565b92915050565b600082601f83011261331157600080fd5b813561332461331f82614a57565b614a2a565b9150818183526020840193506020810190508385602084028201111561334957600080fd5b60005b83811015613379578161335f88826132eb565b84526020840193506020830192505060018101905061334c565b5050505092915050565b600082601f83011261339457600080fd5b81356133a76133a282614a7f565b614a2a565b9150818183526020840193506020810190508360005b838110156133ed57813586016133d3888261347a565b8452602084019350602083019250506001810190506133bd565b5050505092915050565b600082601f83011261340857600080fd5b813561341b61341682614aa7565b614a2a565b9150818183526020840193506020810190508385602084028201111561344057600080fd5b60005b8381101561347057816134568882613522565b845260208401935060208301925050600181019050613443565b5050505092915050565b600082601f83011261348b57600080fd5b813561349e61349982614acf565b614a2a565b915080825260208301602083018583830111156134ba57600080fd5b6134c5838284614c72565b50505092915050565b600082601f8301126134df57600080fd5b81356134f26134ed82614afb565b614a2a565b9150808252602083016020830185838301111561350e57600080fd5b613519838284614c72565b50505092915050565b60008135905061353181614cdc565b92915050565b60006020828403121561354957600080fd5b6000613557848285016132eb565b91505092915050565b6000806040838503121561357357600080fd5b6000613581858286016132eb565b9250506020613592858286016132eb565b9150509250929050565b6000602082840312156135ae57600080fd5b600082013567ffffffffffffffff8111156135c857600080fd5b6135d484828501613383565b91505092915050565b6000602082840312156135ef57600080fd5b600082013567ffffffffffffffff81111561360957600080fd5b6136158482850161347a565b91505092915050565b60006020828403121561363057600080fd5b600082013567ffffffffffffffff81111561364a57600080fd5b613656848285016134ce565b91505092915050565b6000806040838503121561367257600080fd5b600083013567ffffffffffffffff81111561368c57600080fd5b613698858286016134ce565b92505060206136a9858286016132eb565b9150509250929050565b6000806000606084860312156136c857600080fd5b600084013567ffffffffffffffff8111156136e257600080fd5b6136ee868287016134ce565b93505060206136ff868287016132eb565b9250506040613710868287016132eb565b9150509250925092565b600080600080600060a0868803121561373257600080fd5b600086013567ffffffffffffffff81111561374c57600080fd5b613758888289016134ce565b955050602086013567ffffffffffffffff81111561377557600080fd5b61378188828901613300565b945050604086013567ffffffffffffffff81111561379e57600080fd5b6137aa88828901613300565b935050606086013567ffffffffffffffff8111156137c757600080fd5b6137d388828901613300565b925050608086013567ffffffffffffffff8111156137f057600080fd5b6137fc888289016133f7565b9150509295509295909350565b6000806040838503121561381c57600080fd5b600083013567ffffffffffffffff81111561383657600080fd5b6138428582860161347a565b9250506020613853858286016132eb565b9150509250929050565b60006020828403121561386f57600080fd5b600061387d84828501613522565b91505092915050565b600061389283836138ca565b60208301905092915050565b60006138aa8383613a92565b905092915050565b60006138be8383614401565b60208301905092915050565b6138d381614c2a565b82525050565b6138e281614c2a565b82525050565b60006138f382614b6c565b6138fd8185614bca565b935061390883614b27565b8060005b838110156139395781516139208882613886565b975061392b83614ba3565b92505060018101905061390c565b5085935050505092915050565b600061395182614b77565b61395b8185614bdb565b93508360208202850161396d85614b37565b8060005b858110156139a9578484038952815161398a858261389e565b945061399583614bb0565b925060208a01995050600181019050613971565b50829750879550505050505092915050565b60006139c682614b82565b6139d08185614bec565b93506139db83614b47565b8060005b83811015613a0c5781516139f388826138b2565b97506139fe83614bbd565b9250506001810190506139df565b5085935050505092915050565b613a2281614c3c565b82525050565b6000613a3382614b98565b613a3d8185614c0e565b9350613a4d818560208601614c81565b613a5681614cb4565b840191505092915050565b6000613a6c82614b98565b613a768185614c1f565b9350613a86818560208601614c81565b80840191505092915050565b6000613a9d82614b8d565b613aa78185614bfd565b9350613ab7818560208601614c81565b613ac081614cb4565b840191505092915050565b6000613ad682614b8d565b613ae08185614c0e565b9350613af0818560208601614c81565b613af981614cb4565b840191505092915050565b600081546001811660008114613b215760018114613b4757613b8b565b607f6002830416613b328187614c0e565b955060ff198316865260208601935050613b8b565b60028204613b558187614c0e565b9550613b6085614b57565b60005b82811015613b8257815481890152600182019150602081019050613b63565b80880195505050505b505092915050565b600081546001811660008114613bb05760018114613bd557613c19565b607f6002830416613bc18187614c1f565b955060ff1983168652808601935050613c19565b60028204613be38187614c1f565b9550613bee85614b57565b60005b82811015613c1057815481890152600182019150602081019050613bf1565b82880195505050505b505092915050565b6000613c2e601f83614c0e565b91507f70726f706f73616c2068617368206d757374206e6f7420626520656d707479006000830152602082019050919050565b6000613c6e603583614c0e565b91507f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560008301527f2063616e20616363657074206f776e65727368697000000000000000000000006020830152604082019050919050565b6000613cd4601c83614c0e565b91507f656d70747920656c656374696f6e20686173682070726f7669646564000000006000830152602082019050919050565b6000613d14602883614c0e565b91507f656d7074792061737369676e6564566f7465576569676874732061727261792060008301527f70726f76696465640000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d7a602583614c0e565b91507f656d707479206e6f6d696e656573566f746564466f722061727261792070726f60008301527f76696465640000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613de0603183614c0e565b91507f73656e64657220686173206e6f742064656c65676174656420766f74696e672060008301527f77656967687420666f72206d656d6265720000000000000000000000000000006020830152604082019050919050565b6000613e46602983614c0e565b91507f6e756d626572206f66207365617473206d75737420626520677265617465722060008301527f7468616e207a65726f00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613eac602883614c0e565b91507f6d656d62657220746f2064696c757465206d75737420626520612076616c696460008301527f20616464726573730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f12601783614c0e565b91507f70726f706f73616c20646f6573206e6f742065786973740000000000000000006000830152602082019050919050565b6000613f52602183614c0e565b91507f696e76616c6964206e756d626572206f6620636f756e63696c206d656d62657260008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fb8602f83614c0e565b91507f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660008301527f6f726d207468697320616374696f6e00000000000000000000000000000000006020830152604082019050919050565b600061401e602183614c0e565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614084601c83614c0e565b91507f766f74657220686173206e6f2064696c7574696f6e20776569676874000000006000830152602082019050919050565b60006140c4604183614c0e565b91507f64696c7574696f6e207265636569707420646f6573206e6f742065786973742060008301527f666f722074686973206d656d62657220616e642070726f706f73616c2068617360208301527f68000000000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000614150601b83614c0e565b91507f70726f706f73616c2068617368206973206e6f7420756e6971756500000000006000830152602082019050919050565b6000614190603983614c0e565b91507f64696c7574696f6e2063616e206f6e6c79206f636375722077697468696e207460008301527f68652070726f706f73616c20766f74696e6720706572696f64000000000000006020830152604082019050919050565b60006141f6602a83614c0e565b91507f61646472657373206d7573742062652061206e6f6d696e6174656420636f756e60008301527f63696c206d656d626572000000000000000000000000000000000000000000006020830152604082019050919050565b600061425c603e83614c0e565b91507f756e646f2064696c7574696f6e2063616e206f6e6c79206f636375722077697460008301527f68696e207468652070726f706f73616c20766f74696e6720706572696f6400006020830152604082019050919050565b60006142c2601a83614c0e565b91507f73656e6465722068617320616c72656164792064696c757465640000000000006000830152602082019050919050565b6000614302601b83614c0e565b91507f656d70747920766f746572732061727261792070726f766964656400000000006000830152602082019050919050565b6000614342602a83614c0e565b91507f6d656d62657220746f20756e64696c757465206d75737420626520612076616c60008301527f69642061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a8603383614c0e565b91507f6d656d62657220746f2064696c757465206d7573742062652061206e6f6d696e60008301527f6174656420636f756e63696c206d656d626572000000000000000000000000006020830152604082019050919050565b61440a81614c68565b82525050565b61441981614c68565b82525050565b600061442b8284613a61565b915081905092915050565b60006144428284613b93565b915081905092915050565b600060208201905061446260008301846138d9565b92915050565b600060408201905061447d60008301856138d9565b61448a60208301846138d9565b9392505050565b600060208201905081810360008301526144ab81846138e8565b905092915050565b600060208201905081810360008301526144cd8184613946565b905092915050565b60006020820190506144ea6000830184613a19565b92915050565b6000602082019050818103600083015261450a8184613acb565b905092915050565b6000602082019050818103600083015261452c8184613a28565b905092915050565b6000608082019050818103600083015261454e8187613a28565b905061455d60208301866138d9565b61456a6040830185614410565b6145776060830184614410565b95945050505050565b600060a082019050818103600083015261459a8188613a28565b905081810360208301526145ae81876138e8565b905081810360408301526145c281866138e8565b905081810360608301526145d681856138e8565b905081810360808301526145ea81846139bb565b90509695505050505050565b600060808201905081810360008301526146108187613a28565b905081810360208301526146248186613b04565b90506146336040830185614410565b6146406060830184614410565b95945050505050565b600060808201905081810360008301526146638187613acb565b905061467260208301866138d9565b61467f6040830185614410565b61468c6060830184613a19565b95945050505050565b600060a08201905081810360008301526146af8188613acb565b905081810360208301526146c38187613acb565b90506146d26040830186614410565b6146df6060830185614410565b6146ec6080830184613a19565b9695505050505050565b600060408201905081810360008301526147108185613acb565b905061471f6020830184614410565b9392505050565b6000602082019050818103600083015261473f81613c21565b9050919050565b6000602082019050818103600083015261475f81613c61565b9050919050565b6000602082019050818103600083015261477f81613cc7565b9050919050565b6000602082019050818103600083015261479f81613d07565b9050919050565b600060208201905081810360008301526147bf81613d6d565b9050919050565b600060208201905081810360008301526147df81613dd3565b9050919050565b600060208201905081810360008301526147ff81613e39565b9050919050565b6000602082019050818103600083015261481f81613e9f565b9050919050565b6000602082019050818103600083015261483f81613f05565b9050919050565b6000602082019050818103600083015261485f81613f45565b9050919050565b6000602082019050818103600083015261487f81613fab565b9050919050565b6000602082019050818103600083015261489f81614011565b9050919050565b600060208201905081810360008301526148bf81614077565b9050919050565b600060208201905081810360008301526148df816140b7565b9050919050565b600060208201905081810360008301526148ff81614143565b9050919050565b6000602082019050818103600083015261491f81614183565b9050919050565b6000602082019050818103600083015261493f816141e9565b9050919050565b6000602082019050818103600083015261495f8161424f565b9050919050565b6000602082019050818103600083015261497f816142b5565b9050919050565b6000602082019050818103600083015261499f816142f5565b9050919050565b600060208201905081810360008301526149bf81614335565b9050919050565b600060208201905081810360008301526149df8161439b565b9050919050565b60006020820190506149fb6000830184614410565b92915050565b6000604082019050614a166000830185614410565b614a236020830184614410565b9392505050565b6000604051905081810181811067ffffffffffffffff82111715614a4d57600080fd5b8060405250919050565b600067ffffffffffffffff821115614a6e57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614a9657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614abe57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614ae657600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614b1257600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3582614c48565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c9f578082015181840152602081019050614c84565b83811115614cae576000848401525b50505050565b6000601f19601f8301169050919050565b614cce81614c2a565b8114614cd957600080fd5b50565b614ce581614c68565b8114614cf057600080fd5b5056fea365627a7a723158202e239d6c62eaaf53aa36b7903c266879c69a3998576b22246d76c31e8481b99a6c6578706572696d656e74616cf564736f6c634300051000400000000000000000000000000000000000000000000000000000000000000008
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c806379ba5097116100c3578063b71860f71161007c578063b71860f714610406578063bd5ebdd614610436578063d030dd2414610454578063d564bc8614610484578063f5a9a63a146104a0578063fded1505146104d157610158565b806379ba5097146103325780637f3aa6c81461033c5780638849891d146103585780638da5cb5b146103885780639eb269f7146103a6578063a736cc11146103d657610158565b80632c103c79116101155780632c103c791461024357806343d2d8b714610261578063526577ff1461027d57806353a47bb7146102b0578063624f3abe146102ce578063761409a6146102fe57610158565b80631627540c1461015d5780631dc0ffbc146101795780632816ee6a146101a957806328389be2146101d9578063283f4172146102095780632a36aef214610225575b600080fd5b61017760048036036101729190810190613537565b610501565b005b610193600480360361018e919081019061365f565b610584565b6040516101a091906149e6565b60405180910390f35b6101c360048036036101be9190810190613537565b610843565b6040516101d091906149e6565b60405180910390f35b6101f360048036036101ee9190810190613560565b61085b565b60405161020091906149e6565b60405180910390f35b610223600480360361021e919081019061385d565b610880565b005b61022d6108d5565b60405161023a91906149e6565b60405180910390f35b61024b6108db565b60405161025891906149e6565b60405180910390f35b61027b6004803603610276919081019061365f565b6108e1565b005b61029760048036036102929190810190613809565b610f7f565b6040516102a79493929190614649565b60405180910390f35b6102b8611097565b6040516102c5919061444d565b60405180910390f35b6102e860048036036102e3919081019061361e565b6110bd565b6040516102f59190614512565b60405180910390f35b610318600480360361031391908101906135dd565b611327565b604051610329959493929190614695565b60405180910390f35b61033a6114b0565b005b6103566004803603610351919081019061385d565b611662565b005b610372600480360361036d919081019061371a565b6116fa565b60405161037f9190614512565b60405180910390f35b610390611ce8565b60405161039d919061444d565b60405180910390f35b6103c060048036036103bb9190810190613809565b611d0d565b6040516103cd919061444d565b60405180910390f35b6103f060048036036103eb9190810190613809565b611d65565b6040516103fd91906144d5565b60405180910390f35b610420600480360361041b919081019061365f565b611daa565b60405161042d9190614491565b60405180910390f35b61043e611e97565b60405161044b91906144f0565b60405180910390f35b61046e600480360361046991908101906136b3565b611f35565b60405161047b91906149e6565b60405180910390f35b61049e6004803603610499919081019061365f565b611fdc565b005b6104ba60048036036104b591908101906135dd565b612c33565b6040516104c89291906146f6565b60405180910390f35b6104eb60048036036104e6919081019061359c565b612d05565b6040516104f891906144b3565b60405180910390f35b610509612e85565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2281604051610579919061444d565b60405180910390a150565b6000600a83604051610596919061441f565b908152602001604051809103902060040160009054906101000a900460ff166105f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105eb90614826565b60405180910390fd5b6060600a84604051610606919061441f565b90815260200160405180910390206001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106ab5780601f10610680576101008083540402835291602001916106ab565b820191906000526020600020905b81548152906001019060200180831161068e57829003601f168201915b505050505090506005816040516106c2919061441f565b908152602001604051809103902060020160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661075d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075490614926565b60405180910390fd5b600060058260405161076f919061441f565b908152602001604051809103902060010160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600b866040516107d2919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154905061083882828403612f1690919063ffffffff16565b935050505092915050565b60076020528060005260406000206000915090505481565b6006602052816000526040600020602052806000526040600020600091509150505481565b610888612e85565b60006003549050816003819055507f4b8caef4830afa7b696a5c84ec0b624a0cbb7615afbe0da7f78336ed10167647816003546040516108c9929190614a01565b60405180910390a15050565b60025481565b60035481565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610951576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610948906149a6565b60405180910390fd5b600a82604051610961919061441f565b908152602001604051809103902060040160009054906101000a900460ff166109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690614826565b60405180910390fd5b600b826040516109cf919061441f565b908152602001604051809103902060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160009054906101000a900460ff16610a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a61906148c6565b60405180910390fd5b6000600b83604051610a7c919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118015610b81575060011515600983604051610b24919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b610bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb7906148a6565b60405180910390fd5b600a82604051610bd0919061441f565b9081526020016040518091039020600301544210610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a90614946565b60405180910390fd5b60003390506000600b84604051610c3a919061441f565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160020154905060008260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600987604051610ce8919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060008090505b8360030180549050811015610e79578473ffffffffffffffffffffffffffffffffffffffff16846003018281548110610d8557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e6c5783600301600185600301805490500381548110610de557fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846003018281548110610e1f57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610e79565b8080600101915050610d50565b5082600301805480610e8757fe5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055905560008360040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508083600201540383600201819055507f4aa0494fe4184fdf0e4444f08ecf6a62a958f61523ab9b03635674a5345772f8868460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848660020154604051610f6f9493929190614534565b60405180910390a1505050505050565b600b8280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009150915050806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561104e5780601f106110235761010080835404028352916020019161104e565b820191906000526020600020905b81548152906001019060200180831161103157829003601f168201915b5050505050908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060050160009054906101000a900460ff16905084565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600a826040516110cf919061441f565b908152602001604051809103902060040160009054906101000a900460ff161561112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906148e6565b60405180910390fd5b6000825111611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614726565b60405180910390fd5b6000429050600060035482019050611188613067565b6040518060a0016040528086815260200160048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561122f5780601f106112045761010080835404028352916020019161122f565b820191906000526020600020905b81548152906001019060200180831161121257829003601f168201915b5050505050815260200184815260200183815260200160011515815250905080600a8660405161125f919061441f565b90815260200160405180910390206000820151816000019080519060200190611289929190613098565b5060208201518160010190805190602001906112a6929190613098565b50604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083151502179055509050507fd47fe0a856b7afa634ae1195e8e24dea267362b36bf6bd3bcbb72ee3a64df964856004858560405161131494939291906145f6565b60405180910390a1849350505050919050565b600a81805160208101820180518482526020830160208501208183528095505050505050600091509050806000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113e95780601f106113be576101008083540402835291602001916113e9565b820191906000526020600020905b8154815290600101906020018083116113cc57829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114875780601f1061145c57610100808354040283529160200191611487565b820191906000526020600020905b81548152906001019060200180831161146a57829003601f168201915b5050505050908060020154908060030154908060040160009054906101000a900460ff16905085565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611540576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153790614746565b60405180910390fd5b7fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516115b4929190614468565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61166a612e85565b600081116116ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a4906147e6565b60405180910390fd5b60006002549050816002819055507ff19f525adce024b62e1f0a6dc5a1cd7f2942a3b12bd99d3142d7656277ed2bef816002546040516116ee929190614a01565b60405180910390a15050565b6060611704612e85565b6000865111611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90614766565b60405180910390fd5b600084511161178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390614986565b60405180910390fd5b60008351116117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c7906147a6565b60405180910390fd5b6000825111611814576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180b90614786565b60405180910390fd5b600254855114611859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185090614846565b60405180910390fd5b611861613118565b604051806040016040528088815260200142815250905080600588604051611889919061441f565b908152602001604051809103902060008201518160000190805190602001906118b3929190613098565b506020820151816003015590505060008090505b8551811015611b15578381815181106118dc57fe5b6020026020010151600660008884815181106118f457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087848151811061194457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555083818151811061199657fe5b6020026020010151600760008784815181106119ae57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020540160076000878481518110611a0257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550848181518110611a5457fe5b6020026020010151600889604051611a6c919061441f565b90815260200160405180910390206000888481518110611a8857fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080806001019150506118c7565b5060008090505b8651811015611c845760076000888381518110611b3557fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600589604051611b88919061441f565b90815260200160405180910390206001016000898481518110611ba757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001600589604051611bff919061441f565b90815260200160405180910390206002016000898481518110611c1e57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611b1c565b508660049080519060200190611c9b929190613132565b507fa3703394e5f162a1d0ed6d6e1dcfa1f871d1900ff2b7b8195d1483989f1486a88787878787604051611cd3959493929190614580565b60405180910390a18691505095945050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6008828051602081018201805184825260208301602085012081835280955050505050506020528060005260406000206000915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6009828051602081018201805184825260208301602085012081835280955050505050506020528060005260406000206000915091509054906101000a900460ff1681565b6060600b83604051611dbc919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301805480602002602001604051908101604052809291908181526020018280548015611e8a57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611e40575b5050505050905092915050565b60048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f2d5780601f10611f0257610100808354040283529160200191611f2d565b820191906000526020600020905b815481529060010190602001808311611f1057829003601f168201915b505050505081565b6000600b84604051611f47919061441f565b908152602001604051809103902060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561204c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204390614806565b60405180910390fd5b6005600460405161205d9190614436565b908152602001604051809103902060020160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef906149c6565b60405180910390fd5b600a82604051612108919061441f565b908152602001604051809103902060040160009054906101000a900460ff16612166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215d90614826565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221c906147c6565b60405180910390fd5b600a82604051612235919061441f565b9081526020016040518091039020600301544210612288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227f90614906565b60405180910390fd5b6000151560098360405161229c919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514612337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232e90614966565b60405180910390fd5b600b82604051612347919061441f565b908152602001604051809103902060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160009054906101000a900460ff16156126a5576000600b836040516123ba919061441f565b908152602001604051809103902060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600201549050816003013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548260040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826002015401826002018190555060016009856040516125d7919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6f053211788fd6640229ec58c60c916876198ae9f9b5023a1f77dfcd607cfe7d848360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168385600201546040516126969493929190614534565b60405180910390a15050612c2f565b60606126af6131b2565b6040518060a001604052808581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200183815260200160011515815250905080600b85604051612703919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001908051906020019061276a929190613098565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030190805190602001906127d89291906131f9565b5060808201518160050160006101000a81548160ff0219169083151502179055509050506000600b8560405161280e919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050600b8560405161286f919061441f565b908152602001604051809103902060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b866040516129ae919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b86604051612aca919061441f565b908152602001604051809103902060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506001600986604051612b2e919061441f565b908152602001604051809103902060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f6f053211788fd6640229ec58c60c916876198ae9f9b5023a1f77dfcd607cfe7d858583600b89604051612bc4919061441f565b908152602001604051809103902060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154604051612c239493929190614534565b60405180910390a15050505b5050565b600581805160208101820180518482526020830160208501208183528095505050505050600091509050806000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612cf55780601f10612cca57610100808354040283529160200191612cf5565b820191906000526020600020905b815481529060010190602001808311612cd857829003601f168201915b5050505050908060030154905082565b6060808251604051908082528060200260200182016040528015612d3d57816020015b6060815260200190600190039081612d285790505b50905060008090505b8351811015612e7b576060848281518110612d5d57fe5b60200260200101519050600a81604051612d77919061441f565b908152602001604051809103902060040160009054906101000a900460ff1615612e6d57600a81604051612dab919061441f565b90815260200160405180910390206000018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612e505780601f10612e2557610100808354040283529160200191612e50565b820191906000526020600020905b815481529060010190602001808311612e3357829003601f168201915b5050505050838381518110612e6157fe5b60200260200101819052505b508080600101915050612d46565b5080915050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0b90614866565b60405180910390fd5b565b6000612f4482612f36601260ff16600a0a86612f4c90919063ffffffff16565b612fbc90919063ffffffff16565b905092915050565b600080831415612f5f5760009050612fb6565b6000828402905082848281612f7057fe5b0414612fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa890614886565b60405180910390fd5b809150505b92915050565b6000612ffe83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613006565b905092915050565b6000808311829061304d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130449190614512565b60405180910390fd5b50600083858161305957fe5b049050809150509392505050565b6040518060a00160405280606081526020016060815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106130d957805160ff1916838001178555613107565b82800160010185558215613107579182015b828111156131065782518255916020019190600101906130eb565b5b5090506131149190613283565b5090565b604051806040016040528060608152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061317357805160ff19168380011785556131a1565b828001600101855582156131a1579182015b828111156131a0578251825591602001919060010190613185565b5b5090506131ae9190613283565b5090565b6040518060a0016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000151581525090565b828054828255906000526020600020908101928215613272579160200282015b828111156132715782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613219565b5b50905061327f91906132a8565b5090565b6132a591905b808211156132a1576000816000905550600101613289565b5090565b90565b6132e891905b808211156132e457600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016132ae565b5090565b90565b6000813590506132fa81614cc5565b92915050565b600082601f83011261331157600080fd5b813561332461331f82614a57565b614a2a565b9150818183526020840193506020810190508385602084028201111561334957600080fd5b60005b83811015613379578161335f88826132eb565b84526020840193506020830192505060018101905061334c565b5050505092915050565b600082601f83011261339457600080fd5b81356133a76133a282614a7f565b614a2a565b9150818183526020840193506020810190508360005b838110156133ed57813586016133d3888261347a565b8452602084019350602083019250506001810190506133bd565b5050505092915050565b600082601f83011261340857600080fd5b813561341b61341682614aa7565b614a2a565b9150818183526020840193506020810190508385602084028201111561344057600080fd5b60005b8381101561347057816134568882613522565b845260208401935060208301925050600181019050613443565b5050505092915050565b600082601f83011261348b57600080fd5b813561349e61349982614acf565b614a2a565b915080825260208301602083018583830111156134ba57600080fd5b6134c5838284614c72565b50505092915050565b600082601f8301126134df57600080fd5b81356134f26134ed82614afb565b614a2a565b9150808252602083016020830185838301111561350e57600080fd5b613519838284614c72565b50505092915050565b60008135905061353181614cdc565b92915050565b60006020828403121561354957600080fd5b6000613557848285016132eb565b91505092915050565b6000806040838503121561357357600080fd5b6000613581858286016132eb565b9250506020613592858286016132eb565b9150509250929050565b6000602082840312156135ae57600080fd5b600082013567ffffffffffffffff8111156135c857600080fd5b6135d484828501613383565b91505092915050565b6000602082840312156135ef57600080fd5b600082013567ffffffffffffffff81111561360957600080fd5b6136158482850161347a565b91505092915050565b60006020828403121561363057600080fd5b600082013567ffffffffffffffff81111561364a57600080fd5b613656848285016134ce565b91505092915050565b6000806040838503121561367257600080fd5b600083013567ffffffffffffffff81111561368c57600080fd5b613698858286016134ce565b92505060206136a9858286016132eb565b9150509250929050565b6000806000606084860312156136c857600080fd5b600084013567ffffffffffffffff8111156136e257600080fd5b6136ee868287016134ce565b93505060206136ff868287016132eb565b9250506040613710868287016132eb565b9150509250925092565b600080600080600060a0868803121561373257600080fd5b600086013567ffffffffffffffff81111561374c57600080fd5b613758888289016134ce565b955050602086013567ffffffffffffffff81111561377557600080fd5b61378188828901613300565b945050604086013567ffffffffffffffff81111561379e57600080fd5b6137aa88828901613300565b935050606086013567ffffffffffffffff8111156137c757600080fd5b6137d388828901613300565b925050608086013567ffffffffffffffff8111156137f057600080fd5b6137fc888289016133f7565b9150509295509295909350565b6000806040838503121561381c57600080fd5b600083013567ffffffffffffffff81111561383657600080fd5b6138428582860161347a565b9250506020613853858286016132eb565b9150509250929050565b60006020828403121561386f57600080fd5b600061387d84828501613522565b91505092915050565b600061389283836138ca565b60208301905092915050565b60006138aa8383613a92565b905092915050565b60006138be8383614401565b60208301905092915050565b6138d381614c2a565b82525050565b6138e281614c2a565b82525050565b60006138f382614b6c565b6138fd8185614bca565b935061390883614b27565b8060005b838110156139395781516139208882613886565b975061392b83614ba3565b92505060018101905061390c565b5085935050505092915050565b600061395182614b77565b61395b8185614bdb565b93508360208202850161396d85614b37565b8060005b858110156139a9578484038952815161398a858261389e565b945061399583614bb0565b925060208a01995050600181019050613971565b50829750879550505050505092915050565b60006139c682614b82565b6139d08185614bec565b93506139db83614b47565b8060005b83811015613a0c5781516139f388826138b2565b97506139fe83614bbd565b9250506001810190506139df565b5085935050505092915050565b613a2281614c3c565b82525050565b6000613a3382614b98565b613a3d8185614c0e565b9350613a4d818560208601614c81565b613a5681614cb4565b840191505092915050565b6000613a6c82614b98565b613a768185614c1f565b9350613a86818560208601614c81565b80840191505092915050565b6000613a9d82614b8d565b613aa78185614bfd565b9350613ab7818560208601614c81565b613ac081614cb4565b840191505092915050565b6000613ad682614b8d565b613ae08185614c0e565b9350613af0818560208601614c81565b613af981614cb4565b840191505092915050565b600081546001811660008114613b215760018114613b4757613b8b565b607f6002830416613b328187614c0e565b955060ff198316865260208601935050613b8b565b60028204613b558187614c0e565b9550613b6085614b57565b60005b82811015613b8257815481890152600182019150602081019050613b63565b80880195505050505b505092915050565b600081546001811660008114613bb05760018114613bd557613c19565b607f6002830416613bc18187614c1f565b955060ff1983168652808601935050613c19565b60028204613be38187614c1f565b9550613bee85614b57565b60005b82811015613c1057815481890152600182019150602081019050613bf1565b82880195505050505b505092915050565b6000613c2e601f83614c0e565b91507f70726f706f73616c2068617368206d757374206e6f7420626520656d707479006000830152602082019050919050565b6000613c6e603583614c0e565b91507f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560008301527f2063616e20616363657074206f776e65727368697000000000000000000000006020830152604082019050919050565b6000613cd4601c83614c0e565b91507f656d70747920656c656374696f6e20686173682070726f7669646564000000006000830152602082019050919050565b6000613d14602883614c0e565b91507f656d7074792061737369676e6564566f7465576569676874732061727261792060008301527f70726f76696465640000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d7a602583614c0e565b91507f656d707479206e6f6d696e656573566f746564466f722061727261792070726f60008301527f76696465640000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613de0603183614c0e565b91507f73656e64657220686173206e6f742064656c65676174656420766f74696e672060008301527f77656967687420666f72206d656d6265720000000000000000000000000000006020830152604082019050919050565b6000613e46602983614c0e565b91507f6e756d626572206f66207365617473206d75737420626520677265617465722060008301527f7468616e207a65726f00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613eac602883614c0e565b91507f6d656d62657220746f2064696c757465206d75737420626520612076616c696460008301527f20616464726573730000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f12601783614c0e565b91507f70726f706f73616c20646f6573206e6f742065786973740000000000000000006000830152602082019050919050565b6000613f52602183614c0e565b91507f696e76616c6964206e756d626572206f6620636f756e63696c206d656d62657260008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fb8602f83614c0e565b91507f4f6e6c792074686520636f6e7472616374206f776e6572206d6179207065726660008301527f6f726d207468697320616374696f6e00000000000000000000000000000000006020830152604082019050919050565b600061401e602183614c0e565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614084601c83614c0e565b91507f766f74657220686173206e6f2064696c7574696f6e20776569676874000000006000830152602082019050919050565b60006140c4604183614c0e565b91507f64696c7574696f6e207265636569707420646f6573206e6f742065786973742060008301527f666f722074686973206d656d62657220616e642070726f706f73616c2068617360208301527f68000000000000000000000000000000000000000000000000000000000000006040830152606082019050919050565b6000614150601b83614c0e565b91507f70726f706f73616c2068617368206973206e6f7420756e6971756500000000006000830152602082019050919050565b6000614190603983614c0e565b91507f64696c7574696f6e2063616e206f6e6c79206f636375722077697468696e207460008301527f68652070726f706f73616c20766f74696e6720706572696f64000000000000006020830152604082019050919050565b60006141f6602a83614c0e565b91507f61646472657373206d7573742062652061206e6f6d696e6174656420636f756e60008301527f63696c206d656d626572000000000000000000000000000000000000000000006020830152604082019050919050565b600061425c603e83614c0e565b91507f756e646f2064696c7574696f6e2063616e206f6e6c79206f636375722077697460008301527f68696e207468652070726f706f73616c20766f74696e6720706572696f6400006020830152604082019050919050565b60006142c2601a83614c0e565b91507f73656e6465722068617320616c72656164792064696c757465640000000000006000830152602082019050919050565b6000614302601b83614c0e565b91507f656d70747920766f746572732061727261792070726f766964656400000000006000830152602082019050919050565b6000614342602a83614c0e565b91507f6d656d62657220746f20756e64696c757465206d75737420626520612076616c60008301527f69642061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006143a8603383614c0e565b91507f6d656d62657220746f2064696c757465206d7573742062652061206e6f6d696e60008301527f6174656420636f756e63696c206d656d626572000000000000000000000000006020830152604082019050919050565b61440a81614c68565b82525050565b61441981614c68565b82525050565b600061442b8284613a61565b915081905092915050565b60006144428284613b93565b915081905092915050565b600060208201905061446260008301846138d9565b92915050565b600060408201905061447d60008301856138d9565b61448a60208301846138d9565b9392505050565b600060208201905081810360008301526144ab81846138e8565b905092915050565b600060208201905081810360008301526144cd8184613946565b905092915050565b60006020820190506144ea6000830184613a19565b92915050565b6000602082019050818103600083015261450a8184613acb565b905092915050565b6000602082019050818103600083015261452c8184613a28565b905092915050565b6000608082019050818103600083015261454e8187613a28565b905061455d60208301866138d9565b61456a6040830185614410565b6145776060830184614410565b95945050505050565b600060a082019050818103600083015261459a8188613a28565b905081810360208301526145ae81876138e8565b905081810360408301526145c281866138e8565b905081810360608301526145d681856138e8565b905081810360808301526145ea81846139bb565b90509695505050505050565b600060808201905081810360008301526146108187613a28565b905081810360208301526146248186613b04565b90506146336040830185614410565b6146406060830184614410565b95945050505050565b600060808201905081810360008301526146638187613acb565b905061467260208301866138d9565b61467f6040830185614410565b61468c6060830184613a19565b95945050505050565b600060a08201905081810360008301526146af8188613acb565b905081810360208301526146c38187613acb565b90506146d26040830186614410565b6146df6060830185614410565b6146ec6080830184613a19565b9695505050505050565b600060408201905081810360008301526147108185613acb565b905061471f6020830184614410565b9392505050565b6000602082019050818103600083015261473f81613c21565b9050919050565b6000602082019050818103600083015261475f81613c61565b9050919050565b6000602082019050818103600083015261477f81613cc7565b9050919050565b6000602082019050818103600083015261479f81613d07565b9050919050565b600060208201905081810360008301526147bf81613d6d565b9050919050565b600060208201905081810360008301526147df81613dd3565b9050919050565b600060208201905081810360008301526147ff81613e39565b9050919050565b6000602082019050818103600083015261481f81613e9f565b9050919050565b6000602082019050818103600083015261483f81613f05565b9050919050565b6000602082019050818103600083015261485f81613f45565b9050919050565b6000602082019050818103600083015261487f81613fab565b9050919050565b6000602082019050818103600083015261489f81614011565b9050919050565b600060208201905081810360008301526148bf81614077565b9050919050565b600060208201905081810360008301526148df816140b7565b9050919050565b600060208201905081810360008301526148ff81614143565b9050919050565b6000602082019050818103600083015261491f81614183565b9050919050565b6000602082019050818103600083015261493f816141e9565b9050919050565b6000602082019050818103600083015261495f8161424f565b9050919050565b6000602082019050818103600083015261497f816142b5565b9050919050565b6000602082019050818103600083015261499f816142f5565b9050919050565b600060208201905081810360008301526149bf81614335565b9050919050565b600060208201905081810360008301526149df8161439b565b9050919050565b60006020820190506149fb6000830184614410565b92915050565b6000604082019050614a166000830185614410565b614a236020830184614410565b9392505050565b6000604051905081810181811067ffffffffffffffff82111715614a4d57600080fd5b8060405250919050565b600067ffffffffffffffff821115614a6e57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614a9657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614abe57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614ae657600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614b1257600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614c3582614c48565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c9f578082015181840152602081019050614c84565b83811115614cae576000848401525b50505050565b6000601f19601f8301169050919050565b614cce81614c2a565b8114614cd957600080fd5b50565b614ce581614c68565b8114614cf057600080fd5b5056fea365627a7a723158202e239d6c62eaaf53aa36b7903c266879c69a3998576b22246d76c31e8481b99a6c6578706572696d656e74616cf564736f6c63430005100040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000008
-----Decoded View---------------
Arg [0] : _numOfSeats (uint256): 8
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000008
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.