diff --git a/contracts/src/consensus/Consensus.sol b/contracts/src/consensus/Consensus.sol index 195a047b1..16f3f0700 100644 --- a/contracts/src/consensus/Consensus.sol +++ b/contracts/src/consensus/Consensus.sol @@ -15,6 +15,13 @@ struct Validator { struct Vote { address validator; uint256 balance; + address prev; + address next; +} + +struct VoteResult { + address voter; + address validator; } event ValidatorRegistered(address addr, bytes bls12_381_public_key); @@ -55,9 +62,12 @@ contract Consensus { mapping(bytes32 => bool) private _registeredPublicKeys; address[] private _registeredValidators; - mapping(address => Vote) private _votes; + mapping(address => Vote) private _voters; + uint256 private _votersCount = 0; + address private _votersHead = address(0); + address private _votersTail = address(0); - address private _head; + address private _topValidatorsHead; mapping(address => address) private _topValidators; uint256 private _topValidatorsCount = 0; address[] private _calculatedTopValidators; @@ -90,7 +100,7 @@ contract Consensus { } function deleteTopValidators() internal { - address next = _head; + address next = _topValidatorsHead; while (next != address(0)) { address current = next; @@ -104,7 +114,7 @@ contract Consensus { shuffle(); deleteTopValidators(); - _head = address(0); + _topValidatorsHead = address(0); uint8 top = uint8(_clamp(n, 0, _registeredValidatorsCount - _resignedValidatorsCount)); // TODO: Use new method that returns registered validators if (top == 0) { @@ -119,8 +129,8 @@ contract Consensus { continue; } - if (_head == address(0)) { - _head = addr; + if (_topValidatorsHead == address(0)) { + _topValidatorsHead = addr; _topValidatorsCount = 1; continue; } @@ -130,14 +140,15 @@ contract Consensus { continue; } - ValidatorData storage headData = _registeredValidatorData[_head]; + ValidatorData storage headData = _registeredValidatorData[_topValidatorsHead]; - if (_isGreater(Validator({addr: addr, data: data}), Validator({addr: _head, data: headData}))) { + if (_isGreater(Validator({addr: addr, data: data}), Validator({addr: _topValidatorsHead, data: headData}))) + { insertTopValidator(addr, top); } } - address next = _head; + address next = _topValidatorsHead; delete _calculatedTopValidators; _calculatedTopValidators = new address[](top); for (uint256 i = 0; i < top; i++) { @@ -151,13 +162,14 @@ contract Consensus { if ( _isGreater( - Validator({addr: _head, data: _registeredValidatorData[_head]}), Validator({addr: addr, data: data}) + Validator({addr: _topValidatorsHead, data: _registeredValidatorData[_topValidatorsHead]}), + Validator({addr: addr, data: data}) ) ) { insertHead(addr); } else { - address current = _topValidators[_head]; - address previous = _head; + address current = _topValidators[_topValidatorsHead]; + address previous = _topValidatorsHead; while (true) { if (current == address(0)) { @@ -181,16 +193,16 @@ contract Consensus { } if (_topValidatorsCount > top) { - address next = _topValidators[_head]; - delete _topValidators[_head]; - _head = next; + address next = _topValidators[_topValidatorsHead]; + delete _topValidators[_topValidatorsHead]; + _topValidatorsHead = next; _topValidatorsCount--; } } function insertHead(address addr) internal { - _topValidators[addr] = _head; - _head = addr; + _topValidators[addr] = _topValidatorsHead; + _topValidatorsHead = addr; _topValidatorsCount++; } @@ -211,6 +223,8 @@ contract Consensus { return result; } + // TODO: allow passing limit to cap maximum number of returned items in case validator count is very high. + // the caller can paginate to retrieve all items. function getAllValidators() public view returns (Validator[] memory) { Validator[] memory result = new Validator[](_registeredValidators.length); for (uint256 i = 0; i < _registeredValidators.length; i++) { @@ -289,14 +303,57 @@ contract Consensus { _registeredValidatorData[_validator.addr] = _validator.data; } + function getVotesCount() public view returns (uint256) { + return _votersCount; + } + + function getVotes(address addr, uint256 count) public view onlyOwner returns (VoteResult[] memory) { + VoteResult[] memory voters = new VoteResult[](_clamp(count, 0, _votersCount)); + + address next = _votersHead; + + if (addr != address(0)) { + next = _voters[addr].next; + } + + uint256 i = 0; + while (next != address(0) && i < count) { + Vote storage voter = _voters[next]; + voters[i++] = VoteResult({voter: next, validator: voter.validator}); + next = voter.next; + } + + if (voters.length == i) { + return voters; + } + + // Slice array to remove empty elements + VoteResult[] memory slice = new VoteResult[](i); + for (uint256 j = 0; j < i; j++) { + slice[j] = voters[j]; + } + + return slice; + } + function vote(address addr) external preventOwner { require(isValidatorRegistered(addr), "Must vote for validator"); - require(_votes[msg.sender].validator == address(0), "Already voted"); + require(_voters[msg.sender].validator == address(0), "Already voted"); ValidatorData storage validatorData = _registeredValidatorData[addr]; require(!validatorData.isResigned, "Must vote for unresigned validator"); - _votes[msg.sender] = Vote({validator: addr, balance: msg.sender.balance}); + _voters[msg.sender] = Vote({validator: addr, balance: msg.sender.balance, prev: address(0), next: address(0)}); + + if (_votersHead == address(0)) { + _votersHead = msg.sender; + _votersTail = msg.sender; + } else { + _voters[_votersTail].next = msg.sender; + _voters[msg.sender].prev = _votersTail; + _votersTail = msg.sender; + } + _votersCount++; // TODO: safe math validatorData.voteBalance += msg.sender.balance; @@ -306,14 +363,33 @@ contract Consensus { } function unvote() external { - Vote storage voter = _votes[msg.sender]; + Vote storage voter = _voters[msg.sender]; require(voter.validator != address(0), "TODO: not voted"); + if (_votersHead == _votersTail) { + _votersHead = address(0); + _votersTail = address(0); + } else if (_votersTail == msg.sender) { + _voters[voter.prev].next = address(0); + _votersTail = voter.prev; + } else if (_votersHead == msg.sender) { + _voters[_votersTail].prev = address(0); + _votersHead = _voters[_votersHead].next; + } else { + _voters[voter.prev].next = voter.next; + _voters[voter.next].prev = voter.prev; + } + emit Unvoted(msg.sender, voter.validator); - _registeredValidatorData[voter.validator].voteBalance -= voter.balance; - _registeredValidatorData[voter.validator].votersCount -= 1; - delete _votes[msg.sender]; + ValidatorData storage validatorData = _registeredValidatorData[voter.validator]; + + validatorData.voteBalance -= voter.balance; + validatorData.votersCount -= 1; + + delete _voters[msg.sender]; + + _votersCount--; } function updateVoters(address[] calldata voters) external onlyOwner { @@ -324,7 +400,7 @@ contract Consensus { } function _updateVoter(address addr) private { - Vote storage voter = _votes[addr]; + Vote storage voter = _voters[addr]; if (voter.validator == address(0)) { return; } diff --git a/contracts/test/consensus/Consensus-Vote.sol b/contracts/test/consensus/Consensus-Vote.sol index dd5d38e2e..4eef9c373 100644 --- a/contracts/test/consensus/Consensus-Vote.sol +++ b/contracts/test/consensus/Consensus-Vote.sol @@ -2,7 +2,7 @@ pragma solidity ^0.8.13; import {Test, console} from "@forge-std/Test.sol"; -import {Consensus, ValidatorData, Validator, Unvoted, Voted} from "@contracts/consensus/Consensus.sol"; +import {Consensus, ValidatorData, Validator, Unvoted, Voted, VoteResult} from "@contracts/consensus/Consensus.sol"; contract ConsensusTest is Test { Consensus public consensus; @@ -35,6 +35,11 @@ contract ConsensusTest is Test { } function test_vote() public { + // Assert voters + assertEq(consensus.getVotesCount(), 0); + VoteResult[] memory allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 0); + // Register validator address addr = address(1); registerValidator(addr); @@ -50,12 +55,19 @@ contract ConsensusTest is Test { consensus.vote(addr); vm.stopPrank(); - // Assert voteBalance and voter balance + // Assert validator Validator memory validator = consensus.getValidator(addr); assertEq(validator.addr, addr); assertEq(validator.data.voteBalance, 100 ether); assertEq(validator.data.votersCount, 1); + // Assert voters balance assertEq(voterAddr.balance, 100 ether); + // Assert voters + assertEq(consensus.getVotesCount(), 1); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr); + assertEq(allVoters[0].validator, addr); // Update vote should correctly update the vote balance // Let say voter has 90 eth at the end of the block @@ -65,12 +77,19 @@ contract ConsensusTest is Test { voters[0] = voterAddr; consensus.updateVoters(voters); - // Assert voteBalance and voter balance + // Assert validator validator = consensus.getValidator(addr); assertEq(validator.addr, addr); assertEq(validator.data.voteBalance, 90 ether); assertEq(validator.data.votersCount, 1); + // Assert voter balance assertEq(voterAddr.balance, 90 ether); + // Assert voters + assertEq(consensus.getVotesCount(), 1); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr); + assertEq(allVoters[0].validator, addr); } function test_vote_revert_if_caller_is_owner() public { @@ -78,7 +97,19 @@ contract ConsensusTest is Test { consensus.vote(address(1)); } + function test_get_voters_revert_if_caller_is_not_owner() public { + vm.startPrank(address(1)); + + vm.expectRevert("Caller is not the contract owner"); + consensus.getVotes(address(0), 10); + } + function test_vote_allow_self_vote() public { + // Assert voters + assertEq(consensus.getVotesCount(), 0); + VoteResult[] memory allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 0); + // Register validator address addr = address(1); registerValidator(addr); @@ -94,12 +125,19 @@ contract ConsensusTest is Test { consensus.vote(addr); vm.stopPrank(); - // Assert voteBalance and voter balance + // Assert voteBalance Validator memory validator = consensus.getValidator(addr); assertEq(validator.addr, addr); assertEq(validator.data.voteBalance, 100 ether); assertEq(validator.data.votersCount, 1); + // Assert voter balance assertEq(voterAddr.balance, 100 ether); + // Assert voters + assertEq(consensus.getVotesCount(), 1); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr); + assertEq(allVoters[0].validator, voterAddr); // Update vote should correctly update the vote balance // Let say voter has 90 eth at the end of the block @@ -109,12 +147,19 @@ contract ConsensusTest is Test { voters[0] = voterAddr; consensus.updateVoters(voters); - // Assert voteBalance and voter balance + // Assert validator validator = consensus.getValidator(addr); assertEq(validator.addr, addr); assertEq(validator.data.voteBalance, 90 ether); assertEq(validator.data.votersCount, 1); + // Assert voter balance assertEq(voterAddr.balance, 90 ether); + // Assert voters + assertEq(consensus.getVotesCount(), 1); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr); + assertEq(allVoters[0].validator, voterAddr); } function test_vote_prevent_double_vote() public { @@ -156,6 +201,11 @@ contract ConsensusTest is Test { } function test_unvote_and_vote_in_same_block() public { + // Assert voters + assertEq(consensus.getVotesCount(), 0); + VoteResult[] memory allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 0); + // Register validator address addr = address(1); registerValidator(addr); @@ -167,12 +217,19 @@ contract ConsensusTest is Test { consensus.vote(addr); vm.stopPrank(); - // Assert voteBalance and voter balance + // Assert validator Validator memory validator = consensus.getValidator(addr); assertEq(validator.addr, addr); assertEq(validator.data.voteBalance, 100 ether); assertEq(validator.data.votersCount, 1); + // Assert voter balance assertEq(voterAddr.balance, 100 ether); + // Assert voters + assertEq(consensus.getVotesCount(), 1); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr); + assertEq(allVoters[0].validator, addr); // Let say voter has 90 eth after some tx vm.deal(voterAddr, 90 ether); @@ -184,15 +241,25 @@ contract ConsensusTest is Test { consensus.unvote(); vm.stopPrank(); - // Assert voteBalance and voter balance + // Assert validator validator = consensus.getValidator(addr); assertEq(validator.addr, addr); assertEq(validator.data.voteBalance, 0 ether); assertEq(validator.data.votersCount, 0); + /// Assert voter balance assertEq(voterAddr.balance, 90 ether); + // Assert voters + assertEq(consensus.getVotesCount(), 0); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 0); } function test_unvote_and_vote_in_different_blocks() public { + // Assert voters + assertEq(consensus.getVotesCount(), 0); + VoteResult[] memory allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 0); + // Register validator address addr = address(1); registerValidator(addr); @@ -204,12 +271,19 @@ contract ConsensusTest is Test { consensus.vote(addr); vm.stopPrank(); - // Assert voteBalance and voter balance + // Assert validator Validator memory validator = consensus.getValidator(addr); assertEq(validator.addr, addr); assertEq(validator.data.voteBalance, 100 ether); assertEq(validator.data.votersCount, 1); + // Assert voter balance assertEq(voterAddr.balance, 100 ether); + // Assert voters + assertEq(consensus.getVotesCount(), 1); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr); + assertEq(allVoters[0].validator, addr); // Update vote should correctly update the vote balance // Let say voter has 90 eth at the end of the block @@ -218,12 +292,19 @@ contract ConsensusTest is Test { voters[0] = voterAddr; consensus.updateVoters(voters); - // Assert voteBalance and voter balance + // Assert validator validator = consensus.getValidator(addr); assertEq(validator.addr, addr); assertEq(validator.data.voteBalance, 90 ether); assertEq(validator.data.votersCount, 1); + // Assert voter balance assertEq(voterAddr.balance, 90 ether); + // Assert voters + assertEq(consensus.getVotesCount(), 1); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr); + assertEq(allVoters[0].validator, addr); // Let say voter has 80 eth after some tx vm.deal(voterAddr, 80 ether); @@ -235,13 +316,338 @@ contract ConsensusTest is Test { consensus.unvote(); vm.stopPrank(); - // Assert voteBalance and voter balance + // Assert validator validator = consensus.getValidator(addr); assertEq(validator.addr, addr); assertEq(validator.data.voteBalance, 0 ether); assertEq(validator.data.votersCount, 0); + // Assert voter balance assertEq(voterAddr.balance, 80 ether); + // Assert voters + assertEq(consensus.getVotesCount(), 0); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 0); + } + + function test_multiple_voted_different_validators() public { + // Assert voters + assertEq(consensus.getVotesCount(), 0); + VoteResult[] memory allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 0); + + // Register validators + address validatorAddr1 = address(1); + registerValidator(validatorAddr1); + address validatorAddr2 = address(2); + registerValidator(validatorAddr2); + address validatorAddr3 = address(3); + registerValidator(validatorAddr3); + + // Vote 1 + address voterAddr1 = address(11); + vm.deal(voterAddr1, 100 ether); + vm.startPrank(voterAddr1); + consensus.vote(validatorAddr1); + vm.stopPrank(); + + // Vote 2 + address voterAddr2 = address(12); + vm.deal(voterAddr2, 100 ether); + vm.startPrank(voterAddr2); + consensus.vote(validatorAddr2); + vm.stopPrank(); + + // Vote 3 + address voterAddr3 = address(13); + vm.deal(voterAddr3, 100 ether); + vm.startPrank(voterAddr3); + consensus.vote(validatorAddr3); + vm.stopPrank(); + + // Assert validators 1 + Validator memory validator1 = consensus.getValidator(validatorAddr1); + assertEq(validator1.addr, validatorAddr1); + assertEq(validator1.data.voteBalance, 100 ether); + assertEq(validator1.data.votersCount, 1); + // Assert validator 2 + Validator memory validator2 = consensus.getValidator(validatorAddr2); + assertEq(validator2.addr, validatorAddr2); + assertEq(validator2.data.voteBalance, 100 ether); + assertEq(validator2.data.votersCount, 1); + // Assert validator 3 + Validator memory validator3 = consensus.getValidator(validatorAddr3); + assertEq(validator3.addr, validatorAddr3); + assertEq(validator3.data.voteBalance, 100 ether); + assertEq(validator3.data.votersCount, 1); + + // Assert voters + assertEq(consensus.getVotesCount(), 3); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 3); + assertEq(allVoters[0].voter, voterAddr1); + assertEq(allVoters[0].validator, validatorAddr1); + assertEq(allVoters[1].voter, voterAddr2); + assertEq(allVoters[1].validator, validatorAddr2); + assertEq(allVoters[2].voter, voterAddr3); + assertEq(allVoters[2].validator, validatorAddr3); + + // UNVOTE + // Middle voter + vm.startPrank(voterAddr2); + consensus.unvote(); + vm.stopPrank(); + + // Assert validators 1 + validator1 = consensus.getValidator(validatorAddr1); + assertEq(validator1.addr, validatorAddr1); + assertEq(validator1.data.voteBalance, 100 ether); + assertEq(validator1.data.votersCount, 1); + // Assert validator 2 + validator2 = consensus.getValidator(validatorAddr2); + assertEq(validator2.addr, validatorAddr2); + assertEq(validator2.data.voteBalance, 0 ether); + assertEq(validator2.data.votersCount, 0); + // Assert validator 3 + validator3 = consensus.getValidator(validatorAddr3); + assertEq(validator3.addr, validatorAddr3); + assertEq(validator3.data.voteBalance, 100 ether); + assertEq(validator3.data.votersCount, 1); + + // Assert voters + assertEq(consensus.getVotesCount(), 2); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 2); + assertEq(allVoters[0].voter, voterAddr1); + assertEq(allVoters[0].validator, validatorAddr1); + assertEq(allVoters[1].voter, voterAddr3); + assertEq(allVoters[1].validator, validatorAddr3); + + // UNVOTE + // Last voter + vm.startPrank(voterAddr3); + consensus.unvote(); + vm.stopPrank(); + + // Assert validators 1 + validator1 = consensus.getValidator(validatorAddr1); + assertEq(validator1.addr, validatorAddr1); + assertEq(validator1.data.voteBalance, 100 ether); + assertEq(validator1.data.votersCount, 1); + // Assert validator 2 + validator2 = consensus.getValidator(validatorAddr2); + assertEq(validator2.addr, validatorAddr2); + assertEq(validator2.data.voteBalance, 0 ether); + assertEq(validator2.data.votersCount, 0); + // Assert validator 3 + validator3 = consensus.getValidator(validatorAddr3); + assertEq(validator3.addr, validatorAddr3); + assertEq(validator3.data.voteBalance, 0 ether); + assertEq(validator3.data.votersCount, 0); + + // Assert voters + assertEq(consensus.getVotesCount(), 1); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr1); + assertEq(allVoters[0].validator, validatorAddr1); + + // UNVOTE + // First voter + vm.startPrank(voterAddr1); + consensus.unvote(); + vm.stopPrank(); + + // Assert validators 1 + validator1 = consensus.getValidator(validatorAddr1); + assertEq(validator1.addr, validatorAddr1); + assertEq(validator1.data.voteBalance, 0 ether); + assertEq(validator1.data.votersCount, 0); + // Assert validator 2 + validator2 = consensus.getValidator(validatorAddr2); + assertEq(validator2.addr, validatorAddr2); + assertEq(validator2.data.voteBalance, 0 ether); + assertEq(validator2.data.votersCount, 0); + // Assert validator 3 + validator3 = consensus.getValidator(validatorAddr3); + assertEq(validator3.addr, validatorAddr3); + assertEq(validator3.data.voteBalance, 0 ether); + assertEq(validator3.data.votersCount, 0); + + // Assert voters + assertEq(consensus.getVotesCount(), 0); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 0); + } + + function test_multiple_voted_same_validator() public { + // Assert voters + assertEq(consensus.getVotesCount(), 0); + VoteResult[] memory allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 0); + + // Register validators + address validatorAddr1 = address(1); + registerValidator(validatorAddr1); + + // Vote 1 + address voterAddr1 = address(11); + vm.deal(voterAddr1, 100 ether); + vm.startPrank(voterAddr1); + consensus.vote(validatorAddr1); + vm.stopPrank(); + + // Vote 2 + address voterAddr2 = address(12); + vm.deal(voterAddr2, 100 ether); + vm.startPrank(voterAddr2); + consensus.vote(validatorAddr1); + vm.stopPrank(); + + // Vote 3 + address voterAddr3 = address(13); + vm.deal(voterAddr3, 100 ether); + vm.startPrank(voterAddr3); + consensus.vote(validatorAddr1); + vm.stopPrank(); + + // Assert validators 1 + Validator memory validator1 = consensus.getValidator(validatorAddr1); + assertEq(validator1.addr, validatorAddr1); + assertEq(validator1.data.voteBalance, 300 ether); + assertEq(validator1.data.votersCount, 3); + + // Assert voters + assertEq(consensus.getVotesCount(), 3); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 3); + assertEq(allVoters[0].voter, voterAddr1); + assertEq(allVoters[0].validator, validatorAddr1); + assertEq(allVoters[1].voter, voterAddr2); + assertEq(allVoters[1].validator, validatorAddr1); + assertEq(allVoters[2].voter, voterAddr3); + assertEq(allVoters[2].validator, validatorAddr1); + + // UNVOTE + // Middle voter + vm.startPrank(voterAddr2); + consensus.unvote(); + vm.stopPrank(); + + // Assert validators 1 + validator1 = consensus.getValidator(validatorAddr1); + assertEq(validator1.addr, validatorAddr1); + assertEq(validator1.data.voteBalance, 200 ether); + assertEq(validator1.data.votersCount, 2); + + // Assert voters + assertEq(consensus.getVotesCount(), 2); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 2); + assertEq(allVoters[0].voter, voterAddr1); + assertEq(allVoters[0].validator, validatorAddr1); + assertEq(allVoters[1].voter, voterAddr3); + assertEq(allVoters[1].validator, validatorAddr1); + + // UNVOTE + // Last voter + vm.startPrank(voterAddr3); + consensus.unvote(); + vm.stopPrank(); + + // Assert validators 1 + validator1 = consensus.getValidator(validatorAddr1); + assertEq(validator1.addr, validatorAddr1); + assertEq(validator1.data.voteBalance, 100 ether); + assertEq(validator1.data.votersCount, 1); + + // Assert voters + assertEq(consensus.getVotesCount(), 1); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr1); + assertEq(allVoters[0].validator, validatorAddr1); + + // UNVOTE + // First voter + vm.startPrank(voterAddr1); + consensus.unvote(); + vm.stopPrank(); + + // Assert validators 1 + validator1 = consensus.getValidator(validatorAddr1); + assertEq(validator1.addr, validatorAddr1); + assertEq(validator1.data.voteBalance, 0 ether); + assertEq(validator1.data.votersCount, 0); + + // Assert voters + assertEq(consensus.getVotesCount(), 0); + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 0); } - // TODO: Test multiple votes + function test_pagination() public { + // Assert voters + assertEq(consensus.getVotesCount(), 0); + VoteResult[] memory allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 0); + + // Register validators + address validatorAddr1 = address(1); + registerValidator(validatorAddr1); + + // Vote 1 + address voterAddr1 = address(11); + vm.deal(voterAddr1, 100 ether); + vm.startPrank(voterAddr1); + consensus.vote(validatorAddr1); + vm.stopPrank(); + + // Vote 2 + address voterAddr2 = address(12); + vm.deal(voterAddr2, 100 ether); + vm.startPrank(voterAddr2); + consensus.vote(validatorAddr1); + vm.stopPrank(); + + // Vote 3 + address voterAddr3 = address(13); + vm.deal(voterAddr3, 100 ether); + vm.startPrank(voterAddr3); + consensus.vote(validatorAddr1); + vm.stopPrank(); + + // Assert voters + assertEq(consensus.getVotesCount(), 3); + + allVoters = consensus.getVotes(address(0), 10); + assertEq(allVoters.length, 3); + assertEq(allVoters[0].voter, voterAddr1); + assertEq(allVoters[1].voter, voterAddr2); + assertEq(allVoters[2].voter, voterAddr3); + + allVoters = consensus.getVotes(address(0), 2); + assertEq(allVoters.length, 2); + assertEq(allVoters[0].voter, voterAddr1); + assertEq(allVoters[1].voter, voterAddr2); + + allVoters = consensus.getVotes(address(0), 1); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr1); + + allVoters = consensus.getVotes(address(0), 0); + assertEq(allVoters.length, 0); + + allVoters = consensus.getVotes(voterAddr1, 10); + assertEq(allVoters.length, 2); + assertEq(allVoters[0].voter, voterAddr2); + assertEq(allVoters[1].voter, voterAddr3); + + allVoters = consensus.getVotes(voterAddr1, 1); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr2); + + allVoters = consensus.getVotes(voterAddr2, 10); + assertEq(allVoters.length, 1); + assertEq(allVoters[0].voter, voterAddr3); + } } diff --git a/packages/contracts/source/contracts/evm/contract-service.ts b/packages/contracts/source/contracts/evm/contract-service.ts new file mode 100644 index 000000000..9efabbf7f --- /dev/null +++ b/packages/contracts/source/contracts/evm/contract-service.ts @@ -0,0 +1,13 @@ +import { ValidatorWallet } from "../state/wallets.js"; + +export interface Vote { + validatorAddress: string; + voterAddress: string; +} + +export interface ConsensusContractService { + getActiveValidators(): Promise; + getAllValidators(): Promise; + getVotesCount(): Promise; + getVotes(): AsyncIterable; +} diff --git a/packages/contracts/source/contracts/evm/index.ts b/packages/contracts/source/contracts/evm/index.ts index bfeb142bc..21fd8281a 100644 --- a/packages/contracts/source/contracts/evm/index.ts +++ b/packages/contracts/source/contracts/evm/index.ts @@ -1,3 +1,4 @@ +export * from "./contract-service.js"; export * from "./evm.js"; export * from "./gas-fee.js"; export * from "./state.js"; diff --git a/packages/contracts/source/identifiers.ts b/packages/contracts/source/identifiers.ts index e3601960a..edac29193 100644 --- a/packages/contracts/source/identifiers.ts +++ b/packages/contracts/source/identifiers.ts @@ -136,6 +136,9 @@ export const Identifiers = { HTTP: Symbol.for("Evm"), HTTPS: Symbol.for("Evm"), }, + ContractService: { + Consensus: Symbol("Evm"), + }, Gas: { FeeCalculator: Symbol("Evm"), Limits: Symbol("Evm"), diff --git a/packages/evm-consensus/package.json b/packages/evm-consensus/package.json index a5482de58..366c046df 100644 --- a/packages/evm-consensus/package.json +++ b/packages/evm-consensus/package.json @@ -26,6 +26,7 @@ "@mainsail/contracts": "workspace:*", "@mainsail/evm-contracts": "workspace:*", "@mainsail/kernel": "workspace:*", + "@mainsail/utils": "workspace:*", "ethers": "^6.11.0" }, "devDependencies": { diff --git a/packages/evm-consensus/source/index.ts b/packages/evm-consensus/source/index.ts index 608e0ae9b..88fdb42d2 100644 --- a/packages/evm-consensus/source/index.ts +++ b/packages/evm-consensus/source/index.ts @@ -4,6 +4,7 @@ import { Providers } from "@mainsail/kernel"; import { Deployer } from "./deployer.js"; import { Selector } from "./selector.js"; +import { ConsensusContractService } from "./services/consensus-contract-service.js"; import { ValidatorSet } from "./validator-set.js"; export { Identifiers } from "./identifiers.js"; @@ -14,6 +15,7 @@ export class ServiceProvider extends Providers.ServiceProvider { this.app.bind(Identifiers.ValidatorSet.Service).to(ValidatorSet).inSingletonScope(); this.app.bind(Identifiers.Proposer.Selector).to(Selector).inSingletonScope(); + this.app.bind(Identifiers.Evm.ContractService.Consensus).to(ConsensusContractService); } public async boot(): Promise { diff --git a/packages/evm-consensus/source/services/consensus-contract-service.ts b/packages/evm-consensus/source/services/consensus-contract-service.ts new file mode 100644 index 000000000..ae58ff801 --- /dev/null +++ b/packages/evm-consensus/source/services/consensus-contract-service.ts @@ -0,0 +1,127 @@ +import { inject, injectable, tagged } from "@mainsail/container"; +import { Contracts, Identifiers } from "@mainsail/contracts"; +import { ConsensusAbi } from "@mainsail/evm-contracts"; +import { BigNumber } from "@mainsail/utils"; +import { ethers } from "ethers"; + +import { Identifiers as EvmConsensusIdentifiers } from "../identifiers.js"; +import { AsyncVotesIterator } from "./votes-iterator.js"; + +@injectable() +export class ConsensusContractService implements Contracts.Evm.ConsensusContractService { + @inject(Identifiers.Application.Instance) + private readonly app!: Contracts.Kernel.Application; + + @inject(Identifiers.Cryptography.Configuration) + private readonly configuration!: Contracts.Crypto.Configuration; + + @inject(Identifiers.Evm.Instance) + @tagged("instance", "evm") + private readonly evm!: Contracts.Evm.Instance; + + async getActiveValidators(): Promise { + const consensusContractAddress = this.app.get(EvmConsensusIdentifiers.Contracts.Addresses.Consensus); + const deployerAddress = this.app.get(EvmConsensusIdentifiers.Internal.Addresses.Deployer); + const { evmSpec } = this.configuration.getMilestone(); + + const iface = new ethers.Interface(ConsensusAbi.abi); + const data = iface.encodeFunctionData("getTopValidators").slice(2); + + const result = await this.evm.view({ + caller: deployerAddress, + data: Buffer.from(data, "hex"), + recipient: consensusContractAddress, + specId: evmSpec, + }); + + if (!result.success) { + await this.app.terminate("getTopValidators failed"); + } + + const [validators] = iface.decodeFunctionResult("getTopValidators", result.output!); + + const validatorWallets: Contracts.State.ValidatorWallet[] = []; + for (const [, validator] of validators.entries()) { + const [address, [votersCount, voteBalance, isResigned, blsPublicKey]] = validator; + + const validatorWallet: Contracts.State.ValidatorWallet = { + address, + blsPublicKey: blsPublicKey.slice(2), + isResigned, + voteBalance: BigNumber.make(voteBalance), + votersCount: Number(votersCount), + }; + + validatorWallets.push(validatorWallet); + } + + return validatorWallets; + } + + async getAllValidators(): Promise { + const consensusContractAddress = this.app.get(EvmConsensusIdentifiers.Contracts.Addresses.Consensus); + const deployerAddress = this.app.get(EvmConsensusIdentifiers.Internal.Addresses.Deployer); + const { evmSpec } = this.configuration.getMilestone(); + + const iface = new ethers.Interface(ConsensusAbi.abi); + const data = iface.encodeFunctionData("getAllValidators").slice(2); + + const result = await this.evm.view({ + caller: deployerAddress, + data: Buffer.from(data, "hex"), + recipient: consensusContractAddress, + specId: evmSpec, + }); + + if (!result.success) { + await this.app.terminate("getAllValidators failed"); + } + + const [validators] = iface.decodeFunctionResult("getAllValidators", result.output!); + + const validatorWallets: Contracts.State.ValidatorWallet[] = []; + for (const [, validator] of validators.entries()) { + const [address, [votersCount, voteBalance, isResigned, blsPublicKey]] = validator; + + const validatorWallet: Contracts.State.ValidatorWallet = { + address, + blsPublicKey: blsPublicKey.slice(2), + isResigned, + voteBalance: BigNumber.make(voteBalance), + votersCount: Number(votersCount), + }; + + validatorWallets.push(validatorWallet); + } + + return validatorWallets; + } + + async getVotesCount(): Promise { + const consensusContractAddress = this.app.get(EvmConsensusIdentifiers.Contracts.Addresses.Consensus); + const deployerAddress = this.app.get(EvmConsensusIdentifiers.Internal.Addresses.Deployer); + const { evmSpec } = this.configuration.getMilestone(); + + const iface = new ethers.Interface(ConsensusAbi.abi); + const data = iface.encodeFunctionData("getVotesCount").slice(2); + + const result = await this.evm.view({ + caller: deployerAddress, + data: Buffer.from(data, "hex"), + recipient: consensusContractAddress, + specId: evmSpec, + }); + + if (!result.success) { + await this.app.terminate("getVotesCount failed"); + } + + const [voters] = iface.decodeFunctionResult("getVotesCount", result.output!); + + return Number(voters); + } + + getVotes(): AsyncIterable { + return this.app.resolve(AsyncVotesIterator); + } +} diff --git a/packages/evm-consensus/source/services/votes-iterator.ts b/packages/evm-consensus/source/services/votes-iterator.ts new file mode 100644 index 000000000..5866de687 --- /dev/null +++ b/packages/evm-consensus/source/services/votes-iterator.ts @@ -0,0 +1,68 @@ +import { inject, injectable, tagged } from "@mainsail/container"; +import { Contracts, Identifiers } from "@mainsail/contracts"; +import { ConsensusAbi } from "@mainsail/evm-contracts"; +import { ethers } from "ethers"; + +import { Identifiers as EvmConsensusIdentifiers } from "../identifiers.js"; + +const VOTES_PER_REQUEST = 10_000; + +@injectable() +export class AsyncVotesIterator implements AsyncIterable { + @inject(Identifiers.Application.Instance) + private readonly app!: Contracts.Kernel.Application; + + @inject(Identifiers.Cryptography.Configuration) + private readonly configuration!: Contracts.Crypto.Configuration; + + @inject(Identifiers.Evm.Instance) + @tagged("instance", "evm") + private readonly evm!: Contracts.Evm.Instance; + + #address = "0x0000000000000000000000000000000000000000"; + #votes: Contracts.Evm.Vote[] = []; + #index = 0; + + [Symbol.asyncIterator](): AsyncIterator { + return this; + } + + async next(): Promise> { + if (this.#votes.length === this.#index) { + this.#votes = await this.getVotes(); + + if (this.#votes.length === 0) { + return { done: true, value: undefined }; + } + + this.#index = 0; + this.#address = this.#votes.at(-1)!.voterAddress; + } + + return { done: false, value: this.#votes[this.#index++] }; + } + + private async getVotes(): Promise { + const consensusContractAddress = this.app.get(EvmConsensusIdentifiers.Contracts.Addresses.Consensus); + const deployerAddress = this.app.get(EvmConsensusIdentifiers.Internal.Addresses.Deployer); + const { evmSpec } = this.configuration.getMilestone(); + + const iface = new ethers.Interface(ConsensusAbi.abi); + const data = iface.encodeFunctionData("getVotes", [this.#address, VOTES_PER_REQUEST]).slice(2); + + const result = await this.evm.view({ + caller: deployerAddress, + data: Buffer.from(data, "hex"), + recipient: consensusContractAddress, + specId: evmSpec, + }); + + if (!result.success) { + await this.app.terminate("getVotes failed"); + } + + const [votes] = iface.decodeFunctionResult("getVotes", result.output!); + + return votes.map((vote: string[]) => ({ validatorAddress: vote[1], voterAddress: vote[0] })); + } +} diff --git a/packages/evm-consensus/source/validator-set.ts b/packages/evm-consensus/source/validator-set.ts index 9bd810482..17fa9bef4 100644 --- a/packages/evm-consensus/source/validator-set.ts +++ b/packages/evm-consensus/source/validator-set.ts @@ -1,22 +1,14 @@ -import { inject, injectable, tagged } from "@mainsail/container"; +import { inject, injectable } from "@mainsail/container"; import { Contracts, Exceptions, Identifiers } from "@mainsail/contracts"; -import { ConsensusAbi } from "@mainsail/evm-contracts"; import { Utils } from "@mainsail/kernel"; -import { ethers } from "ethers"; - -import { Identifiers as EvmConsensusIdentifiers } from "./identifiers.js"; @injectable() export class ValidatorSet implements Contracts.ValidatorSet.Service { - @inject(Identifiers.Application.Instance) - private readonly app!: Contracts.Kernel.Application; - @inject(Identifiers.Cryptography.Configuration) private readonly configuration!: Contracts.Crypto.Configuration; - @inject(Identifiers.Evm.Instance) - @tagged("instance", "evm") - private readonly evm!: Contracts.Evm.Instance; + @inject(Identifiers.Evm.ContractService.Consensus) + private readonly consensusContractService!: Contracts.Evm.ConsensusContractService; #topValidators: Contracts.State.ValidatorWallet[] = []; #indexByAddress: Map = new Map(); @@ -27,7 +19,7 @@ export class ValidatorSet implements Contracts.ValidatorSet.Service { public async restore(): Promise { await this.#buildActiveValidators(); - const validators = await this.#getAllValidators(); + const validators = await this.consensusContractService.getAllValidators(); this.#allValidators = new Map(validators.map((validator) => [validator.address, validator])); } @@ -73,7 +65,7 @@ export class ValidatorSet implements Contracts.ValidatorSet.Service { async #buildActiveValidators(): Promise { const { activeValidators } = this.configuration.getMilestone(); - const validators = await this.#getActiveValidators(); + const validators = await this.consensusContractService.getActiveValidators(); if (validators.length < activeValidators) { throw new Exceptions.NotEnoughActiveValidatorsError(this.#topValidators.length, activeValidators); } @@ -85,7 +77,7 @@ export class ValidatorSet implements Contracts.ValidatorSet.Service { async #calculateChangedValidators(): Promise { this.#dirtyValidators = []; - const validators = await this.#getAllValidators(); + const validators = await this.consensusContractService.getAllValidators(); for (const validator of validators) { const currentValidator = this.#allValidators.get(validator.address); if ( @@ -101,82 +93,4 @@ export class ValidatorSet implements Contracts.ValidatorSet.Service { this.#allValidators = new Map(validators.map((validator) => [validator.address, validator])); } - - async #getActiveValidators(): Promise { - const consensusContractAddress = this.app.get(EvmConsensusIdentifiers.Contracts.Addresses.Consensus); - const deployerAddress = this.app.get(EvmConsensusIdentifiers.Internal.Addresses.Deployer); - const { evmSpec } = this.configuration.getMilestone(); - - const iface = new ethers.Interface(ConsensusAbi.abi); - const data = iface.encodeFunctionData("getTopValidators").slice(2); - - const result = await this.evm.view({ - caller: deployerAddress, - data: Buffer.from(data, "hex"), - recipient: consensusContractAddress, - specId: evmSpec, - }); - - if (!result.success) { - this.app.terminate("getTopValidators failed"); - } - - const [validators] = iface.decodeFunctionResult("getTopValidators", result.output!); - - const validatorWallets: Contracts.State.ValidatorWallet[] = []; - for (const [, validator] of validators.entries()) { - const [address, [votersCount, voteBalance, isResigned, blsPublicKey]] = validator; - - const validatorWallet: Contracts.State.ValidatorWallet = { - address, - blsPublicKey: blsPublicKey.slice(2), - isResigned, - voteBalance: Utils.BigNumber.make(voteBalance), - votersCount: Number(votersCount), - }; - - validatorWallets.push(validatorWallet); - } - - return validatorWallets; - } - - async #getAllValidators(): Promise { - const consensusContractAddress = this.app.get(EvmConsensusIdentifiers.Contracts.Addresses.Consensus); - const deployerAddress = this.app.get(EvmConsensusIdentifiers.Internal.Addresses.Deployer); - const { evmSpec } = this.configuration.getMilestone(); - - const iface = new ethers.Interface(ConsensusAbi.abi); - const data = iface.encodeFunctionData("getAllValidators").slice(2); - - const result = await this.evm.view({ - caller: deployerAddress, - data: Buffer.from(data, "hex"), - recipient: consensusContractAddress, - specId: evmSpec, - }); - - if (!result.success) { - this.app.terminate("getAllValidators failed"); - } - - const [validators] = iface.decodeFunctionResult("getAllValidators", result.output!); - - const validatorWallets: Contracts.State.ValidatorWallet[] = []; - for (const [, validator] of validators.entries()) { - const [address, [votersCount, voteBalance, isResigned, blsPublicKey]] = validator; - - const validatorWallet: Contracts.State.ValidatorWallet = { - address, - blsPublicKey: blsPublicKey.slice(2), - isResigned, - voteBalance: Utils.BigNumber.make(voteBalance), - votersCount: Number(votersCount), - }; - - validatorWallets.push(validatorWallet); - } - - return validatorWallets; - } } diff --git a/packages/evm-contracts/source/abis/Consensus.json b/packages/evm-contracts/source/abis/Consensus.json index ed98b85ef..e825da24d 100644 --- a/packages/evm-contracts/source/abis/Consensus.json +++ b/packages/evm-contracts/source/abis/Consensus.json @@ -96,6 +96,33 @@ ], "stateMutability": "view" }, + { + "type": "function", + "name": "getVotes", + "inputs": [ + { "name": "addr", "type": "address", "internalType": "address" }, + { "name": "count", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct VoteResult[]", + "components": [ + { "name": "voter", "type": "address", "internalType": "address" }, + { "name": "validator", "type": "address", "internalType": "address" } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVotesCount", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, { "type": "function", "name": "isValidatorRegistered", @@ -202,20 +229,21 @@ } ], "bytecode": { - "object": "0x60a06040525f5f555f6001555f6009553480156019575f5ffd5b503360805260805161230c61004b5f395f818161036801528181610548015281816108be0152610ccd015261230c5ff3fe608060405234801561000f575f5ffd5b50600436106100e5575f3560e01c80636dd7d8ea11610088578063b85f5da211610063578063b85f5da2146101a6578063d04a68c7146101ae578063f1bd0b37146101e9578063f3513a37146101f0575f5ffd5b80636dd7d8ea1461016b578063afeea1151461017e578063b5cfa68c14610193575f5ffd5b80632bdf6d43116100c35780632bdf6d43146101285780633174b6891461013d578063602a9eee146101455780636252587914610158575f5ffd5b80630777cbef146100e95780630d2bd909146101005780631904bb2e14610108575b5f5ffd5b6001545b6040519081526020015b60405180910390f35b600a546100ed565b61011b610116366004611cf6565b6101f8565b6040516100f79190611da7565b61013b610136366004611db9565b61035d565b005b61013b61041b565b61013b610153366004611e2a565b61053e565b61013b610166366004611e88565b610819565b61013b610179366004611cf6565b6108b4565b610186610b24565b6040516100f79190611ebf565b61013b6101a1366004611f22565b610cc2565b61013b611115565b6101d96101bc366004611cf6565b6001600160a01b03165f9081526003602052604090205460ff1690565b60405190151581526020016100f7565b5f546100ed565b610186611236565b610200611c1b565b6001600160a01b0382165f9081526003602052604090205460ff1661026c5760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e2774206578697374730000000060448201526064015b60405180910390fd5b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff161515948201949094526003840180549394928501939192916060840191906102d490611f42565b80601f016020809104026020016040519081016040528092919081815260200182805461030090611f42565b801561034b5780601f106103225761010080835404028352916020019161034b565b820191905f5260205f20905b81548152906001019060200180831161032e57829003601f168201915b50505091909252505050905292915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103d55760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f742074686520636f6e7472616374206f776e65726044820152606401610263565b5f5b818110156104165761040e8383838181106103f4576103f4611f74565b90506020020160208101906104099190611cf6565b6113ce565b6001016103d7565b505050565b335f90815260066020526040902080546001600160a01b03166104725760405162461bcd60e51b815260206004820152600f60248201526e1513d113ce881b9bdd081d9bdd1959608a1b6044820152606401610263565b8054604080513381526001600160a01b0390921660208301527f6572af8bf9a0a86efb88dcc30011626a15c9c4603503aa4466a3f87a1867deef910160405180910390a160018082015482546001600160a01b03165f9081526002602052604081209092018054919290916104e8908490611f9c565b909155505080546001600160a01b03165f908152600260205260408120805460019290610516908490611f9c565b9091555050335f90815260066020526040812080546001600160a01b03191681556001015550565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036105b65760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e6572000000006044820152606401610263565b335f9081526003602052604090205460ff16156106155760405162461bcd60e51b815260206004820152601f60248201527f56616c696461746f7220697320616c72656164792072656769737465726564006044820152606401610263565b5f8282604051610626929190611faf565b60408051918290039091205f8181526004602052919091205490915060ff161561069e5760405162461bcd60e51b815260206004820152602360248201527f424c5331322d333831206b657920697320616c726561647920726567697374656044820152621c995960ea1b6064820152608401610263565b6106a883836114ae565b5f60405180608001604052805f81526020015f81526020015f1515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920182905250939094525050805492935090508061071083611fbe565b9091555050335f9081526003602081815260408084208054600160ff1991821681179092556002808552958390208751815593870151918401919091559085015193820180549091169315159390931790925560608301518392918201906107789082612035565b5050505f82815260046020526040808220805460ff191660019081179091556005805491820181559092527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910180546001600160a01b0319163390811790915590517f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c9161080b91879087906120f0565b60405180910390a150505050565b6108296101bc6020830183611cf6565b6108755760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e277420657869737473000000006044820152606401610263565b610882602082018261212f565b60025f6108926020850185611cf6565b6001600160a01b0316815260208101919091526040015f206104168282612207565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361092c5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e6572000000006044820152606401610263565b6001600160a01b0381165f9081526003602052604090205460ff166109935760405162461bcd60e51b815260206004820152601760248201527f4d75737420766f746520666f722076616c696461746f720000000000000000006044820152606401610263565b335f908152600660205260409020546001600160a01b0316156109e85760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b6044820152606401610263565b6001600160a01b0381165f9081526002602081905260409091209081015460ff1615610a615760405162461bcd60e51b815260206004820152602260248201527f4d75737420766f746520666f7220756e72657369676e65642076616c6964617460448201526137b960f11b6064820152608401610263565b6040805180820182526001600160a01b03848116825233803160208085019182525f8381526006909152948520935184546001600160a01b0319169316929092178355905160019283015590830180549131929091610ac190849061228f565b9091555050805460019082905f90610ada90849061228f565b9091555050604080513381526001600160a01b03841660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2910160405180910390a15050565b600a546060905f9067ffffffffffffffff811115610b4457610b44611fd6565b604051908082528060200260200182016040528015610b7d57816020015b610b6a611c1b565b815260200190600190039081610b625790505b5090505f5b600a54811015610cbc575f600a8281548110610ba057610ba0611f74565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff1615159583019590955260038101805493965090949384019285916060840191610c1290611f42565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3e90611f42565b8015610c895780601f10610c6057610100808354040283529160200191610c89565b820191905f5260205f20905b815481529060010190602001808311610c6c57829003601f168201915b505050505081525050815250848481518110610ca757610ca7611f74565b60209081029190910101525050600101610b82565b50919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d3a5760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f742074686520636f6e7472616374206f776e65726044820152606401610263565b610d42611510565b610d4a61165f565b600780546001600160a01b03191690556001545f80549091610d7c9160ff8516918491610d779190611f9c565b6116b0565b90508060ff165f03610d8c575050565b5f5b600554811015611037575f60058281548110610dac57610dac611f74565b5f9182526020808320909101546001600160a01b03168083526002918290526040909220908101549192509060ff1615610de757505061102f565b6007546001600160a01b0316610e225750600780546001600160a01b0319166001600160a01b0392909216919091179055600160095561102f565b8360ff166009541015610e4057610e398285611741565b505061102f565b6007546001600160a01b039081165f908152600260208181526040928390208351808501855294871685528351608081018552865481526001870154818401529286015460ff16151593830193909352600385018054939461101c94909392840192918791606084019190610eb490611f42565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee090611f42565b8015610f2b5780601f10610f0257610100808354040283529160200191610f2b565b820191905f5260205f20905b815481529060010190602001808311610f0e57829003601f168201915b5050509190925250505090526040805180820182526007546001600160a01b031681528151608081018352855481526001860154602082810191909152600287015460ff16151593820193909352600386018054929384019287916060840191610f9490611f42565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc090611f42565b801561100b5780601f10610fe25761010080835404028352916020019161100b565b820191905f5260205f20905b815481529060010190602001808311610fee57829003601f168201915b505050505081525050815250611b20565b1561102b5761102b8386611741565b5050505b600101610d8e565b506007546001600160a01b031661104f600a5f611c64565b8160ff1667ffffffffffffffff81111561106b5761106b611fd6565b604051908082528060200260200182016040528015611094578160200160208202803683370190505b5080516110a991600a91602090910190611c7f565b505f5b8260ff1681101561110e5781600a82815481106110cb576110cb611f74565b5f91825260208083209190910180546001600160a01b0319166001600160a01b0394851617905593821681526008909352604090922054909116906001016110ac565b5050505b50565b335f9081526003602052604090205460ff166111735760405162461bcd60e51b815260206004820152601960248201527f43616c6c6572206973206e6f7420612076616c696461746f72000000000000006044820152606401610263565b335f9081526002602081905260409091209081015460ff16156111d85760405162461bcd60e51b815260206004820152601d60248201527f56616c696461746f7220697320616c72656164792072657369676e65640000006044820152606401610263565b60028101805460ff19166001908117909155805481905f906111fb90839061228f565b90915550506040513381527f24250fc1ec78a1405ddd4cc8b75964858af228d05faa8d4bc1302966d8a541179060200160405180910390a150565b6005546060905f9067ffffffffffffffff81111561125657611256611fd6565b60405190808252806020026020018201604052801561128f57816020015b61127c611c1b565b8152602001906001900390816112745790505b5090505f5b600554811015610cbc575f600582815481106112b2576112b2611f74565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff161515958301959095526003810180549396509094938401928591606084019161132490611f42565b80601f016020809104026020016040519081016040528092919081815260200182805461135090611f42565b801561139b5780601f106113725761010080835404028352916020019161139b565b820191905f5260205f20905b81548152906001019060200180831161137e57829003601f168201915b5050505050815250508152508484815181106113b9576113b9611f74565b60209081029190910101525050600101611294565b6001600160a01b038082165f90815260066020526040902080549091166113f3575050565b60018101546001600160a01b038316318110156114545761141e816001600160a01b03851631611f9c565b82546001600160a01b03165f908152600260205260408120600101805490919061144990849061228f565b909155506114999050565b6114686001600160a01b0384163182611f9c565b82546001600160a01b03165f9081526002602052604081206001018054909190611493908490611f9c565b90915550505b506001600160a01b0390911631600190910155565b6030811461150c5760405162461bcd60e51b815260206004820152602560248201527f424c5331322d333831207075626c69634b6579206c656e67746820697320696e6044820152641d985b1a5960da1b6064820152608401610263565b5050565b6005545f61151f600183611f9c565b90505b801561150c575f61153482600161228f565b60408051426020820152449181019190915260608101849052608001604051602081830303815290604052805190602001205f1c61157291906122a2565b90505f6005838154811061158857611588611f74565b5f91825260209091200154600580546001600160a01b03909216925090839081106115b5576115b5611f74565b5f91825260209091200154600580546001600160a01b0390921691859081106115e0576115e0611f74565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550806005838154811061161f5761161f611f74565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050508080611657906122c1565b915050611522565b6007546001600160a01b03165b6001600160a01b038116156116a9576001600160a01b039081165f90815260086020526040902080546001600160a01b031981169091551661166c565b505f600955565b5f818311156117195760405162461bcd60e51b815260206004820152602f60248201527f4d696e696d756d2073686f756c64206265206c657373207468616e206f72206560448201526e7175616c20746f206d6178696d756d60881b6064820152608401610263565b8284101561172857508161173a565b8184111561173757508061173a565b50825b9392505050565b6001600160a01b0382165f9081526002602081815260408084208151608081018352815481526001820154938101939093529283015460ff1615159082015260038201805491929160608401919061179890611f42565b80601f01602080910402602001604051908101604052809291908181526020018280546117c490611f42565b801561180f5780601f106117e65761010080835404028352916020019161180f565b820191905f5260205f20905b8154815290600101906020018083116117f257829003601f168201915b5050509190925250506040805180820182526007546001600160a01b03168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff16151594820194909452600384018054969750611930969395509185019390929091606084019161188a90611f42565b80601f01602080910402602001604051908101604052809291908181526020018280546118b690611f42565b80156119015780601f106118d857610100808354040283529160200191611901565b820191905f5260205f20905b8154815290600101906020018083116118e457829003601f168201915b5050505050815250508152506040518060400160405280866001600160a01b0316815260200184815250611b20565b156119435761193e83611b6c565b611ac1565b6007546001600160a01b039081165f81815260086020526040902054909116905b6001600160a01b0382166119815761197c8186611bbd565b611abe565b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff16151594820194909452600384018054611a8e95938501939160608401916119e890611f42565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1490611f42565b8015611a5f5780601f10611a3657610100808354040283529160200191611a5f565b820191905f5260205f20905b815481529060010190602001808311611a4257829003601f168201915b5050505050815250508152506040518060400160405280886001600160a01b0316815260200186815250611b20565b15611a9d5761197c8186611bbd565b506001600160a01b038082165f908152600860205260409020541690611964565b50505b8160ff16600954111561041657600780546001600160a01b039081165f90815260086020526040812080546001600160a01b03198082169092558454931692168217909255600980549192611b15836122c1565b919050555050505050565b5f81602001516020015183602001516020015103611b505750805182516001600160a01b03918216911611611b66565b8160200151602001518360200151602001511190505b92915050565b600780546001600160a01b038381165f8181526008602052604081208054939094166001600160a01b0319938416179093558354909116179091556009805491611bb583611fbe565b919050555050565b6001600160a01b038281165f8181526008602052604080822080548686168085529284208054919096166001600160a01b031991821617909555928252825490931690921790556009805491611c1283611fbe565b91905055505050565b60405180604001604052805f6001600160a01b03168152602001611c5f60405180608001604052805f81526020015f81526020015f15158152602001606081525090565b905290565b5080545f8255905f5260205f20908101906111129190611ce2565b828054828255905f5260205f20908101928215611cd2579160200282015b82811115611cd257825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611c9d565b50611cde929150611ce2565b5090565b5b80821115611cde575f8155600101611ce3565b5f60208284031215611d06575f5ffd5b81356001600160a01b038116811461173a575f5ffd5b60018060a01b0381511682525f602082015160406020850152805160408501526020810151606085015260408101511515608085015260608101519050608060a085015280518060c08601525f5b81811015611d8757602081840181015160e0888401015201611d6a565b505f60e0828701015260e0601f19601f8301168601019250505092915050565b602081525f61173a6020830184611d1c565b5f5f60208385031215611dca575f5ffd5b823567ffffffffffffffff811115611de0575f5ffd5b8301601f81018513611df0575f5ffd5b803567ffffffffffffffff811115611e06575f5ffd5b8560208260051b8401011115611e1a575f5ffd5b6020919091019590945092505050565b5f5f60208385031215611e3b575f5ffd5b823567ffffffffffffffff811115611e51575f5ffd5b8301601f81018513611e61575f5ffd5b803567ffffffffffffffff811115611e77575f5ffd5b856020828401011115611e1a575f5ffd5b5f60208284031215611e98575f5ffd5b813567ffffffffffffffff811115611eae575f5ffd5b82016040818503121561173a575f5ffd5b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015611f1657603f19878603018452611f01858351611d1c565b94506020938401939190910190600101611ee5565b50929695505050505050565b5f60208284031215611f32575f5ffd5b813560ff8116811461173a575f5ffd5b600181811c90821680611f5657607f821691505b602082108103610cbc57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115611b6657611b66611f88565b818382375f9101908152919050565b5f60018201611fcf57611fcf611f88565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b601f82111561041657805f5260205f20601f840160051c8101602085101561200f5750805b601f840160051c820191505b8181101561202e575f815560010161201b565b5050505050565b815167ffffffffffffffff81111561204f5761204f611fd6565b6120638161205d8454611f42565b84611fea565b6020601f821160018114612095575f831561207e5750848201515b5f19600385901b1c1916600184901b17845561202e565b5f84815260208120601f198516915b828110156120c457878501518255602094850194600190920191016120a4565b50848210156120e157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8235607e19833603018112612143575f5ffd5b9190910192915050565b67ffffffffffffffff83111561216557612165611fd6565b612179836121738354611f42565b83611fea565b5f601f8411600181146121aa575f85156121935750838201355b5f19600387901b1c1916600186901b17835561202e565b5f83815260208120601f198716915b828110156121d957868501358255602094850194600190920191016121b9565b50868210156121f5575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b813581556020820135600182015560028101604083013580151580821461222c575f5ffd5b60ff19835416915060ff8116821783555050506060820135601e19833603018112612255575f5ffd5b8201803567ffffffffffffffff81111561226d575f5ffd5b602082019150803603821315612281575f5ffd5b61110e81836003860161214d565b80820180821115611b6657611b66611f88565b5f826122bc57634e487b7160e01b5f52601260045260245ffd5b500690565b5f816122cf576122cf611f88565b505f19019056fea2646970667358221220fb596a899783aa169bc4bac8389b7b024606b59ed939dfa3029105b691e2bc1964736f6c634300081b0033", - "sourceMap": "1326:9070:23:-:0;;;1421:1;1376:46;;1468:1;1425:44;;1858:1;1820:39;;1908:41;;;;;;;;;-1:-1:-1;1935:10:23;1926:19;;1326:9070;;;;;;;;;;;;;;;;;;;;;;;;;;;", + "object": "0x60a06040525f80805560018190556007819055600880546001600160a01b0319908116909155600980549091169055600c5534801561003c575f5ffd5b50336080526080516128196100755f395f81816103a6015281816106bf01528181610a3501528181610f1d015261146201526128195ff3fe608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c80636dd7d8ea11610093578063d04a68c711610063578063d04a68c7146101cc578063eb9019d414610207578063f1bd0b3714610227578063f3513a371461022e575f5ffd5b80636dd7d8ea14610189578063afeea1151461019c578063b5cfa68c146101b1578063b85f5da2146101c4575f5ffd5b80632bdf6d43116100ce5780632bdf6d43146101465780633174b6891461015b578063602a9eee146101635780636252587914610176575f5ffd5b80630777cbef146100ff5780630d2bd909146101165780631904bb2e1461011e5780631b605b861461013e575b5f5ffd5b6001545b6040519081526020015b60405180910390f35b600d54610103565b61013161012c366004612161565b610236565b60405161010d9190612205565b600754610103565b610159610154366004612217565b61039b565b005b610159610429565b610159610171366004612286565b6106b5565b6101596101843660046122e2565b610990565b610159610197366004612161565b610a2b565b6101a4610d75565b60405161010d9190612318565b6101596101bf36600461237b565b610f12565b610159611334565b6101f76101da366004612161565b6001600160a01b03165f9081526003602052604090205460ff1690565b604051901515815260200161010d565b61021a61021536600461239b565b611455565b60405161010d91906123c3565b5f54610103565b6101a4611698565b61023e61206b565b6001600160a01b0382165f9081526003602052604090205460ff166102aa5760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e2774206578697374730000000060448201526064015b60405180910390fd5b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff161515948201949094526003840180549394928501939192916060840191906103129061241d565b80601f016020809104026020016040519081016040528092919081815260200182805461033e9061241d565b80156103895780601f1061036057610100808354040283529160200191610389565b820191905f5260205f20905b81548152906001019060200180831161036c57829003601f168201915b50505091909252505050905292915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103e35760405162461bcd60e51b81526004016102a19061244f565b5f5b818110156104245761041c83838381811061040257610402612484565b90506020020160208101906104179190612161565b61182f565b6001016103e5565b505050565b335f90815260066020526040902080546001600160a01b03166104805760405162461bcd60e51b815260206004820152600f60248201526e1513d113ce881b9bdd081d9bdd1959608a1b60448201526064016102a1565b6009546008546001600160a01b039182169116036104b957600880546001600160a01b03199081169091556009805490911690556105cc565b600954336001600160a01b0390911603610512576002810180546001600160a01b039081165f90815260066020526040902060030180546001600160a01b031990811690915591546009805490931691161790556105cc565b600854336001600160a01b0390911603610576576009546001600160a01b039081165f9081526006602052604080822060020180546001600160a01b03199081169091556008805480861685529290932060030154911692169190911790556105cc565b60038181018054600280850180546001600160a01b039081165f9081526006602052604080822090970180549583166001600160a01b031996871617905591549454811682529490200180549290931691161790555b8054604080513381526001600160a01b0390921660208301527f6572af8bf9a0a86efb88dcc30011626a15c9c4603503aa4466a3f87a1867deef910160405180910390a180546001600160a01b03165f9081526002602052604081206001808401549082018054929391929091906106459084906124ac565b9091555050805460019082905f9061065e9084906124ac565b9091555050335f90815260066020526040812080546001600160a01b03199081168255600182018390556002820180548216905560039091018054909116905560078054916106ac836124bf565b91905055505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361072d5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e65720000000060448201526064016102a1565b335f9081526003602052604090205460ff161561078c5760405162461bcd60e51b815260206004820152601f60248201527f56616c696461746f7220697320616c726561647920726567697374657265640060448201526064016102a1565b5f828260405161079d9291906124d4565b60408051918290039091205f8181526004602052919091205490915060ff16156108155760405162461bcd60e51b815260206004820152602360248201527f424c5331322d333831206b657920697320616c726561647920726567697374656044820152621c995960ea1b60648201526084016102a1565b61081f838361190f565b5f60405180608001604052805f81526020015f81526020015f1515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509390945250508054929350905080610887836124e3565b9091555050335f9081526003602081815260408084208054600160ff1991821681179092556002808552958390208751815593870151918401919091559085015193820180549091169315159390931790925560608301518392918201906108ef908261255a565b5050505f82815260046020526040808220805460ff191660019081179091556005805491820181559092527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910180546001600160a01b0319163390811790915590517f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c916109829187908790612614565b60405180910390a150505050565b6109a06101da6020830183612161565b6109ec5760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e2774206578697374730000000060448201526064016102a1565b6109f96020820182612653565b60025f610a096020850185612161565b6001600160a01b0316815260208101919091526040015f20610424828261272a565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610aa35760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e65720000000060448201526064016102a1565b6001600160a01b0381165f9081526003602052604090205460ff16610b0a5760405162461bcd60e51b815260206004820152601760248201527f4d75737420766f746520666f722076616c696461746f7200000000000000000060448201526064016102a1565b335f908152600660205260409020546001600160a01b031615610b5f5760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b60448201526064016102a1565b6001600160a01b0381165f9081526002602081905260409091209081015460ff1615610bd85760405162461bcd60e51b815260206004820152602260248201527f4d75737420766f746520666f7220756e72657369676e65642076616c6964617460448201526137b960f11b60648201526084016102a1565b604080516080810182526001600160a01b03808516825233803160208085019182525f85870181815260608701828152948252600690925295909520935184549084166001600160a01b03199182161785559051600185015593516002840180549184169186169190911790555160039092018054928216929093169190911790915560085416610c8a5760088054336001600160a01b03199182168117909255600980549091169091179055610ce1565b600980546001600160a01b039081165f9081526006602052604080822060030180546001600160a01b0319908116339081179092558554828552929093206002018054841692909416919091179092558254161790555b60078054905f610cf0836124e3565b9190505550336001600160a01b031631816001015f828254610d1291906127b1565b9091555050805460019082905f90610d2b9084906127b1565b9091555050604080513381526001600160a01b03841660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2910160405180910390a15050565b600d546060905f906001600160401b03811115610d9457610d946124fb565b604051908082528060200260200182016040528015610dcd57816020015b610dba61206b565b815260200190600190039081610db25790505b5090505f5b600d54811015610f0c575f600d8281548110610df057610df0612484565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff1615159583019590955260038101805493965090949384019285916060840191610e629061241d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8e9061241d565b8015610ed95780601f10610eb057610100808354040283529160200191610ed9565b820191905f5260205f20905b815481529060010190602001808311610ebc57829003601f168201915b505050505081525050815250848481518110610ef757610ef7612484565b60209081029190910101525050600101610dd2565b50919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f5a5760405162461bcd60e51b81526004016102a19061244f565b610f62611971565b610f6a611ac0565b600a80546001600160a01b03191690556001545f80549091610f9c9160ff8516918491610f9791906124ac565b611b11565b90508060ff165f03610fac575050565b5f5b600554811015611257575f60058281548110610fcc57610fcc612484565b5f9182526020808320909101546001600160a01b03168083526002918290526040909220908101549192509060ff161561100757505061124f565b600a546001600160a01b03166110425750600a80546001600160a01b0319166001600160a01b03929092169190911790556001600c5561124f565b8360ff16600c541015611060576110598285611ba2565b505061124f565b600a546001600160a01b039081165f908152600260208181526040928390208351808501855294871685528351608081018552865481526001870154818401529286015460ff16151593830193909352600385018054939461123c949093928401929187916060840191906110d49061241d565b80601f01602080910402602001604051908101604052809291908181526020018280546111009061241d565b801561114b5780601f106111225761010080835404028352916020019161114b565b820191905f5260205f20905b81548152906001019060200180831161112e57829003601f168201915b505050919092525050509052604080518082018252600a546001600160a01b031681528151608081018352855481526001860154602082810191909152600287015460ff161515938201939093526003860180549293840192879160608401916111b49061241d565b80601f01602080910402602001604051908101604052809291908181526020018280546111e09061241d565b801561122b5780601f106112025761010080835404028352916020019161122b565b820191905f5260205f20905b81548152906001019060200180831161120e57829003601f168201915b505050505081525050815250611f81565b1561124b5761124b8386611ba2565b5050505b600101610fae565b50600a546001600160a01b031661126f600d5f6120b4565b8160ff166001600160401b0381111561128a5761128a6124fb565b6040519080825280602002602001820160405280156112b3578160200160208202803683370190505b5080516112c891600d916020909101906120cf565b505f5b8260ff1681101561132d5781600d82815481106112ea576112ea612484565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559382168152600b909352604090922054909116906001016112cb565b5050505b50565b335f9081526003602052604090205460ff166113925760405162461bcd60e51b815260206004820152601960248201527f43616c6c6572206973206e6f7420612076616c696461746f720000000000000060448201526064016102a1565b335f9081526002602081905260409091209081015460ff16156113f75760405162461bcd60e51b815260206004820152601d60248201527f56616c696461746f7220697320616c72656164792072657369676e656400000060448201526064016102a1565b60028101805460ff19166001908117909155805481905f9061141a9083906127b1565b90915550506040513381527f24250fc1ec78a1405ddd4cc8b75964858af228d05faa8d4bc1302966d8a541179060200160405180910390a150565b6060336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461149f5760405162461bcd60e51b81526004016102a19061244f565b5f6114ad835f600754611b11565b6001600160401b038111156114c4576114c46124fb565b60405190808252806020026020018201604052801561150857816020015b604080518082019091525f80825260208201528152602001906001900390816114e25790505b506008549091506001600160a01b039081169085161561154157506001600160a01b038085165f90815260066020526040902060030154165b5f5b6001600160a01b0382161580159061155a57508481105b156115cf576001600160a01b038083165f81815260066020908152604091829020825180840190935292825282549093169281019290925290848361159e816124e3565b9450815181106115b0576115b0612484565b6020908102919091010152600301546001600160a01b03169150611543565b808351036115e257829350505050611692565b5f816001600160401b038111156115fb576115fb6124fb565b60405190808252806020026020018201604052801561163f57816020015b604080518082019091525f80825260208201528152602001906001900390816116195790505b5090505f5b8281101561168b5784818151811061165e5761165e612484565b602002602001015182828151811061167857611678612484565b6020908102919091010152600101611644565b5093505050505b92915050565b6005546060905f906001600160401b038111156116b7576116b76124fb565b6040519080825280602002602001820160405280156116f057816020015b6116dd61206b565b8152602001906001900390816116d55790505b5090505f5b600554811015610f0c575f6005828154811061171357611713612484565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff16151595830195909552600381018054939650909493840192859160608401916117859061241d565b80601f01602080910402602001604051908101604052809291908181526020018280546117b19061241d565b80156117fc5780601f106117d3576101008083540402835291602001916117fc565b820191905f5260205f20905b8154815290600101906020018083116117df57829003601f168201915b50505050508152505081525084848151811061181a5761181a612484565b602090810291909101015250506001016116f5565b6001600160a01b038082165f9081526006602052604090208054909116611854575050565b60018101546001600160a01b038316318110156118b55761187f816001600160a01b038516316124ac565b82546001600160a01b03165f90815260026020526040812060010180549091906118aa9084906127b1565b909155506118fa9050565b6118c96001600160a01b03841631826124ac565b82546001600160a01b03165f90815260026020526040812060010180549091906118f49084906124ac565b90915550505b506001600160a01b0390911631600190910155565b6030811461196d5760405162461bcd60e51b815260206004820152602560248201527f424c5331322d333831207075626c69634b6579206c656e67746820697320696e6044820152641d985b1a5960da1b60648201526084016102a1565b5050565b6005545f6119806001836124ac565b90505b801561196d575f6119958260016127b1565b60408051426020820152449181019190915260608101849052608001604051602081830303815290604052805190602001205f1c6119d391906127c4565b90505f600583815481106119e9576119e9612484565b5f91825260209091200154600580546001600160a01b0390921692509083908110611a1657611a16612484565b5f91825260209091200154600580546001600160a01b039092169185908110611a4157611a41612484565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508060058381548110611a8057611a80612484565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050508080611ab8906124bf565b915050611983565b600a546001600160a01b03165b6001600160a01b03811615611b0a576001600160a01b039081165f908152600b6020526040902080546001600160a01b0319811690915516611acd565b505f600c55565b5f81831115611b7a5760405162461bcd60e51b815260206004820152602f60248201527f4d696e696d756d2073686f756c64206265206c657373207468616e206f72206560448201526e7175616c20746f206d6178696d756d60881b60648201526084016102a1565b82841015611b89575081611b9b565b81841115611b98575080611b9b565b50825b9392505050565b6001600160a01b0382165f9081526002602081815260408084208151608081018352815481526001820154938101939093529283015460ff16151590820152600382018054919291606084019190611bf99061241d565b80601f0160208091040260200160405190810160405280929190818152602001828054611c259061241d565b8015611c705780601f10611c4757610100808354040283529160200191611c70565b820191905f5260205f20905b815481529060010190602001808311611c5357829003601f168201915b505050919092525050604080518082018252600a546001600160a01b03168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff16151594820194909452600384018054969750611d919693955091850193909290916060840191611ceb9061241d565b80601f0160208091040260200160405190810160405280929190818152602001828054611d179061241d565b8015611d625780601f10611d3957610100808354040283529160200191611d62565b820191905f5260205f20905b815481529060010190602001808311611d4557829003601f168201915b5050505050815250508152506040518060400160405280866001600160a01b0316815260200184815250611f81565b15611da457611d9f83611fc5565b611f22565b600a546001600160a01b039081165f818152600b6020526040902054909116905b6001600160a01b038216611de257611ddd8186612016565b611f1f565b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff16151594820194909452600384018054611eef9593850193916060840191611e499061241d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e759061241d565b8015611ec05780601f10611e9757610100808354040283529160200191611ec0565b820191905f5260205f20905b815481529060010190602001808311611ea357829003601f168201915b5050505050815250508152506040518060400160405280886001600160a01b0316815260200186815250611f81565b15611efe57611ddd8186612016565b506001600160a01b038082165f908152600b60205260409020541690611dc5565b50505b8160ff16600c54111561042457600a80546001600160a01b039081165f908152600b6020526040812080546001600160a01b03198082169092558454931692168217909255600c80549192611f76836124bf565b919050555050505050565b5f81602001516020015183602001516020015103611fb15750805182516001600160a01b03918216911611611692565b506020908101518101519181015101511190565b600a80546001600160a01b038381165f818152600b602052604081208054939094166001600160a01b031993841617909355835490911617909155600c80549161200e836124e3565b919050555050565b6001600160a01b038281165f818152600b602052604080822080548686168085529284208054919096166001600160a01b03199182161790955592825282549093169092179055600c8054916106ac836124e3565b60405180604001604052805f6001600160a01b031681526020016120af60405180608001604052805f81526020015f81526020015f15158152602001606081525090565b905290565b5080545f8255905f5260205f20908101906113319190612132565b828054828255905f5260205f20908101928215612122579160200282015b8281111561212257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906120ed565b5061212e929150612132565b5090565b5b8082111561212e575f8155600101612133565b80356001600160a01b038116811461215c575f5ffd5b919050565b5f60208284031215612171575f5ffd5b611b9b82612146565b60018060a01b0381511682525f602082015160406020850152805160408501526020810151606085015260408101511515608085015260608101519050608060a085015280518060c08601525f5b818110156121e557602081840181015160e08884010152016121c8565b505f60e0828701015260e0601f19601f8301168601019250505092915050565b602081525f611b9b602083018461217a565b5f5f60208385031215612228575f5ffd5b82356001600160401b0381111561223d575f5ffd5b8301601f8101851361224d575f5ffd5b80356001600160401b03811115612262575f5ffd5b8560208260051b8401011115612276575f5ffd5b6020919091019590945092505050565b5f5f60208385031215612297575f5ffd5b82356001600160401b038111156122ac575f5ffd5b8301601f810185136122bc575f5ffd5b80356001600160401b038111156122d1575f5ffd5b856020828401011115612276575f5ffd5b5f602082840312156122f2575f5ffd5b81356001600160401b03811115612307575f5ffd5b820160408185031215611b9b575f5ffd5b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561236f57603f1987860301845261235a85835161217a565b9450602093840193919091019060010161233e565b50929695505050505050565b5f6020828403121561238b575f5ffd5b813560ff81168114611b9b575f5ffd5b5f5f604083850312156123ac575f5ffd5b6123b583612146565b946020939093013593505050565b602080825282518282018190525f918401906040840190835b8181101561241257835180516001600160a01b0390811685526020918201511681850152909301926040909201916001016123dc565b509095945050505050565b600181811c9082168061243157607f821691505b602082108103610f0c57634e487b7160e01b5f52602260045260245ffd5b6020808252818101527f43616c6c6572206973206e6f742074686520636f6e7472616374206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561169257611692612498565b5f816124cd576124cd612498565b505f190190565b818382375f9101908152919050565b5f600182016124f4576124f4612498565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b601f82111561042457805f5260205f20601f840160051c810160208510156125345750805b601f840160051c820191505b81811015612553575f8155600101612540565b5050505050565b81516001600160401b03811115612573576125736124fb565b61258781612581845461241d565b8461250f565b6020601f8211600181146125b9575f83156125a25750848201515b5f19600385901b1c1916600184901b178455612553565b5f84815260208120601f198516915b828110156125e857878501518255602094850194600190920191016125c8565b508482101561260557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8235607e19833603018112612667575f5ffd5b9190910192915050565b6001600160401b03831115612688576126886124fb565b61269c83612696835461241d565b8361250f565b5f601f8411600181146126cd575f85156126b65750838201355b5f19600387901b1c1916600186901b178355612553565b5f83815260208120601f198716915b828110156126fc57868501358255602094850194600190920191016126dc565b5086821015612718575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b813581556020820135600182015560028101604083013580151580821461274f575f5ffd5b60ff19835416915060ff8116821783555050506060820135601e19833603018112612778575f5ffd5b820180356001600160401b0381111561278f575f5ffd5b6020820191508036038213156127a3575f5ffd5b61132d818360038601612671565b8082018082111561169257611692612498565b5f826127de57634e487b7160e01b5f52601260045260245ffd5b50069056fea2646970667358221220a8ee0b1320141255bce1b410559059bcda15b2e7d6bad21420e5b904b6bec7e564736f6c634300081b0033", + "sourceMap": "1460:13132:23:-:0;;;1561:1;1516:46;;;1568:44;;;;1904:32;;;;1942:40;;;-1:-1:-1;;;;;;1942:40:23;;;;;;1988;;;;;;;;2131:39;;2225:50;;;;;;;;;-1:-1:-1;2258:10:23;2249:19;;1460:13132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", "linkReferences": {} }, "deployedBytecode": { - "object": "0x608060405234801561000f575f5ffd5b50600436106100e5575f3560e01c80636dd7d8ea11610088578063b85f5da211610063578063b85f5da2146101a6578063d04a68c7146101ae578063f1bd0b37146101e9578063f3513a37146101f0575f5ffd5b80636dd7d8ea1461016b578063afeea1151461017e578063b5cfa68c14610193575f5ffd5b80632bdf6d43116100c35780632bdf6d43146101285780633174b6891461013d578063602a9eee146101455780636252587914610158575f5ffd5b80630777cbef146100e95780630d2bd909146101005780631904bb2e14610108575b5f5ffd5b6001545b6040519081526020015b60405180910390f35b600a546100ed565b61011b610116366004611cf6565b6101f8565b6040516100f79190611da7565b61013b610136366004611db9565b61035d565b005b61013b61041b565b61013b610153366004611e2a565b61053e565b61013b610166366004611e88565b610819565b61013b610179366004611cf6565b6108b4565b610186610b24565b6040516100f79190611ebf565b61013b6101a1366004611f22565b610cc2565b61013b611115565b6101d96101bc366004611cf6565b6001600160a01b03165f9081526003602052604090205460ff1690565b60405190151581526020016100f7565b5f546100ed565b610186611236565b610200611c1b565b6001600160a01b0382165f9081526003602052604090205460ff1661026c5760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e2774206578697374730000000060448201526064015b60405180910390fd5b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff161515948201949094526003840180549394928501939192916060840191906102d490611f42565b80601f016020809104026020016040519081016040528092919081815260200182805461030090611f42565b801561034b5780601f106103225761010080835404028352916020019161034b565b820191905f5260205f20905b81548152906001019060200180831161032e57829003601f168201915b50505091909252505050905292915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103d55760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f742074686520636f6e7472616374206f776e65726044820152606401610263565b5f5b818110156104165761040e8383838181106103f4576103f4611f74565b90506020020160208101906104099190611cf6565b6113ce565b6001016103d7565b505050565b335f90815260066020526040902080546001600160a01b03166104725760405162461bcd60e51b815260206004820152600f60248201526e1513d113ce881b9bdd081d9bdd1959608a1b6044820152606401610263565b8054604080513381526001600160a01b0390921660208301527f6572af8bf9a0a86efb88dcc30011626a15c9c4603503aa4466a3f87a1867deef910160405180910390a160018082015482546001600160a01b03165f9081526002602052604081209092018054919290916104e8908490611f9c565b909155505080546001600160a01b03165f908152600260205260408120805460019290610516908490611f9c565b9091555050335f90815260066020526040812080546001600160a01b03191681556001015550565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036105b65760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e6572000000006044820152606401610263565b335f9081526003602052604090205460ff16156106155760405162461bcd60e51b815260206004820152601f60248201527f56616c696461746f7220697320616c72656164792072656769737465726564006044820152606401610263565b5f8282604051610626929190611faf565b60408051918290039091205f8181526004602052919091205490915060ff161561069e5760405162461bcd60e51b815260206004820152602360248201527f424c5331322d333831206b657920697320616c726561647920726567697374656044820152621c995960ea1b6064820152608401610263565b6106a883836114ae565b5f60405180608001604052805f81526020015f81526020015f1515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920182905250939094525050805492935090508061071083611fbe565b9091555050335f9081526003602081815260408084208054600160ff1991821681179092556002808552958390208751815593870151918401919091559085015193820180549091169315159390931790925560608301518392918201906107789082612035565b5050505f82815260046020526040808220805460ff191660019081179091556005805491820181559092527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910180546001600160a01b0319163390811790915590517f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c9161080b91879087906120f0565b60405180910390a150505050565b6108296101bc6020830183611cf6565b6108755760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e277420657869737473000000006044820152606401610263565b610882602082018261212f565b60025f6108926020850185611cf6565b6001600160a01b0316815260208101919091526040015f206104168282612207565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361092c5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e6572000000006044820152606401610263565b6001600160a01b0381165f9081526003602052604090205460ff166109935760405162461bcd60e51b815260206004820152601760248201527f4d75737420766f746520666f722076616c696461746f720000000000000000006044820152606401610263565b335f908152600660205260409020546001600160a01b0316156109e85760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b6044820152606401610263565b6001600160a01b0381165f9081526002602081905260409091209081015460ff1615610a615760405162461bcd60e51b815260206004820152602260248201527f4d75737420766f746520666f7220756e72657369676e65642076616c6964617460448201526137b960f11b6064820152608401610263565b6040805180820182526001600160a01b03848116825233803160208085019182525f8381526006909152948520935184546001600160a01b0319169316929092178355905160019283015590830180549131929091610ac190849061228f565b9091555050805460019082905f90610ada90849061228f565b9091555050604080513381526001600160a01b03841660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2910160405180910390a15050565b600a546060905f9067ffffffffffffffff811115610b4457610b44611fd6565b604051908082528060200260200182016040528015610b7d57816020015b610b6a611c1b565b815260200190600190039081610b625790505b5090505f5b600a54811015610cbc575f600a8281548110610ba057610ba0611f74565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff1615159583019590955260038101805493965090949384019285916060840191610c1290611f42565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3e90611f42565b8015610c895780601f10610c6057610100808354040283529160200191610c89565b820191905f5260205f20905b815481529060010190602001808311610c6c57829003601f168201915b505050505081525050815250848481518110610ca757610ca7611f74565b60209081029190910101525050600101610b82565b50919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d3a5760405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f742074686520636f6e7472616374206f776e65726044820152606401610263565b610d42611510565b610d4a61165f565b600780546001600160a01b03191690556001545f80549091610d7c9160ff8516918491610d779190611f9c565b6116b0565b90508060ff165f03610d8c575050565b5f5b600554811015611037575f60058281548110610dac57610dac611f74565b5f9182526020808320909101546001600160a01b03168083526002918290526040909220908101549192509060ff1615610de757505061102f565b6007546001600160a01b0316610e225750600780546001600160a01b0319166001600160a01b0392909216919091179055600160095561102f565b8360ff166009541015610e4057610e398285611741565b505061102f565b6007546001600160a01b039081165f908152600260208181526040928390208351808501855294871685528351608081018552865481526001870154818401529286015460ff16151593830193909352600385018054939461101c94909392840192918791606084019190610eb490611f42565b80601f0160208091040260200160405190810160405280929190818152602001828054610ee090611f42565b8015610f2b5780601f10610f0257610100808354040283529160200191610f2b565b820191905f5260205f20905b815481529060010190602001808311610f0e57829003601f168201915b5050509190925250505090526040805180820182526007546001600160a01b031681528151608081018352855481526001860154602082810191909152600287015460ff16151593820193909352600386018054929384019287916060840191610f9490611f42565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc090611f42565b801561100b5780601f10610fe25761010080835404028352916020019161100b565b820191905f5260205f20905b815481529060010190602001808311610fee57829003601f168201915b505050505081525050815250611b20565b1561102b5761102b8386611741565b5050505b600101610d8e565b506007546001600160a01b031661104f600a5f611c64565b8160ff1667ffffffffffffffff81111561106b5761106b611fd6565b604051908082528060200260200182016040528015611094578160200160208202803683370190505b5080516110a991600a91602090910190611c7f565b505f5b8260ff1681101561110e5781600a82815481106110cb576110cb611f74565b5f91825260208083209190910180546001600160a01b0319166001600160a01b0394851617905593821681526008909352604090922054909116906001016110ac565b5050505b50565b335f9081526003602052604090205460ff166111735760405162461bcd60e51b815260206004820152601960248201527f43616c6c6572206973206e6f7420612076616c696461746f72000000000000006044820152606401610263565b335f9081526002602081905260409091209081015460ff16156111d85760405162461bcd60e51b815260206004820152601d60248201527f56616c696461746f7220697320616c72656164792072657369676e65640000006044820152606401610263565b60028101805460ff19166001908117909155805481905f906111fb90839061228f565b90915550506040513381527f24250fc1ec78a1405ddd4cc8b75964858af228d05faa8d4bc1302966d8a541179060200160405180910390a150565b6005546060905f9067ffffffffffffffff81111561125657611256611fd6565b60405190808252806020026020018201604052801561128f57816020015b61127c611c1b565b8152602001906001900390816112745790505b5090505f5b600554811015610cbc575f600582815481106112b2576112b2611f74565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff161515958301959095526003810180549396509094938401928591606084019161132490611f42565b80601f016020809104026020016040519081016040528092919081815260200182805461135090611f42565b801561139b5780601f106113725761010080835404028352916020019161139b565b820191905f5260205f20905b81548152906001019060200180831161137e57829003601f168201915b5050505050815250508152508484815181106113b9576113b9611f74565b60209081029190910101525050600101611294565b6001600160a01b038082165f90815260066020526040902080549091166113f3575050565b60018101546001600160a01b038316318110156114545761141e816001600160a01b03851631611f9c565b82546001600160a01b03165f908152600260205260408120600101805490919061144990849061228f565b909155506114999050565b6114686001600160a01b0384163182611f9c565b82546001600160a01b03165f9081526002602052604081206001018054909190611493908490611f9c565b90915550505b506001600160a01b0390911631600190910155565b6030811461150c5760405162461bcd60e51b815260206004820152602560248201527f424c5331322d333831207075626c69634b6579206c656e67746820697320696e6044820152641d985b1a5960da1b6064820152608401610263565b5050565b6005545f61151f600183611f9c565b90505b801561150c575f61153482600161228f565b60408051426020820152449181019190915260608101849052608001604051602081830303815290604052805190602001205f1c61157291906122a2565b90505f6005838154811061158857611588611f74565b5f91825260209091200154600580546001600160a01b03909216925090839081106115b5576115b5611f74565b5f91825260209091200154600580546001600160a01b0390921691859081106115e0576115e0611f74565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550806005838154811061161f5761161f611f74565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050508080611657906122c1565b915050611522565b6007546001600160a01b03165b6001600160a01b038116156116a9576001600160a01b039081165f90815260086020526040902080546001600160a01b031981169091551661166c565b505f600955565b5f818311156117195760405162461bcd60e51b815260206004820152602f60248201527f4d696e696d756d2073686f756c64206265206c657373207468616e206f72206560448201526e7175616c20746f206d6178696d756d60881b6064820152608401610263565b8284101561172857508161173a565b8184111561173757508061173a565b50825b9392505050565b6001600160a01b0382165f9081526002602081815260408084208151608081018352815481526001820154938101939093529283015460ff1615159082015260038201805491929160608401919061179890611f42565b80601f01602080910402602001604051908101604052809291908181526020018280546117c490611f42565b801561180f5780601f106117e65761010080835404028352916020019161180f565b820191905f5260205f20905b8154815290600101906020018083116117f257829003601f168201915b5050509190925250506040805180820182526007546001600160a01b03168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff16151594820194909452600384018054969750611930969395509185019390929091606084019161188a90611f42565b80601f01602080910402602001604051908101604052809291908181526020018280546118b690611f42565b80156119015780601f106118d857610100808354040283529160200191611901565b820191905f5260205f20905b8154815290600101906020018083116118e457829003601f168201915b5050505050815250508152506040518060400160405280866001600160a01b0316815260200184815250611b20565b156119435761193e83611b6c565b611ac1565b6007546001600160a01b039081165f81815260086020526040902054909116905b6001600160a01b0382166119815761197c8186611bbd565b611abe565b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff16151594820194909452600384018054611a8e95938501939160608401916119e890611f42565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1490611f42565b8015611a5f5780601f10611a3657610100808354040283529160200191611a5f565b820191905f5260205f20905b815481529060010190602001808311611a4257829003601f168201915b5050505050815250508152506040518060400160405280886001600160a01b0316815260200186815250611b20565b15611a9d5761197c8186611bbd565b506001600160a01b038082165f908152600860205260409020541690611964565b50505b8160ff16600954111561041657600780546001600160a01b039081165f90815260086020526040812080546001600160a01b03198082169092558454931692168217909255600980549192611b15836122c1565b919050555050505050565b5f81602001516020015183602001516020015103611b505750805182516001600160a01b03918216911611611b66565b8160200151602001518360200151602001511190505b92915050565b600780546001600160a01b038381165f8181526008602052604081208054939094166001600160a01b0319938416179093558354909116179091556009805491611bb583611fbe565b919050555050565b6001600160a01b038281165f8181526008602052604080822080548686168085529284208054919096166001600160a01b031991821617909555928252825490931690921790556009805491611c1283611fbe565b91905055505050565b60405180604001604052805f6001600160a01b03168152602001611c5f60405180608001604052805f81526020015f81526020015f15158152602001606081525090565b905290565b5080545f8255905f5260205f20908101906111129190611ce2565b828054828255905f5260205f20908101928215611cd2579160200282015b82811115611cd257825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611c9d565b50611cde929150611ce2565b5090565b5b80821115611cde575f8155600101611ce3565b5f60208284031215611d06575f5ffd5b81356001600160a01b038116811461173a575f5ffd5b60018060a01b0381511682525f602082015160406020850152805160408501526020810151606085015260408101511515608085015260608101519050608060a085015280518060c08601525f5b81811015611d8757602081840181015160e0888401015201611d6a565b505f60e0828701015260e0601f19601f8301168601019250505092915050565b602081525f61173a6020830184611d1c565b5f5f60208385031215611dca575f5ffd5b823567ffffffffffffffff811115611de0575f5ffd5b8301601f81018513611df0575f5ffd5b803567ffffffffffffffff811115611e06575f5ffd5b8560208260051b8401011115611e1a575f5ffd5b6020919091019590945092505050565b5f5f60208385031215611e3b575f5ffd5b823567ffffffffffffffff811115611e51575f5ffd5b8301601f81018513611e61575f5ffd5b803567ffffffffffffffff811115611e77575f5ffd5b856020828401011115611e1a575f5ffd5b5f60208284031215611e98575f5ffd5b813567ffffffffffffffff811115611eae575f5ffd5b82016040818503121561173a575f5ffd5b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015611f1657603f19878603018452611f01858351611d1c565b94506020938401939190910190600101611ee5565b50929695505050505050565b5f60208284031215611f32575f5ffd5b813560ff8116811461173a575f5ffd5b600181811c90821680611f5657607f821691505b602082108103610cbc57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115611b6657611b66611f88565b818382375f9101908152919050565b5f60018201611fcf57611fcf611f88565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b601f82111561041657805f5260205f20601f840160051c8101602085101561200f5750805b601f840160051c820191505b8181101561202e575f815560010161201b565b5050505050565b815167ffffffffffffffff81111561204f5761204f611fd6565b6120638161205d8454611f42565b84611fea565b6020601f821160018114612095575f831561207e5750848201515b5f19600385901b1c1916600184901b17845561202e565b5f84815260208120601f198516915b828110156120c457878501518255602094850194600190920191016120a4565b50848210156120e157868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8235607e19833603018112612143575f5ffd5b9190910192915050565b67ffffffffffffffff83111561216557612165611fd6565b612179836121738354611f42565b83611fea565b5f601f8411600181146121aa575f85156121935750838201355b5f19600387901b1c1916600186901b17835561202e565b5f83815260208120601f198716915b828110156121d957868501358255602094850194600190920191016121b9565b50868210156121f5575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b813581556020820135600182015560028101604083013580151580821461222c575f5ffd5b60ff19835416915060ff8116821783555050506060820135601e19833603018112612255575f5ffd5b8201803567ffffffffffffffff81111561226d575f5ffd5b602082019150803603821315612281575f5ffd5b61110e81836003860161214d565b80820180821115611b6657611b66611f88565b5f826122bc57634e487b7160e01b5f52601260045260245ffd5b500690565b5f816122cf576122cf611f88565b505f19019056fea2646970667358221220fb596a899783aa169bc4bac8389b7b024606b59ed939dfa3029105b691e2bc1964736f6c634300081b0033", - "sourceMap": "1326:9070:23:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6110:104;6186:24;;6110:104;;;160:25:31;;;148:2;133:18;6110:104:23;;;;;;;;6217:109;6291:24;:31;6217:109;;7811:229;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9172:195::-;;;;;;:::i;:::-;;:::i;:::-;;8822:347;;;:::i;6329:840::-;;;;;;:::i;:::-;;:::i;8043:213::-;;;;;;:::i;:::-;;:::i;8259:560::-;;;;;;:::i;:::-;;:::i;5200:401::-;;;:::i;:::-;;;;;;;:::i;2837:1145::-;;;;;;:::i;:::-;;:::i;7172:361::-;;;:::i;7536:116::-;;;;;;:::i;:::-;-1:-1:-1;;;;;7619:29:23;7602:4;7619:29;;;:23;:29;;;;;;;;;7536:116;;;;4506:14:31;;4499:22;4481:41;;4469:2;4454:18;7536:116:23;4341:187:31;5999:108:23;6057:7;6077:26;5999:108;;5604:392;;;:::i;7811:229::-;7869:16;;:::i;:::-;-1:-1:-1;;;;;7619:29:23;;7602:4;7619:29;;;:23;:29;;;;;;;;7891:71;;;;-1:-1:-1;;;7891:71:23;;4735:2:31;7891:71:23;;;4717:21:31;4774:2;4754:18;;;4747:30;4813;4793:18;;;4786:58;4861:18;;7891:71:23;;;;;;;;;7973:63;;;;;;;;-1:-1:-1;;;;;7973:63:23;;;;;-1:-1:-1;8003:31:23;;;:24;7973:63;8003:31;;;;;;;7973:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8003:31;7973:63;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7973:63:23;;;;-1:-1:-1;;;7973:63:23;;7966:70;7811:229;-1:-1:-1;;7811:229:23:o;9172:195::-;1985:10;-1:-1:-1;;;;;1999:6:23;1985:20;;1977:65;;;;-1:-1:-1;;;1977:65:23;;5477:2:31;1977:65:23;;;5459:21:31;;;5496:18;;;5489:30;5555:34;5535:18;;;5528:62;5607:18;;1977:65:23;5275:356:31;1977:65:23;9295:6:::1;9290:74;9307:17:::0;;::::1;9290:74;;;9336:23;9349:6;;9356:1;9349:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9336:12;:23::i;:::-;9326:3;;9290:74;;;;9172:195:::0;;:::o;8822:347::-;8881:10;8853:18;8874;;;:6;:18;;;;;8904:15;;-1:-1:-1;;;;;8904:15:23;8896:57;;;;-1:-1:-1;;;8896:57:23;;5970:2:31;8896:57:23;;;5952:21:31;6009:2;5989:18;;;5982:30;-1:-1:-1;;;6028:18:31;;;6021:45;6083:18;;8896:57:23;5768:339:31;8896:57:23;8983:15;;8963:36;;;8971:10;6286:51:31;;-1:-1:-1;;;;;8983:15:23;;;6368:2:31;6353:18;;6346:60;8963:36:23;;6259:18:31;8963:36:23;;;;;;;9061:13;;;;;9029:15;;-1:-1:-1;;;;;9029:15:23;9004:41;;;;:24;:41;;;;;:53;;;:70;;9061:13;;9004:53;;:70;;9061:13;;9004:70;:::i;:::-;;;;-1:-1:-1;;9103:15:23;;-1:-1:-1;;;;;9103:15:23;9078:41;;;;:24;:41;;;;;:58;;9135:1;;9078:41;:58;;9135:1;;9078:58;:::i;:::-;;;;-1:-1:-1;;9154:10:23;9147:18;;;;:6;:18;;;;;9140:25;;-1:-1:-1;;;;;;9140:25:23;;;;;;-1:-1:-1;8822:347:23:o;6329:840::-;-1:-1:-1;;;;;2104:6:23;2090:20;:10;:20;2082:61;;;;-1:-1:-1;;;2082:61:23;;6884:2:31;2082:61:23;;;6866:21:31;6923:2;6903:18;;;6896:30;6962;6942:18;;;6935:58;7010:18;;2082:61:23;6682:352:31;2082:61:23;6452:10:::1;6428:35;::::0;;;:23:::1;:35;::::0;;;;;::::1;;6427:36;6419:80;;;::::0;-1:-1:-1;;;6419:80:23;;7241:2:31;6419:80:23::1;::::0;::::1;7223:21:31::0;7280:2;7260:18;;;7253:30;7319:33;7299:18;;;7292:61;7370:18;;6419:80:23::1;7039:355:31::0;6419:80:23::1;6504:27;6544:20;;6534:31;;;;;;;:::i;:::-;;::::0;;;;;::::1;::::0;;;6579:42:::1;::::0;;;:21:::1;:42;::::0;;;;;;6534:31;;-1:-1:-1;6579:42:23::1;;6578:43;6570:91;;;::::0;-1:-1:-1;;;6570:91:23;;7877:2:31;6570:91:23::1;::::0;::::1;7859:21:31::0;7916:2;7896:18;;;7889:30;7955:34;7935:18;;;7928:62;-1:-1:-1;;;8006:18:31;;;7999:33;8049:19;;6570:91:23::1;7675:399:31::0;6570:91:23::1;6666:46;6691:20;;6666:24;:46::i;:::-;6717:30;6750:126;;;;;;;;6782:1;6750:126;;;;6801:1;6750:126;;;;6819:5;6750:126;;;;;;6851:20;;6750:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;6750:126:23;;;;-1:-1:-1;;6881:28:23;;6717:159;;-1:-1:-1;6750:126:23;-1:-1:-1;6750:126:23;6881:28:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;6937:10:23::1;6913:35;::::0;;;:23:::1;:35;::::0;;;;;;;:42;;6951:4:::1;-1:-1:-1::0;;6913:42:23;;::::1;::::0;::::1;::::0;;;6959:24:::1;:36:::0;;;;;;;:48;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;:36;:48;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;7011:42:23::1;::::0;;;:21:::1;:42;::::0;;;;;:49;;-1:-1:-1;;7011:49:23::1;7056:4;7011:49:::0;;::::1;::::0;;;7064:21:::1;:38:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;7064:38:23::1;7091:10;7064:38:::0;;::::1;::::0;;;7112:53;;::::1;::::0;::::1;::::0;7144:20;;;;7112:53:::1;:::i;:::-;;;;;;;;6415:754;;6329:840:::0;;:::o;8043:213::-;8118:38;8140:15;;;;:10;:15;:::i;8118:38::-;8110:79;;;;-1:-1:-1;;;8110:79:23;;4735:2:31;8110:79:23;;;4717:21:31;4774:2;4754:18;;;4747:30;4813;4793:18;;;4786:58;4861:18;;8110:79:23;4533:352:31;8110:79:23;8237:15;;;;:10;:15;:::i;:::-;8193:24;:41;8218:15;;;;:10;:15;:::i;:::-;-1:-1:-1;;;;;8193:41:23;;;;;;;;;;;;-1:-1:-1;8193:41:23;:59;;:41;:59;:::i;8259:560::-;-1:-1:-1;;;;;2104:6:23;2090:20;:10;:20;2082:61;;;;-1:-1:-1;;;2082:61:23;;6884:2:31;2082:61:23;;;6866:21:31;6923:2;6903:18;;;6896:30;6962;6942:18;;;6935:58;7010:18;;2082:61:23;6682:352:31;2082:61:23;-1:-1:-1;;;;;7619:29:23;;7602:4;7619:29;;;:23;:29;;;;;;;;8313:63:::1;;;::::0;-1:-1:-1;;;8313:63:23;;13879:2:31;8313:63:23::1;::::0;::::1;13861:21:31::0;13918:2;13898:18;;;13891:30;13957:25;13937:18;;;13930:53;14000:18;;8313:63:23::1;13677:347:31::0;8313:63:23::1;8395:10;8428:1;8388:18:::0;;;:6:::1;:18;::::0;;;;:28;-1:-1:-1;;;;;8388:28:23::1;:42:::0;8380:68:::1;;;::::0;-1:-1:-1;;;8380:68:23;;14231:2:31;8380:68:23::1;::::0;::::1;14213:21:31::0;14270:2;14250:18;;;14243:30;-1:-1:-1;;;14289:18:31;;;14282:43;14342:18;;8380:68:23::1;14029:337:31::0;8380:68:23::1;-1:-1:-1::0;;;;;8491:30:23;::::1;8453:35;8491:30:::0;;;:24:::1;:30;::::0;;;;;;;8534:24;;::::1;::::0;::::1;;8533:25;8525:72;;;::::0;-1:-1:-1;;;8525:72:23;;14573:2:31;8525:72:23::1;::::0;::::1;14555:21:31::0;14612:2;14592:18;;;14585:30;14651:34;14631:18;;;14624:62;-1:-1:-1;;;14702:18:31;;;14695:32;14744:19;;8525:72:23::1;14371:398:31::0;8525:72:23::1;8623:52;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;8623:52:23;;::::1;::::0;;8655:10:::1;:18:::0;::::1;8623:52;::::0;;::::1;::::0;;;-1:-1:-1;8602:18:23;;;:6:::1;:18:::0;;;;;;:73;;;;-1:-1:-1;;;;;;8602:73:23::1;::::0;::::1;::::0;;;::::1;::::0;;;;-1:-1:-1;8602:73:23;;::::1;::::0;8701:25;;::::1;:47:::0;;8730:18;::::1;::::0;8701:25;;:47:::1;::::0;8730:18;;8701:47:::1;:::i;:::-;::::0;;;-1:-1:-1;;8752:30:23;;8781:1:::1;::::0;8752:13;;:25:::1;::::0;:30:::1;::::0;8781:1;;8752:30:::1;:::i;:::-;::::0;;;-1:-1:-1;;8792:23:23::1;::::0;;8798:10:::1;6286:51:31::0;;-1:-1:-1;;;;;6373:32:31;;6368:2;6353:18;;6346:60;8792:23:23::1;::::0;6259:18:31;8792:23:23::1;;;;;;;8309:510;8259:560:::0;:::o;5200:401::-;5317:24;:31;5249:18;;5273:25;;5301:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;5273:76:23;-1:-1:-1;5358:6:23;5353:227;5374:24;:31;5370:35;;5353:227;;;5417:12;5432:24;5457:1;5432:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;5432:27:23;5493:30;;;:24;:30;;;;;;;;5540:35;;;;;;;;;;;;;;;;;;;;;5432:27;5540:35;;;;;;;;;;;;;;;;;;;;;;;;;;;5432:27;;-1:-1:-1;5493:30:23;;5540:35;;;;5493:30;;5540:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5528:6;5535:1;5528:9;;;;;;;;:::i;:::-;;;;;;;;;;:47;-1:-1:-1;;5407:3:23;;5353:227;;;-1:-1:-1;5591:6:23;5200:401;-1:-1:-1;5200:401:23:o;2837:1145::-;1985:10;-1:-1:-1;;;;;1999:6:23;1985:20;;1977:65;;;;-1:-1:-1;;;1977:65:23;;5477:2:31;1977:65:23;;;5459:21:31;;;5496:18;;;5489:30;5555:34;5535:18;;;5528:62;5607:18;;1977:65:23;5275:356:31;1977:65:23;2901:9:::1;:7;:9::i;:::-;2914:21;:19;:21::i;:::-;2940:5;:18:::0;;-1:-1:-1;;;;;;2940:18:23::1;::::0;;;3023:24;2956:1:::1;2994:26:::0;;2956:1;;2981:67:::1;::::0;::::1;::::0;::::1;::::0;2956:1;;2994:53:::1;::::0;3023:24;2994:53:::1;:::i;:::-;2981:6;:67::i;:::-;2963:86;;3116:3;:8;;3123:1;3116:8:::0;3112:30:::1;;3131:7;2837:1145:::0;:::o;3112:30::-:1;3151:6;3146:614;3167:21;:28:::0;3163:32;::::1;3146:614;;;3207:12;3222:21;3244:1;3222:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;3222:24:23::1;3281:30:::0;;;:24:::1;:30:::0;;;;;;;;3320:15;;::::1;::::0;3222:24;;-1:-1:-1;3281:30:23;3320:15:::1;;3316:41;;;3343:8;;;;3316:41;3366:5;::::0;-1:-1:-1;;;;;3366:5:23::1;3362:92;;-1:-1:-1::0;3393:5:23::1;:12:::0;;-1:-1:-1;;;;;;3393:12:23::1;-1:-1:-1::0;;;;;3393:12:23;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;3411:19:23::1;:23:::0;3440:8:::1;;3362:92;3485:3;3463:25;;:19;;:25;3459:86;;;3496:29;3515:4;3521:3;3496:18;:29::i;:::-;3531:8;;;;3459:86;3608:5;::::0;-1:-1:-1;;;;;3608:5:23;;::::1;3550:30;3583:31:::0;;;:24:::1;:31;::::0;;;;;;;;3635:35;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;3608:5;3635:35;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;;;::::0;;;;;;;::::1;::::0;::::1;::::0;;3583:31;;3624:89:::1;::::0;3635:35;;;;::::1;::::0;;3664:4;;3635:35;;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;3635:35:23;;;;-1:-1:-1;;;3635:35:23;;3672:40:::1;::::0;;;;::::1;::::0;;3689:5:::1;::::0;-1:-1:-1;;;;;3689:5:23::1;3672:40:::0;;;;::::1;::::0;::::1;::::0;;;;;;3689:5;3672:40;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;3702:8;;3672:40;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;::::0;3624:10:::1;:89::i;:::-;3620:136;;;3721:29;3740:4;3746:3;3721:18;:29::i;:::-;3202:558;;;3146:614;3197:3;;3146:614;;;-1:-1:-1::0;3779:5:23::1;::::0;-1:-1:-1;;;;;3779:5:23::1;3788:31;3795:24;3764:12;3788:31;:::i;:::-;3864:3;3850:18;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;3850:18:23::1;-1:-1:-1::0;3823:45:23;;::::1;::::0;:24:::1;::::0;:45:::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;3877:6:23::1;3872:107;3893:3;3889:7;;:1;:7;3872:107;;;3938:4;3908:24;3933:1;3908:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:34:::0;;-1:-1:-1;;;;;;3908:34:23::1;-1:-1:-1::0;;;;;3908:34:23;;::::1;;::::0;;3954:20;;::::1;::::0;;:14:::1;:20:::0;;;;;;;;;;::::1;::::0;-1:-1:-1;3898:3:23::1;3872:107;;;;2897:1085;;2046:1;2837:1145:::0;:::o;7172:361::-;7242:10;7602:4;7619:29;;;:23;:29;;;;;;;;7212:71;;;;-1:-1:-1;;;7212:71:23;;15106:2:31;7212:71:23;;;15088:21:31;15145:2;15125:18;;;15118:30;15184:27;15164:18;;;15157:55;15229:18;;7212:71:23;14904:349:31;7212:71:23;7347:10;7288:31;7322:36;;;:24;:36;;;;;;;;7371:20;;;;;;7370:21;7362:63;;;;-1:-1:-1;;;7362:63:23;;15460:2:31;7362:63:23;;;15442:21:31;15499:2;15479:18;;;15472:30;15538:31;15518:18;;;15511:59;15587:18;;7362:63:23;15258:353:31;7362:63:23;7430:20;;;:27;;-1:-1:-1;;7430:27:23;7453:4;7430:27;;;;;;7461:29;;7453:4;;7430:20;;7461:29;;7453:4;;7461:29;:::i;:::-;;;;-1:-1:-1;;7500:29:23;;7518:10;15762:51:31;;7500:29:23;;15750:2:31;15735:18;7500:29:23;;;;;;;7208:325;7172:361::o;5604:392::-;5721:21;:28;5653:18;;5677:25;;5705:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;5677:73:23;-1:-1:-1;5759:6:23;5754:221;5775:21;:28;5771:32;;5754:221;;;5815:12;5830:21;5852:1;5830:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;5830:24:23;5888:30;;;:24;:30;;;;;;;;5935:35;;;;;;;;;;;;;;;;;;;;;5830:24;5935:35;;;;;;;;;;;;;;;;;;;;;;;;;;;5830:24;;-1:-1:-1;5888:30:23;;5935:35;;;;5888:30;;5935:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5923:6;5930:1;5923:9;;;;;;;;:::i;:::-;;;;;;;;;;:47;-1:-1:-1;;5805:3:23;;5754:221;;9370:444;-1:-1:-1;;;;;9439:12:23;;;9418:18;9439:12;;;:6;:12;;;;;9459:15;;9439:12;;9459:15;9455:51;;9495:7;9370:444;:::o;9455:51::-;9533:13;;;;-1:-1:-1;;;;;9570:12:23;;;9555:27;;9551:227;;;9646:27;9661:12;-1:-1:-1;;;;;9646:12:23;;;:27;:::i;:::-;9614:15;;-1:-1:-1;;;;;9614:15:23;9589:41;;;;:24;:41;;;;;9614:15;9589:53;:84;;:53;;:41;:84;;;;;:::i;:::-;;;;-1:-1:-1;9551:227:23;;-1:-1:-1;9551:227:23;;9746:27;-1:-1:-1;;;;;9761:12:23;;;9746;:27;:::i;:::-;9714:15;;-1:-1:-1;;;;;9714:15:23;9689:41;;;;:24;:41;;;;;9714:15;9689:53;:84;;:53;;:41;:84;;;;;:::i;:::-;;;;-1:-1:-1;;9551:227:23;-1:-1:-1;;;;;;9798:12:23;;;;9782:13;;;;:28;9370:444::o;7655:153::-;7760:2;7740:22;;7732:72;;;;-1:-1:-1;;;7732:72:23;;16026:2:31;7732:72:23;;;16008:21:31;16065:2;16045:18;;;16038:30;16104:34;16084:18;;;16077:62;-1:-1:-1;;;16155:18:31;;;16148:35;16200:19;;7732:72:23;15824:401:31;7732:72:23;7655:153;;:::o;2155:448::-;2199:21;:28;2187:9;2248:5;2252:1;2199:28;2248:5;:::i;:::-;2236:17;;2231:369;2255:5;;2231:369;;2325:9;2415:5;:1;2419;2415:5;:::i;:::-;2355:54;;;2372:15;2355:54;;;16415:19:31;2389:16:23;16450:12:31;;;16443:28;;;;16487:12;;;16480:28;;;16524:12;;2355:54:23;;;;;;;;;;;;2345:65;;;;;;2337:74;;:84;;;;:::i;:::-;2325:96;;2464:12;2479:21;2501:1;2479:24;;;;;;;;:::i;:::-;;;;;;;;;;;2535:21;:24;;-1:-1:-1;;;;;2479:24:23;;;;-1:-1:-1;2535:21:23;2557:1;;2535:24;;;;;;:::i;:::-;;;;;;;;;;;2508:21;:24;;-1:-1:-1;;;;;2535:24:23;;;;2530:1;;2508:24;;;;;;:::i;:::-;;;;;;;;;:51;;;;;-1:-1:-1;;;;;2508:51:23;;;;;-1:-1:-1;;;;;2508:51:23;;;;;;2591:4;2564:21;2586:1;2564:24;;;;;;;;:::i;:::-;;;;;;;;;:31;;;;;-1:-1:-1;;;;;2564:31:23;;;;;-1:-1:-1;;;;;2564:31:23;;;;;;2267:333;;2262:3;;;;;:::i;:::-;;;;2231:369;;2606:228;2665:5;;-1:-1:-1;;;;;2665:5:23;2675:129;-1:-1:-1;;;;;2682:18:23;;;2675:129;;-1:-1:-1;;;;;2741:23:23;;;2707:15;2741:23;;;:14;:23;;;;;;;-1:-1:-1;;;;;;2769:30:23;;;;;2741:23;2675:129;;;-1:-1:-1;2829:1:23;2807:19;:23;2606:228::o;10117:277::-;10196:7;10224:3;10217;:10;;10209:70;;;;-1:-1:-1;;;10209:70:23;;17104:2:31;10209:70:23;;;17086:21:31;17143:2;17123:18;;;17116:30;17182:34;17162:18;;;17155:62;-1:-1:-1;;;17233:18:31;;;17226:45;17288:19;;10209:70:23;16902:411:31;10209:70:23;10295:3;10287:5;:11;10283:108;;;-1:-1:-1;10312:3:23;10305:10;;10283:108;10338:3;10330:5;:11;10326:65;;;-1:-1:-1;10355:3:23;10348:10;;10326:65;-1:-1:-1;10381:5:23;10326:65;10117:277;;;;;:::o;3985:921::-;-1:-1:-1;;;;;4079:30:23;;4051:25;4079:30;;;:24;:30;;;;;;;;4051:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4079:30;4051:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4051:58:23;;;;-1:-1:-1;;4138:63:23;;;;;;;;4155:5;;-1:-1:-1;;;;;4155:5:23;4138:63;;;-1:-1:-1;4168:31:23;;;:24;4138:63;4168:31;;;;;;;4138:63;;;;;;;;;;;4155:5;4138:63;;;;;;;;;;;;;;;;;;;;;;;;;;;4051:58;;-1:-1:-1;4122:125:23;;4138:63;;-1:-1:-1;4138:63:23;;;;;;4168:31;;4138:63;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4207:35;;;;;;;;4224:4;-1:-1:-1;;;;;4207:35:23;;;;;4236:4;4207:35;;;4122:10;:125::i;:::-;4114:632;;;4257:16;4268:4;4257:10;:16::i;:::-;4114:632;;;4322:5;;-1:-1:-1;;;;;4322:5:23;;;4289:15;4307:21;;;:14;:21;;;;;;;;;;4363:379;-1:-1:-1;;;;;4386:21:23;;4382:80;;4416:27;4428:8;4438:4;4416:11;:27::i;:::-;4450:5;;4382:80;4496:67;;;;;;;;-1:-1:-1;;;;;4496:67:23;;;;;-1:-1:-1;4528:33:23;;;:24;4496:67;4528:33;;;;;;;4496:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4478:135;;4496:67;;;;4528:33;4496:67;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4571:35;;;;;;;;4588:4;-1:-1:-1;;;;;4571:35:23;;;;;4600:4;4571:35;;;4478:10;:135::i;:::-;4468:205;;;4627:27;4639:8;4649:4;4627:11;:27::i;4468:205::-;-1:-1:-1;;;;;;4713:23:23;;;;;;;:14;:23;;;;;;;;4363:379;;;4284:462;;4114:632;4776:3;4754:25;;:19;;:25;4750:153;;;4816:5;;;-1:-1:-1;;;;;4816:5:23;;;4786:12;4801:21;;;:14;:21;;;;;;;-1:-1:-1;;;;;;4827:28:23;;;;;;4860:12;;4801:21;;4860:12;;;;;;;4877:19;:21;;4801;;4877;;;:::i;:::-;;;;;;4781:122;4047:859;3985:921;;:::o;9817:297::-;9918:4;9963:10;:15;;;:27;;;9932:10;:15;;;:27;;;:58;9928:114;;-1:-1:-1;10022:15:23;;10004;;-1:-1:-1;;;;;10004:33:23;;;;;;9997:40;;9928:114;10083:10;:15;;;:27;;;10053:10;:15;;;:27;;;:57;10046:64;;9817:297;;;;;:::o;4909:120::-;4979:5;;;-1:-1:-1;;;;;4956:20:23;;;4979:5;4956:20;;;:14;:20;;;;;:28;;4979:5;;;;-1:-1:-1;;;;;;4956:28:23;;;;;;;4988:12;;;;;;;;;5004:19;:21;;;;;;:::i;:::-;;;;;;4909:120;:::o;5032:165::-;-1:-1:-1;;;;;5117:20:23;;;;;;;:14;:20;;;;;;;;5094;;;;;;;;;:43;;5117:20;;;;-1:-1:-1;;;;;;5094:43:23;;;;;;;5141:20;;;:27;;;;;;;;;;5172:19;:21;;;;;;:::i;:::-;;;;;;5032:165;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:286:31;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;350:23;;-1:-1:-1;;;;;402:31:31;;392:42;;382:70;;448:1;445;438:12;487:871;604:1;600;595:3;591:11;587:19;579:5;573:12;569:38;564:3;557:51;539:3;654:4;647:5;643:16;637:23;692:4;685;680:3;676:14;669:28;735:12;729:19;722:4;717:3;713:14;706:43;803:4;789:12;785:23;779:30;774:2;769:3;765:12;758:52;880:4;866:12;862:23;856:30;849:38;842:46;835:4;830:3;826:14;819:70;944:2;930:12;926:21;920:28;898:50;;979:4;973:3;968;964:13;957:27;1013:14;1007:21;1059:6;1053:3;1048;1044:13;1037:29;1084:1;1094:147;1108:6;1105:1;1102:13;1094:147;;;1224:4;1200:22;;;1196:33;;1190:40;1184:3;1171:11;;;1167:21;1160:71;1123:12;1094:147;;;1098:3;1285:1;1279:3;1270:6;1265:3;1261:16;1257:26;1250:37;1348:3;1341:2;1337:7;1332:2;1324:6;1320:15;1316:29;1311:3;1307:39;1303:49;1296:56;;;;487:871;;;;:::o;1363:266::-;1548:2;1537:9;1530:21;1511:4;1568:55;1619:2;1608:9;1604:18;1596:6;1568:55;:::i;1634:610::-;1720:6;1728;1781:2;1769:9;1760:7;1756:23;1752:32;1749:52;;;1797:1;1794;1787:12;1749:52;1837:9;1824:23;1870:18;1862:6;1859:30;1856:50;;;1902:1;1899;1892:12;1856:50;1925:22;;1978:4;1970:13;;1966:27;-1:-1:-1;1956:55:31;;2007:1;2004;1997:12;1956:55;2047:2;2034:16;2073:18;2065:6;2062:30;2059:50;;;2105:1;2102;2095:12;2059:50;2158:7;2153:2;2143:6;2140:1;2136:14;2132:2;2128:23;2124:32;2121:45;2118:65;;;2179:1;2176;2169:12;2118:65;2210:2;2202:11;;;;;2232:6;;-1:-1:-1;1634:610:31;-1:-1:-1;;;1634:610:31:o;2249:586::-;2319:6;2327;2380:2;2368:9;2359:7;2355:23;2351:32;2348:52;;;2396:1;2393;2386:12;2348:52;2436:9;2423:23;2469:18;2461:6;2458:30;2455:50;;;2501:1;2498;2491:12;2455:50;2524:22;;2577:4;2569:13;;2565:27;-1:-1:-1;2555:55:31;;2606:1;2603;2596:12;2555:55;2646:2;2633:16;2672:18;2664:6;2661:30;2658:50;;;2704:1;2701;2694:12;2658:50;2749:7;2744:2;2735:6;2731:2;2727:15;2723:24;2720:37;2717:57;;;2770:1;2767;2760:12;2840:389;2929:6;2982:2;2970:9;2961:7;2957:23;2953:32;2950:52;;;2998:1;2995;2988:12;2950:52;3038:9;3025:23;3071:18;3063:6;3060:30;3057:50;;;3103:1;3100;3093:12;3057:50;3126:22;;3182:2;3164:16;;;3160:25;3157:45;;;3198:1;3195;3188:12;3234:828;3432:4;3480:2;3469:9;3465:18;3510:2;3499:9;3492:21;3533:6;3568;3562:13;3599:6;3591;3584:22;3637:2;3626:9;3622:18;3615:25;;3699:2;3689:6;3686:1;3682:14;3671:9;3667:30;3663:39;3649:53;;3737:2;3729:6;3725:15;3758:1;3768:265;3782:6;3779:1;3776:13;3768:265;;;3875:2;3871:7;3859:9;3851:6;3847:22;3843:36;3838:3;3831:49;3903:50;3946:6;3937;3931:13;3903:50;:::i;:::-;3893:60;-1:-1:-1;3988:2:31;4011:12;;;;3976:15;;;;;3804:1;3797:9;3768:265;;;-1:-1:-1;4050:6:31;;3234:828;-1:-1:-1;;;;;;3234:828:31:o;4067:269::-;4124:6;4177:2;4165:9;4156:7;4152:23;4148:32;4145:52;;;4193:1;4190;4183:12;4145:52;4232:9;4219:23;4282:4;4275:5;4271:16;4264:5;4261:27;4251:55;;4302:1;4299;4292:12;4890:380;4969:1;4965:12;;;;5012;;;5033:61;;5087:4;5079:6;5075:17;5065:27;;5033:61;5140:2;5132:6;5129:14;5109:18;5106:38;5103:161;;5186:10;5181:3;5177:20;5174:1;5167:31;5221:4;5218:1;5211:15;5249:4;5246:1;5239:15;5636:127;5697:10;5692:3;5688:20;5685:1;5678:31;5728:4;5725:1;5718:15;5752:4;5749:1;5742:15;6417:127;6478:10;6473:3;6469:20;6466:1;6459:31;6509:4;6506:1;6499:15;6533:4;6530:1;6523:15;6549:128;6616:9;;;6637:11;;;6634:37;;;6651:18;;:::i;7399:271::-;7582:6;7574;7569:3;7556:33;7538:3;7608:16;;7633:13;;;7608:16;7399:271;-1:-1:-1;7399:271:31:o;8079:135::-;8118:3;8139:17;;;8136:43;;8159:18;;:::i;:::-;-1:-1:-1;8206:1:31;8195:13;;8079:135::o;8219:127::-;8280:10;8275:3;8271:20;8268:1;8261:31;8311:4;8308:1;8301:15;8335:4;8332:1;8325:15;8476:517;8577:2;8572:3;8569:11;8566:421;;;8613:5;8610:1;8603:16;8657:4;8654:1;8644:18;8727:2;8715:10;8711:19;8708:1;8704:27;8698:4;8694:38;8763:4;8751:10;8748:20;8745:47;;;-1:-1:-1;8786:4:31;8745:47;8841:2;8836:3;8832:12;8829:1;8825:20;8819:4;8815:31;8805:41;;8896:81;8914:2;8907:5;8904:13;8896:81;;;8973:1;8959:16;;8940:1;8929:13;8896:81;;;8900:3;;8476:517;;;:::o;9169:1295::-;9293:3;9287:10;9320:18;9312:6;9309:30;9306:56;;;9342:18;;:::i;:::-;9371:96;9460:6;9420:38;9452:4;9446:11;9420:38;:::i;:::-;9414:4;9371:96;:::i;:::-;9516:4;9547:2;9536:14;;9564:1;9559:648;;;;10251:1;10268:6;10265:89;;;-1:-1:-1;10320:19:31;;;10314:26;10265:89;-1:-1:-1;;9126:1:31;9122:11;;;9118:24;9114:29;9104:40;9150:1;9146:11;;;9101:57;10367:81;;9529:929;;9559:648;8423:1;8416:14;;;8460:4;8447:18;;-1:-1:-1;;9595:20:31;;;9712:222;9726:7;9723:1;9720:14;9712:222;;;9808:19;;;9802:26;9787:42;;9915:4;9900:20;;;;9868:1;9856:14;;;;9742:12;9712:222;;;9716:3;9962:6;9953:7;9950:19;9947:201;;;10023:19;;;10017:26;-1:-1:-1;;10106:1:31;10102:14;;;10118:3;10098:24;10094:37;10090:42;10075:58;10060:74;;9947:201;-1:-1:-1;;;;10194:1:31;10178:14;;;10174:22;10161:36;;-1:-1:-1;9169:1295:31:o;10469:485::-;-1:-1:-1;;;;;10654:32:31;;10636:51;;10723:2;10718;10703:18;;10696:30;;;10742:18;;10735:34;;;10762:6;10811;10806:2;10791:18;;10778:48;10875:1;10846:22;;;10870:2;10842:31;;;10835:42;;;;10938:2;10917:15;;;-1:-1:-1;;10913:29:31;10898:45;10894:54;;10469:485;-1:-1:-1;;10469:485:31:o;10959:332::-;11059:4;11117:11;11104:25;11211:3;11207:8;11196;11180:14;11176:29;11172:44;11152:18;11148:69;11138:97;;11231:1;11228;11221:12;11138:97;11252:33;;;;;10959:332;-1:-1:-1;;10959:332:31:o;11296:1178::-;11402:18;11397:3;11394:27;11391:53;;;11424:18;;:::i;:::-;11453:93;11542:3;11502:38;11534:4;11528:11;11502:38;:::i;:::-;11496:4;11453:93;:::i;:::-;11572:1;11597:2;11592:3;11589:11;11614:1;11609:607;;;;12260:1;12277:3;12274:93;;;-1:-1:-1;12333:19:31;;;12320:33;12274:93;-1:-1:-1;;9126:1:31;9122:11;;;9118:24;9114:29;9104:40;9150:1;9146:11;;;9101:57;12380:78;;11582:886;;11609:607;8423:1;8416:14;;;8460:4;8447:18;;-1:-1:-1;;11645:17:31;;;11759:229;11773:7;11770:1;11767:14;11759:229;;;11862:19;;;11849:33;11834:49;;11969:4;11954:20;;;;11922:1;11910:14;;;;11789:12;11759:229;;;11763:3;12016;12007:7;12004:16;12001:159;;;12140:1;12136:6;12130:3;12124;12121:1;12117:11;12113:21;12109:34;12105:39;12092:9;12087:3;12083:19;12070:33;12066:79;12058:6;12051:95;12001:159;;;12203:1;12197:3;12194:1;12190:11;12186:19;12180:4;12173:33;11582:886;;11296:1178;;;:::o;12479:1193::-;12674:19;;12702:25;;12808:2;12797:14;;12784:28;12838:1;12828:12;;12821:35;12893:1;12883:12;;12943:2;12932:14;;12919:28;12973:15;;12966:23;13008:15;;;12998:43;;13037:1;13034;13027:12;12998:43;13092:3;13088:8;13075:10;13069:17;13065:32;13050:47;;13145:3;13141:2;13137:12;13128:7;13125:25;13113:10;13106:45;;;;13210:2;13203:5;13199:14;13186:28;13293:2;13289:7;13281:5;13265:14;13261:26;13257:40;13237:18;13233:65;13223:93;;13312:1;13309;13302:12;13223:93;13337:30;;13390:18;;13431;13420:30;;13417:50;;;13463:1;13460;13453:12;13417:50;13500:2;13494:4;13490:13;13476:27;;13547:6;13531:14;13527:27;13519:6;13515:40;13512:60;;;13568:1;13565;13558:12;13512:60;13581:85;13659:6;13651;13647:1;13641:4;13637:12;13581:85;:::i;14774:125::-;14839:9;;;14860:10;;;14857:36;;;14873:18;;:::i;16547:209::-;16579:1;16605;16595:132;;16649:10;16644:3;16640:20;16637:1;16630:31;16684:4;16681:1;16674:15;16712:4;16709:1;16702:15;16595:132;-1:-1:-1;16741:9:31;;16547:209::o;16761:136::-;16800:3;16828:5;16818:39;;16837:18;;:::i;:::-;-1:-1:-1;;;16873:18:31;;16761:136::o", + "object": "0x608060405234801561000f575f5ffd5b50600436106100fb575f3560e01c80636dd7d8ea11610093578063d04a68c711610063578063d04a68c7146101cc578063eb9019d414610207578063f1bd0b3714610227578063f3513a371461022e575f5ffd5b80636dd7d8ea14610189578063afeea1151461019c578063b5cfa68c146101b1578063b85f5da2146101c4575f5ffd5b80632bdf6d43116100ce5780632bdf6d43146101465780633174b6891461015b578063602a9eee146101635780636252587914610176575f5ffd5b80630777cbef146100ff5780630d2bd909146101165780631904bb2e1461011e5780631b605b861461013e575b5f5ffd5b6001545b6040519081526020015b60405180910390f35b600d54610103565b61013161012c366004612161565b610236565b60405161010d9190612205565b600754610103565b610159610154366004612217565b61039b565b005b610159610429565b610159610171366004612286565b6106b5565b6101596101843660046122e2565b610990565b610159610197366004612161565b610a2b565b6101a4610d75565b60405161010d9190612318565b6101596101bf36600461237b565b610f12565b610159611334565b6101f76101da366004612161565b6001600160a01b03165f9081526003602052604090205460ff1690565b604051901515815260200161010d565b61021a61021536600461239b565b611455565b60405161010d91906123c3565b5f54610103565b6101a4611698565b61023e61206b565b6001600160a01b0382165f9081526003602052604090205460ff166102aa5760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e2774206578697374730000000060448201526064015b60405180910390fd5b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff161515948201949094526003840180549394928501939192916060840191906103129061241d565b80601f016020809104026020016040519081016040528092919081815260200182805461033e9061241d565b80156103895780601f1061036057610100808354040283529160200191610389565b820191905f5260205f20905b81548152906001019060200180831161036c57829003601f168201915b50505091909252505050905292915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103e35760405162461bcd60e51b81526004016102a19061244f565b5f5b818110156104245761041c83838381811061040257610402612484565b90506020020160208101906104179190612161565b61182f565b6001016103e5565b505050565b335f90815260066020526040902080546001600160a01b03166104805760405162461bcd60e51b815260206004820152600f60248201526e1513d113ce881b9bdd081d9bdd1959608a1b60448201526064016102a1565b6009546008546001600160a01b039182169116036104b957600880546001600160a01b03199081169091556009805490911690556105cc565b600954336001600160a01b0390911603610512576002810180546001600160a01b039081165f90815260066020526040902060030180546001600160a01b031990811690915591546009805490931691161790556105cc565b600854336001600160a01b0390911603610576576009546001600160a01b039081165f9081526006602052604080822060020180546001600160a01b03199081169091556008805480861685529290932060030154911692169190911790556105cc565b60038181018054600280850180546001600160a01b039081165f9081526006602052604080822090970180549583166001600160a01b031996871617905591549454811682529490200180549290931691161790555b8054604080513381526001600160a01b0390921660208301527f6572af8bf9a0a86efb88dcc30011626a15c9c4603503aa4466a3f87a1867deef910160405180910390a180546001600160a01b03165f9081526002602052604081206001808401549082018054929391929091906106459084906124ac565b9091555050805460019082905f9061065e9084906124ac565b9091555050335f90815260066020526040812080546001600160a01b03199081168255600182018390556002820180548216905560039091018054909116905560078054916106ac836124bf565b91905055505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016330361072d5760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e65720000000060448201526064016102a1565b335f9081526003602052604090205460ff161561078c5760405162461bcd60e51b815260206004820152601f60248201527f56616c696461746f7220697320616c726561647920726567697374657265640060448201526064016102a1565b5f828260405161079d9291906124d4565b60408051918290039091205f8181526004602052919091205490915060ff16156108155760405162461bcd60e51b815260206004820152602360248201527f424c5331322d333831206b657920697320616c726561647920726567697374656044820152621c995960ea1b60648201526084016102a1565b61081f838361190f565b5f60405180608001604052805f81526020015f81526020015f1515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509390945250508054929350905080610887836124e3565b9091555050335f9081526003602081815260408084208054600160ff1991821681179092556002808552958390208751815593870151918401919091559085015193820180549091169315159390931790925560608301518392918201906108ef908261255a565b5050505f82815260046020526040808220805460ff191660019081179091556005805491820181559092527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910180546001600160a01b0319163390811790915590517f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c916109829187908790612614565b60405180910390a150505050565b6109a06101da6020830183612161565b6109ec5760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e2774206578697374730000000060448201526064016102a1565b6109f96020820182612653565b60025f610a096020850185612161565b6001600160a01b0316815260208101919091526040015f20610424828261272a565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610aa35760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e65720000000060448201526064016102a1565b6001600160a01b0381165f9081526003602052604090205460ff16610b0a5760405162461bcd60e51b815260206004820152601760248201527f4d75737420766f746520666f722076616c696461746f7200000000000000000060448201526064016102a1565b335f908152600660205260409020546001600160a01b031615610b5f5760405162461bcd60e51b815260206004820152600d60248201526c105b1c9958591e481d9bdd1959609a1b60448201526064016102a1565b6001600160a01b0381165f9081526002602081905260409091209081015460ff1615610bd85760405162461bcd60e51b815260206004820152602260248201527f4d75737420766f746520666f7220756e72657369676e65642076616c6964617460448201526137b960f11b60648201526084016102a1565b604080516080810182526001600160a01b03808516825233803160208085019182525f85870181815260608701828152948252600690925295909520935184549084166001600160a01b03199182161785559051600185015593516002840180549184169186169190911790555160039092018054928216929093169190911790915560085416610c8a5760088054336001600160a01b03199182168117909255600980549091169091179055610ce1565b600980546001600160a01b039081165f9081526006602052604080822060030180546001600160a01b0319908116339081179092558554828552929093206002018054841692909416919091179092558254161790555b60078054905f610cf0836124e3565b9190505550336001600160a01b031631816001015f828254610d1291906127b1565b9091555050805460019082905f90610d2b9084906127b1565b9091555050604080513381526001600160a01b03841660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2910160405180910390a15050565b600d546060905f906001600160401b03811115610d9457610d946124fb565b604051908082528060200260200182016040528015610dcd57816020015b610dba61206b565b815260200190600190039081610db25790505b5090505f5b600d54811015610f0c575f600d8281548110610df057610df0612484565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff1615159583019590955260038101805493965090949384019285916060840191610e629061241d565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8e9061241d565b8015610ed95780601f10610eb057610100808354040283529160200191610ed9565b820191905f5260205f20905b815481529060010190602001808311610ebc57829003601f168201915b505050505081525050815250848481518110610ef757610ef7612484565b60209081029190910101525050600101610dd2565b50919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f5a5760405162461bcd60e51b81526004016102a19061244f565b610f62611971565b610f6a611ac0565b600a80546001600160a01b03191690556001545f80549091610f9c9160ff8516918491610f9791906124ac565b611b11565b90508060ff165f03610fac575050565b5f5b600554811015611257575f60058281548110610fcc57610fcc612484565b5f9182526020808320909101546001600160a01b03168083526002918290526040909220908101549192509060ff161561100757505061124f565b600a546001600160a01b03166110425750600a80546001600160a01b0319166001600160a01b03929092169190911790556001600c5561124f565b8360ff16600c541015611060576110598285611ba2565b505061124f565b600a546001600160a01b039081165f908152600260208181526040928390208351808501855294871685528351608081018552865481526001870154818401529286015460ff16151593830193909352600385018054939461123c949093928401929187916060840191906110d49061241d565b80601f01602080910402602001604051908101604052809291908181526020018280546111009061241d565b801561114b5780601f106111225761010080835404028352916020019161114b565b820191905f5260205f20905b81548152906001019060200180831161112e57829003601f168201915b505050919092525050509052604080518082018252600a546001600160a01b031681528151608081018352855481526001860154602082810191909152600287015460ff161515938201939093526003860180549293840192879160608401916111b49061241d565b80601f01602080910402602001604051908101604052809291908181526020018280546111e09061241d565b801561122b5780601f106112025761010080835404028352916020019161122b565b820191905f5260205f20905b81548152906001019060200180831161120e57829003601f168201915b505050505081525050815250611f81565b1561124b5761124b8386611ba2565b5050505b600101610fae565b50600a546001600160a01b031661126f600d5f6120b4565b8160ff166001600160401b0381111561128a5761128a6124fb565b6040519080825280602002602001820160405280156112b3578160200160208202803683370190505b5080516112c891600d916020909101906120cf565b505f5b8260ff1681101561132d5781600d82815481106112ea576112ea612484565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559382168152600b909352604090922054909116906001016112cb565b5050505b50565b335f9081526003602052604090205460ff166113925760405162461bcd60e51b815260206004820152601960248201527f43616c6c6572206973206e6f7420612076616c696461746f720000000000000060448201526064016102a1565b335f9081526002602081905260409091209081015460ff16156113f75760405162461bcd60e51b815260206004820152601d60248201527f56616c696461746f7220697320616c72656164792072657369676e656400000060448201526064016102a1565b60028101805460ff19166001908117909155805481905f9061141a9083906127b1565b90915550506040513381527f24250fc1ec78a1405ddd4cc8b75964858af228d05faa8d4bc1302966d8a541179060200160405180910390a150565b6060336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461149f5760405162461bcd60e51b81526004016102a19061244f565b5f6114ad835f600754611b11565b6001600160401b038111156114c4576114c46124fb565b60405190808252806020026020018201604052801561150857816020015b604080518082019091525f80825260208201528152602001906001900390816114e25790505b506008549091506001600160a01b039081169085161561154157506001600160a01b038085165f90815260066020526040902060030154165b5f5b6001600160a01b0382161580159061155a57508481105b156115cf576001600160a01b038083165f81815260066020908152604091829020825180840190935292825282549093169281019290925290848361159e816124e3565b9450815181106115b0576115b0612484565b6020908102919091010152600301546001600160a01b03169150611543565b808351036115e257829350505050611692565b5f816001600160401b038111156115fb576115fb6124fb565b60405190808252806020026020018201604052801561163f57816020015b604080518082019091525f80825260208201528152602001906001900390816116195790505b5090505f5b8281101561168b5784818151811061165e5761165e612484565b602002602001015182828151811061167857611678612484565b6020908102919091010152600101611644565b5093505050505b92915050565b6005546060905f906001600160401b038111156116b7576116b76124fb565b6040519080825280602002602001820160405280156116f057816020015b6116dd61206b565b8152602001906001900390816116d55790505b5090505f5b600554811015610f0c575f6005828154811061171357611713612484565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff16151595830195909552600381018054939650909493840192859160608401916117859061241d565b80601f01602080910402602001604051908101604052809291908181526020018280546117b19061241d565b80156117fc5780601f106117d3576101008083540402835291602001916117fc565b820191905f5260205f20905b8154815290600101906020018083116117df57829003601f168201915b50505050508152505081525084848151811061181a5761181a612484565b602090810291909101015250506001016116f5565b6001600160a01b038082165f9081526006602052604090208054909116611854575050565b60018101546001600160a01b038316318110156118b55761187f816001600160a01b038516316124ac565b82546001600160a01b03165f90815260026020526040812060010180549091906118aa9084906127b1565b909155506118fa9050565b6118c96001600160a01b03841631826124ac565b82546001600160a01b03165f90815260026020526040812060010180549091906118f49084906124ac565b90915550505b506001600160a01b0390911631600190910155565b6030811461196d5760405162461bcd60e51b815260206004820152602560248201527f424c5331322d333831207075626c69634b6579206c656e67746820697320696e6044820152641d985b1a5960da1b60648201526084016102a1565b5050565b6005545f6119806001836124ac565b90505b801561196d575f6119958260016127b1565b60408051426020820152449181019190915260608101849052608001604051602081830303815290604052805190602001205f1c6119d391906127c4565b90505f600583815481106119e9576119e9612484565b5f91825260209091200154600580546001600160a01b0390921692509083908110611a1657611a16612484565b5f91825260209091200154600580546001600160a01b039092169185908110611a4157611a41612484565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508060058381548110611a8057611a80612484565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050508080611ab8906124bf565b915050611983565b600a546001600160a01b03165b6001600160a01b03811615611b0a576001600160a01b039081165f908152600b6020526040902080546001600160a01b0319811690915516611acd565b505f600c55565b5f81831115611b7a5760405162461bcd60e51b815260206004820152602f60248201527f4d696e696d756d2073686f756c64206265206c657373207468616e206f72206560448201526e7175616c20746f206d6178696d756d60881b60648201526084016102a1565b82841015611b89575081611b9b565b81841115611b98575080611b9b565b50825b9392505050565b6001600160a01b0382165f9081526002602081815260408084208151608081018352815481526001820154938101939093529283015460ff16151590820152600382018054919291606084019190611bf99061241d565b80601f0160208091040260200160405190810160405280929190818152602001828054611c259061241d565b8015611c705780601f10611c4757610100808354040283529160200191611c70565b820191905f5260205f20905b815481529060010190602001808311611c5357829003601f168201915b505050919092525050604080518082018252600a546001600160a01b03168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff16151594820194909452600384018054969750611d919693955091850193909290916060840191611ceb9061241d565b80601f0160208091040260200160405190810160405280929190818152602001828054611d179061241d565b8015611d625780601f10611d3957610100808354040283529160200191611d62565b820191905f5260205f20905b815481529060010190602001808311611d4557829003601f168201915b5050505050815250508152506040518060400160405280866001600160a01b0316815260200184815250611f81565b15611da457611d9f83611fc5565b611f22565b600a546001600160a01b039081165f818152600b6020526040902054909116905b6001600160a01b038216611de257611ddd8186612016565b611f1f565b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff16151594820194909452600384018054611eef9593850193916060840191611e499061241d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e759061241d565b8015611ec05780601f10611e9757610100808354040283529160200191611ec0565b820191905f5260205f20905b815481529060010190602001808311611ea357829003601f168201915b5050505050815250508152506040518060400160405280886001600160a01b0316815260200186815250611f81565b15611efe57611ddd8186612016565b506001600160a01b038082165f908152600b60205260409020541690611dc5565b50505b8160ff16600c54111561042457600a80546001600160a01b039081165f908152600b6020526040812080546001600160a01b03198082169092558454931692168217909255600c80549192611f76836124bf565b919050555050505050565b5f81602001516020015183602001516020015103611fb15750805182516001600160a01b03918216911611611692565b506020908101518101519181015101511190565b600a80546001600160a01b038381165f818152600b602052604081208054939094166001600160a01b031993841617909355835490911617909155600c80549161200e836124e3565b919050555050565b6001600160a01b038281165f818152600b602052604080822080548686168085529284208054919096166001600160a01b03199182161790955592825282549093169092179055600c8054916106ac836124e3565b60405180604001604052805f6001600160a01b031681526020016120af60405180608001604052805f81526020015f81526020015f15158152602001606081525090565b905290565b5080545f8255905f5260205f20908101906113319190612132565b828054828255905f5260205f20908101928215612122579160200282015b8281111561212257825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906120ed565b5061212e929150612132565b5090565b5b8082111561212e575f8155600101612133565b80356001600160a01b038116811461215c575f5ffd5b919050565b5f60208284031215612171575f5ffd5b611b9b82612146565b60018060a01b0381511682525f602082015160406020850152805160408501526020810151606085015260408101511515608085015260608101519050608060a085015280518060c08601525f5b818110156121e557602081840181015160e08884010152016121c8565b505f60e0828701015260e0601f19601f8301168601019250505092915050565b602081525f611b9b602083018461217a565b5f5f60208385031215612228575f5ffd5b82356001600160401b0381111561223d575f5ffd5b8301601f8101851361224d575f5ffd5b80356001600160401b03811115612262575f5ffd5b8560208260051b8401011115612276575f5ffd5b6020919091019590945092505050565b5f5f60208385031215612297575f5ffd5b82356001600160401b038111156122ac575f5ffd5b8301601f810185136122bc575f5ffd5b80356001600160401b038111156122d1575f5ffd5b856020828401011115612276575f5ffd5b5f602082840312156122f2575f5ffd5b81356001600160401b03811115612307575f5ffd5b820160408185031215611b9b575f5ffd5b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561236f57603f1987860301845261235a85835161217a565b9450602093840193919091019060010161233e565b50929695505050505050565b5f6020828403121561238b575f5ffd5b813560ff81168114611b9b575f5ffd5b5f5f604083850312156123ac575f5ffd5b6123b583612146565b946020939093013593505050565b602080825282518282018190525f918401906040840190835b8181101561241257835180516001600160a01b0390811685526020918201511681850152909301926040909201916001016123dc565b509095945050505050565b600181811c9082168061243157607f821691505b602082108103610f0c57634e487b7160e01b5f52602260045260245ffd5b6020808252818101527f43616c6c6572206973206e6f742074686520636f6e7472616374206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561169257611692612498565b5f816124cd576124cd612498565b505f190190565b818382375f9101908152919050565b5f600182016124f4576124f4612498565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b601f82111561042457805f5260205f20601f840160051c810160208510156125345750805b601f840160051c820191505b81811015612553575f8155600101612540565b5050505050565b81516001600160401b03811115612573576125736124fb565b61258781612581845461241d565b8461250f565b6020601f8211600181146125b9575f83156125a25750848201515b5f19600385901b1c1916600184901b178455612553565b5f84815260208120601f198516915b828110156125e857878501518255602094850194600190920191016125c8565b508482101561260557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8235607e19833603018112612667575f5ffd5b9190910192915050565b6001600160401b03831115612688576126886124fb565b61269c83612696835461241d565b8361250f565b5f601f8411600181146126cd575f85156126b65750838201355b5f19600387901b1c1916600186901b178355612553565b5f83815260208120601f198716915b828110156126fc57868501358255602094850194600190920191016126dc565b5086821015612718575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b813581556020820135600182015560028101604083013580151580821461274f575f5ffd5b60ff19835416915060ff8116821783555050506060820135601e19833603018112612778575f5ffd5b820180356001600160401b0381111561278f575f5ffd5b6020820191508036038213156127a3575f5ffd5b61132d818360038601612671565b8082018082111561169257611692612498565b5f826127de57634e487b7160e01b5f52601260045260245ffd5b50069056fea2646970667358221220a8ee0b1320141255bce1b410559059bcda15b2e7d6bad21420e5b904b6bec7e564736f6c634300081b0033", + "sourceMap": "1460:13132:23:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7856:113;7938:24;;7856:113;;;160:25:31;;;148:2;133:18;7856:113:23;;;;;;;;7975:118;8055:24;:31;7975:118;;9761:244;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10245:91::-;10317:12;;10245:91;;13157:228;;;;;;:::i;:::-;;:::i;:::-;;12165:986;;;:::i;8099:951::-;;;;;;:::i;:::-;;:::i;10011:228::-;;;;;;:::i;:::-;;:::i;11193:966::-;;;;;;:::i;:::-;;:::i;6649:458::-;;;:::i;:::-;;;;;;;:::i;3350:1532::-;;;;;;:::i;:::-;;:::i;9056:400::-;;;:::i;9462:125::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9551:29:23;9528:4;9551:29;;;:23;:29;;;;;;;;;9462:125;;;;4584:14:31;;4577:22;4559:41;;4547:2;4532:18;9462:125:23;4419:187:31;10342:845:23;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7733:117::-;7791:7;7817:26;7733:117;;7278:449;;;:::i;9761:244::-;9819:16;;:::i;:::-;-1:-1:-1;;;;;9551:29:23;;9528:4;9551:29;;;:23;:29;;;;;;;;9847:71;;;;-1:-1:-1;;;9847:71:23;;5883:2:31;9847:71:23;;;5865:21:31;5922:2;5902:18;;;5895:30;5961;5941:18;;;5934:58;6009:18;;9847:71:23;;;;;;;;;9935:63;;;;;;;;-1:-1:-1;;;;;9935:63:23;;;;;-1:-1:-1;9965:31:23;;;:24;9935:63;9965:31;;;;;;;9935:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9965:31;9935:63;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9935:63:23;;;;-1:-1:-1;;;9935:63:23;;9928:70;9761:244;-1:-1:-1;;9761:244:23:o;13157:228::-;2320:10;-1:-1:-1;;;;;2334:6:23;2320:20;;2312:65;;;;-1:-1:-1;;;2312:65:23;;;;;;;:::i;:::-;13292:9:::1;13287:92;13307:17:::0;;::::1;13287:92;;;13345:23;13358:6;;13365:1;13358:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;13345:12;:23::i;:::-;13326:3;;13287:92;;;;13157:228:::0;;:::o;12165:986::-;12231:10;12202:18;12223:19;;;:7;:19;;;;;12260:15;;-1:-1:-1;;;;;12260:15:23;12252:57;;;;-1:-1:-1;;;12252:57:23;;7118:2:31;12252:57:23;;;7100:21:31;7157:2;7137:18;;;7130:30;-1:-1:-1;;;7176:18:31;;;7169:45;7231:18;;12252:57:23;6916:339:31;12252:57:23;12339:11;;12324;;-1:-1:-1;;;;;12339:11:23;;;12324;;:26;12320:528;;12366:11;:24;;-1:-1:-1;;;;;;12366:24:23;;;;;;12404:11;:24;;;;;;;12320:528;;;12449:11;;12464:10;-1:-1:-1;;;;;12449:11:23;;;:25;12445:403;;12498:10;;;;;-1:-1:-1;;;;;12498:10:23;;;12525:1;12490:19;;;:7;:19;;;;;:24;;:37;;-1:-1:-1;;;;;;12490:37:23;;;;;;12555:10;;12541:11;:24;;;;;12555:10;;12541:24;;;12445:403;;;12586:11;;12601:10;-1:-1:-1;;;;;12586:11:23;;;:25;12582:266;;12635:11;;-1:-1:-1;;;;;12635:11:23;;;12663:1;12627:20;;;:7;:20;;;;;;:25;;:38;;-1:-1:-1;;;;;;12627:38:23;;;;;;12701:11;;;;;;12693:20;;;;;;:25;;;12679:39;;12693:25;;12679:39;;;;;;12582:266;;;12776:10;;;;;;12757;;;;;;-1:-1:-1;;;;;12757:10:23;;;12776;12749:19;;;:7;:19;;;;;;:24;;;:37;;12776:10;;;-1:-1:-1;;;;;;12749:37:23;;;;;;12827:10;;12808;;;;12800:19;;;;;:24;:37;;12827:10;;;;12800:37;;;;;12582:266;12883:15;;12863:36;;;12871:10;7434:51:31;;-1:-1:-1;;;;;12883:15:23;;;7516:2:31;7501:18;;7494:60;12863:36:23;;7407:18:31;12863:36:23;;;;;;;12973:15;;-1:-1:-1;;;;;12973:15:23;12910:35;12948:41;;;:24;:41;;;;;12973:15;13029:13;;;;13000:25;;;:42;;12948:41;;13029:13;;13000:25;;12910:35;13000:42;;13029:13;;13000:42;:::i;:::-;;;;-1:-1:-1;;13052:30:23;;13081:1;;13052:13;;:25;;:30;;13081:1;;13052:30;:::i;:::-;;;;-1:-1:-1;;13108:10:23;13100:19;;;;:7;:19;;;;;13093:26;;-1:-1:-1;;;;;;13093:26:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13130:12;:14;;;;;;:::i;:::-;;;;;;12192:959;;12165:986::o;8099:951::-;-1:-1:-1;;;;;2457:6:23;2443:20;:10;:20;2435:61;;;;-1:-1:-1;;;2435:61:23;;8173:2:31;2435:61:23;;;8155:21:31;8212:2;8192:18;;;8185:30;8251;8231:18;;;8224:58;8299:18;;2435:61:23;7971:352:31;2435:61:23;8228:10:::1;8204:35;::::0;;;:23:::1;:35;::::0;;;;;::::1;;8203:36;8195:80;;;::::0;-1:-1:-1;;;8195:80:23;;8530:2:31;8195:80:23::1;::::0;::::1;8512:21:31::0;8569:2;8549:18;;;8542:30;8608:33;8588:18;;;8581:61;8659:18;;8195:80:23::1;8328:355:31::0;8195:80:23::1;8286:27;8326:20;;8316:31;;;;;;;:::i;:::-;;::::0;;;;;::::1;::::0;;;8367:42:::1;::::0;;;:21:::1;:42;::::0;;;;;;8316:31;;-1:-1:-1;8367:42:23::1;;8366:43;8358:91;;;::::0;-1:-1:-1;;;8358:91:23;;9166:2:31;8358:91:23::1;::::0;::::1;9148:21:31::0;9205:2;9185:18;;;9178:30;9244:34;9224:18;;;9217:62;-1:-1:-1;;;9295:18:31;;;9288:33;9338:19;;8358:91:23::1;8964:399:31::0;8358:91:23::1;8460:46;8485:20;;8460:24;:46::i;:::-;8517:30;8550:168;;;;;;;;8591:1;8550:168;;;;8619:1;8550:168;;;;8646:5;8550:168;;;;;;8687:20;;8550:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;8550:168:23;;;;-1:-1:-1;;8729:28:23;;8517:201;;-1:-1:-1;8550:168:23;-1:-1:-1;8550:168:23;8729:28:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;8791:10:23::1;8767:35;::::0;;;:23:::1;:35;::::0;;;;;;;:42;;8805:4:::1;-1:-1:-1::0;;8767:42:23;;::::1;::::0;::::1;::::0;;;8819:24:::1;:36:::0;;;;;;;:48;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;:36;:48;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;8877:42:23::1;::::0;;;:21:::1;:42;::::0;;;;;:49;;-1:-1:-1;;8877:49:23::1;8922:4;8877:49:::0;;::::1;::::0;;;8936:21:::1;:38:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;8936:38:23::1;8963:10;8936:38:::0;;::::1;::::0;;;8990:53;;::::1;::::0;::::1;::::0;9022:20;;;;8990:53:::1;:::i;:::-;;;;;;;;8185:865;;8099:951:::0;;:::o;10011:228::-;10092:38;10114:15;;;;:10;:15;:::i;10092:38::-;10084:79;;;;-1:-1:-1;;;10084:79:23;;5883:2:31;10084:79:23;;;5865:21:31;5922:2;5902:18;;;5895:30;5961;5941:18;;;5934:58;6009:18;;10084:79:23;5681:352:31;10084:79:23;10217:15;;;;:10;:15;:::i;:::-;10173:24;:41;10198:15;;;;:10;:15;:::i;:::-;-1:-1:-1;;;;;10173:41:23;;;;;;;;;;;;-1:-1:-1;10173:41:23;:59;;:41;:59;:::i;11193:966::-;-1:-1:-1;;;;;2457:6:23;2443:20;:10;:20;2435:61;;;;-1:-1:-1;;;2435:61:23;;8173:2:31;2435:61:23;;;8155:21:31;8212:2;8192:18;;;8185:30;8251;8231:18;;;8224:58;8299:18;;2435:61:23;7971:352:31;2435:61:23;-1:-1:-1;;;;;9551:29:23;;9528:4;9551:29;;;:23;:29;;;;;;;;11253:63:::1;;;::::0;-1:-1:-1;;;11253:63:23;;15168:2:31;11253:63:23::1;::::0;::::1;15150:21:31::0;15207:2;15187:18;;;15180:30;15246:25;15226:18;;;15219:53;15289:18;;11253:63:23::1;14966:347:31::0;11253:63:23::1;11342:10;11375:1;11334:19:::0;;;:7:::1;:19;::::0;;;;:29;-1:-1:-1;;;;;11334:29:23::1;:43:::0;11326:69:::1;;;::::0;-1:-1:-1;;;11326:69:23;;15520:2:31;11326:69:23::1;::::0;::::1;15502:21:31::0;15559:2;15539:18;;;15532:30;-1:-1:-1;;;15578:18:31;;;15571:43;15631:18;;11326:69:23::1;15318:337:31::0;11326:69:23::1;-1:-1:-1::0;;;;;11444:30:23;::::1;11406:35;11444:30:::0;;;:24:::1;:30;::::0;;;;;;;11493:24;;::::1;::::0;::::1;;11492:25;11484:72;;;::::0;-1:-1:-1;;;11484:72:23;;15862:2:31;11484:72:23::1;::::0;::::1;15844:21:31::0;15901:2;15881:18;;;15874:30;15940:34;15920:18;;;15913:62;-1:-1:-1;;;15991:18:31;;;15984:32;16033:19;;11484:72:23::1;15660:398:31::0;11484:72:23::1;11589:88;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;11589:88:23;;::::1;::::0;;11621:10:::1;:18:::0;::::1;11589:88;::::0;;::::1;::::0;;;-1:-1:-1;11589:88:23;;;;;;;;;;;;11567:19;;;:7:::1;:19:::0;;;;;;;:110;;;;;;::::1;-1:-1:-1::0;;;;;;11567:110:23;;::::1;;::::0;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;11692:11:::1;::::0;::::1;11688:277;;11733:11;:24:::0;;11747:10:::1;-1:-1:-1::0;;;;;;11733:24:23;;::::1;::::0;::::1;::::0;;;11771:11:::1;:24:::0;;;;::::1;::::0;;::::1;::::0;;11688:277:::1;;;11834:11;::::0;;-1:-1:-1;;;;;11834:11:23;;::::1;11826:20;::::0;;;:7:::1;:20;::::0;;;;;:25:::1;;:38:::0;;-1:-1:-1;;;;;;11826:38:23;;::::1;11854:10;11826:38:::0;;::::1;::::0;;;11905:11;;11878:19;;;;;;;:24:::1;;:38:::0;;;::::1;11905:11:::0;;;::::1;11878:38:::0;;;::::1;::::0;;;11930:24;;::::1;;::::0;;11688:277:::1;11974:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;;;;;;12055:10;-1:-1:-1::0;;;;;12055:18:23::1;;12026:13;:25;;;:47;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;12083:30:23;;12112:1:::1;::::0;12083:13;;:25:::1;::::0;:30:::1;::::0;12112:1;;12083:30:::1;:::i;:::-;::::0;;;-1:-1:-1;;12129:23:23::1;::::0;;12135:10:::1;7434:51:31::0;;-1:-1:-1;;;;;7521:32:31;;7516:2;7501:18;;7494:60;12129:23:23::1;::::0;7407:18:31;12129:23:23::1;;;;;;;11243:916;11193:966:::0;:::o;6649:458::-;6772:24;:31;6698:18;;6728:25;;-1:-1:-1;;;;;6756:48:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;6728:76:23;-1:-1:-1;6819:9:23;6814:263;6838:24;:31;6834:35;;6814:263;;;6890:12;6905:24;6930:1;6905:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;6905:27:23;6975:30;;;:24;:30;;;;;;;;7031:35;;;;;;;;;;;;;;;;;;;;;6905:27;7031:35;;;;;;;;;;;;;;;;;;;;;;;;;;;6905:27;;-1:-1:-1;6975:30:23;;7031:35;;;;6975:30;;7031:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7019:6;7026:1;7019:9;;;;;;;;:::i;:::-;;;;;;;;;;:47;-1:-1:-1;;6871:3:23;;6814:263;;;-1:-1:-1;7094:6:23;6649:458;-1:-1:-1;6649:458:23:o;3350:1532::-;2320:10;-1:-1:-1;;;;;2334:6:23;2320:20;;2312:65;;;;-1:-1:-1;;;2312:65:23;;;;;;;:::i;:::-;3420:9:::1;:7;:9::i;:::-;3439:21;:19;:21::i;:::-;3471:18;:31:::0;;-1:-1:-1;;;;;;3471:31:23::1;::::0;;;3573:24;3500:1:::1;3544:26:::0;;3500:1;;3531:67:::1;::::0;::::1;::::0;::::1;::::0;3500:1;;3544:53:::1;::::0;3573:24;3544:53:::1;:::i;:::-;3531:6;:67::i;:::-;3513:86;;3672:3;:8;;3679:1;3672:8:::0;3668:45:::1;;3696:7;3350:1532:::0;:::o;3668:45::-:1;3728:9;3723:870;3747:21;:28:::0;3743:32;::::1;3723:870;;;3796:12;3811:21;3833:1;3811:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;3811:24:23::1;3879:30:::0;;;:24:::1;:30:::0;;;;;;;;3927:15;;::::1;::::0;3811:24;;-1:-1:-1;3879:30:23;3927:15:::1;;3923:62;;;3962:8;;;;3923:62;4003:18;::::0;-1:-1:-1;;;;;4003:18:23::1;3999:163;;-1:-1:-1::0;4055:18:23::1;:25:::0;;-1:-1:-1;;;;;;4055:25:23::1;-1:-1:-1::0;;;;;4055:25:23;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;4098:19:23::1;:23:::0;4139:8:::1;;3999:163;4202:3;4180:25;;:19;;:25;4176:119;;;4225:29;4244:4;4250:3;4225:18;:29::i;:::-;4272:8;;;;4176:119;4367:18;::::0;-1:-1:-1;;;;;4367:18:23;;::::1;4309:30;4342:44:::0;;;:24:::1;:44;::::0;;;;;;;;4416:35;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;4367:18;4416:35;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;;;::::0;;;;;;;::::1;::::0;::::1;::::0;;4342:44;;4405:102:::1;::::0;4416:35;;;;::::1;::::0;;4445:4;;4416:35;;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;4416:35:23;;;;-1:-1:-1;;;4416:35:23;;4453:53:::1;::::0;;;;::::1;::::0;;4470:18:::1;::::0;-1:-1:-1;;;;;4470:18:23::1;4453:53:::0;;;;::::1;::::0;::::1;::::0;;;;;;4470:18;4453:53;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;4496:8;;4453:53;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;::::0;4405:10:::1;:102::i;:::-;4401:182;;;4539:29;4558:4;4564:3;4539:18;:29::i;:::-;3782:811;;;3723:870;3777:3;;3723:870;;;-1:-1:-1::0;4618:18:23::1;::::0;-1:-1:-1;;;;;4618:18:23::1;4646:31;4653:24;4603:12;4646:31;:::i;:::-;4728:3;4714:18;;-1:-1:-1::0;;;;;4714:18:23::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;4714:18:23::1;-1:-1:-1::0;4687:45:23;;::::1;::::0;:24:::1;::::0;:45:::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;4747:9:23::1;4742:134;4766:3;4762:7;;:1;:7;4742:134;;;4820:4;4790:24;4815:1;4790:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;;::::1;:34:::0;;-1:-1:-1;;;;;;4790:34:23::1;-1:-1:-1::0;;;;;4790:34:23;;::::1;;::::0;;4845:20;;::::1;::::0;;:14:::1;:20:::0;;;;;;;;;;::::1;::::0;-1:-1:-1;4771:3:23::1;4742:134;;;;3410:1472;;2387:1;3350:1532:::0;:::o;9056:400::-;9132:10;9528:4;9551:29;;;:23;:29;;;;;;;;9102:71;;;;-1:-1:-1;;;9102:71:23;;16395:2:31;9102:71:23;;;16377:21:31;16434:2;16414:18;;;16407:30;16473:27;16453:18;;;16446:55;16518:18;;9102:71:23;16193:349:31;9102:71:23;9243:10;9184:31;9218:36;;;:24;:36;;;;;;;;9273:20;;;;;;9272:21;9264:63;;;;-1:-1:-1;;;9264:63:23;;16749:2:31;9264:63:23;;;16731:21:31;16788:2;16768:18;;;16761:30;16827:31;16807:18;;;16800:59;16876:18;;9264:63:23;16547:353:31;9264:63:23;9338:20;;;:27;;-1:-1:-1;;9338:27:23;9361:4;9338:27;;;;;;9375:29;;9361:4;;9338:20;;9375:29;;9361:4;;9375:29;:::i;:::-;;;;-1:-1:-1;;9420:29:23;;9438:10;17051:51:31;;9420:29:23;;17039:2:31;17024:18;9420:29:23;;;;;;;9092:364;9056:400::o;10342:845::-;10420:19;2320:10;-1:-1:-1;;;;;2334:6:23;2320:20;;2312:65;;;;-1:-1:-1;;;2312:65:23;;;;;;;:::i;:::-;10451:26:::1;10497:30;10504:5;10511:1;10514:12;;10497:6;:30::i;:::-;-1:-1:-1::0;;;;;10480:48:23::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;10480:48:23::1;;;;;;;;;;;;;;;-1:-1:-1::0;10554:11:23::1;::::0;10451:77;;-1:-1:-1;;;;;;10554:11:23;;::::1;::::0;10580:18;::::1;::::0;10576:74:::1;;-1:-1:-1::0;;;;;;10621:13:23;;::::1;;::::0;;;:7:::1;:13;::::0;;;;:18:::1;;::::0;::::1;10576:74;10660:9;10683:211;-1:-1:-1::0;;;;;10690:18:23;::::1;::::0;;::::1;::::0;:31:::1;;;10716:5;10712:1;:9;10690:31;10683:211;;;-1:-1:-1::0;;;;;10758:13:23;;::::1;10737:18;10758:13:::0;;;:7:::1;:13;::::0;;;;;;;;10799:53;;;;::::1;::::0;;;;;;10835:15;;;;::::1;10799:53:::0;;::::1;::::0;;;;10758:13;10785:6;10792:3;::::1;::::0;::::1;:::i;:::-;;;10785:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:67;10873:10:::1;;::::0;-1:-1:-1;;;;;10873:10:23::1;::::0;-1:-1:-1;10683:211:23::1;;;10925:1;10908:6;:13;:18:::0;10904:62:::1;;10949:6;10942:13;;;;;;;10904:62;11024:25;11069:1;-1:-1:-1::0;;;;;11052:19:23::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;11052:19:23::1;;;;;;;;;;;;;;;-1:-1:-1::0;11024:47:23;-1:-1:-1;11086:9:23::1;11081:77;11105:1;11101;:5;11081:77;;;11138:6;11145:1;11138:9;;;;;;;;:::i;:::-;;;;;;;11127:5;11133:1;11127:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:20;11108:3:::1;;11081:77;;;-1:-1:-1::0;11175:5:23;-1:-1:-1;;;;2387:1:23::1;10342:845:::0;;;;:::o;7278:449::-;7401:21;:28;7327:18;;7357:25;;-1:-1:-1;;;;;7385:45:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;7357:73:23;-1:-1:-1;7445:9:23;7440:257;7464:21;:28;7460:32;;7440:257;;;7513:12;7528:21;7550:1;7528:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;7528:24:23;7595:30;;;:24;:30;;;;;;;;7651:35;;;;;;;;;;;;;;;;;;;;;7528:24;7651:35;;;;;;;;;;;;;;;;;;;;;;;;;;;7528:24;;-1:-1:-1;7595:30:23;;7651:35;;;;7595:30;;7651:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7639:6;7646:1;7639:9;;;;;;;;:::i;:::-;;;;;;;;;;:47;-1:-1:-1;;7494:3:23;;7440:257;;13391:523;-1:-1:-1;;;;;13466:13:23;;;13445:18;13466:13;;;:7;:13;;;;;13493:15;;13466:13;;13493:15;13489:66;;13538:7;13391:523;:::o;13489:66::-;13588:13;;;;-1:-1:-1;;;;;13631:12:23;;;13616:27;;13612:257;;;13716:27;13731:12;-1:-1:-1;;;;;13716:12:23;;;:27;:::i;:::-;13684:15;;-1:-1:-1;;;;;13684:15:23;13659:41;;;;:24;:41;;;;;13684:15;13659:53;:84;;:53;;:41;:84;;;;;:::i;:::-;;;;-1:-1:-1;13612:257:23;;-1:-1:-1;13612:257:23;;13831:27;-1:-1:-1;;;;;13846:12:23;;;13831;:27;:::i;:::-;13799:15;;-1:-1:-1;;;;;13799:15:23;13774:41;;;;:24;:41;;;;;13799:15;13774:53;:84;;:53;;:41;:84;;;;;:::i;:::-;;;;-1:-1:-1;;13612:257:23;-1:-1:-1;;;;;;13895:12:23;;;;13879:13;;;;:28;13391:523::o;9593:162::-;9704:2;9684:22;;9676:72;;;;-1:-1:-1;;;9676:72:23;;17315:2:31;9676:72:23;;;17297:21:31;17354:2;17334:18;;;17327:30;17393:34;17373:18;;;17366:62;-1:-1:-1;;;17444:18:31;;;17437:35;17489:19;;9676:72:23;17113:401:31;9676:72:23;9593:162;;:::o;2520:523::-;2570:21;:28;2558:9;2625:5;2629:1;2570:28;2625:5;:::i;:::-;2613:17;;2608:429;2632:5;;2608:429;;2720:9;2810:5;:1;2814;2810:5;:::i;:::-;2750:54;;;2767:15;2750:54;;;17704:19:31;2784:16:23;17739:12:31;;;17732:28;;;;17776:12;;;17769:28;;;17813:12;;2750:54:23;;;;;;;;;;;;2740:65;;;;;;2732:74;;:84;;;;:::i;:::-;2720:96;;2877:12;2892:21;2914:1;2892:24;;;;;;;;:::i;:::-;;;;;;;;;;;2957:21;:24;;-1:-1:-1;;;;;2892:24:23;;;;-1:-1:-1;2957:21:23;2979:1;;2957:24;;;;;;:::i;:::-;;;;;;;;;;;2930:21;:24;;-1:-1:-1;;;;;2957:24:23;;;;2952:1;;2930:24;;;;;;:::i;:::-;;;;;;;;;:51;;;;;-1:-1:-1;;;;;2930:51:23;;;;;-1:-1:-1;;;;;2930:51:23;;;;;;3022:4;2995:21;3017:1;2995:24;;;;;;;;:::i;:::-;;;;;;;;;:31;;;;;-1:-1:-1;;;;;2995:31:23;;;;;-1:-1:-1;;;;;2995:31:23;;;;;;2644:393;;2639:3;;;;;:::i;:::-;;;;2608:429;;3049:295;3114:18;;-1:-1:-1;;;;;3114:18:23;3143:162;-1:-1:-1;;;;;3150:18:23;;;3143:162;;-1:-1:-1;;;;;3227:23:23;;;3184:15;3227:23;;;:14;:23;;;;;;;-1:-1:-1;;;;;;3264:30:23;;;;;3227:23;3143:162;;;-1:-1:-1;3336:1:23;3314:19;:23;3049:295::o;14253:337::-;14332:7;14366:3;14359;:10;;14351:70;;;;-1:-1:-1;;;14351:70:23;;18252:2:31;14351:70:23;;;18234:21:31;18291:2;18271:18;;;18264:30;18330:34;18310:18;;;18303:62;-1:-1:-1;;;18381:18:31;;;18374:45;18436:19;;14351:70:23;18050:411:31;14351:70:23;14443:3;14435:5;:11;14431:153;;;-1:-1:-1;14469:3:23;14462:10;;14431:153;14501:3;14493:5;:11;14489:95;;;-1:-1:-1;14527:3:23;14520:10;;14489:95;-1:-1:-1;14568:5:23;14489:95;14253:337;;;;;:::o;4888:1390::-;-1:-1:-1;;;;;4988:30:23;;4960:25;4988:30;;;:24;:30;;;;;;;;4960:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4988:30;4960:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4960:58:23;;;;-1:-1:-1;;5074:89:23;;;;;;;;5091:18;;-1:-1:-1;;;;;5091:18:23;5074:89;;;-1:-1:-1;5117:44:23;;;:24;5074:89;5117:44;;;;;;;5074:89;;;;;;;;;;;5091:18;5074:89;;;;;;;;;;;;;;;;;;;;;;;;;;;4960:58;;-1:-1:-1;5046:184:23;;5074:89;;-1:-1:-1;5074:89:23;;;;;;5117:44;;5074:89;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5181:35;;;;;;;;5198:4;-1:-1:-1;;;;;5181:35:23;;;;;5210:4;5181:35;;;5046:10;:184::i;:::-;5029:999;;;5255:16;5266:4;5255:10;:16::i;:::-;5029:999;;;5335:18;;-1:-1:-1;;;;;5335:18:23;;;5302:15;5320:34;;;:14;:34;;;;;;;;;;5420:598;-1:-1:-1;;;;;5455:21:23;;5451:122;;5500:27;5512:8;5522:4;5500:11;:27::i;:::-;5549:5;;5451:122;5652:67;;;;;;;;-1:-1:-1;;;;;5652:67:23;;;;;-1:-1:-1;5684:33:23;;;:24;5652:67;5684:33;;;;;;;5652:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5616:186;;5652:67;;;;5684:33;5652:67;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5745:35;;;;;;;;5762:4;-1:-1:-1;;;;;5745:35:23;;;;;5774:4;5745:35;;;5616:10;:186::i;:::-;5591:325;;;5843:27;5855:8;5865:4;5843:11;:27::i;5591:325::-;-1:-1:-1;;;;;;5980:23:23;;;;;;;:14;:23;;;;;;;;5420:598;;;5288:740;;5029:999;6064:3;6042:25;;:19;;:25;6038:234;;;6113:18;;;-1:-1:-1;;;;;6113:18:23;;;6083:12;6098:34;;;:14;:34;;;;;;;-1:-1:-1;;;;;;6146:41:23;;;;;;6201:25;;6098:34;;6201:25;;;;;;;6240:19;:21;;6098:34;;6240:21;;;:::i;:::-;;;;;;6069:203;4950:1328;4888:1390;;:::o;13920:327::-;14021:4;14072:10;:15;;;:27;;;14041:10;:15;;;:27;;;:58;14037:129;;-1:-1:-1;14140:15:23;;14122;;-1:-1:-1;;;;;14122:33:23;;;;;;14115:40;;14037:129;-1:-1:-1;14213:15:23;;;;;:27;;;14183:15;;;;:27;;:57;;13920:327::o;6284:167::-;6360:18;;;-1:-1:-1;;;;;6337:20:23;;;6360:18;6337:20;;;:14;:20;;;;;:41;;6360:18;;;;-1:-1:-1;;;;;;6337:41:23;;;;;;;6388:25;;;;;;;;;6423:19;:21;;;;;;:::i;:::-;;;;;;6284:167;:::o;6457:186::-;-1:-1:-1;;;;;6548:20:23;;;;;;;:14;:20;;;;;;;;6525;;;;;;;;;:43;;6548:20;;;;-1:-1:-1;;;;;;6525:43:23;;;;;;;6578:20;;;:27;;;;;;;;;;6615:19;:21;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:173:31;264:20;;-1:-1:-1;;;;;313:31:31;;303:42;;293:70;;359:1;356;349:12;293:70;196:173;;;:::o;374:186::-;433:6;486:2;474:9;465:7;461:23;457:32;454:52;;;502:1;499;492:12;454:52;525:29;544:9;525:29;:::i;565:871::-;682:1;678;673:3;669:11;665:19;657:5;651:12;647:38;642:3;635:51;617:3;732:4;725:5;721:16;715:23;770:4;763;758:3;754:14;747:28;813:12;807:19;800:4;795:3;791:14;784:43;881:4;867:12;863:23;857:30;852:2;847:3;843:12;836:52;958:4;944:12;940:23;934:30;927:38;920:46;913:4;908:3;904:14;897:70;1022:2;1008:12;1004:21;998:28;976:50;;1057:4;1051:3;1046;1042:13;1035:27;1091:14;1085:21;1137:6;1131:3;1126;1122:13;1115:29;1162:1;1172:147;1186:6;1183:1;1180:13;1172:147;;;1302:4;1278:22;;;1274:33;;1268:40;1262:3;1249:11;;;1245:21;1238:71;1201:12;1172:147;;;1176:3;1363:1;1357:3;1348:6;1343:3;1339:16;1335:26;1328:37;1426:3;1419:2;1415:7;1410:2;1402:6;1398:15;1394:29;1389:3;1385:39;1381:49;1374:56;;;;565:871;;;;:::o;1441:266::-;1626:2;1615:9;1608:21;1589:4;1646:55;1697:2;1686:9;1682:18;1674:6;1646:55;:::i;1712:610::-;1798:6;1806;1859:2;1847:9;1838:7;1834:23;1830:32;1827:52;;;1875:1;1872;1865:12;1827:52;1915:9;1902:23;-1:-1:-1;;;;;1940:6:31;1937:30;1934:50;;;1980:1;1977;1970:12;1934:50;2003:22;;2056:4;2048:13;;2044:27;-1:-1:-1;2034:55:31;;2085:1;2082;2075:12;2034:55;2125:2;2112:16;-1:-1:-1;;;;;2143:6:31;2140:30;2137:50;;;2183:1;2180;2173:12;2137:50;2236:7;2231:2;2221:6;2218:1;2214:14;2210:2;2206:23;2202:32;2199:45;2196:65;;;2257:1;2254;2247:12;2196:65;2288:2;2280:11;;;;;2310:6;;-1:-1:-1;1712:610:31;-1:-1:-1;;;1712:610:31:o;2327:586::-;2397:6;2405;2458:2;2446:9;2437:7;2433:23;2429:32;2426:52;;;2474:1;2471;2464:12;2426:52;2514:9;2501:23;-1:-1:-1;;;;;2539:6:31;2536:30;2533:50;;;2579:1;2576;2569:12;2533:50;2602:22;;2655:4;2647:13;;2643:27;-1:-1:-1;2633:55:31;;2684:1;2681;2674:12;2633:55;2724:2;2711:16;-1:-1:-1;;;;;2742:6:31;2739:30;2736:50;;;2782:1;2779;2772:12;2736:50;2827:7;2822:2;2813:6;2809:2;2805:15;2801:24;2798:37;2795:57;;;2848:1;2845;2838:12;2918:389;3007:6;3060:2;3048:9;3039:7;3035:23;3031:32;3028:52;;;3076:1;3073;3066:12;3028:52;3116:9;3103:23;-1:-1:-1;;;;;3141:6:31;3138:30;3135:50;;;3181:1;3178;3171:12;3135:50;3204:22;;3260:2;3242:16;;;3238:25;3235:45;;;3276:1;3273;3266:12;3312:828;3510:4;3558:2;3547:9;3543:18;3588:2;3577:9;3570:21;3611:6;3646;3640:13;3677:6;3669;3662:22;3715:2;3704:9;3700:18;3693:25;;3777:2;3767:6;3764:1;3760:14;3749:9;3745:30;3741:39;3727:53;;3815:2;3807:6;3803:15;3836:1;3846:265;3860:6;3857:1;3854:13;3846:265;;;3953:2;3949:7;3937:9;3929:6;3925:22;3921:36;3916:3;3909:49;3981:50;4024:6;4015;4009:13;3981:50;:::i;:::-;3971:60;-1:-1:-1;4066:2:31;4089:12;;;;4054:15;;;;;3882:1;3875:9;3846:265;;;-1:-1:-1;4128:6:31;;3312:828;-1:-1:-1;;;;;;3312:828:31:o;4145:269::-;4202:6;4255:2;4243:9;4234:7;4230:23;4226:32;4223:52;;;4271:1;4268;4261:12;4223:52;4310:9;4297:23;4360:4;4353:5;4349:16;4342:5;4339:27;4329:55;;4380:1;4377;4370:12;4611:254;4679:6;4687;4740:2;4728:9;4719:7;4715:23;4711:32;4708:52;;;4756:1;4753;4746:12;4708:52;4779:29;4798:9;4779:29;:::i;:::-;4769:39;4855:2;4840:18;;;;4827:32;;-1:-1:-1;;;4611:254:31:o;4870:806::-;5118:2;5130:21;;;5200:13;;5103:18;;;5222:22;;;5070:4;;5301:15;;;5275:2;5260:18;;;5070:4;5344:306;5358:6;5355:1;5352:13;5344:306;;;5417:13;;5459:9;;-1:-1:-1;;;;;5455:35:31;;;5443:48;;5543:2;5535:11;;;5529:18;5525:44;5511:12;;;5504:66;5625:15;;;;5599:2;5590:12;;;;5487:1;5373:9;5344:306;;;-1:-1:-1;5667:3:31;;4870:806;-1:-1:-1;;;;;4870:806:31:o;6038:380::-;6117:1;6113:12;;;;6160;;;6181:61;;6235:4;6227:6;6223:17;6213:27;;6181:61;6288:2;6280:6;6277:14;6257:18;6254:38;6251:161;;6334:10;6329:3;6325:20;6322:1;6315:31;6369:4;6366:1;6359:15;6397:4;6394:1;6387:15;6423:356;6625:2;6607:21;;;6644:18;;;6637:30;6703:34;6698:2;6683:18;;6676:62;6770:2;6755:18;;6423:356::o;6784:127::-;6845:10;6840:3;6836:20;6833:1;6826:31;6876:4;6873:1;6866:15;6900:4;6897:1;6890:15;7565:127;7626:10;7621:3;7617:20;7614:1;7607:31;7657:4;7654:1;7647:15;7681:4;7678:1;7671:15;7697:128;7764:9;;;7785:11;;;7782:37;;;7799:18;;:::i;7830:136::-;7869:3;7897:5;7887:39;;7906:18;;:::i;:::-;-1:-1:-1;;;7942:18:31;;7830:136::o;8688:271::-;8871:6;8863;8858:3;8845:33;8827:3;8897:16;;8922:13;;;8897:16;8688:271;-1:-1:-1;8688:271:31:o;9368:135::-;9407:3;9428:17;;;9425:43;;9448:18;;:::i;:::-;-1:-1:-1;9495:1:31;9484:13;;9368:135::o;9508:127::-;9569:10;9564:3;9560:20;9557:1;9550:31;9600:4;9597:1;9590:15;9624:4;9621:1;9614:15;9765:517;9866:2;9861:3;9858:11;9855:421;;;9902:5;9899:1;9892:16;9946:4;9943:1;9933:18;10016:2;10004:10;10000:19;9997:1;9993:27;9987:4;9983:38;10052:4;10040:10;10037:20;10034:47;;;-1:-1:-1;10075:4:31;10034:47;10130:2;10125:3;10121:12;10118:1;10114:20;10108:4;10104:31;10094:41;;10185:81;10203:2;10196:5;10193:13;10185:81;;;10262:1;10248:16;;10229:1;10218:13;10185:81;;;10189:3;;9765:517;;;:::o;10458:1295::-;10582:3;10576:10;-1:-1:-1;;;;;10601:6:31;10598:30;10595:56;;;10631:18;;:::i;:::-;10660:96;10749:6;10709:38;10741:4;10735:11;10709:38;:::i;:::-;10703:4;10660:96;:::i;:::-;10805:4;10836:2;10825:14;;10853:1;10848:648;;;;11540:1;11557:6;11554:89;;;-1:-1:-1;11609:19:31;;;11603:26;11554:89;-1:-1:-1;;10415:1:31;10411:11;;;10407:24;10403:29;10393:40;10439:1;10435:11;;;10390:57;11656:81;;10818:929;;10848:648;9712:1;9705:14;;;9749:4;9736:18;;-1:-1:-1;;10884:20:31;;;11001:222;11015:7;11012:1;11009:14;11001:222;;;11097:19;;;11091:26;11076:42;;11204:4;11189:20;;;;11157:1;11145:14;;;;11031:12;11001:222;;;11005:3;11251:6;11242:7;11239:19;11236:201;;;11312:19;;;11306:26;-1:-1:-1;;11395:1:31;11391:14;;;11407:3;11387:24;11383:37;11379:42;11364:58;11349:74;;11236:201;-1:-1:-1;;;;11483:1:31;11467:14;;;11463:22;11450:36;;-1:-1:-1;10458:1295:31:o;11758:485::-;-1:-1:-1;;;;;11943:32:31;;11925:51;;12012:2;12007;11992:18;;11985:30;;;12031:18;;12024:34;;;12051:6;12100;12095:2;12080:18;;12067:48;12164:1;12135:22;;;12159:2;12131:31;;;12124:42;;;;12227:2;12206:15;;;-1:-1:-1;;12202:29:31;12187:45;12183:54;;11758:485;-1:-1:-1;;11758:485:31:o;12248:332::-;12348:4;12406:11;12393:25;12500:3;12496:8;12485;12469:14;12465:29;12461:44;12441:18;12437:69;12427:97;;12520:1;12517;12510:12;12427:97;12541:33;;;;;12248:332;-1:-1:-1;;12248:332:31:o;12585:1178::-;-1:-1:-1;;;;;12686:3:31;12683:27;12680:53;;;12713:18;;:::i;:::-;12742:93;12831:3;12791:38;12823:4;12817:11;12791:38;:::i;:::-;12785:4;12742:93;:::i;:::-;12861:1;12886:2;12881:3;12878:11;12903:1;12898:607;;;;13549:1;13566:3;13563:93;;;-1:-1:-1;13622:19:31;;;13609:33;13563:93;-1:-1:-1;;10415:1:31;10411:11;;;10407:24;10403:29;10393:40;10439:1;10435:11;;;10390:57;13669:78;;12871:886;;12898:607;9712:1;9705:14;;;9749:4;9736:18;;-1:-1:-1;;12934:17:31;;;13048:229;13062:7;13059:1;13056:14;13048:229;;;13151:19;;;13138:33;13123:49;;13258:4;13243:20;;;;13211:1;13199:14;;;;13078:12;13048:229;;;13052:3;13305;13296:7;13293:16;13290:159;;;13429:1;13425:6;13419:3;13413;13410:1;13406:11;13402:21;13398:34;13394:39;13381:9;13376:3;13372:19;13359:33;13355:79;13347:6;13340:95;13290:159;;;13492:1;13486:3;13483:1;13479:11;13475:19;13469:4;13462:33;12871:886;;12585:1178;;;:::o;13768:1193::-;13963:19;;13991:25;;14097:2;14086:14;;14073:28;14127:1;14117:12;;14110:35;14182:1;14172:12;;14232:2;14221:14;;14208:28;14262:15;;14255:23;14297:15;;;14287:43;;14326:1;14323;14316:12;14287:43;14381:3;14377:8;14364:10;14358:17;14354:32;14339:47;;14434:3;14430:2;14426:12;14417:7;14414:25;14402:10;14395:45;;;;14499:2;14492:5;14488:14;14475:28;14582:2;14578:7;14570:5;14554:14;14550:26;14546:40;14526:18;14522:65;14512:93;;14601:1;14598;14591:12;14512:93;14626:30;;14679:18;;-1:-1:-1;;;;;14709:30:31;;14706:50;;;14752:1;14749;14742:12;14706:50;14789:2;14783:4;14779:13;14765:27;;14836:6;14820:14;14816:27;14808:6;14804:40;14801:60;;;14857:1;14854;14847:12;14801:60;14870:85;14948:6;14940;14936:1;14930:4;14926:12;14870:85;:::i;16063:125::-;16128:9;;;16149:10;;;16146:36;;;16162:18;;:::i;17836:209::-;17868:1;17894;17884:132;;17938:10;17933:3;17929:20;17926:1;17919:31;17973:4;17970:1;17963:15;18001:4;17998:1;17991:15;17884:132;-1:-1:-1;18030:9:31;;17836:209::o", "linkReferences": {}, "immutableReferences": { - "39820": [ - { "start": 872, "length": 32 }, - { "start": 1352, "length": 32 }, - { "start": 2238, "length": 32 }, - { "start": 3277, "length": 32 } + "39829": [ + { "start": 934, "length": 32 }, + { "start": 1727, "length": 32 }, + { "start": 2613, "length": 32 }, + { "start": 3869, "length": 32 }, + { "start": 5218, "length": 32 } ] } }, @@ -225,6 +253,8 @@ "getAllValidators()": "f3513a37", "getTopValidators()": "afeea115", "getValidator(address)": "1904bb2e", + "getVotes(address,uint256)": "eb9019d4", + "getVotesCount()": "1b605b86", "isValidatorRegistered(address)": "d04a68c7", "registerValidator(bytes)": "602a9eee", "registeredValidatorsCount()": "f1bd0b37", @@ -235,7 +265,7 @@ "updateVoters(address[])": "2bdf6d43", "vote(address)": "6dd7d8ea" }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"Unvoted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"name\":\"ValidatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"ValidatorResigned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"Voted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"activeValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"}],\"name\":\"calculateTopValidators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTopValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isValidatorRegistered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"name\":\"registerValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registeredValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resignValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resignedValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unvote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator\",\"name\":\"_validator\",\"type\":\"tuple\"}],\"name\":\"updateValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"voters\",\"type\":\"address[]\"}],\"name\":\"updateVoters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/consensus/Consensus.sol\":\"Consensus\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@contracts/=src/\",\":@forge-std/=forge-std/src/\"]},\"sources\":{\"src/consensus/Consensus.sol\":{\"keccak256\":\"0xa9de7b08abcc3d2e7e8f5adce9534f6ec28beb6b06e8b49bfc1b521ec53fad5d\",\"urls\":[\"bzz-raw://0ed11153c9aa281668334067cc7d224100767edb8f73d881ad6ca9cb0ef875dd\",\"dweb:/ipfs/QmfKZcviJjgYoUL1ToN5NWr7Xb3k9iYbgqP1W4Zn5qLuRU\"]}},\"version\":1}", + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"Unvoted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"name\":\"ValidatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"ValidatorResigned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"Voted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"activeValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"}],\"name\":\"calculateTopValidators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTopValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"internalType\":\"struct VoteResult[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVotesCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isValidatorRegistered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"name\":\"registerValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registeredValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resignValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resignedValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unvote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator\",\"name\":\"_validator\",\"type\":\"tuple\"}],\"name\":\"updateValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"voters\",\"type\":\"address[]\"}],\"name\":\"updateVoters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/consensus/Consensus.sol\":\"Consensus\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@contracts/=src/\",\":@forge-std/=forge-std/src/\"]},\"sources\":{\"src/consensus/Consensus.sol\":{\"keccak256\":\"0xd07ac0850b476ecc88b2298e31f2fffaddada47f582e2f7a8512f0fb811c9701\",\"urls\":[\"bzz-raw://46bd738e4fc7386afe87fe491f6facc69af844a4871b0740dd703b718e047bc7\",\"dweb:/ipfs/Qmdy4S9LncL8b8Qrs8XX9SSyxKqHnBCuJXrZJhu9zmM8AH\"]}},\"version\":1}", "metadata": { "compiler": { "version": "0.8.27+commit.40a35a09" }, "language": "Solidity", @@ -369,6 +399,33 @@ } ] }, + { + "inputs": [ + { "internalType": "address", "name": "addr", "type": "address" }, + { "internalType": "uint256", "name": "count", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function", + "name": "getVotes", + "outputs": [ + { + "internalType": "struct VoteResult[]", + "name": "", + "type": "tuple[]", + "components": [ + { "internalType": "address", "name": "voter", "type": "address" }, + { "internalType": "address", "name": "validator", "type": "address" } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getVotesCount", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] + }, { "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }], "stateMutability": "view", @@ -450,10 +507,10 @@ }, "sources": { "src/consensus/Consensus.sol": { - "keccak256": "0xa9de7b08abcc3d2e7e8f5adce9534f6ec28beb6b06e8b49bfc1b521ec53fad5d", + "keccak256": "0xd07ac0850b476ecc88b2298e31f2fffaddada47f582e2f7a8512f0fb811c9701", "urls": [ - "bzz-raw://0ed11153c9aa281668334067cc7d224100767edb8f73d881ad6ca9cb0ef875dd", - "dweb:/ipfs/QmfKZcviJjgYoUL1ToN5NWr7Xb3k9iYbgqP1W4Zn5qLuRU" + "bzz-raw://46bd738e4fc7386afe87fe491f6facc69af844a4871b0740dd703b718e047bc7", + "dweb:/ipfs/Qmdy4S9LncL8b8Qrs8XX9SSyxKqHnBCuJXrZJhu9zmM8AH" ], "license": null } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e3127f924..ef25578a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1823,6 +1823,9 @@ importers: '@mainsail/kernel': specifier: workspace:* version: link:../kernel + '@mainsail/utils': + specifier: workspace:* + version: link:../utils ethers: specifier: ^6.11.0 version: 6.13.1